Mobicents XML Patch Ops RI
Mobicents provides Reference Implementation of MobicentsXMLPatchOpsAPI. The RI is based on generic DOM model. It depends on xerces implementation of standard XML APIs.
Resources
- RI source can be accessed via svn at: http://mobicents.googlecode.com/svn/trunk/protocols/xcap-diff/dom
- Documentation source can be accessed vis svn at:http://mobicents.googlecode.com/svn/trunk/protocols/xcap-diff/docs
- Binary release can be accessed at: n/a
Limitations
The RI is not sophisticated. It has been created to address Mobicents specific needs(along with demonstrating how API should be used). As such, it does not cover all corner cases of XML manipulation. Thus it has certain limitations. Here is a list of 'rules' that must be obeyed:
- Documents must be well formed.
- Documents which are compared end to end (document vs document) must be flat, cant contain ony 'Element' type nodes
Still, it is fully fledged RI of API defined by MobicentsXMLPatchOpsAPI. Thus it supports all RFC mandated features and operations.
Example
The documentation has fairly good set of examples. However, here is one similar to one present in API article, to show difference with RI
import org.mobicents.protocols.xcap.*; //imports api and default, dom implementation
import org.w3c.dom.*; //import dom stuff
XcapDiffFactory<Document, Element, Document, Node, Node> xcapDiffFactory = new DOMXcapDiffFactory();
XcapDiffPatchBuilder<Document, Element, Document, Node, Node> xcapDiffPatchBuilder = xcapDiffFactory.getPatchBuilder();
DocumentPatchComponentBuilder<Element, Document, Node, Node> documentPatchComponentBuilder = xcapDiffPatchBuilder.getDocumentPatchComponentBuilder();
XmlPatchOperationsBuilder<Document, Element, Node, Node> xmlPatchOperationsBuilder = documentPatchComponentBuilder.getXmlPatchOperationsBuilder();
//Note, no namespaces
String xcapRoot = "http://localhost:8080/default"; //root of server
String documentSelector = "tests/users/sip:joe@example.com/index";
String attributeSelector = "house/room[id='main']/switch/@on"; //house status document?
String attributeNewValue = "true";
String oldETag = "3416134yyDFGA$v33@!";
String newETag = "haha";
Element attributeElement = xmlPatchOperationsBuilder.replaceAttribute(attributeSelector,attributeNewValue,null); //no namespaces
Element documentElement = documentPatchComponentBuilder.buildPatchComponent(documentSelector,oldETag,newETag,new Element[]{attributeElement});
Document xcapDiffDocument = xcapDiffPatchBuilder.buildPatch(xcapRoot,new Element[]{documentElement}); //xcap diff patch
Comments