Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright (c) 1997-2013 Oracle and/or its affiliates. All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common Development
   * and Distribution License("CDDL") (collectively, the "License").  You
   * may not use this file except in compliance with the License.  You can
  * obtain a copy of the License at
  * http://glassfish.java.net/public/CDDL+GPL_1_1.html
  * or packager/legal/LICENSE.txt.  See the License for the specific
  * language governing permissions and limitations under the License.
  *
  * When distributing the software, include this License Header Notice in each
  * file and include the License file at packager/legal/LICENSE.txt.
  *
  * GPL Classpath Exception:
  * Oracle designates this particular file as subject to the "Classpath"
  * exception as provided by Oracle in the GPL Version 2 section of the License
  * file that accompanied this code.
  *
  * Modifications:
  * If applicable, add the following below the License Header, with the fields
  * enclosed by brackets [] replaced by your own identifying information:
  * "Portions Copyright [year] [name of copyright owner]"
  *
  * Contributor(s):
  * If you wish your version of this file to be governed by only the CDDL or
  * only the GPL Version 2, indicate your decision by adding "[Contributor]
  * elects to include this software in this distribution under the [CDDL or GPL
  * Version 2] license."  If you don't indicate a single choice of license, a
  * recipient has the option to distribute your version of this file under
  * either the CDDL, the GPL Version 2 or to extend the choice of license to
  * its licensees as provided above.  However, if you add GPL Version 2 code
  * and therefore, elected the GPL Version 2 license, then the option applies
  * only if the new code is made subject to such option by the copyright
  * holder.
  */
 
 package com.sun.tools.ws.wsdl.parser;
 
 import org.w3c.dom.*;
 
 import java.net.URL;
 import java.util.Set;


Internalizes external binding declarations.

