Código de ejemplo para extender un esquema en el depósito de archivos

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:

  1. Añadir una nueva propiedad extendida a un tipo de entidad incorporado en el depósito de archivos.
  2. Crear una entidad con un valor para la propiedad extendida.
  3. Buscar una entidad con el valor de la propiedad extendida.

Requisitos previos

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.

Código de ejemplo

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();
        }
    }
}

Gráficos de datos de entrada y salida

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.

Gráfico de datos de entrada para crear un tipo de propiedad postOfficeBox y añadirlo a un tipo de entidad existente
<?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>
Gráfico de datos de salida posterior a la creación de un tipo de propiedad postOfficeBox y la adición a un tipo de entidad existente:
<?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>
Gráfico de datos de entrada para crear una entidad, Person B, con una propiedad definida, postOfficeBox:
<?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>
Gráfico de datos de salida después de crear una entidad con la propiedad extendida:
<?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>
Gráfico de datos de entrada para buscar una entidad con el valor de propiedad extendida, postOfficeBox='4-23':
<?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>
Gráfico de datos de salida después de buscar una entidad con un valor de propiedad extendida, postOfficeBox='4-23' (la entidad, Person B, encontrada):
<?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>


Condiciones de uso | Comentarios