Network Deployment (Distributed operating systems), v8.0 > Develop and deploying applications > XML applications > Use the XML API to perform operations > Use resolvers


Register a collection resolver

We can register implementations of the XCollectionResolver interface with the XDynamicContext.


Procedure

Register a collection resolver with the dynamic context.

The XCollectionResolver implementation registered with the XDynamicContext is used at execution time to retrieve the collection of nodes associated with the URI provided in calls to the fn:collection method. If no collection resolver is registered with the XDynamicContext then calls to fn:collection will result in a recoverable error and the empty sequence is used for the collection.

Note that the collection resolver and the fn:collection function are not meant to resolve document URIs. The source resolver and fn:doc function should be used for this purpose.


Example

The following is a basic example of using a collection resolver.

XFactory factory = XFactory.newInstance();

// Prepare the XPath expression
XPathExecutable executable = factory.prepareXPath("count(collection('typeA-typeB'))"
    
// Register the collection resolver with the dynamic context XCollectionResolver collectionResolver = new ACollectionResolver(factory);
XDynamicContext dynamicContext = factory.newDynamicContext();
dynamicContext.setCollectionResolver(collectionResolver);

// Execute the XPath expression
XSequenceCursor cursor = executable.execute(dynamicContext);

The following is a basic example of an XCollectionResolver implementation.

public class ACollectionResolver implements XCollectionResolver {

    private XFactory m_factory;

    public ACollectionResolver(XFactory factory) {
        m_factory = factory;
    }

    public XSequenceCursor getCollection(String uri, String base) {

        // Get the default collection
if (uri.equals("")) {
            return getCollection("default", base);
        }

        // Get the requested collection
ArrayList
<XItemView> list = new ArrayList
<XItemView>();
        StringTokenizer tokenizer = new StringTokenizer(uri, "-");
          XSequenceCursor cursor = null;
          while (tokenizer.hasMoreTokens()) {
              String token = tokenizer.nextToken();
              XSequenceCursor temp = getNodes(new StreamSource("collections.xml"), "/doc/" + token);
              if (cursor == null) {
                  cursor = temp;
              } else {
                  cursor = cursor.append(temp);
              }
          }
        return cursor;
    }

     private XSequenceCursor getNodes(Source source, String expression) {
         XPathExecutable executable = m_factory.prepareXPath(expression);
         XSequenceCursor cursor = executable.execute(source);
         return cursor;
     }

}

Use a source resolver at execution time
XPath Static Context
XPath Dynamic Context

+

Search Tips   |   Advanced Search