aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.xml.internal.ws.transport.http; aoqi@0: aoqi@0: import com.oracle.webservices.internal.api.databinding.DatabindingModeFeature; aoqi@0: import com.oracle.webservices.internal.api.databinding.ExternalMetadataFeature; aoqi@0: import com.sun.istack.internal.NotNull; aoqi@0: import com.sun.xml.internal.ws.api.BindingID; aoqi@0: import com.sun.xml.internal.ws.api.WSBinding; aoqi@0: import com.sun.xml.internal.ws.api.databinding.MetadataReader; aoqi@0: import com.sun.xml.internal.ws.api.server.Container; aoqi@0: import com.sun.xml.internal.ws.api.server.SDDocumentSource; aoqi@0: import com.sun.xml.internal.ws.api.server.WSEndpoint; aoqi@0: import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory; aoqi@0: import com.sun.xml.internal.ws.binding.WebServiceFeatureList; aoqi@0: aoqi@0: import com.sun.xml.internal.ws.handler.HandlerChainsModel; aoqi@0: import com.sun.xml.internal.ws.resources.ServerMessages; aoqi@0: import com.sun.xml.internal.ws.resources.WsservletMessages; aoqi@0: import com.sun.xml.internal.ws.server.EndpointFactory; aoqi@0: import com.sun.xml.internal.ws.server.ServerRtException; aoqi@0: import com.sun.xml.internal.ws.streaming.Attributes; aoqi@0: import com.sun.xml.internal.ws.streaming.TidyXMLStreamReader; aoqi@0: import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil; aoqi@0: import com.sun.xml.internal.ws.util.HandlerAnnotationInfo; aoqi@0: import com.sun.xml.internal.ws.util.exception.LocatableWebServiceException; aoqi@0: import com.sun.xml.internal.ws.util.xml.XmlUtil; aoqi@0: import org.xml.sax.EntityResolver; aoqi@0: aoqi@0: import javax.xml.namespace.QName; aoqi@0: import javax.xml.stream.XMLStreamConstants; aoqi@0: import javax.xml.stream.XMLStreamException; aoqi@0: import javax.xml.stream.XMLStreamReader; aoqi@0: import javax.xml.ws.WebServiceException; aoqi@0: import javax.xml.ws.WebServiceFeature; aoqi@0: import javax.xml.ws.http.HTTPBinding; aoqi@0: import javax.xml.ws.soap.MTOMFeature; aoqi@0: import javax.xml.ws.soap.SOAPBinding; aoqi@0: import java.io.File; aoqi@0: import java.io.FileInputStream; aoqi@0: import java.io.IOException; aoqi@0: import java.io.InputStream; aoqi@0: import java.net.MalformedURLException; aoqi@0: import java.net.URL; aoqi@0: import java.util.ArrayList; aoqi@0: import java.util.Arrays; aoqi@0: import java.util.HashMap; aoqi@0: import java.util.HashSet; aoqi@0: import java.util.List; aoqi@0: import java.util.Map; aoqi@0: import java.util.Set; aoqi@0: import java.util.logging.Level; aoqi@0: import java.util.logging.Logger; aoqi@0: aoqi@0: /** aoqi@0: * Parses {@code sun-jaxws.xml} into {@link WSEndpoint}. aoqi@0: *

aoqi@0: *

aoqi@0: * Since {@code sun-jaxws.xml} captures more information than what {@link WSEndpoint} aoqi@0: * represents (in particular URL pattern and name), this class aoqi@0: * takes a parameterization 'A' so that the user of this parser can choose to aoqi@0: * create another type that wraps {@link WSEndpoint}. aoqi@0: *

aoqi@0: * {@link HttpAdapter} and its derived type is used for this often, aoqi@0: * but it can be anything. aoqi@0: * aoqi@0: * @author WS Development Team aoqi@0: * @author Kohsuke Kawaguchi aoqi@0: */ aoqi@0: public class DeploymentDescriptorParser { aoqi@0: aoqi@0: public static final String NS_RUNTIME = "http://java.sun.com/xml/ns/jax-ws/ri/runtime"; aoqi@0: public static final String JAXWS_WSDL_DD_DIR = "WEB-INF/wsdl"; aoqi@0: aoqi@0: public static final QName QNAME_ENDPOINTS = new QName(NS_RUNTIME, "endpoints"); aoqi@0: public static final QName QNAME_ENDPOINT = new QName(NS_RUNTIME, "endpoint"); aoqi@0: public static final QName QNAME_EXT_METADA = new QName(NS_RUNTIME, "external-metadata"); aoqi@0: aoqi@0: public static final String ATTR_FILE = "file"; aoqi@0: public static final String ATTR_RESOURCE = "resource"; aoqi@0: aoqi@0: public static final String ATTR_VERSION = "version"; aoqi@0: public static final String ATTR_NAME = "name"; aoqi@0: public static final String ATTR_IMPLEMENTATION = "implementation"; aoqi@0: public static final String ATTR_WSDL = "wsdl"; aoqi@0: public static final String ATTR_SERVICE = "service"; aoqi@0: public static final String ATTR_PORT = "port"; aoqi@0: public static final String ATTR_URL_PATTERN = "url-pattern"; aoqi@0: public static final String ATTR_ENABLE_MTOM = "enable-mtom"; aoqi@0: public static final String ATTR_MTOM_THRESHOLD_VALUE = "mtom-threshold-value"; aoqi@0: public static final String ATTR_BINDING = "binding"; aoqi@0: public static final String ATTR_DATABINDING = "databinding"; aoqi@0: aoqi@0: public static final List ATTRVALUE_SUPPORTED_VERSIONS = Arrays.asList("2.0", "2.1"); aoqi@0: aoqi@0: private static final Logger logger = Logger.getLogger(com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.http"); aoqi@0: aoqi@0: private final Container container; aoqi@0: private final ClassLoader classLoader; aoqi@0: private final ResourceLoader loader; aoqi@0: private final AdapterFactory adapterFactory; aoqi@0: aoqi@0: /** aoqi@0: * Endpoint names that are declared. aoqi@0: * Used to catch double definitions. aoqi@0: */ aoqi@0: private final Set names = new HashSet(); aoqi@0: aoqi@0: /** aoqi@0: * WSDL/schema documents collected from /WEB-INF/wsdl. Keyed by the system ID. aoqi@0: */ aoqi@0: private final Map docs = new HashMap(); aoqi@0: aoqi@0: /** aoqi@0: * @param cl Used to load service implementations. aoqi@0: * @param loader Used to locate resources, in particular WSDL. aoqi@0: * @param container Optional {@link Container} that {@link WSEndpoint}s receive. aoqi@0: * @param adapterFactory Creates {@link HttpAdapter} (or its derived class.) aoqi@0: */ aoqi@0: public DeploymentDescriptorParser(ClassLoader cl, ResourceLoader loader, Container container, aoqi@0: AdapterFactory adapterFactory) throws MalformedURLException { aoqi@0: classLoader = cl; aoqi@0: this.loader = loader; aoqi@0: this.container = container; aoqi@0: this.adapterFactory = adapterFactory; aoqi@0: aoqi@0: collectDocs("/WEB-INF/wsdl/"); aoqi@0: logger.log(Level.FINE, "war metadata={0}", docs); aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Parses the {@code sun-jaxws.xml} file and configures aoqi@0: * a set of {@link HttpAdapter}s. aoqi@0: */ aoqi@0: public @NotNull List parse(String systemId, InputStream is) { aoqi@0: XMLStreamReader reader = null; aoqi@0: try { aoqi@0: reader = new TidyXMLStreamReader( aoqi@0: XMLStreamReaderFactory.create(systemId, is, true), is); aoqi@0: XMLStreamReaderUtil.nextElementContent(reader); aoqi@0: return parseAdapters(reader); aoqi@0: } finally { aoqi@0: if (reader != null) { aoqi@0: try { aoqi@0: reader.close(); aoqi@0: } catch (XMLStreamException e) { aoqi@0: throw new ServerRtException("runtime.parser.xmlReader", e); aoqi@0: } aoqi@0: } aoqi@0: try { aoqi@0: is.close(); aoqi@0: } catch (IOException e) { aoqi@0: // ignore aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Parses the {@code sun-jaxws.xml} file and configures aoqi@0: * a set of {@link HttpAdapter}s. aoqi@0: */ aoqi@0: public @NotNull List parse(File f) throws IOException { aoqi@0: FileInputStream in = new FileInputStream(f); aoqi@0: try { aoqi@0: return parse(f.getPath(), in); aoqi@0: } finally { aoqi@0: in.close(); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Get all the WSDL & schema documents recursively. aoqi@0: */ aoqi@0: private void collectDocs(String dirPath) throws MalformedURLException { aoqi@0: Set paths = loader.getResourcePaths(dirPath); aoqi@0: if (paths != null) { aoqi@0: for (String path : paths) { aoqi@0: if (path.endsWith("/")) { aoqi@0: if (path.endsWith("/CVS/") || path.endsWith("/.svn/")) { aoqi@0: continue; aoqi@0: } aoqi@0: collectDocs(path); aoqi@0: } else { aoqi@0: URL res = loader.getResource(path); aoqi@0: docs.put(res.toString(), SDDocumentSource.create(res)); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: aoqi@0: private List parseAdapters(XMLStreamReader reader) { aoqi@0: if (!reader.getName().equals(QNAME_ENDPOINTS)) { aoqi@0: failWithFullName("runtime.parser.invalidElement", reader); aoqi@0: } aoqi@0: aoqi@0: List adapters = new ArrayList(); aoqi@0: aoqi@0: Attributes attrs = XMLStreamReaderUtil.getAttributes(reader); aoqi@0: String version = getMandatoryNonEmptyAttribute(reader, attrs, ATTR_VERSION); aoqi@0: if (!ATTRVALUE_SUPPORTED_VERSIONS.contains(version)) { aoqi@0: failWithLocalName("runtime.parser.invalidVersionNumber", reader, version); aoqi@0: } aoqi@0: aoqi@0: while (XMLStreamReaderUtil.nextElementContent(reader) != XMLStreamConstants.END_ELEMENT) { aoqi@0: aoqi@0: if (reader.getName().equals(QNAME_ENDPOINT)) { aoqi@0: attrs = XMLStreamReaderUtil.getAttributes(reader); aoqi@0: aoqi@0: String name = getMandatoryNonEmptyAttribute(reader, attrs, ATTR_NAME); aoqi@0: if (!names.add(name)) { aoqi@0: logger.warning( aoqi@0: WsservletMessages.SERVLET_WARNING_DUPLICATE_ENDPOINT_NAME(/*name*/)); aoqi@0: } aoqi@0: aoqi@0: String implementationName = aoqi@0: getMandatoryNonEmptyAttribute(reader, attrs, ATTR_IMPLEMENTATION); aoqi@0: Class implementorClass = getImplementorClass(implementationName, reader); aoqi@0: aoqi@0: MetadataReader metadataReader = null; aoqi@0: ExternalMetadataFeature externalMetadataFeature = null; aoqi@0: aoqi@0: // parse subelements to instantiate externalMetadataReader, if necessary ... aoqi@0: XMLStreamReaderUtil.nextElementContent(reader); aoqi@0: if (reader.getEventType() != XMLStreamConstants.END_ELEMENT) { aoqi@0: externalMetadataFeature = configureExternalMetadataReader(reader); aoqi@0: if (externalMetadataFeature != null) { aoqi@0: metadataReader = externalMetadataFeature.getMetadataReader(implementorClass.getClassLoader(), false); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: QName serviceName = getQNameAttribute(attrs, ATTR_SERVICE); aoqi@0: if (serviceName == null) { aoqi@0: serviceName = EndpointFactory.getDefaultServiceName(implementorClass, metadataReader); aoqi@0: } aoqi@0: aoqi@0: QName portName = getQNameAttribute(attrs, ATTR_PORT); aoqi@0: if (portName == null) { aoqi@0: portName = EndpointFactory.getDefaultPortName(serviceName, implementorClass, metadataReader); aoqi@0: } aoqi@0: aoqi@0: //get enable-mtom attribute value aoqi@0: String enable_mtom = getAttribute(attrs, ATTR_ENABLE_MTOM); aoqi@0: String mtomThreshold = getAttribute(attrs, ATTR_MTOM_THRESHOLD_VALUE); aoqi@0: String dbMode = getAttribute(attrs, ATTR_DATABINDING); aoqi@0: String bindingId = getAttribute(attrs, ATTR_BINDING); aoqi@0: if (bindingId != null) { aoqi@0: // Convert short-form tokens to API's binding ids aoqi@0: bindingId = getBindingIdForToken(bindingId); aoqi@0: } aoqi@0: WSBinding binding = createBinding(bindingId, implementorClass, enable_mtom, mtomThreshold, dbMode); aoqi@0: if (externalMetadataFeature != null) { aoqi@0: binding.getFeatures().mergeFeatures(new WebServiceFeature[]{externalMetadataFeature}, aoqi@0: true); aoqi@0: } aoqi@0: aoqi@0: String urlPattern = getMandatoryNonEmptyAttribute(reader, attrs, ATTR_URL_PATTERN); aoqi@0: aoqi@0: // TODO use 'docs' as the metadata. If wsdl is non-null it's the primary. aoqi@0: boolean handlersSetInDD = setHandlersAndRoles(binding, reader, serviceName, portName); aoqi@0: aoqi@0: EndpointFactory.verifyImplementorClass(implementorClass, metadataReader); aoqi@0: SDDocumentSource primaryWSDL = getPrimaryWSDL(reader, attrs, implementorClass, metadataReader); aoqi@0: aoqi@0: WSEndpoint endpoint = WSEndpoint.create( aoqi@0: implementorClass, !handlersSetInDD, aoqi@0: null, aoqi@0: serviceName, portName, container, binding, aoqi@0: primaryWSDL, docs.values(), createEntityResolver(), false aoqi@0: ); aoqi@0: adapters.add(adapterFactory.createAdapter(name, urlPattern, endpoint)); aoqi@0: } else { aoqi@0: failWithLocalName("runtime.parser.invalidElement", reader); aoqi@0: } aoqi@0: } aoqi@0: return adapters; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * @param ddBindingId binding id explicitlyspecified in the DeploymentDescriptor or parameter aoqi@0: * @param implClass Endpoint Implementation class aoqi@0: * @param mtomEnabled represents mtom-enabled attribute in DD aoqi@0: * @param mtomThreshold threshold value specified in DD aoqi@0: * @return is returned with only MTOMFeature set resolving the various precendece rules aoqi@0: */ aoqi@0: private static WSBinding createBinding(String ddBindingId, Class implClass, aoqi@0: String mtomEnabled, String mtomThreshold, String dataBindingMode) { aoqi@0: // Features specified through DD aoqi@0: WebServiceFeatureList features; aoqi@0: aoqi@0: MTOMFeature mtomfeature = null; aoqi@0: if (mtomEnabled != null) { aoqi@0: if (mtomThreshold != null) { aoqi@0: mtomfeature = new MTOMFeature(Boolean.valueOf(mtomEnabled), aoqi@0: Integer.valueOf(mtomThreshold)); aoqi@0: } else { aoqi@0: mtomfeature = new MTOMFeature(Boolean.valueOf(mtomEnabled)); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: BindingID bindingID; aoqi@0: if (ddBindingId != null) { aoqi@0: bindingID = BindingID.parse(ddBindingId); aoqi@0: features = bindingID.createBuiltinFeatureList(); aoqi@0: aoqi@0: if (checkMtomConflict(features.get(MTOMFeature.class), mtomfeature)) { aoqi@0: throw new ServerRtException(ServerMessages.DD_MTOM_CONFLICT(ddBindingId, mtomEnabled)); aoqi@0: } aoqi@0: } else { aoqi@0: bindingID = BindingID.parse(implClass); aoqi@0: // Since bindingID is coming from implclass, aoqi@0: // mtom through Feature annotation or DD takes precendece aoqi@0: aoqi@0: features = new WebServiceFeatureList(); aoqi@0: if (mtomfeature != null) { // this wins over MTOM setting in bindingID aoqi@0: features.add(mtomfeature); aoqi@0: } aoqi@0: features.addAll(bindingID.createBuiltinFeatureList()); aoqi@0: } aoqi@0: aoqi@0: if (dataBindingMode != null) { aoqi@0: features.add(new DatabindingModeFeature(dataBindingMode)); aoqi@0: } aoqi@0: aoqi@0: return bindingID.createBinding(features.toArray()); aoqi@0: } aoqi@0: aoqi@0: private static boolean checkMtomConflict(MTOMFeature lhs, MTOMFeature rhs) { aoqi@0: if (lhs == null || rhs == null) { aoqi@0: return false; aoqi@0: } aoqi@0: return lhs.isEnabled() ^ rhs.isEnabled(); aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * JSR-109 defines short-form tokens for standard binding Ids. These are aoqi@0: * used only in DD. So stand alone deployment descirptor should also honor aoqi@0: * these tokens. This method converts the tokens to API's standard aoqi@0: * binding ids aoqi@0: * aoqi@0: * @param lexical binding attribute value from DD. Always not null aoqi@0: * @return returns corresponding API's binding ID or the same lexical aoqi@0: */ aoqi@0: public static @NotNull String getBindingIdForToken(@NotNull String lexical) { aoqi@0: if (lexical.equals("##SOAP11_HTTP")) { aoqi@0: return SOAPBinding.SOAP11HTTP_BINDING; aoqi@0: } else if (lexical.equals("##SOAP11_HTTP_MTOM")) { aoqi@0: return SOAPBinding.SOAP11HTTP_MTOM_BINDING; aoqi@0: } else if (lexical.equals("##SOAP12_HTTP")) { aoqi@0: return SOAPBinding.SOAP12HTTP_BINDING; aoqi@0: } else if (lexical.equals("##SOAP12_HTTP_MTOM")) { aoqi@0: return SOAPBinding.SOAP12HTTP_MTOM_BINDING; aoqi@0: } else if (lexical.equals("##XML_HTTP")) { aoqi@0: return HTTPBinding.HTTP_BINDING; aoqi@0: } aoqi@0: return lexical; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Creates a new "Adapter". aoqi@0: *

aoqi@0: * Normally 'A' would be {@link HttpAdapter} or some derived class. aoqi@0: * But the parser doesn't require that to be of any particular type. aoqi@0: */ aoqi@0: public static interface AdapterFactory { aoqi@0: A createAdapter(String name, String urlPattern, WSEndpoint endpoint); aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Checks the deployment descriptor or {@link @WebServiceProvider} annotation aoqi@0: * to see if it points to any WSDL. If so, returns the {@link SDDocumentSource}. aoqi@0: * aoqi@0: * @return The pointed WSDL, if any. Otherwise null. aoqi@0: */ aoqi@0: private SDDocumentSource getPrimaryWSDL(XMLStreamReader xsr, Attributes attrs, Class implementorClass, MetadataReader metadataReader) { aoqi@0: aoqi@0: String wsdlFile = getAttribute(attrs, ATTR_WSDL); aoqi@0: if (wsdlFile == null) { aoqi@0: wsdlFile = EndpointFactory.getWsdlLocation(implementorClass, metadataReader); aoqi@0: } aoqi@0: aoqi@0: if (wsdlFile != null) { aoqi@0: if (!wsdlFile.startsWith(JAXWS_WSDL_DD_DIR)) { aoqi@0: logger.log(Level.WARNING, "Ignoring wrong wsdl={0}. It should start with {1}. Going to generate and publish a new WSDL.", new Object[]{wsdlFile, JAXWS_WSDL_DD_DIR}); aoqi@0: return null; aoqi@0: } aoqi@0: aoqi@0: URL wsdl; aoqi@0: try { aoqi@0: wsdl = loader.getResource('/' + wsdlFile); aoqi@0: } catch (MalformedURLException e) { aoqi@0: throw new LocatableWebServiceException( aoqi@0: ServerMessages.RUNTIME_PARSER_WSDL_NOT_FOUND(wsdlFile), e, xsr); aoqi@0: } aoqi@0: if (wsdl == null) { aoqi@0: throw new LocatableWebServiceException( aoqi@0: ServerMessages.RUNTIME_PARSER_WSDL_NOT_FOUND(wsdlFile), xsr); aoqi@0: } aoqi@0: SDDocumentSource docInfo = docs.get(wsdl.toExternalForm()); aoqi@0: assert docInfo != null; aoqi@0: return docInfo; aoqi@0: } aoqi@0: aoqi@0: return null; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Creates an {@link EntityResolver} that consults {@code /WEB-INF/jax-ws-catalog.xml}. aoqi@0: */ aoqi@0: private EntityResolver createEntityResolver() { aoqi@0: try { aoqi@0: return XmlUtil.createEntityResolver(loader.getCatalogFile()); aoqi@0: } catch (MalformedURLException e) { aoqi@0: throw new WebServiceException(e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: protected String getAttribute(Attributes attrs, String name) { aoqi@0: String value = attrs.getValue(name); aoqi@0: if (value != null) { aoqi@0: value = value.trim(); aoqi@0: } aoqi@0: return value; aoqi@0: } aoqi@0: aoqi@0: protected QName getQNameAttribute(Attributes attrs, String name) { aoqi@0: String value = getAttribute(attrs, name); aoqi@0: if (value == null || value.equals("")) { aoqi@0: return null; aoqi@0: } else { aoqi@0: return QName.valueOf(value); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: protected String getNonEmptyAttribute(XMLStreamReader reader, Attributes attrs, String name) { aoqi@0: String value = getAttribute(attrs, name); aoqi@0: if (value != null && value.equals("")) { aoqi@0: failWithLocalName( aoqi@0: "runtime.parser.invalidAttributeValue", aoqi@0: reader, aoqi@0: name); aoqi@0: } aoqi@0: return value; aoqi@0: } aoqi@0: aoqi@0: protected String getMandatoryAttribute(XMLStreamReader reader, Attributes attrs, String name) { aoqi@0: String value = getAttribute(attrs, name); aoqi@0: if (value == null) { aoqi@0: failWithLocalName("runtime.parser.missing.attribute", reader, name); aoqi@0: } aoqi@0: return value; aoqi@0: } aoqi@0: aoqi@0: protected String getMandatoryNonEmptyAttribute(XMLStreamReader reader, Attributes attributes, aoqi@0: String name) { aoqi@0: String value = getAttribute(attributes, name); aoqi@0: if (value == null) { aoqi@0: failWithLocalName("runtime.parser.missing.attribute", reader, name); aoqi@0: } else if (value.equals("")) { aoqi@0: failWithLocalName( aoqi@0: "runtime.parser.invalidAttributeValue", aoqi@0: reader, aoqi@0: name); aoqi@0: } aoqi@0: return value; aoqi@0: } aoqi@0: aoqi@0: /** aoqi@0: * Parses the handler and role information and sets it aoqi@0: * on the {@link WSBinding}. aoqi@0: * aoqi@0: * @return true if element present in DD aoqi@0: * false otherwise. aoqi@0: */ aoqi@0: protected boolean setHandlersAndRoles(WSBinding binding, XMLStreamReader reader, QName serviceName, QName portName) { aoqi@0: aoqi@0: if (reader.getEventType() == XMLStreamConstants.END_ELEMENT || aoqi@0: !reader.getName().equals(HandlerChainsModel.QNAME_HANDLER_CHAINS)) { aoqi@0: return false; aoqi@0: } aoqi@0: aoqi@0: HandlerAnnotationInfo handlerInfo = HandlerChainsModel.parseHandlerFile( aoqi@0: reader, classLoader, serviceName, portName, binding); aoqi@0: aoqi@0: binding.setHandlerChain(handlerInfo.getHandlers()); aoqi@0: if (binding instanceof SOAPBinding) { aoqi@0: ((SOAPBinding) binding).setRoles(handlerInfo.getRoles()); aoqi@0: } aoqi@0: aoqi@0: // move past aoqi@0: XMLStreamReaderUtil.nextContent(reader); aoqi@0: return true; aoqi@0: } aoqi@0: aoqi@0: protected ExternalMetadataFeature configureExternalMetadataReader(XMLStreamReader reader) { aoqi@0: aoqi@0: ExternalMetadataFeature.Builder featureBuilder = null; aoqi@0: while (QNAME_EXT_METADA.equals(reader.getName())) { aoqi@0: aoqi@0: if (reader.getEventType() == XMLStreamConstants.START_ELEMENT) { aoqi@0: Attributes attrs = XMLStreamReaderUtil.getAttributes(reader); aoqi@0: String file = getAttribute(attrs, ATTR_FILE); aoqi@0: if (file != null) { aoqi@0: if (featureBuilder == null) { aoqi@0: featureBuilder = ExternalMetadataFeature.builder(); aoqi@0: } aoqi@0: featureBuilder.addFiles(new File(file)); aoqi@0: } aoqi@0: aoqi@0: String res = getAttribute(attrs, ATTR_RESOURCE); aoqi@0: if (res != null) { aoqi@0: if (featureBuilder == null) { aoqi@0: featureBuilder = ExternalMetadataFeature.builder(); aoqi@0: } aoqi@0: featureBuilder.addResources(res); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: XMLStreamReaderUtil.nextElementContent(reader); aoqi@0: } aoqi@0: aoqi@0: return buildFeature(featureBuilder); aoqi@0: } aoqi@0: aoqi@0: private ExternalMetadataFeature buildFeature(ExternalMetadataFeature.Builder builder) { aoqi@0: return builder != null ? builder.build() : null; aoqi@0: } aoqi@0: aoqi@0: protected static void fail(String key, XMLStreamReader reader) { aoqi@0: logger.log(Level.SEVERE, "{0}{1}", new Object[]{key, reader.getLocation().getLineNumber()}); aoqi@0: throw new ServerRtException( aoqi@0: key, aoqi@0: Integer.toString(reader.getLocation().getLineNumber())); aoqi@0: } aoqi@0: aoqi@0: protected static void failWithFullName(String key, XMLStreamReader reader) { aoqi@0: throw new ServerRtException( aoqi@0: key, aoqi@0: reader.getLocation().getLineNumber(), aoqi@0: reader.getName()); aoqi@0: } aoqi@0: aoqi@0: protected static void failWithLocalName(String key, XMLStreamReader reader) { aoqi@0: throw new ServerRtException( aoqi@0: key, aoqi@0: reader.getLocation().getLineNumber(), aoqi@0: reader.getLocalName()); aoqi@0: } aoqi@0: aoqi@0: protected static void failWithLocalName(String key, XMLStreamReader reader, String arg) { aoqi@0: throw new ServerRtException( aoqi@0: key, aoqi@0: reader.getLocation().getLineNumber(), aoqi@0: reader.getLocalName(), aoqi@0: arg); aoqi@0: } aoqi@0: aoqi@0: protected Class loadClass(String name) { aoqi@0: try { aoqi@0: return Class.forName(name, true, classLoader); aoqi@0: } catch (ClassNotFoundException e) { aoqi@0: logger.log(Level.SEVERE, e.getMessage(), e); aoqi@0: throw new ServerRtException( aoqi@0: "runtime.parser.classNotFound", aoqi@0: name); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: aoqi@0: /** aoqi@0: * Loads the class of the given name. aoqi@0: * aoqi@0: * @param xsr Used to report the source location information if there's any error. aoqi@0: */ aoqi@0: private Class getImplementorClass(String name, XMLStreamReader xsr) { aoqi@0: try { aoqi@0: return Class.forName(name, true, classLoader); aoqi@0: } catch (ClassNotFoundException e) { aoqi@0: logger.log(Level.SEVERE, e.getMessage(), e); aoqi@0: throw new LocatableWebServiceException( aoqi@0: ServerMessages.RUNTIME_PARSER_CLASS_NOT_FOUND(name), e, xsr); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: }