Author(s):
Vivek Pandey
 
 public class Internalizer {
 
     private static final XPathFactory xpf = XmlUtil.newXPathFactory(true);
     private final XPath xpath = .newXPath();
     private final DOMForest forest;
     private final ErrorReceiver errorReceiver;
 
 
     public Internalizer(DOMForest forestWsimportOptions optionsErrorReceiver errorReceiver) {
         this. = forest;
         this. = errorReceiver;
     }
 
     public void transform() {
         for (Element jaxwsBinding : .) {
             internalize(jaxwsBindingjaxwsBinding);
         }
     }

    
Validates attributes of a <JAXWS:bindings> element.
 
     private void validate(Element bindings) {
         NamedNodeMap atts = bindings.getAttributes();
        for (int i = 0; i < atts.getLength(); i++) {
            Attr a = (Attratts.item(i);
            if (a.getNamespaceURI() != null) {
                continue;   // all foreign namespace OK.
            }
            if (a.getLocalName().equals("node")) {
                continue;
            }
            if (a.getLocalName().equals("wsdlLocation")) {
                continue;
            }
            // TODO: flag error for this undefined attribute
        }
    }
    private void internalize(Element bindingsNode inheritedTarget) {
        // start by the inherited target
        Node target = inheritedTarget;
        validate(bindings); // validate this node
        // look for @wsdlLocation
        if (isTopLevelBinding(bindings)) {
            String wsdlLocation;
            if (bindings.getAttributeNode("wsdlLocation") != null) {
                wsdlLocation = bindings.getAttribute("wsdlLocation");
                try {
                    // absolutize this URI.
                    // TODO: use the URI class
                    // TODO: honor xml:base
                    wsdlLocation = new URL(new URL(.getSystemId(bindings.getOwnerDocument())),
                            wsdlLocation).toExternalForm();
                } catch (MalformedURLException e) {
                    wsdlLocation = JAXWSUtils.absolutize(JAXWSUtils.getFileOrURLName(wsdlLocation));
                }
            } else {
                //the node does not have
                wsdlLocation = .getFirstRootDocument();
            }
            target = .get(wsdlLocation);
            if (target == null) {
                reportError(bindings, WsdlMessages.INTERNALIZER_INCORRECT_SCHEMA_REFERENCE(wsdlLocation, EditDistance.findNearest(wsdlLocation.listSystemIDs())));
                return// abort processing this <JAXWS:bindings>
            }
        }
        //if the target node is xs:schema, declare the jaxb version on it as latter on it will be
        //required by the inlined schema bindings
        Element element = DOMUtil.getFirstElementChild(target);
        if (element != null && element.getNamespaceURI().equals(.) && element.getLocalName().equals("definitions")) {
            //get all schema elements
            Element type = DOMUtils.getFirstChildElement(element."types");
            if (type != null) {
                for (Element schemaElement : DOMUtils.getChildElements(type."schema")) {
                    if (!schemaElement.hasAttributeNS(."jaxb")) {
                        schemaElement.setAttributeNS(."xmlns:jaxb".);
                    }
                    //add jaxb:bindings version info. Lets put it to 1.0, may need to change latter
                    if (!schemaElement.hasAttributeNS(."version")) {
                        schemaElement.setAttributeNS(."jaxb:version".);
                    }
                }
            }
        }
        NodeList targetNodes = null;
        boolean hasNode = true;
        boolean isToplevelBinding = isTopLevelBinding(bindings);
        if ((isJAXWSBindings(bindings) || isJAXBBindings(bindings)) && bindings.getAttributeNode("node") != null) {
            targetNodes = evaluateXPathMultiNode(bindingstargetbindings.getAttribute("node"), new NamespaceContextImpl(bindings));
        } else
        if (isJAXWSBindings(bindings) && (bindings.getAttributeNode("node") == null) && !isToplevelBinding) {
            hasNode = false;
        } else
        if (isGlobalBinding(bindings) && !isWSDLDefinition(target) && isTopLevelBinding(bindings.getParentNode())) {
            targetNodes = getWSDLDefintionNode(bindingstarget);
        }
        //if target is null or empty it means the xpath evaluation has some problem,
        // just return
        if (targetNodes == null && hasNode && !isToplevelBinding) {
            return;
        }
        if (hasNode) {
            if (targetNodes != null) {
                for (int i = 0; i < targetNodes.getLength(); i++) {
                    insertBinding(bindingstargetNodes.item(i));
                    // look for child <JAXWS:bindings> and process them recursively
                    Element[] children = getChildElements(bindings);
                    for (Element child : children) {
                        if ("bindings".equals(child.getLocalName())) {
                            internalize(childtargetNodes.item(i));
                        }
                    }
                }
            }
        }
        if (targetNodes == null) {
            // look for child <JAXWS:bindings> and process them recursively
            Element[] children = getChildElements(bindings);
            for (Element child : children) {
                internalize(childtarget);
            }
        }
    }

    
Moves JAXWS customizations under their respective target nodes.
    private void insertBinding(@NotNull Element bindings, @NotNull Node target) {
        if ("bindings".equals(bindings.getLocalName())) {
            Element[] children = DOMUtils.getChildElements(bindings);
            for (Element item : children) {
                if ("bindings".equals(item.getLocalName())) {
                    //done
                } else {
                    moveUnder(item, (Elementtarget);
                }
            }
        } else {
            moveUnder(bindings, (Elementtarget);
        }
    }
    private NodeList getWSDLDefintionNode(Node bindingsNode target) {
        return evaluateXPathMultiNode(bindingstarget"wsdl:definitions",
                new NamespaceContext() {
                    @Override
                    public String getNamespaceURI(String prefix) {
                        return "http://schemas.xmlsoap.org/wsdl/";
                    }
                    @Override
                    public String getPrefix(String nsURI) {
                        throw new UnsupportedOperationException();
                    }
                    @Override
                    public Iterator getPrefixes(String namespaceURI) {
                        throw new UnsupportedOperationException();
                    }
                });
    }
    private boolean isWSDLDefinition(Node target) {
        if (target == null) {
            return false;
        }
        String localName = target.getLocalName();
        String nsURI = target.getNamespaceURI();
        return fixNull(localName).equals("definitions") && fixNull(nsURI).equals("http://schemas.xmlsoap.org/wsdl/");
    }
    private boolean isTopLevelBinding(Node node) {
        return node.getOwnerDocument().getDocumentElement() == node;
    }
    private boolean isJAXWSBindings(Node bindings) {
        return (bindings.getNamespaceURI().equals(.) && bindings.getLocalName().equals("bindings"));
    }
    private boolean isJAXBBindings(Node bindings) {
        return (bindings.getNamespaceURI().equals(.) && bindings.getLocalName().equals("bindings"));
    }
    private boolean isGlobalBinding(Node bindings) {
        if (bindings.getNamespaceURI() == null) {
            .warning(..getStartLocation((Elementbindings), WsdlMessages.INVALID_CUSTOMIZATION_NAMESPACE(bindings.getLocalName()));
            return false;
        }
        return (bindings.getNamespaceURI().equals(.) &&
                (bindings.getLocalName().equals("package") ||
                        bindings.getLocalName().equals("enableAsyncMapping") ||
                        bindings.getLocalName().equals("enableAdditionalSOAPHeaderMapping") ||
                        bindings.getLocalName().equals("enableWrapperStyle") ||
                        bindings.getLocalName().equals("enableMIMEContent")));
    }
    private static Element[] getChildElements(Element parent) {
        ArrayList<Elementa = new ArrayList<Element>();
        NodeList children = parent.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node item = children.item(i);
            if (!(item instanceof Element)) {
                continue;
            }
            if (..equals(item.getNamespaceURI()) ||
                    ..equals(item.getNamespaceURI())) {
                a.add((Elementitem);
            }
        }
        return a.toArray(new Element[a.size()]);
    }
    private NodeList evaluateXPathMultiNode(Node bindingsNode targetString expressionNamespaceContext namespaceContext) {
        NodeList nlst;
        try {
            .setNamespaceContext(namespaceContext);
            nlst = (NodeList.evaluate(expressiontarget.);
        } catch (XPathExpressionException e) {
            reportError((Elementbindings, WsdlMessages.INTERNALIZER_X_PATH_EVALUATION_ERROR(e.getMessage()), e);
            return null// abort processing this <jaxb:bindings>
        }
        if (nlst.getLength() == 0) {
            reportError((Elementbindings, WsdlMessages.INTERNALIZER_X_PATH_EVALUATES_TO_NO_TARGET(expression));
            return null// abort
        }
        return nlst;
    }
    private boolean isJAXBBindingElement(Element e) {
    }
    private boolean isJAXWSBindingElement(Element e) {
    }

    
Moves the "decl" node under the "target" node.

Parameters:
decl A JAXWS customization element (e.g., <JAXWS:class>)
target XML wsdl element under which the declaration should move. For example, <xs:element>
    private void moveUnder(Element declElement target) {
        //if there is @node on decl and has a child element jaxb:bindings, move it under the target
        //Element jaxb = getJAXBBindingElement(decl);
        if (isJAXBBindingElement(decl)) {
            //add jaxb namespace declaration
            if (!target.hasAttributeNS(."jaxb")) {
                target.setAttributeNS(."xmlns:jaxb".);
            }
            //add jaxb:bindings version info. Lets put it to 1.0, may need to change latter
            if (!target.hasAttributeNS(."version")) {
            }
            // HACK: allow XJC extension all the time. This allows people to specify
            // the <xjc:someExtension> in the external bindings. Otherwise users lack the ability
            // to specify jaxb:extensionBindingPrefixes, so it won't work.
            //
            // the current workaround is still problematic in the sense that
            // it can't support user-defined extensions. This needs more careful thought.
            //JAXB doesn't allow writing jaxb:extensionbindingPrefix anywhere other than root element so lets write only on <xs:schema>
            if (target.getLocalName().equals("schema") && target.getNamespaceURI().equals(.) && !target.hasAttributeNS(."extensionBindingPrefixes")) {
                target.setAttributeNS(."jaxb:extensionBindingPrefixes""xjc");
                target.setAttributeNS(."xmlns:xjc".);
            }
            //insert xs:annotation/xs:appinfo where in jaxb:binding will be put
            target = refineSchemaTarget(target);
            copyInscopeNSAttributes(decl);
        } else if (isJAXWSBindingElement(decl)) {
            //add jaxb namespace declaration
            if (!target.hasAttributeNS(."JAXWS")) {
                target.setAttributeNS(."xmlns:JAXWS".);
            }
            //insert xs:annotation/xs:appinfo where in jaxb:binding will be put
            target = refineWSDLTarget(target);
            copyInscopeNSAttributes(decl);
        } else {
            return;
        }
        // finally move the declaration to the target node.
        if (target.getOwnerDocument() != decl.getOwnerDocument()) {
            // if they belong to different DOM documents, we need to clone them
            decl = (Elementtarget.getOwnerDocument().importNode(decltrue);
        }
        target.appendChild(decl);
    }

    
Copy in-scope namespace declarations of the decl node to the decl node itself so that this move won't change the in-scope namespace bindings.
    private void copyInscopeNSAttributes(Element e) {
        Element p = e;
        Set<Stringinscopes = new HashSet<String>();
        while (true) {
            NamedNodeMap atts = p.getAttributes();
            for (int i = 0; i < atts.getLength(); i++) {
                Attr a = (Attratts.item(i);
                if (..equals(a.getNamespaceURI())) {
                    String prefix;
                    if (a.getName().indexOf(':') == -1) {
                        prefix = "";
                    } else {
                        prefix = a.getLocalName();
                    }
                    if (inscopes.add(prefix) && p != e) {
                        // if this is the first time we see this namespace bindings,
                        // copy the declaration.
                        // if p==decl, there's no need to. Note that
                        // we want to add prefix to inscopes even if p==Decl
                        e.setAttributeNodeNS((Attra.cloneNode(true));
                    }
                }
            }
            if (p.getParentNode() instanceof Document) {
                break;
            }
            p = (Elementp.getParentNode();
        }
        if (!inscopes.contains("")) {
            // if the default namespace was undeclared in the context of decl,
            // it must be explicitly set to "" since the new environment might
            // have a different default namespace URI.
            e.setAttributeNS(."xmlns""");
        }
    }
    public Element refineSchemaTarget(Element target) {
        // look for existing xs:annotation
        Element annotation = DOMUtils.getFirstChildElement(target."annotation");
        if (annotation == null) {
            // none exists. need to make one
            annotation = insertXMLSchemaElement(target"annotation");
        }
        // then look for appinfo
        Element appinfo = DOMUtils.getFirstChildElement(annotation."appinfo");
        if (appinfo == null) {
            // none exists. need to make one
            appinfo = insertXMLSchemaElement(annotation"appinfo");
        }
        return appinfo;
    }
    public Element refineWSDLTarget(Element target) {
        // look for existing xs:annotation
        Element JAXWSBindings = DOMUtils.getFirstChildElement(target."bindings");
        if (JAXWSBindings == null) {
            // none exists. need to make one
            JAXWSBindings = insertJAXWSBindingsElement(target"bindings");
        }
        return JAXWSBindings;
    }

    
Creates a new XML Schema element of the given local name and insert it as the first child of the given parent node.

Returns:
Newly create element.
    private Element insertXMLSchemaElement(Element parentString localName) {
        // use the same prefix as the parent node to avoid modifying
        // the namespace binding.
        String qname = parent.getTagName();
        int idx = qname.indexOf(':');
        if (idx == -1) {
            qname = localName;
        } else {
            qname = qname.substring(0, idx + 1) + localName;
        }
        Element child = parent.getOwnerDocument().createElementNS(.qname);
        NodeList children = parent.getChildNodes();
        if (children.getLength() == 0) {
            parent.appendChild(child);
        } else {
            parent.insertBefore(childchildren.item(0));
        }
        return child;
    }
    private Element insertJAXWSBindingsElement(Element parentString localName) {
        String qname = "JAXWS:" + localName;
        NodeList children = parent.getChildNodes();
        if (children.getLength() == 0) {
            parent.appendChild(child);
        } else {
            parent.insertBefore(childchildren.item(0));
        }
        return child;
    }
    @NotNull
    static String fixNull(@Nullable String s) {
        if (s == null) {
            return "";
        } else {
            return s;
        }
    }
    private void reportError(Element errorSourceString formattedMsg) {
        reportError(errorSourceformattedMsgnull);
    }
    private void reportError(Element errorSource,
                             String formattedMsgException nestedException) {
        SAXParseException e = new SAXParseException2(formattedMsg,
                ..getStartLocation(errorSource),
                nestedException);
        .error(e);
    }
New to GrepCode? Check out our FAQ X