|
Java example source code file (Internalizer.java)
The Internalizer.java Java example source code/* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.internal.ws.wsdl.parser; import com.sun.istack.internal.NotNull; import com.sun.istack.internal.Nullable; import com.sun.istack.internal.SAXParseException2; import com.sun.tools.internal.ws.resources.WsdlMessages; import com.sun.tools.internal.ws.wscompile.ErrorReceiver; import com.sun.tools.internal.ws.wscompile.WsimportOptions; import com.sun.tools.internal.ws.wsdl.document.jaxws.JAXWSBindingsConstants; import com.sun.tools.internal.xjc.util.DOMUtils; import com.sun.xml.internal.bind.v2.util.EditDistance; import com.sun.xml.internal.ws.util.DOMUtil; import com.sun.xml.internal.ws.util.JAXWSUtils; import com.sun.xml.internal.ws.util.xml.XmlUtil; import org.w3c.dom.*; import org.xml.sax.SAXParseException; import javax.xml.namespace.NamespaceContext; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * Internalizes external binding declarations. * * @author Vivek Pandey */ public class Internalizer { private static final XPathFactory xpf = XmlUtil.newXPathFactory(true); private final XPath xpath = xpf.newXPath(); private final DOMForest forest; private final ErrorReceiver errorReceiver; public Internalizer(DOMForest forest, WsimportOptions options, ErrorReceiver errorReceiver) { this.forest = forest; this.errorReceiver = errorReceiver; } public void transform() { for (Element jaxwsBinding : forest.outerMostBindings) { internalize(jaxwsBinding, jaxwsBinding); } } /** * 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 = (Attr) atts.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 bindings, Node 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(forest.getSystemId(bindings.getOwnerDocument())), wsdlLocation).toExternalForm(); } catch (MalformedURLException e) { wsdlLocation = JAXWSUtils.absolutize(JAXWSUtils.getFileOrURLName(wsdlLocation)); } } else { //the node does not have wsdlLocation = forest.getFirstRootDocument(); } target = forest.get(wsdlLocation); if (target == null) { reportError(bindings, WsdlMessages.INTERNALIZER_INCORRECT_SCHEMA_REFERENCE(wsdlLocation, EditDistance.findNearest(wsdlLocation, forest.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(Constants.NS_WSDL) && element.getLocalName().equals("definitions")) { //get all schema elements Element type = DOMUtils.getFirstChildElement(element, Constants.NS_WSDL, "types"); if (type != null) { for (Element schemaElement : DOMUtils.getChildElements(type, Constants.NS_XSD, "schema")) { if (!schemaElement.hasAttributeNS(Constants.NS_XMLNS, "jaxb")) { schemaElement.setAttributeNS(Constants.NS_XMLNS, "xmlns:jaxb", JAXWSBindingsConstants.NS_JAXB_BINDINGS); } //add jaxb:bindings version info. Lets put it to 1.0, may need to change latter if (!schemaElement.hasAttributeNS(JAXWSBindingsConstants.NS_JAXB_BINDINGS, "version")) { schemaElement.setAttributeNS(JAXWSBindingsConstants.NS_JAXB_BINDINGS, "jaxb:version", JAXWSBindingsConstants.JAXB_BINDING_VERSION); } } } } NodeList targetNodes = null; boolean hasNode = true; boolean isToplevelBinding = isTopLevelBinding(bindings); if ((isJAXWSBindings(bindings) || isJAXBBindings(bindings)) && bindings.getAttributeNode("node") != null) { targetNodes = evaluateXPathMultiNode(bindings, target, bindings.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(bindings, target); } //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(bindings, targetNodes.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(child, targetNodes.item(i)); } } } } } if (targetNodes == null) { // look for child <JAXWS:bindings> and process them recursively Element[] children = getChildElements(bindings); for (Element child : children) { internalize(child, target); } } } /** * 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, (Element) target); } } } else { moveUnder(bindings, (Element) target); } } private NodeList getWSDLDefintionNode(Node bindings, Node target) { return evaluateXPathMultiNode(bindings, target, "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(JAXWSBindingsConstants.NS_JAXWS_BINDINGS) && bindings.getLocalName().equals("bindings")); } private boolean isJAXBBindings(Node bindings) { return (bindings.getNamespaceURI().equals(JAXWSBindingsConstants.NS_JAXB_BINDINGS) && bindings.getLocalName().equals("bindings")); } private boolean isGlobalBinding(Node bindings) { if (bindings.getNamespaceURI() == null) { errorReceiver.warning(forest.locatorTable.getStartLocation((Element) bindings), WsdlMessages.INVALID_CUSTOMIZATION_NAMESPACE(bindings.getLocalName())); return false; } return (bindings.getNamespaceURI().equals(JAXWSBindingsConstants.NS_JAXWS_BINDINGS) && (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<Element> a = new ArrayList Other Java examples (source code examples)Here is a short list of links related to this Java Internalizer.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.