Utilice el código de ejemplo completo y los gráficos de datos para extender el esquema añadiendo una nueva propiedad a un tipo de entidad existente en el depósito de archivos.
En este escenario de ejemplo se incluyen los pasos siguientes:
Asegúrese de leer la información y completar los pasos que se describen en el tema Requisitos previos de programación, incluida la sección Ampliación del esquema de propiedad, que contiene información sobre los objetos de datos propertySchema y extensionPropertySchema e indica la sintaxis válida para los tipos de datos de propiedad.
Añada el siguiente código de ejemplo completo al código de aplicación y sustituya las variables por los valores reales que desea utilizar.
/**
* Esta clase se utiliza para mostrar el uso de la API de VMM para extender el esquema.
* En el ejemplo se añade una nueva propiedad a un tipo de entidad existente en el depósito de archivos.
*/
public class ExtendSchemaSample extends BaseApp
{
/**
* Una constante de tipo serie para el nuevo nombre de propiedad que debe añadirse
*/
private static final String newPropName = "postOfficeBox";
/**
* Punto de entrada de aplicación
* @param args
* @throws WIMException
*/
public static void main(String[] args) throws WIMException
{
System.out.println("Starting .. ");
// localizar servicio
service = locateService(null);
System.out.println("Located service. Starting schema extension ... ");
// Añadir una nueva propiedad (runtime)
runTimeAddNewProperty();
}
/**
* Este método muestra el uso de la API de extensión de esquema
* En este ejemplo se realiza lo siguiente:
* Se añade una nueva propiedad, postOfficeBox, a un tipo de entidad existente
* Se crea una entidad con el valor 4-23 para la propiedad extendida postOfficeBox
* Se busca una entidad con el valor de la propiedad extendida
*/
private static void runTimeAddNewProperty()
{
// Añadir la propiedad "postOfficeBox" a "PersonAccount"
addNewProperty();
System.out.println("The property 'postOfficeBox' is added to 'PersonAccount'.");
// Crear una persona con una propiedad "postOfficeBox"
System.out.println("\nCLIENT: Creating Person B with a defined property called 'postOfficeBox'.");
createPerson();
// Buscar en la propiedad "postOfficeBox = 4-23"
searchPerson();
}
/**
* En este método se crea una persona con los atributos siguientes
* uid: personb
* cn: Person B
* sn: PersonBLastName
* postOfficeBox: 4-23
*/
private static void createPerson()
{
//Crear Person B ...
try
{
// Obtener un objeto de datos raíz. El resto del árbol de objeto se creará bajo éste
DataObject root = SDOHelper.createRootDataObject();
// Crear un objeto de datos de tipo de entidad "PersonAccount" debajo de root
// El objeto está en el espacio de nombres de WIM predeterminado
DataObject person = root.createDataObject(SchemaConstants.DO_ENTITIES, Service.WIM_NS_URI,
SchemaConstants.DO_PERSON_ACCOUNT);
// Establecer los valores para los atributos necesarios, uid, cn, sn
// También establecer el valor para el atributo que se acaba de añadir "postOfficeBox"
person.set("uid", "personb");
person.set("cn", "Person B");
person.set("sn", "PersonBLastName");
person.set(newPropName, "4-23");
System.out.println("Input datagraph for create person -> " + printDO(root));
// Invocar la API de creación para crear la entidad de cuenta de persona definida previamente
root = service.create(root);
System.out.println("Output datagraph for create person -> " + printDO(root);
System.out.println("CLIENT: Person B has been created\n\n");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Este método añade la propiedad "postOfficeBox" al tipo de entidad "PersonAccount".
*/
@SuppressWarnings("unchecked")
private static void addNewProperty()
{
try
{
System.out.println("\nCLIENT: Creating new property type postOfficeBox
and adding it to existing entity type PersonAccount");
// Obtener un objeto de datos raíz. El resto del árbol de objeto se creará bajo éste
DataObject root = SDOHelper.createRootDataObject();
// Crear un nuevo objeto "schema" debajo de la raíz.
// Este objeto contendrá los detalles de las modificaciones de esquema que deben realizarse
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
/***************************************/
/** Código para definir la nueva propiedad **/
/***************************************/
// Crear un objeto de datos de esquema de propiedad debajo del objeto de esquema creado antes
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Establecer valores para la propiedad, por ej., URI espacio_nombres, prefijo espacio_nombres, nombre_propiedad
propSchemaDO.set(SchemaConstants.PROP_NS_URI, "http://www.yourco.com/wim/yourext");
propSchemaDO.set(SchemaConstants.PROP_NS_PREFIX, "yourprefix");
propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, newPropName);
// Especificar si la propiedad es de múltiples valores
// Si es de múltiples valores, el tipo debe ser List
propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
// Especificar el tipo de datos de la propiedad
// Los tipos de datos pueden ser simples como boolean, int, float, double, String
// o especiales como Address, Person, Group, etc.
propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
// Obtener la lista de tipos de entidad a la que debe añadirse esta propiedad
List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
// Añadir los nombres de tipo de entidad aplicables a la lista obtenida previamente
applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
/***************************************************/
/** Definición de propiedad nueva realizada **/
/** Ahora debe invocarse la API createSchema **/
/***************************************************/
System.out.println("Input datagraph for create property -> " + printDO(root));
// Invocar API de creación de esquema para añadir la definición de propiedad al modelo de esquema
root = service.createSchema(root);
System.out.println("Output datagraph for create property -> " + printDO(root));
System.out.println("\nCLIENT: New property type is created.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* Buscar persona con postOfficeBox = 4-23.
*/
@SuppressWarnings("unchecked")
private static void searchPerson()
{
try
{
// Buscar Person B
// Crear un objeto de datos de control de búsqueda
DataObject root = SDOHelper.createRootDataObject();
DataObject searchCtrl = SDOHelper.createControlDataObject(root, null,
SchemaConstants.DO_SEARCH_CONTROL);
// Especificar las propiedades que deben obtenerse para todas las entradas coincidentes
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
// Especificar los criterios de coincidencia como la expresión de búsqueda
// La expresión aquí especifica el tipo de entidad como "PersonAccount"
// y el valor de "postOfficeBox" como '4-23'
// La ejecución de la búsqueda con esta expresión devolverá todos los objetos "PersonAccount"
con el valor de "postOfficeBox" '4-23'
// Deben obtenerse las propiedades 'uid', 'sn' y 'cn' para todos los objetos
searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='"
+ Service.DO_PERSON_ACCOUNT + "' and " + newPropName + "='4-23'");
System.out.println("Searching for " + searchCtrl.getString(SchemaConstants.PROP_SEARCH_EXPRESSION));
System.out.println("Input datagraph for search -> " + printDO(root));
// Invocar la API de búsqueda con el control de búsqueda
root = service.search(root); System.out.println("Output datagraph for search -> " + printDO(root));
// Repetir los resultados de búsqueda
// Los resultados se incluyen como una Lista en la propiedad "entities"
// del objeto de datos devuelto por la API de búsqueda
// Se define una constante "DO_ENTITIES" apropiada en SchemaConstants para referirse a esta propiedad
printIdentifiers(root);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
A continuación se proporcionan los gráficos de datos de entrada y los gráficos de datos de salida resultantes para cada paso de este ejemplo.
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:sdo="commonj.sdo"
xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:schema>
<wim:propertySchema nsPrefix="yourprefix" nsURI="http://www.yourco.com/wim/yourext"
dataType="String" multiValued="false" propertyName="postOfficeBox">
<wim:applicableEntityTypeNames>PersonAccount</wim:applicableEntityTypeNames>
</wim:propertySchema>
</wim:schema>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:sdo="commonj.sdo"
xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:schema>
<wim:propertySchema nsPrefix="yourprefix" nsURI="http://www.yourco.com/wim/yourext"
dataType="String" multiValued="false" propertyName="postOfficeBox">
<wim:applicableEntityTypeNames>PersonAccount</wim:applicableEntityTypeNames>
</wim:propertySchema>
</wim:schema>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim"
xmlns:yourprefix="http://www.yourco.com/wim/yourext">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:uid>personb</wim:uid>
<wim:cn>Person B</wim:cn>
<wim:sn>PersonBLastName</wim:sn>
<yourprefix:postOfficeBox>4-23</yourprefix:postOfficeBox>
</wim:entities>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="uid=personb,o=defaultWIMFileBasedRealm"
repositoryId="InternalFileRepository"
uniqueId="fc050249-d245-498f-a3f3-1a3d7566f971"
uniqueName="uid=personb,o=defaultWIMFileBasedRealm"/>
</wim:entities>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:controls xsi:type="wim:SearchControl"
expression="@xsi:type='PersonAccount' and postOfficeBox='4-23'">
<wim:properties>uid</wim:properties>
<wim:properties>sn</wim:properties>
<wim:properties>cn</wim:properties>
</wim:controls>
</wim:Root>
</sdo:datagraph>
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
<wim:Root>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="uid=personb,o=defaultWIMFileBasedRealm"
repositoryId="InternalFileRepository"
uniqueId="fc050249-d245-498f-a3f3-1a3d7566f971"
uniqueName="uid=personb,o=defaultWIMFileBasedRealm"/>
<wim:uid>personb</wim:uid>
<wim:cn>Person B</wim:cn>
<wim:sn>PersonBLastName</wim:sn>
</wim:entities>
</wim:Root>
</sdo:datagraph>