Con un plug-in o índice MapIndexPlugin, puede escribir estrategias personalizadas de indexación que van más allá de los índices incorporados que proporciona eXtreme Scale.
Las implementaciones de MapIndexPlugin deben utilizar la interfaz MapIndexPlugin y seguir las convenciones comunes de plug-in de eXtreme Scale.
Las secciones siguientes incluyen algunos de los métodos importantes de la interfaz index.
Utilice el método setProperties para inicializar el plug-in index mediante programación. El parámetro del objeto Properties que se pasa en el método debe contener la información de configuración para inicializar el plug-in correctamente. La implementación del método setProperties, junto con la implementación del método getProperties, son necesarias en un entorno distribuido porque la configuración del plug-in index se mueve entre los procesos de cliente y servidor. A continuación se muestra un ejemplo de la implementación de este método.
setProperties(Properties properties)
// Código de ejemplo del método setProperties
public void setProperties(Properties properties) {
ivIndexProperties = properties;
String ivRangeIndexString = properties.getProperty("rangeIndex");
if (ivRangeIndexString != null && ivRangeIndexString.equals("true")) {
setRangeIndex(true);
}
setName(properties.getProperty("indexName"));
setAttributeName(properties.getProperty("attributeName"));
String ivFieldAccessAttributeString = properties.getProperty("fieldAccessAttribute");
if (ivFieldAccessAttributeString != null && ivFieldAccessAttributeString.equals("true")) {
setFieldAccessAttribute(true);
}
String ivPOJOKeyIndexString = properties.getProperty("POJOKeyIndex");
if (ivPOJOKeyIndexString != null && ivPOJOKeyIndexString.equals("true")) {
setPOJOKeyIndex(true);
}
}
El método getProperties extrae la configuración del plug-in index de una instancia de MapIndexPlugin. Puede utilizar las propiedades extraídas para inicializar otra instancia de MapIndexPlugin para que tenga los mismos estados internos. Las implementaciones del método getProperties y del método setProperties son necesarias en un entorno distribuido. A continuación, aparece una implementación de ejemplo del método getProperties:
getProperties()
// Código de ejemplo del método getProperties
public Properties getProperties() {
Properties p = new Properties();
p.put("indexName", indexName);
p.put("attributeName", attributeName);
p.put("rangeIndex", ivRangeIndex ? "true" : "false");
p.put("fieldAccessAttribute", ivFieldAccessAttribute ? "true" : "false");
p.put("POJOKeyIndex", ivPOJOKeyIndex ? "true" : "false");
return p;
}
La ejecución de WebSphere eXtreme Scale llama al método setEntityMetadata durante la inicialización para establecer el EntityMetadata del BackingMap asociado en la instancia de MapIndexPlugin. El EntityMetadata es necesario para dar soporte a la indexación de objetos tuple. Un tuple es un conjunto de datos que represente un objeto de entidad o su clave. Si la BackingMap es para una entidad, el usuario debe implementar este método.
El siguiente código de ejemplo implementa el método setEntityMetadata.
setEntityMetadata(EntityMetadata entityMetadata)
// Código de ejemplo del método setEntityMetadata
public void setEntityMetadata(EntityMetadata entityMetadata) {
ivEntityMetadata = entityMetadata;
if (ivEntityMetadata != null) {
// es una correlación de tuples
TupleMetadata valueMetadata = ivEntityMetadata.getValueMetadata();
int numAttributes = valueMetadata.getNumAttributes();
for (int i = 0; i < numAttributes; i++) {
String tupleAttributeName = valueMetadata.getAttribute(i).getName();
if (attributeName.equals(tupleAttributeName)) {
ivTupleValueIndex = i;
break;
}
}
if (ivTupleValueIndex == -1) {
// no se encontró atributo en tuple de valor, intente encontrarlo en tuple de clave
// no se encontró en tuple de clave, implica indexación de claves en uno de los atributos
// de clave de tuple
TupleMetadata keyMetadata = ivEntityMetadata.getKeyMetadata();
numAttributes = keyMetadata.getNumAttributes();
for (int i = 0; i < numAttributes; i++) {
String tupleAttributeName = keyMetadata.getAttribute(i).getName();
if (attributeName.equals(tupleAttributeName)) {
ivTupleValueIndex = i;
ivKeyTupleAttributeIndex = true;
break;
}
}
}
if (ivTupleValueIndex == -1) {
// si entityMetadata no es nulo y no se ha podido encontrar el
// attributeName en entityMetadata, se trata de un
// error
throw new ObjectGridRuntimeException("Invalid attributeName. Entity: " + ivEntityMetadata.getName());
}
}
}
El método setAttributeName establece el nombre del atributo que se va a indexar. La clase de objeto almacenada en la memoria caché debe proporcionar el método get para el atributo indexado. Por ejemplo, si el objeto tiene un atributo employeeName o EmployeeName, el índice llama al método getEmployeeName en el objeto para extraer el valor de atributo. El nombre de atributo debe ser el mismo que el nombre que aparece en el método get, y el atributo debe implementar la interfaz Comparable. Si el atributo es del tipo booleano, también puede utilizar el patrón del método isAttributeName.
El método getAttributeName devuelve el nombre del atributo indexado.
El método getAttribute devuelve el valor de atributo indexado del objeto especificado. Por ejemplo, si un objeto Employee tiene un atributo llamado employeeName que está indexado, puede utilizar el método getAttribute para extraer el valor del atributo employeeName de un objeto Employee especificado. Este método es necesario en un entorno distribuido de WebSphere eXtreme Scale.
getAttribute(Object value)
// Código de ejemplo del método getAttribute
public Object getAttribute(Object value) throws ObjectGridRuntimeException {
if (ivPOJOKeyIndex) {
// En el caso de indexación de claves POJO, no es necesario obtener el atributo
// del objeto de valor.
// La clave misma es el valor del atributo utilizado para compilar el índice.
return null;
}
try {
Object attribute = null;
if (value != null) {
// manejar valor de tuple si ivTupleValueIndex != -1
if (ivTupleValueIndex == -1) {
// valor regular
if (ivFieldAccessAttribute) {
attribute = this.getAttributeField(value).get(value);
} else {
attribute = getAttributeMethod(value).invoke(value, emptyArray);
}
} else {
// Nombre de tuple
attribute = extractValueFromTuple(value);
}
}
return attribute;
} catch (InvocationTargetException e) {
throw new ObjectGridRuntimeException(
"Caught unexpected Throwable during index update processing,
index name = " + indexName + ": " + t,
t);
} catch (Throwable t) {
throw new ObjectGridRuntimeException(
"Caught unexpected Throwable during index update processing,
index name = " + indexName + ": " + t,
t);
}
}