org.firesoa.common.jxpath.model.dom.W3CDomFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.firesoa.common.jxpath.model.dom.W3CDomFactory.java

Source

/**
 * Copyright 2007-2010 ?
 * All rights reserved. 
 * 
 * This library is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License v3 as published by the Free Software
 * Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this library; if not, see http://www.gnu.org/licenses/lgpl.html.
 *
 */
package org.firesoa.common.jxpath.model.dom;

import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.jxpath.AbstractFactory;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.Pointer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
 *
 * @author ? nychen2000@163.com
 * Fire Workflow www.firesoa.com  www.fireflow.org
 *
 */
public class W3CDomFactory extends AbstractFactory {
    private static final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

    public boolean createObject(JXPathContext context, Pointer pointer, Object parent, String name, int index) {
        String prefix = null;
        String localName = null;
        String namespaceURI = null;
        int thePosition = name.indexOf(":");
        if (thePosition > 0) {
            prefix = name.substring(0, thePosition);
            localName = name.substring(thePosition + 1);
            namespaceURI = context.getNamespaceURI(prefix);
        } else {
            //????
            localName = name;
        }
        String qualifiedName = localName;
        if (prefix != null && !prefix.trim().equals("")) {
            qualifiedName = prefix + ":" + localName;
        }

        addW3CDomElement((Node) parent, index, qualifiedName, namespaceURI);

        return true;
    }

    private void addW3CDomElement(Node parent, int index, String tag, String namespaceURI) {
        try {
            Node child = parent.getFirstChild();
            int count = 0;
            while (child != null) {
                if (child.getNodeName().equals(tag)) {
                    count++;
                }
                child = child.getNextSibling();
            }

            // Keep inserting new elements until we have index + 1 of them
            while (count <= index) {
                Document doc = parent.getOwnerDocument();
                Node newElement;
                if (namespaceURI == null) {
                    newElement = doc.createElement(tag);
                } else {
                    newElement = doc.createElementNS(namespaceURI, tag);
                }

                parent.appendChild(newElement);
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public boolean declareVariable(JXPathContext context, String name) {
        return false;
    }

    private static boolean equalStrings(String s1, String s2) {
        if (s1 == s2) {
            return true;
        }
        s1 = s1 == null ? "" : s1.trim();
        s2 = s2 == null ? "" : s2.trim();
        return s1.equals(s2);
    }
}