325N/A/*
325N/A * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
325N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
325N/A *
325N/A * This code is free software; you can redistribute it and/or modify it
325N/A * under the terms of the GNU General Public License version 2 only, as
325N/A * published by the Free Software Foundation. Oracle designates this
325N/A * particular file as subject to the "Classpath" exception as provided
325N/A * by Oracle in the LICENSE file that accompanied this code.
325N/A *
325N/A * This code is distributed in the hope that it will be useful, but WITHOUT
325N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
325N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
325N/A * version 2 for more details (a copy is included in the LICENSE file that
325N/A * accompanied this code).
325N/A *
325N/A * You should have received a copy of the GNU General Public License version
325N/A * 2 along with this work; if not, write to the Free Software Foundation,
325N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
325N/A *
325N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
325N/A * or visit www.oracle.com if you need additional information or have any
325N/A * questions.
325N/A */
325N/A
325N/Apackage com.sun.xml.internal.ws.transport.http;
325N/A
325N/Aimport com.sun.istack.internal.NotNull;
325N/Aimport com.sun.xml.internal.ws.api.BindingID;
325N/Aimport com.sun.xml.internal.ws.api.WSBinding;
325N/Aimport com.sun.xml.internal.ws.api.message.Packet;
325N/Aimport com.sun.xml.internal.ws.api.server.Container;
325N/Aimport com.sun.xml.internal.ws.api.server.SDDocumentSource;
325N/Aimport com.sun.xml.internal.ws.api.server.WSEndpoint;
325N/Aimport com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory;
325N/Aimport com.sun.xml.internal.ws.binding.WebServiceFeatureList;
325N/Aimport com.sun.xml.internal.ws.handler.HandlerChainsModel;
325N/Aimport com.sun.xml.internal.ws.resources.ServerMessages;
325N/Aimport com.sun.xml.internal.ws.resources.WsservletMessages;
325N/Aimport com.sun.xml.internal.ws.server.EndpointFactory;
325N/Aimport com.sun.xml.internal.ws.server.ServerRtException;
325N/Aimport com.sun.xml.internal.ws.streaming.Attributes;
325N/Aimport com.sun.xml.internal.ws.streaming.TidyXMLStreamReader;
325N/Aimport com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil;
325N/Aimport com.sun.xml.internal.ws.util.HandlerAnnotationInfo;
325N/Aimport com.sun.xml.internal.ws.util.exception.LocatableWebServiceException;
325N/Aimport com.sun.xml.internal.ws.util.xml.XmlUtil;
325N/Aimport org.xml.sax.EntityResolver;
325N/A
325N/Aimport javax.xml.namespace.QName;
325N/Aimport javax.xml.stream.XMLStreamConstants;
325N/Aimport javax.xml.stream.XMLStreamException;
325N/Aimport javax.xml.stream.XMLStreamReader;
325N/Aimport javax.xml.ws.WebServiceException;
325N/Aimport javax.xml.ws.http.HTTPBinding;
325N/Aimport javax.xml.ws.soap.MTOMFeature;
325N/Aimport javax.xml.ws.soap.SOAPBinding;
325N/Aimport java.io.File;
325N/Aimport java.io.FileInputStream;
325N/Aimport java.io.IOException;
325N/Aimport java.io.InputStream;
325N/Aimport java.net.MalformedURLException;
325N/Aimport java.net.URL;
325N/Aimport java.util.ArrayList;
325N/Aimport java.util.HashMap;
325N/Aimport java.util.HashSet;
325N/Aimport java.util.List;
325N/Aimport java.util.Map;
325N/Aimport java.util.Set;
325N/Aimport java.util.logging.Level;
325N/Aimport java.util.logging.Logger;
325N/A
325N/A/**
325N/A * Parses {@code sun-jaxws.xml} into {@link WSEndpoint}.
325N/A *
325N/A * <p>
325N/A * Since {@code sun-jaxws.xml} captures more information than what {@link WSEndpoint}
325N/A * represents (in particular URL pattern and name), this class
325N/A * takes a parameterization 'A' so that the user of this parser can choose to
325N/A * create another type that wraps {@link WSEndpoint}.
325N/A *
325N/A * {@link HttpAdapter} and its derived type is used for this often,
325N/A * but it can be anything.
325N/A *
325N/A * @author WS Development Team
325N/A * @author Kohsuke Kawaguchi
325N/A */
325N/Apublic class DeploymentDescriptorParser<A> {
325N/A private final Container container;
325N/A private final ClassLoader classLoader;
325N/A private final ResourceLoader loader;
325N/A private final AdapterFactory<A> adapterFactory;
325N/A
325N/A /**
325N/A * Endpoint names that are declared.
325N/A * Used to catch double definitions.
325N/A */
325N/A private final Set<String> names = new HashSet<String>();
325N/A
325N/A /**
325N/A * WSDL/schema documents collected from /WEB-INF/wsdl. Keyed by the system ID.
325N/A */
325N/A private final Map<String,SDDocumentSource> docs = new HashMap<String,SDDocumentSource>();
325N/A
325N/A /**
325N/A *
325N/A * @param cl
325N/A * Used to load service implementations.
325N/A * @param loader
325N/A * Used to locate resources, in particular WSDL.
325N/A * @param container
325N/A * Optional {@link Container} that {@link WSEndpoint}s receive.
325N/A * @param adapterFactory
325N/A * Creates {@link HttpAdapter} (or its derived class.)
325N/A */
325N/A public DeploymentDescriptorParser(ClassLoader cl, ResourceLoader loader, Container container, AdapterFactory<A> adapterFactory) throws MalformedURLException {
325N/A classLoader = cl;
325N/A this.loader = loader;
325N/A this.container = container;
325N/A this.adapterFactory = adapterFactory;
325N/A
325N/A collectDocs("/WEB-INF/wsdl/");
325N/A logger.fine("war metadata="+docs);
325N/A }
325N/A
325N/A /**
325N/A * Parses the {@code sun-jaxws.xml} file and configures
325N/A * a set of {@link HttpAdapter}s.
325N/A */
325N/A public @NotNull List<A> parse(String systemId, InputStream is) {
325N/A XMLStreamReader reader = null;
325N/A try {
325N/A reader = new TidyXMLStreamReader(
325N/A XMLStreamReaderFactory.create(systemId,is,true), is);
325N/A XMLStreamReaderUtil.nextElementContent(reader);
325N/A return parseAdapters(reader);
325N/A } finally {
325N/A if (reader != null) {
325N/A try {
325N/A reader.close();
325N/A } catch (XMLStreamException e) {
325N/A throw new ServerRtException("runtime.parser.xmlReader",e);
325N/A }
325N/A }
325N/A try {
325N/A is.close();
325N/A } catch (IOException e) {
325N/A // ignore
325N/A }
325N/A }
325N/A }
325N/A
325N/A /**
325N/A * Parses the {@code sun-jaxws.xml} file and configures
325N/A * a set of {@link HttpAdapter}s.
325N/A */
325N/A public @NotNull List<A> parse(File f) throws IOException {
325N/A FileInputStream in = new FileInputStream(f);
325N/A try {
325N/A return parse(f.getPath(), in);
325N/A } finally {
325N/A in.close();
325N/A }
325N/A }
325N/A
325N/A /**
325N/A * Get all the WSDL & schema documents recursively.
325N/A */
325N/A private void collectDocs(String dirPath) throws MalformedURLException {
325N/A Set<String> paths = loader.getResourcePaths(dirPath);
325N/A if (paths != null) {
325N/A for (String path : paths) {
325N/A if (path.endsWith("/")) {
325N/A if(path.endsWith("/CVS/") || path.endsWith("/.svn/"))
325N/A continue;
325N/A collectDocs(path);
325N/A } else {
325N/A URL res = loader.getResource(path);
325N/A docs.put(res.toString(),SDDocumentSource.create(res));
325N/A }
325N/A }
325N/A }
325N/A }
325N/A
325N/A
325N/A private List<A> parseAdapters(XMLStreamReader reader) {
325N/A if (!reader.getName().equals(QNAME_ENDPOINTS)) {
325N/A failWithFullName("runtime.parser.invalidElement", reader);
325N/A }
325N/A
325N/A List<A> adapters = new ArrayList<A>();
325N/A
325N/A Attributes attrs = XMLStreamReaderUtil.getAttributes(reader);
325N/A String version = getMandatoryNonEmptyAttribute(reader, attrs, ATTR_VERSION);
325N/A if (!version.equals(ATTRVALUE_VERSION_1_0)) {
325N/A failWithLocalName("runtime.parser.invalidVersionNumber",
325N/A reader, version);
325N/A }
325N/A
325N/A while (XMLStreamReaderUtil.nextElementContent(reader) !=
325N/A XMLStreamConstants.END_ELEMENT) if (reader.getName().equals(QNAME_ENDPOINT)) {
325N/A
325N/A attrs = XMLStreamReaderUtil.getAttributes(reader);
325N/A String name = getMandatoryNonEmptyAttribute(reader, attrs, ATTR_NAME);
325N/A if (!names.add(name)) {
325N/A logger.warning(
325N/A WsservletMessages.SERVLET_WARNING_DUPLICATE_ENDPOINT_NAME(/*name*/));
325N/A }
325N/A
325N/A String implementationName =
325N/A getMandatoryNonEmptyAttribute(reader, attrs, ATTR_IMPLEMENTATION);
325N/A Class<?> implementorClass = getImplementorClass(implementationName,reader);
325N/A EndpointFactory.verifyImplementorClass(implementorClass);
325N/A
325N/A SDDocumentSource primaryWSDL = getPrimaryWSDL(reader, attrs, implementorClass);
325N/A
325N/A QName serviceName = getQNameAttribute(attrs, ATTR_SERVICE);
325N/A if (serviceName == null)
325N/A serviceName = EndpointFactory.getDefaultServiceName(implementorClass);
325N/A
325N/A QName portName = getQNameAttribute(attrs, ATTR_PORT);
325N/A if (portName == null)
325N/A portName = EndpointFactory.getDefaultPortName(serviceName, implementorClass);
325N/A
325N/A //get enable-mtom attribute value
325N/A String enable_mtom = getAttribute(attrs, ATTR_ENABLE_MTOM);
325N/A String mtomThreshold = getAttribute(attrs, ATTR_MTOM_THRESHOLD_VALUE);
325N/A String bindingId = getAttribute(attrs, ATTR_BINDING);
325N/A if (bindingId != null)
325N/A // Convert short-form tokens to API's binding ids
325N/A bindingId = getBindingIdForToken(bindingId);
325N/A WSBinding binding = createBinding(bindingId,implementorClass,
325N/A enable_mtom,mtomThreshold);
325N/A String urlPattern =
325N/A getMandatoryNonEmptyAttribute(reader, attrs, ATTR_URL_PATTERN);
325N/A
325N/A // TODO use 'docs' as the metadata. If wsdl is non-null it's the primary.
325N/A
325N/A boolean handlersSetInDD = setHandlersAndRoles(binding, reader, serviceName, portName);
325N/A
325N/A ensureNoContent(reader);
325N/A WSEndpoint<?> endpoint = WSEndpoint.create(
325N/A implementorClass, !handlersSetInDD,
325N/A null,
325N/A serviceName, portName, container, binding,
325N/A primaryWSDL, docs.values(), createEntityResolver(),false
325N/A );
325N/A adapters.add(adapterFactory.createAdapter(name, urlPattern, endpoint));
325N/A } else {
325N/A failWithLocalName("runtime.parser.invalidElement", reader);
325N/A }
325N/A return adapters;
325N/A }
325N/A
325N/A /**
325N/A * @param ddBindingId
325N/A * binding id explicitlyspecified in the DeploymentDescriptor or parameter
325N/A * @param implClass
325N/A * Endpoint Implementation class
325N/A * @param mtomEnabled
325N/A * represents mtom-enabled attribute in DD
325N/A * @param mtomThreshold
325N/A * threshold value specified in DD
325N/A * @return
325N/A * is returned with only MTOMFeature set resolving the various precendece rules
325N/A */
325N/A private static WSBinding createBinding(String ddBindingId,Class implClass,
325N/A String mtomEnabled, String mtomThreshold) {
325N/A // Features specified through DD
325N/A WebServiceFeatureList features;
325N/A
325N/A MTOMFeature mtomfeature = null;
325N/A if (mtomEnabled != null) {
325N/A if (mtomThreshold != null)
325N/A mtomfeature = new MTOMFeature(Boolean.valueOf(mtomEnabled),
325N/A Integer.valueOf(mtomThreshold));
325N/A else
325N/A mtomfeature = new MTOMFeature(Boolean.valueOf(mtomEnabled));
325N/A }
325N/A
325N/A
325N/A BindingID bindingID;
325N/A if (ddBindingId != null) {
325N/A bindingID = BindingID.parse(ddBindingId);
325N/A features = bindingID.createBuiltinFeatureList();
325N/A
325N/A if(checkMtomConflict(features.get(MTOMFeature.class),mtomfeature)) {
325N/A throw new ServerRtException(ServerMessages.DD_MTOM_CONFLICT(ddBindingId, mtomEnabled));
325N/A }
325N/A } else {
325N/A bindingID = BindingID.parse(implClass);
325N/A // Since bindingID is coming from implclass,
325N/A // mtom through Feature annotation or DD takes precendece
325N/A
325N/A features = new WebServiceFeatureList();
325N/A if(mtomfeature != null)
325N/A features.add(mtomfeature); // this wins over MTOM setting in bindingID
325N/A features.addAll(bindingID.createBuiltinFeatureList());
325N/A }
325N/A
325N/A return bindingID.createBinding(features.toArray());
325N/A }
325N/A
325N/A private static boolean checkMtomConflict(MTOMFeature lhs, MTOMFeature rhs) {
325N/A if(lhs==null || rhs==null) return false;
325N/A return lhs.isEnabled() ^ rhs.isEnabled();
325N/A }
325N/A
325N/A /**
325N/A * JSR-109 defines short-form tokens for standard binding Ids. These are
325N/A * used only in DD. So stand alone deployment descirptor should also honor
325N/A * these tokens. This method converts the tokens to API's standard
325N/A * binding ids
325N/A *
325N/A * @param lexical binding attribute value from DD. Always not null
325N/A *
325N/A * @return returns corresponding API's binding ID or the same lexical
325N/A */
325N/A public static @NotNull String getBindingIdForToken(@NotNull String lexical) {
325N/A if (lexical.equals("##SOAP11_HTTP")) {
325N/A return SOAPBinding.SOAP11HTTP_BINDING;
325N/A } else if (lexical.equals("##SOAP11_HTTP_MTOM")) {
325N/A return SOAPBinding.SOAP11HTTP_MTOM_BINDING;
325N/A } else if (lexical.equals("##SOAP12_HTTP")) {
325N/A return SOAPBinding.SOAP12HTTP_BINDING;
325N/A } else if (lexical.equals("##SOAP12_HTTP_MTOM")) {
325N/A return SOAPBinding.SOAP12HTTP_MTOM_BINDING;
325N/A } else if (lexical.equals("##XML_HTTP")) {
325N/A return HTTPBinding.HTTP_BINDING;
325N/A }
325N/A return lexical;
325N/A }
325N/A
325N/A /**
325N/A * Creates a new "Adapter".
325N/A *
325N/A * <P>
325N/A * Normally 'A' would be {@link HttpAdapter} or some derived class.
325N/A * But the parser doesn't require that to be of any particular type.
325N/A */
325N/A public static interface AdapterFactory<A> {
325N/A A createAdapter(String name, String urlPattern, WSEndpoint<?> endpoint);
325N/A }
325N/A
325N/A /**
325N/A * Checks the deployment descriptor or {@link @WebServiceProvider} annotation
325N/A * to see if it points to any WSDL. If so, returns the {@link SDDocumentSource}.
325N/A *
325N/A * @return
325N/A * The pointed WSDL, if any. Otherwise null.
325N/A */
325N/A private SDDocumentSource getPrimaryWSDL(XMLStreamReader xsr, Attributes attrs, Class<?> implementorClass) {
325N/A
325N/A String wsdlFile = getAttribute(attrs, ATTR_WSDL);
325N/A if (wsdlFile == null) {
325N/A wsdlFile = EndpointFactory.getWsdlLocation(implementorClass);
325N/A }
325N/A
325N/A if (wsdlFile!=null) {
325N/A if (!wsdlFile.startsWith(JAXWS_WSDL_DD_DIR)) {
325N/A logger.warning("Ignoring wrong wsdl="+wsdlFile+". It should start with "
325N/A +JAXWS_WSDL_DD_DIR
325N/A +". Going to generate and publish a new WSDL.");
325N/A return null;
325N/A }
325N/A
325N/A URL wsdl;
325N/A try {
325N/A wsdl = loader.getResource('/'+wsdlFile);
325N/A } catch (MalformedURLException e) {
325N/A throw new LocatableWebServiceException(
325N/A ServerMessages.RUNTIME_PARSER_WSDL_NOT_FOUND(wsdlFile), e, xsr );
325N/A }
325N/A if (wsdl == null) {
325N/A throw new LocatableWebServiceException(
325N/A ServerMessages.RUNTIME_PARSER_WSDL_NOT_FOUND(wsdlFile), xsr );
325N/A }
325N/A SDDocumentSource docInfo = docs.get(wsdl.toExternalForm());
325N/A assert docInfo != null;
325N/A return docInfo;
325N/A }
325N/A
325N/A return null;
325N/A }
325N/A
325N/A /**
325N/A * Creates an {@link EntityResolver} that consults {@code /WEB-INF/jax-ws-catalog.xml}.
325N/A */
325N/A private EntityResolver createEntityResolver() {
325N/A try {
325N/A return XmlUtil.createEntityResolver(loader.getCatalogFile());
325N/A } catch(MalformedURLException e) {
325N/A throw new WebServiceException(e);
325N/A }
325N/A }
325N/A
325N/A protected String getAttribute(Attributes attrs, String name) {
325N/A String value = attrs.getValue(name);
325N/A if (value != null) {
325N/A value = value.trim();
325N/A }
325N/A return value;
325N/A }
325N/A
325N/A protected QName getQNameAttribute(Attributes attrs, String name) {
325N/A String value = getAttribute(attrs, name);
325N/A if (value == null || value.equals("")) {
325N/A return null;
325N/A } else {
325N/A return QName.valueOf(value);
325N/A }
325N/A }
325N/A
325N/A protected String getNonEmptyAttribute(XMLStreamReader reader, Attributes attrs, String name) {
325N/A String value = getAttribute(attrs, name);
325N/A if (value != null && value.equals("")) {
325N/A failWithLocalName(
325N/A "runtime.parser.invalidAttributeValue",
325N/A reader,
325N/A name);
325N/A }
325N/A return value;
325N/A }
325N/A
325N/A protected String getMandatoryAttribute(XMLStreamReader reader, Attributes attrs, String name) {
325N/A String value = getAttribute(attrs, name);
325N/A if (value == null) {
325N/A failWithLocalName("runtime.parser.missing.attribute", reader, name);
325N/A }
325N/A return value;
325N/A }
325N/A
325N/A protected String getMandatoryNonEmptyAttribute(XMLStreamReader reader, Attributes attributes,
325N/A String name) {
325N/A String value = getAttribute(attributes, name);
325N/A if (value == null) {
325N/A failWithLocalName("runtime.parser.missing.attribute", reader, name);
325N/A } else if (value.equals("")) {
325N/A failWithLocalName(
325N/A "runtime.parser.invalidAttributeValue",
325N/A reader,
325N/A name);
325N/A }
325N/A return value;
325N/A }
325N/A
325N/A /**
325N/A * Parses the handler and role information and sets it
325N/A * on the {@link WSBinding}.
325N/A * @return true if <handler-chains> element present in DD
325N/A * false otherwise.
325N/A */
325N/A protected boolean setHandlersAndRoles(WSBinding binding, XMLStreamReader reader, QName serviceName, QName portName) {
325N/A
325N/A if (XMLStreamReaderUtil.nextElementContent(reader) ==
325N/A XMLStreamConstants.END_ELEMENT ||
325N/A !reader.getName().equals(
325N/A HandlerChainsModel.QNAME_HANDLER_CHAINS)) {
325N/A
325N/A return false;
325N/A }
325N/A
325N/A HandlerAnnotationInfo handlerInfo = HandlerChainsModel.parseHandlerFile(
325N/A reader, classLoader,serviceName, portName, binding);
325N/A
325N/A binding.setHandlerChain(handlerInfo.getHandlers());
325N/A if (binding instanceof SOAPBinding) {
325N/A ((SOAPBinding)binding).setRoles(handlerInfo.getRoles());
325N/A }
325N/A
325N/A // move past </handler-chains>
325N/A XMLStreamReaderUtil.nextContent(reader);
325N/A return true;
325N/A }
325N/A
325N/A protected static void ensureNoContent(XMLStreamReader reader) {
325N/A if (reader.getEventType() != XMLStreamConstants.END_ELEMENT) {
325N/A fail("runtime.parser.unexpectedContent", reader);
325N/A }
325N/A }
325N/A
325N/A protected static void fail(String key, XMLStreamReader reader) {
325N/A logger.log(Level.SEVERE, key + reader.getLocation().getLineNumber());
325N/A throw new ServerRtException(
325N/A key,
325N/A Integer.toString(reader.getLocation().getLineNumber()));
325N/A }
325N/A
325N/A protected static void failWithFullName(String key, XMLStreamReader reader) {
325N/A throw new ServerRtException(
325N/A key,
325N/A reader.getLocation().getLineNumber(),
325N/A reader.getName());
325N/A }
325N/A
325N/A protected static void failWithLocalName(String key, XMLStreamReader reader) {
325N/A throw new ServerRtException(
325N/A key,
325N/A reader.getLocation().getLineNumber(),
325N/A reader.getLocalName());
325N/A }
325N/A
325N/A protected static void failWithLocalName(
325N/A String key,
325N/A XMLStreamReader reader,
325N/A String arg) {
325N/A throw new ServerRtException(
325N/A key,
325N/A reader.getLocation().getLineNumber(),
325N/A reader.getLocalName(),
325N/A arg);
325N/A }
325N/A
325N/A protected Class loadClass(String name) {
325N/A try {
325N/A return Class.forName(name, true, classLoader);
325N/A } catch (ClassNotFoundException e) {
325N/A logger.log(Level.SEVERE, e.getMessage(), e);
325N/A throw new ServerRtException(
325N/A "runtime.parser.classNotFound",
325N/A name);
325N/A }
325N/A }
325N/A
325N/A
325N/A /**
325N/A * Loads the class of the given name.
325N/A *
325N/A * @param xsr
325N/A * Used to report the source location information if there's any error.
325N/A */
325N/A private Class getImplementorClass(String name, XMLStreamReader xsr) {
325N/A try {
325N/A return Class.forName(name, true, classLoader);
325N/A } catch (ClassNotFoundException e) {
325N/A logger.log(Level.SEVERE, e.getMessage(), e);
325N/A throw new LocatableWebServiceException(
325N/A ServerMessages.RUNTIME_PARSER_CLASS_NOT_FOUND(name), e, xsr );
325N/A }
325N/A }
325N/A
325N/A public static final String NS_RUNTIME =
325N/A "http://java.sun.com/xml/ns/jax-ws/ri/runtime";
325N/A
325N/A public static final String JAXWS_WSDL_DD_DIR = "WEB-INF/wsdl";
325N/A
325N/A public static final QName QNAME_ENDPOINTS =
325N/A new QName(NS_RUNTIME, "endpoints");
325N/A public static final QName QNAME_ENDPOINT =
325N/A new QName(NS_RUNTIME, "endpoint");
325N/A
325N/A public static final String ATTR_VERSION = "version";
325N/A public static final String ATTR_NAME = "name";
325N/A public static final String ATTR_IMPLEMENTATION = "implementation";
325N/A public static final String ATTR_WSDL = "wsdl";
325N/A public static final String ATTR_SERVICE = "service";
325N/A public static final String ATTR_PORT = "port";
325N/A public static final String ATTR_URL_PATTERN = "url-pattern";
325N/A public static final String ATTR_ENABLE_MTOM = "enable-mtom";
325N/A public static final String ATTR_MTOM_THRESHOLD_VALUE = "mtom-threshold-value";
325N/A public static final String ATTR_BINDING = "binding";
325N/A
325N/A public static final String ATTRVALUE_VERSION_1_0 = "2.0";
325N/A private static final Logger logger =
325N/A Logger.getLogger(
325N/A com.sun.xml.internal.ws.util.Constants.LoggingDomain + ".server.http");
325N/A}