Version 5

    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.








    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. 




    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/";

    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