| Oracle® Content Services Application Developer's Guide 10g Release 1 (10.1.2.2) Part Number B25277-02 |
|
|
View PDF |
Attribute requests are a commonly used feature when developing for Oracle Content Services. Attribute requests tell Oracle Content Services to return a set of attributes about a specific Item in the repository. The request is given when performing an action on that Item, and is returned in an array of AttributeRequest objects. The examples in this book have all used basic attribute requests to retrieve simple piece of data. Attributes, however, can be nested, allowing the creation of more complex data structures for attribute requests. The following example shows how to request and retrieve a nested attribute structure.
In the case where attributes are composed of multiple values, attribute requests must be nested or chained. Chaining attribute requests allows retrieval of an entire tree of related objects in one call. Consider the following example, which sets version numbers on a folder:
/**
* Set manual and auto version on folder
*/
public static void setVersion(Item folder)
throws FdkException, RemoteException
{
// get the Manager instances
CommonManager cm = s_WsCon.getCommonManager();
VersionManager vm = s_WsCon.getVersionManager();
// create auto version configuration definition
NamedValue[] autoVerDef = WsUtility.newNamedValueArray(new Object[][] {
{ Attributes.VERSIONING_CONFIGURATION_AUTO_LABEL, Boolean.TRUE },
{ Attributes.VERSIONING_CONFIGURATION_AUTO_VERSION, Boolean.TRUE },
{ Attributes.VERSIONING_CONFIGURATION_MAX_VERSIONS, new Integer(1000) },
{ Attributes.CONFIGURATION_FINAL, Boolean.FALSE },
{ Attributes.CONFIGURATION_ENABLED, Boolean.TRUE } });
// set auto version configuration on the folder
vm.setVersioningConfiguration(folder.getId(), autoVerDef);
// The version attributes request
// This requests the attributes of the folder, and nests
// the attributes to be retrieved from the versioning configuration
// of the folder
AttributeRequest[] fdr_ver_attr = new AttributeRequest[] {
WsUtility.newAttributeRequest(Attributes.PATH),
WsUtility.newAttributeRequest(Attributes.DESCRIPTION),
// nest the attributes of the versioning configuration
WsUtility.newAttributeRequest(Attributes.VERSIONING_CONFIGURATION,
WsUtility.newAttributeRequestArray(new String[] {
Attributes.VERSIONING_CONFIGURATION_AUTO_LABEL,
Attributes.VERSIONING_CONFIGURATION_AUTO_VERSION,
Attributes.VERSIONING_CONFIGURATION_MAX_VERSIONS,
Attributes.CONFIGURATION_ENABLED })) };
// requesting folder version attributes
// use the CommonManager to get the attributes of an Item
folder = cm.getItem(folder.getId(), fdr_ver_attr);
// returned item has the requested attributes in a NamedValue[]
// convert it to a map for easy lookup and access to attributes
NamedValue[] attrs = folder.getRequestedAttributes();
Map attrMap = ClientUtils.namedValuesToMap(attrs);
WsUtility.log("");
// attributes name and value
WsUtility.log(Attributes.PATH);
// PATH attribute
WsUtility.log(WsUtility.INDENT + (String) attrMap.get(Attributes.PATH));
WsUtility.log(Attributes.DESCRIPTION);
WsUtility.log(WsUtility.INDENT
+ (String) attrMap.get(Attributes.DESCRIPTION));
WsUtility.log(Attributes.VERSIONING_CONFIGURATION);
// VERSIONING_CONFIGURATION is again an Item which will have the nested
attributes
// that we requested for
Item verItem = (Item) attrMap.get(Attributes.VERSIONING_CONFIGURATION);
// again we get these as NamedValue[]
// convert it to a map for easy lookup
attrs = verItem.getRequestedAttributes();
attrMap = ClientUtils.namedValuesToMap(attrs);
WsUtility.log(WsUtility.INDENT
+ Attributes.VERSIONING_CONFIGURATION_AUTO_LABEL);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ (Boolean) attrMap.get(Attributes.VERSIONING_CONFIGURATION_AUTO_LABEL));
WsUtility.log(WsUtility.INDENT
+ Attributes.VERSIONING_CONFIGURATION_AUTO_VERSION);
WsUtility.log(WsUtility.INDENT
+ WsUtility.INDENT
+ (Boolean) attrMap.get(
Attributes.VERSIONING_CONFIGURATION_AUTO_VERSION));
WsUtility.log(WsUtility.INDENT
+ Attributes.VERSIONING_CONFIGURATION_MAX_VERSIONS);
WsUtility.log(WsUtility.INDENT
+ WsUtility.INDENT
+ (Integer) attrMap.get(
Attributes.VERSIONING_CONFIGURATION_MAX_VERSIONS));
WsUtility.log(WsUtility.INDENT + Attributes.CONFIGURATION_ENABLED);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ (Boolean) attrMap.get(Attributes.CONFIGURATION_ENABLED));
}
The attribute request stored in the array fdr_ver_attr is an example of a nested attribute request. The attribute VERSIONING_CONFIGURATION contains multiple sub-attributes, all of which are stored in a subarray of the original request. Oracle Content Services can produce attributes for any level of nesting.
Reading nested attributes follows the same process as regular attributes. Since each nested attribute is itself a fully formed attribute request, you can use the getRequestedAttributes method on its Item object.
Note that the examples use the WsUtility class, which is included with the samples. This class contains many convenient wrappers for simple operations such as object instantiation and logging. These wrappers are used primarily for the sake of readability, and are not necessary.
Below is a second example, featuring two levels of nesting. The nested attribute request extracts attributes for a document, one of which is the nested VERSIONS attribute. For each version, the request fetches information about that versioned document, as well as the nested VERSIONED_DOCUMENT attribute. This attribute contains information about the versioned document itself. The entire structure is returned in the docs variable, converted to a Map, and extracted.
/**
* Checks in a Document.
*/
public static void checkinDocument(Item workingCopy)
throws FdkException, RemoteException
{
// get the Manager instances
CommonManager cm = s_WsCon.getCommonManager();
VersionManager vm = s_WsCon.getVersionManager();
// create checkin document definition
// set a label and comment while checking in
NamedValue[] checkInDef = WsUtility.newNamedValueArray(new Object[][] {
{ Attributes.VERSION_COMMENT, "a new version" },
{ Attributes.VERSION_LABEL, "2.0" } });
NamedValueSet[] checkInDefs = new NamedValueSet[] {
WsUtility.newNamedValueSet(checkInDef) };
// check in the document
vm.checkin(new long[] { workingCopy.getId() }, null, checkInDefs, null);
// request for the attributes of the document
// we look for the document's attributes,
// attributes for different versions of this document
// and for each version we get the details of the version
AttributeRequest[] doc_ver_attr = new AttributeRequest[] {
WsUtility.newAttributeRequest(Attributes.PATH),
WsUtility.newAttributeRequest(Attributes.DESCRIPTION),
// request for the version details
WsUtility.newAttributeRequest(Attributes.VERSIONS,
new AttributeRequest[] {
WsUtility.newAttributeRequest(Attributes.VERSION_LABEL),
WsUtility.newAttributeRequest(Attributes.VERSION_COMMENT),
WsUtility.newAttributeRequest(Attributes.VERSIONED_DOCUMENT,
// request for attributes of each version
new AttributeRequest[] {
WsUtility.newAttributeRequest(Attributes.DESCRIPTION),
WsUtility.newAttributeRequest(Attributes.DOCUMENT_LANGUAGE),
WsUtility.newAttributeRequest(Attributes.CHARACTER_SET) })
}) };
// fetch the attributes via the CommonManager
Item docs = cm.getItem(workingCopy.getId(), doc_ver_attr);
// the returned item has the requested attributes in a NamedValue[]
// convert it to a map for easy lookup and access to attributes
NamedValue[] attrs = docs.getRequestedAttributes();
Map attrMap = ClientUtils.namedValuesToMap(attrs);
WsUtility.log("");
// the document's attributes
WsUtility.log(Attributes.PATH);
WsUtility.log(WsUtility.INDENT + (String) attrMap.get(Attributes.PATH));
WsUtility.log(Attributes.DESCRIPTION);
WsUtility.log(WsUtility.INDENT
+ (String) attrMap.get(Attributes.DESCRIPTION));
WsUtility.log(Attributes.VERSIONS);
// these are the different versions of the document
Item[] verItem = (Item[]) attrMap.get(Attributes.VERSIONS);
for (int i = 0; i < verItem.length; i++)
{
// get second level of attributes
attrs = verItem[i].getRequestedAttributes();
attrMap = ClientUtils.namedValuesToMap(attrs);
WsUtility.log(WsUtility.INDENT + Attributes.VERSION_LABEL);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ (String) attrMap.get(Attributes.VERSION_LABEL));
WsUtility.log(WsUtility.INDENT + Attributes.VERSION_COMMENT);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ (String) attrMap.get(Attributes.VERSION_COMMENT));
WsUtility.log(WsUtility.INDENT + Attributes.VERSIONED_DOCUMENT);
// for each version the attributes of those documents that were versioned
Item docItem = (Item) attrMap.get(Attributes.VERSIONED_DOCUMENT);
// get third level of attributes
attrs = docItem.getRequestedAttributes();
attrMap = ClientUtils.namedValuesToMap(attrs);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ Attributes.DESCRIPTION);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT + WsUtility.INDENT
+ (String) attrMap.get(Attributes.DESCRIPTION));
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ Attributes.DOCUMENT_LANGUAGE);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT + WsUtility.INDENT
+ (String) attrMap.get(Attributes.DOCUMENT_LANGUAGE));
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT
+ Attributes.CHARACTER_SET);
WsUtility.log(WsUtility.INDENT + WsUtility.INDENT + WsUtility.INDENT
+ (String) attrMap.get(Attributes.CHARACTER_SET));
}
}
Every Item object has a getRequested Attributes method returns the attribute set in an array of NamedValue objects. The NamedValue class represents a name/value pair. In Oracle Content Services this class is used to represent attributes, options, and preferences. When working with a returned NamedValue array, it is often easier to convert it to a Map to allow lookups by attribute name. The preceding examples use the namedValuesToMap method (found in the included ClientUtils class), which returns a Map object comprising all the elements of the NamedValue array, with the name elements as key. Another option is to use the NamedValueSet class, which stores arrays of NamedValue objects. This class is used primarily to avoid the need to manage multi-dimensional arrays of attributes.