このエンドツーエンド・サンプル・コードおよびデータ・グラフは、ファイル・リポジトリー内の既存のエンティティー・タイプに新規プロパティーを追加することによってスキーマを拡張するために使用します。
このサンプル・シナリオでは、以下の手順を実行します。
「プログラミングの前提条件」トピック (propertySchema および extensionPropertySchema データ・オブジェクトについての情報が記載され、プロパティーのデータ型についての有効な構文がリストされている「プロパティー・スキーマの拡張」セクションを含む) で説明されている情報を参照済みであること、またトピックの手順を実行済みであることを確認してください。
次のエンドツーエンド・サンプル・コードをアプリケーション・コードに追加し、変数 を実際に使用する値に置き換えます。
/**
* This class is used to demonstrate the use of VMM API to extend the schema.
* This example adds a new property to an existing entity type, in File repository.
*/
public class ExtendSchemaSample extends BaseApp
{
/**
* A string constant for the new property name to be added
*/
private static final String newPropName = "postOfficeBox";
/**
* Application entry point
* @param args
* @throws WIMException
*/
public static void main(String[] args) throws WIMException
{
System.out.println("Starting .. ");
// locate service
service = locateService(null);
System.out.println("Located service. Starting schema extension ... ");
// Add a new property (runtime)
runTimeAddNewProperty();
}
/**
* This method shows the use of the schema extension API
* This example does the following:
* Adds a new property, postOfficeBox, to an existing entity type
* Creates an entity with the value, 4-23 for extended property, postOfficeBox
* Searches for an entity with the value of the extended property
*/
private static void runTimeAddNewProperty()
{
// Add the property "postOfficeBox" to "PersonAccount"
addNewProperty();
System.out.println("The property 'postOfficeBox' is added to 'PersonAccount'.");
// Create a person with a property "postOfficeBox"
System.out.println("¥nCLIENT: Creating Person B with a defined property called 'postOfficeBox'.");
createPerson();
// Search on the property "postOfficeBox = 4-23"
searchPerson();
}
/**
* This method creates a person with the following attributes
* uid: personb
* cn: Person B
* sn: PersonBLastName
* postOfficeBox: 4-23
*/
private static void createPerson()
{
//Create Person B ...
try
{
// Get a root data object. The rest of the object tree would be built under it
DataObject root = SDOHelper.createRootDataObject();
// Create a "PersonAccount" entity type data object under root
// The object is in the default WIM namespace
DataObject person = root.createDataObject(SchemaConstants.DO_ENTITIES, Service.WIM_NS_URI,
SchemaConstants.DO_PERSON_ACCOUNT);
// Set the values for required attributes, uid, cn, sn
// Also set the value for the newly added "postOfficeBox" attribute
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));
// Invoke the create API to create the person account entity defined previously
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();
}
}
/**
* This method adds the "postOfficeBox" property to "PersonAccount" entity type.
*/
@SuppressWarnings("unchecked")
private static void addNewProperty()
{
try
{
System.out.println("¥nCLIENT: Creating new property type postOfficeBox
and adding it to existing entity type PersonAccount");
// Get a root data object. The rest of the object tree would be built under it
DataObject root = SDOHelper.createRootDataObject();
// Create a new "schema" object under root.
// This object will contain the details of the schema modifications that need to be made
DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
/***************************************/
/** Code to define the new property **/
/***************************************/
// Create a property schema data object under the schema object created earlier
DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
// Set the values for the property, such as, namespace URI, namespace prefix, property name
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);
// Specify if the property is multi-valued
// If it is multi-valued, its type must be List
propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
// Specify the property's data type
// Data types can be simple like boolean, int, float, double, String
// or special like Address, Person, Group, etc.
propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
// Get the list of entity types to which this property needs to be added
List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
// Add the applicable entity type names to the list fetched previously
applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
/***************************************************/
/** The new property definition is done **/
/** Now the createSchema API needs to be called **/
/***************************************************/
System.out.println("Input datagraph for create property -> " + printDO(root));
// Invoke the create schema API to actually add the property definition to the schema model
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();
}
}
/**
* Search for person with postOfficeBox = 4-23.
*/
@SuppressWarnings("unchecked")
private static void searchPerson()
{
try
{
//Search Person B
// Create a search control data object
DataObject root = SDOHelper.createRootDataObject();
DataObject searchCtrl = SDOHelper.createControlDataObject(root, null,
SchemaConstants.DO_SEARCH_CONTROL);
// Specify the properties that need to be fetched for all matching entries
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
// Specify the matching criteria as the search expression
// The expression here specifies the entity type as "PersonAccount"
// and value of "postOfficeBox" as '4-23'
// Executing the search with this expression will return all "PersonAccount" objects
that have a value of "postOfficeBox" as '4-23'
// The properties 'uid', 'sn' and 'cn' would be fetched for all objects
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));
// Invoke the search API with the search control
root = service.search(root);
System.out.println("Output datagraph for search -> " + printDO(root));
// Iterate over the search results
// The results are contained as a List in property "entities"
// of the data object returned by the Search API
// A convenience constant "DO_ENTITIES" is defined in SchemaConstants to refer to this property
printIdentifiers(root);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
この例のステップごとの入力データ・グラフおよび生成される出力データ・グラフを、次に示します。
<?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>