/*
* 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.xml.internal.ws.api.server;
import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;
import com.sun.xml.internal.ws.api.BindingID;
import com.sun.xml.internal.ws.api.Component;
import com.sun.xml.internal.ws.api.ComponentRegistry;
import com.sun.xml.internal.ws.api.SOAPVersion;
import com.sun.xml.internal.ws.api.WSBinding;
import com.sun.xml.internal.ws.api.config.management.EndpointCreationAttributes;
import com.sun.xml.internal.ws.api.config.management.ManagedEndpointFactory;
import com.sun.xml.internal.ws.api.databinding.MetadataReader;
import com.sun.xml.internal.ws.api.message.Message;
import com.sun.xml.internal.ws.api.message.Packet;
import com.sun.xml.internal.ws.api.model.SEIModel;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort;
import com.sun.xml.internal.ws.api.pipe.Codec;
import com.sun.xml.internal.ws.api.pipe.Engine;
import com.sun.xml.internal.ws.api.pipe.FiberContextSwitchInterceptor;
import com.sun.xml.internal.ws.api.pipe.ServerTubeAssemblerContext;
import com.sun.xml.internal.ws.api.pipe.ThrowableContainerPropertySet;
import com.sun.xml.internal.ws.api.pipe.Tube;
import com.sun.xml.internal.ws.policy.PolicyMap;
import com.sun.xml.internal.ws.server.EndpointAwareTube;
import com.sun.xml.internal.ws.server.EndpointFactory;
import com.sun.xml.internal.ws.util.ServiceFinder;
import com.sun.xml.internal.ws.util.xml.XmlUtil;
import com.sun.xml.internal.ws.wsdl.OperationDispatcher;
import com.sun.org.glassfish.gmbal.ManagedObjectManager;
import org.xml.sax.EntityResolver;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import javax.xml.ws.Binding;
import javax.xml.ws.EndpointReference;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceException;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;
Root object that hosts the Packet
processing code at the server. One instance of WSEndpoint
is created for each deployed service endpoint. A hosted service usually handles multiple concurrent requests. To do this efficiently, an endpoint handles incoming Packet
through PipeHead
s, where many copies can be created for each endpoint.
Each PipeHead
is thread-unsafe, and request needs to be serialized. A PipeHead
represents a sizable resource (in particular a whole pipeline), so the caller is expected to reuse them and avoid excessive allocations as much as possible. Making PipeHead
s thread-unsafe allow the JAX-WS RI internal to tie thread-local resources to PipeHead
, and reduce the total resource management overhead.
To abbreviate this resource management (and for a few other reasons), JAX-WS RI provides Adapter
class. If you are hosting a JAX-WS service, you'll most likely want to send requests to WSEndpoint
through Adapter
.
WSEndpoint
is ready to handle Packet
s as soon as it's created. No separate post-initialization step is necessary. However, to comply with the JAX-WS spec requirement, the caller is expected to call the dispose()
method to allow an orderly shut-down of a hosted service.
Objects Exposed From Endpoint
WSEndpoint
exposes a series of information that represents how an endpoint is configured to host a service. See the getXXX methods for more details.
Implementation Notes
WSEndpoint
owns a WSWebServiceContext
implementation. But a bulk of the work is delegated to WebServiceContextDelegate
, which is passed in as a parameter to PipeHead.process(Packet, WebServiceContextDelegate, TransportBackChannel)
.
Author: Kohsuke Kawaguchi
/**
* Root object that hosts the {@link Packet} processing code
* at the server.
*
* <p>
* One instance of {@link WSEndpoint} is created for each deployed service
* endpoint. A hosted service usually handles multiple concurrent
* requests. To do this efficiently, an endpoint handles incoming
* {@link Packet} through {@link PipeHead}s, where many copies can be created
* for each endpoint.
*
* <p>
* Each {@link PipeHead} is thread-unsafe, and request needs to be
* serialized. A {@link PipeHead} represents a sizable resource
* (in particular a whole pipeline), so the caller is expected to
* reuse them and avoid excessive allocations as much as possible.
* Making {@link PipeHead}s thread-unsafe allow the JAX-WS RI internal to
* tie thread-local resources to {@link PipeHead}, and reduce the total
* resource management overhead.
*
* <p>
* To abbreviate this resource management (and for a few other reasons),
* JAX-WS RI provides {@link Adapter} class. If you are hosting a JAX-WS
* service, you'll most likely want to send requests to {@link WSEndpoint}
* through {@link Adapter}.
*
* <p>
* {@link WSEndpoint} is ready to handle {@link Packet}s as soon as
* it's created. No separate post-initialization step is necessary.
* However, to comply with the JAX-WS spec requirement, the caller
* is expected to call the {@link #dispose()} method to allow an
* orderly shut-down of a hosted service.
*
*
*
* <h3>Objects Exposed From Endpoint</h3>
* <p>
* {@link WSEndpoint} exposes a series of information that represents
* how an endpoint is configured to host a service. See the getXXX methods
* for more details.
*
*
*
* <h3>Implementation Notes</h3>
* <p>
* {@link WSEndpoint} owns a {@link WSWebServiceContext} implementation.
* But a bulk of the work is delegated to {@link WebServiceContextDelegate},
* which is passed in as a parameter to {@link PipeHead#process(Packet, WebServiceContextDelegate, TransportBackChannel)}.
*
* @author Kohsuke Kawaguchi
*/
public abstract class WSEndpoint<T> implements ComponentRegistry {
Gets the Endpoint's codec that is used to encode/decode Message
s. This is a copy of the master codec and it shouldn't be shared across two requests running concurrently(unless it is stateless). Returns: codec to encode/decode
/**
* Gets the Endpoint's codec that is used to encode/decode {@link Message}s. This is a
* copy of the master codec and it shouldn't be shared across two requests running
* concurrently(unless it is stateless).
*
* @return codec to encode/decode
*/
public abstract @NotNull Codec createCodec();
Gets the application endpoint's serviceName. It could be got from DD or annotations
Returns: same as wsdl:service QName if WSDL exists or generated
/**
* Gets the application endpoint's serviceName. It could be got from DD or annotations
*
* @return same as wsdl:service QName if WSDL exists or generated
*/
public abstract @NotNull QName getServiceName();
Gets the application endpoint's portName. It could be got from DD or annotations
Returns: same as wsdl:port QName if WSDL exists or generated
/**
* Gets the application endpoint's portName. It could be got from DD or annotations
*
* @return same as wsdl:port QName if WSDL exists or generated
*/
public abstract @NotNull QName getPortName();
/**
* Gets the application endpoint {@link Class} that eventually serves the request.
*
* <p>
* This is the same value given to the {@link #create} method.
*/
public abstract @NotNull Class<T> getImplementationClass();
Represents the binding for which this WSEndpoint
is created for. Returns:
always same object.
/**
* Represents the binding for which this {@link WSEndpoint}
* is created for.
*
* @return
* always same object.
*/
public abstract @NotNull WSBinding getBinding();
Gets the Container
object. The components inside WSEndpoint
uses this reference to communicate with the hosting environment.
Returns: always same object. If no "real" Container
instance is given, Container.NONE
will be returned.
/**
* Gets the {@link Container} object.
*
* <p>
* The components inside {@link WSEndpoint} uses this reference
* to communicate with the hosting environment.
*
* @return
* always same object. If no "real" {@link Container} instance
* is given, {@link Container#NONE} will be returned.
*/
public abstract @NotNull Container getContainer();
Gets the port that this endpoint is serving.
A service is not required to have a WSDL, and when it doesn't, this method returns null. Otherwise it returns an object that describes the port that this WSEndpoint
is serving.
Returns:
Possibly null, but always the same value.
/**
* Gets the port that this endpoint is serving.
*
* <p>
* A service is not required to have a WSDL, and when it doesn't,
* this method returns null. Otherwise it returns an object that
* describes the port that this {@link WSEndpoint} is serving.
*
* @return
* Possibly null, but always the same value.
*/
public abstract @Nullable WSDLPort getPort();
Set this Executor
to run asynchronous requests using this executor. This executor is set on Engine
and must be set before calling schedule(Packet, CompletionCallback)
and schedule(Packet, CompletionCallback, FiberContextSwitchInterceptor)
methods. Params: - exec – Executor to run async requests
/**
* Set this {@link Executor} to run asynchronous requests using this executor.
* This executor is set on {@link Engine} and must be set before
* calling {@link #schedule(Packet,CompletionCallback) } and
* {@link #schedule(Packet,CompletionCallback,FiberContextSwitchInterceptor)} methods.
*
* @param exec Executor to run async requests
*/
public abstract void setExecutor(@NotNull Executor exec);
This method takes a Packet
that represents a request, run it through a Tube
line, eventually pass it to the user implementation code, which produces a reply, then run that through the tubeline again, and eventually return it as a return value through CompletionCallback
. This takes care of pooling of Tube
lines and reuses tubeline for requests. Same instance of tubeline is not used concurrently for two requests.
If the transport is capable of asynchronous execution, use this instead of using PipeHead.process
.
Before calling this method, set the executor using setExecutor
. The executor may used multiple times to run this request in a asynchronous fashion. The calling thread will be returned immediately, and the callback will be called in a different a thread.
Packet.transportBackChannel
should have the correct value, so that one-way message processing happens correctly. Packet.webServiceContextDelegate
should have the correct value, so that some WebServiceContext
methods correctly.
Params: - request – web service request
- callback – callback to get response packet
See Also:
/**
* This method takes a {@link Packet} that represents
* a request, run it through a {@link Tube}line, eventually
* pass it to the user implementation code, which produces
* a reply, then run that through the tubeline again,
* and eventually return it as a return value through {@link CompletionCallback}.
*
* <p>
* This takes care of pooling of {@link Tube}lines and reuses
* tubeline for requests. Same instance of tubeline is not used concurrently
* for two requests.
*
* <p>
* If the transport is capable of asynchronous execution, use this
* instead of using {@link PipeHead#process}.
*
* <p>
* Before calling this method, set the executor using {@link #setExecutor}. The
* executor may used multiple times to run this request in a asynchronous fashion.
* The calling thread will be returned immediately, and the callback will be
* called in a different a thread.
*
* <p>
* {@link Packet#transportBackChannel} should have the correct value, so that
* one-way message processing happens correctly. {@link Packet#webServiceContextDelegate}
* should have the correct value, so that some {@link WebServiceContext} methods correctly.
*
* @see Packet#transportBackChannel
* @see Packet#webServiceContextDelegate
*
* @param request web service request
* @param callback callback to get response packet
*/
public final void schedule(@NotNull Packet request, @NotNull CompletionCallback callback ) {
schedule(request,callback,null);
}
Schedule invocation of web service asynchronously.
Params: - request – web service request
- callback – callback to get response packet(exception if there is one)
- interceptor – caller's interceptor to impose a context of execution
See Also: - schedule(Packet, CompletionCallback)
/**
* Schedule invocation of web service asynchronously.
*
* @see #schedule(Packet, CompletionCallback)
*
* @param request web service request
* @param callback callback to get response packet(exception if there is one)
* @param interceptor caller's interceptor to impose a context of execution
*/
public abstract void schedule(@NotNull Packet request, @NotNull CompletionCallback callback, @Nullable FiberContextSwitchInterceptor interceptor );
public void process(@NotNull Packet request, @NotNull CompletionCallback callback, @Nullable FiberContextSwitchInterceptor interceptor ) {
schedule(request,callback,interceptor);
}
Returns Engine
for this endpoint Returns: Engine
/**
* Returns {@link Engine} for this endpoint
* @return Engine
*/
public Engine getEngine() {
throw new UnsupportedOperationException();
}
Callback to notify that jax-ws runtime has finished execution of a request
submitted via schedule().
/**
* Callback to notify that jax-ws runtime has finished execution of a request
* submitted via schedule().
*/
public interface CompletionCallback {
Indicates that the jax-ws runtime has finished execution of a request
submitted via schedule().
Since the JAX-WS RI runs asynchronously,
this method maybe invoked by a different thread
than any of the threads that started it or run a part of tubeline.
Params: - response –
Packet
/**
* Indicates that the jax-ws runtime has finished execution of a request
* submitted via schedule().
*
* <p>
* Since the JAX-WS RI runs asynchronously,
* this method maybe invoked by a different thread
* than any of the threads that started it or run a part of tubeline.
*
* @param response {@link Packet}
*/
void onCompletion(@NotNull Packet response);
}
Creates a new PipeHead
to process incoming requests. This is not a cheap operation. The caller is expected to reuse the returned PipeHead
. See class javadoc
for details.
Returns: A newly created PipeHead
that's ready to serve.
/**
* Creates a new {@link PipeHead} to process
* incoming requests.
*
* <p>
* This is not a cheap operation. The caller is expected
* to reuse the returned {@link PipeHead}. See
* {@link WSEndpoint class javadoc} for details.
*
* @return
* A newly created {@link PipeHead} that's ready to serve.
*/
public abstract @NotNull PipeHead createPipeHead();
Represents a resource local to a thread. See WSEndpoint
class javadoc for more discussion about this. /**
* Represents a resource local to a thread.
*
* See {@link WSEndpoint} class javadoc for more discussion about
* this.
*/
public interface PipeHead {
Processes a request and produces a reply.
This method takes a Packet
that represents a request, run it through a Tube
line, eventually pass it to the user implementation code, which produces a reply, then run that through the pipeline again, and eventually return it as a return value.
Params: - request – Unconsumed
Packet
that represents a request. - wscd –
WebServiceContextDelegate
to be set to Packet
. (we didn't have to take this and instead just ask the caller to set to Packet.webServiceContextDelegate
, but that felt too error prone.) - tbc –
TransportBackChannel
to be set to Packet
. See the wscd
parameter javadoc for why this is a parameter. Can be null.
Throws: - WebServiceException –
This method does not throw a
WebServiceException
. The WSEndpoint
must always produce a fault Message
for it. - RuntimeException – A
RuntimeException
thrown from this method, including WebServiceException
, must be treated as a bug in the code (including JAX-WS and all the pipe implementations), not an operator error by the user.
Therefore, it should be recorded by the caller in a way that
allows developers to fix a bug.
Returns: Unconsumed Packet
that represents a reply to the request.
/**
* Processes a request and produces a reply.
*
* <p>
* This method takes a {@link Packet} that represents
* a request, run it through a {@link Tube}line, eventually
* pass it to the user implementation code, which produces
* a reply, then run that through the pipeline again,
* and eventually return it as a return value.
*
* @param request
* Unconsumed {@link Packet} that represents
* a request.
* @param wscd
* {@link WebServiceContextDelegate} to be set to {@link Packet}.
* (we didn't have to take this and instead just ask the caller to
* set to {@link Packet#webServiceContextDelegate}, but that felt
* too error prone.)
* @param tbc
* {@link TransportBackChannel} to be set to {@link Packet}.
* See the {@code wscd} parameter javadoc for why this is a parameter.
* Can be null.
* @return
* Unconsumed {@link Packet} that represents
* a reply to the request.
*
* @throws WebServiceException
* This method <b>does not</b> throw a {@link WebServiceException}.
* The {@link WSEndpoint} must always produce a fault {@link Message}
* for it.
*
* @throws RuntimeException
* A {@link RuntimeException} thrown from this method, including
* {@link WebServiceException}, must be treated as a bug in the
* code (including JAX-WS and all the pipe implementations), not
* an operator error by the user.
*
* <p>
* Therefore, it should be recorded by the caller in a way that
* allows developers to fix a bug.
*/
@NotNull Packet process(
@NotNull Packet request, @Nullable WebServiceContextDelegate wscd, @Nullable TransportBackChannel tbc);
}
Indicates that the WSEndpoint
is about to be turned off, and will no longer serve any packet anymore. This method needs to be invoked for the JAX-WS RI to correctly implement some of the spec semantics (TODO: pointer.) It's the responsibility of the code that hosts a WSEndpoint
to invoke this method.
Once this method is called, the behavior is undefed for all in-progress PipeHead.process
methods (by other threads) and future PipeHead.process
method invocations.
/**
* Indicates that the {@link WSEndpoint} is about to be turned off,
* and will no longer serve any packet anymore.
*
* <p>
* This method needs to be invoked for the JAX-WS RI to correctly
* implement some of the spec semantics (TODO: pointer.)
* It's the responsibility of the code that hosts a {@link WSEndpoint}
* to invoke this method.
*
* <p>
* Once this method is called, the behavior is undefed for
* all in-progress {@link PipeHead#process} methods (by other threads)
* and future {@link PipeHead#process} method invocations.
*/
public abstract void dispose();
Gets the description of the service.
A description is a set of WSDL/schema and other documents that together
describes a service.
A service is not required to have a description, and when it doesn't,
this method returns null.
Returns:
Possibly null, always the same value under ordinary circumstances but
may change if the endpoint is managed.
/**
* Gets the description of the service.
*
* <p>
* A description is a set of WSDL/schema and other documents that together
* describes a service.
* A service is not required to have a description, and when it doesn't,
* this method returns null.
*
* @return
* Possibly null, always the same value under ordinary circumstances but
* may change if the endpoint is managed.
*/
public abstract @Nullable ServiceDefinition getServiceDefinition();
Gets the list of BoundEndpoint
that are associated with this endpoint. Returns:
always return the same set.
/**
* Gets the list of {@link BoundEndpoint} that are associated
* with this endpoint.
*
* @return
* always return the same set.
*/
public List<BoundEndpoint> getBoundEndpoints() {
Module m = getContainer().getSPI(Module.class);
return m != null ? m.getBoundEndpoints() : null;
}
Gets the list of EndpointComponent
that are associated with this endpoint. Components (such as codec, tube, handler, etc) who wish to provide some service to other components in the endpoint can iterate the registry and call its EndpointComponent.getSPI(Class<Object>)
to establish a private contract between components.
Components who wish to subscribe to such a service can add itself
to this set.
Returns:
always return the same set. Deprecated:
/**
* Gets the list of {@link EndpointComponent} that are associated
* with this endpoint.
*
* <p>
* Components (such as codec, tube, handler, etc) who wish to provide
* some service to other components in the endpoint can iterate the
* registry and call its {@link EndpointComponent#getSPI(Class)} to
* establish a private contract between components.
* <p>
* Components who wish to subscribe to such a service can add itself
* to this set.
*
* @return
* always return the same set.
* @deprecated
*/
public abstract @NotNull Set<EndpointComponent> getComponentRegistry();
public @NotNull Set<Component> getComponents() {
return Collections.emptySet();
}
public @Nullable <S> S getSPI(@NotNull Class<S> spiType) {
Set<Component> componentRegistry = getComponents();
if (componentRegistry != null) {
for (Component c : componentRegistry) {
S s = c.getSPI(spiType);
if (s != null)
return s;
}
}
return getContainer().getSPI(spiType);
}
Gets the SEIModel
that represents the relationship between WSDL and Java SEI.
This method returns a non-null value if and only if this
endpoint is ultimately serving an application through an SEI.
Returns:
maybe null. See above for more discussion.
Always the same value.
/**
* Gets the {@link com.sun.xml.internal.ws.api.model.SEIModel} that represents the relationship
* between WSDL and Java SEI.
*
* <p>
* This method returns a non-null value if and only if this
* endpoint is ultimately serving an application through an SEI.
*
* @return
* maybe null. See above for more discussion.
* Always the same value.
*/
public abstract @Nullable SEIModel getSEIModel();
Gives the PolicMap that captures the Policy for the endpoint
Returns: PolicyMap Deprecated:
Do not use this method as the PolicyMap API is not final yet and might change in next few months.
/**
* Gives the PolicMap that captures the Policy for the endpoint
*
* @return PolicyMap
*
* @deprecated
* Do not use this method as the PolicyMap API is not final yet and might change in next few months.
*/
public abstract PolicyMap getPolicyMap();
Get the ManagedObjectManager for this endpoint.
/**
* Get the ManagedObjectManager for this endpoint.
*/
public abstract @NotNull ManagedObjectManager getManagedObjectManager();
Close the ManagedObjectManager for this endpoint.
This is used by the Web Service Configuration Management system so that it
closes the MOM before it creates a new WSEndpoint. Then it calls dispose
on the existing endpoint and then installs the new endpoint.
The call to dispose also calls closeManagedObjectManager, but is a noop
if that method has already been called.
/**
* Close the ManagedObjectManager for this endpoint.
* This is used by the Web Service Configuration Management system so that it
* closes the MOM before it creates a new WSEndpoint. Then it calls dispose
* on the existing endpoint and then installs the new endpoint.
* The call to dispose also calls closeManagedObjectManager, but is a noop
* if that method has already been called.
*/
public abstract void closeManagedObjectManager();
This is only needed to expose info for monitoring.
/**
* This is only needed to expose info for monitoring.
*/
public abstract @NotNull ServerTubeAssemblerContext getAssemblerContext();
Creates an endpoint from deployment or programmatic configuration
This method works like the following:
ServiceDefinition
is modeleed from the given SEI type. Invoker
that always serves implementationObject
will be used.
Params: - implType –
Endpoint class(not SEI). Enpoint class must have @WebService or @WebServiceProvider
annotation.
- processHandlerAnnotation –
Flag to control processing of @HandlerChain on Impl class
if true, processes @HandlerChain on Impl
if false, DD might have set HandlerChain no need to parse.
- invoker – Pass an object to invoke the actual endpoint object. If it is null, a default invoker is created using
InstanceResolver.createDefault
. Appservers could create its own invoker to do additional functions like transactions, invoking the endpoint through proxy etc. - serviceName –
Optional service name(may be from DD) to override the one given by the
implementation class. If it is null, it will be derived from annotations.
- portName –
Optional port name(may be from DD) to override the one given by the
implementation class. If it is null, it will be derived from annotations.
- container –
Allows technologies that are built on top of JAX-WS(such as WSIT) needs to
negotiate private contracts between them and the container
- binding – JAX-WS implementation of
Binding
. This object can be created by BindingID.createBinding()
. Usually the binding can be got from DD, BindingType
. TODO: DD has a configuration for MTOM threshold. Maybe we need something more generic so that other technologies like Tango can get information from DD. TODO: does it really make sense for this to take EntityResolver? Given that all metadata has to be given as a list anyway. - primaryWsdl – The
primary
WSDL. If null, it'll be generated based on the SEI (if this is an SEI) or no WSDL is associated (if it's a provider.) TODO: shouldn't the implementation find this from the metadata list? - metadata – Other documents that become
SDDocument
s. Can be null. - resolver – Optional resolver used to de-reference resources referenced from WSDL. Must be null if the
url
is null. - isTransportSynchronous – If the caller knows that the returned
WSEndpoint
is going to be used by a synchronous-only transport, then it may pass in true
to allow the callee to perform an optimization based on that knowledge (since often synchronous version is cheaper than an asynchronous version.) This value is visible from ServerTubeAssemblerContext.isSynchronous()
.
Throws: - WebServiceException –
if the endpoint set up fails.
Returns: newly constructed WSEndpoint
.
/**
* Creates an endpoint from deployment or programmatic configuration
*
* <p>
* This method works like the following:
* <ol>
* <li>{@link ServiceDefinition} is modeleed from the given SEI type.
* <li>{@link Invoker} that always serves {@code implementationObject} will be used.
* </ol>
* @param implType
* Endpoint class(not SEI). Enpoint class must have @WebService or @WebServiceProvider
* annotation.
* @param processHandlerAnnotation
* Flag to control processing of @HandlerChain on Impl class
* if true, processes @HandlerChain on Impl
* if false, DD might have set HandlerChain no need to parse.
* @param invoker
* Pass an object to invoke the actual endpoint object. If it is null, a default
* invoker is created using {@link InstanceResolver#createDefault}. Appservers
* could create its own invoker to do additional functions like transactions,
* invoking the endpoint through proxy etc.
* @param serviceName
* Optional service name(may be from DD) to override the one given by the
* implementation class. If it is null, it will be derived from annotations.
* @param portName
* Optional port name(may be from DD) to override the one given by the
* implementation class. If it is null, it will be derived from annotations.
* @param container
* Allows technologies that are built on top of JAX-WS(such as WSIT) needs to
* negotiate private contracts between them and the container
* @param binding
* JAX-WS implementation of {@link Binding}. This object can be created by
* {@link BindingID#createBinding()}. Usually the binding can be got from
* DD, {@link javax.xml.ws.BindingType}.
*
*
* TODO: DD has a configuration for MTOM threshold.
* Maybe we need something more generic so that other technologies
* like Tango can get information from DD.
*
* TODO: does it really make sense for this to take EntityResolver?
* Given that all metadata has to be given as a list anyway.
*
* @param primaryWsdl
* The {@link ServiceDefinition#getPrimary() primary} WSDL.
* If null, it'll be generated based on the SEI (if this is an SEI)
* or no WSDL is associated (if it's a provider.)
* TODO: shouldn't the implementation find this from the metadata list?
* @param metadata
* Other documents that become {@link SDDocument}s. Can be null.
* @param resolver
* Optional resolver used to de-reference resources referenced from
* WSDL. Must be null if the {@code url} is null.
* @param isTransportSynchronous
* If the caller knows that the returned {@link WSEndpoint} is going to be
* used by a synchronous-only transport, then it may pass in {@code true}
* to allow the callee to perform an optimization based on that knowledge
* (since often synchronous version is cheaper than an asynchronous version.)
* This value is visible from {@link ServerTubeAssemblerContext#isSynchronous()}.
*
* @return newly constructed {@link WSEndpoint}.
* @throws WebServiceException
* if the endpoint set up fails.
*/
public static <T> WSEndpoint<T> create(
@NotNull Class<T> implType,
boolean processHandlerAnnotation,
@Nullable Invoker invoker,
@Nullable QName serviceName,
@Nullable QName portName,
@Nullable Container container,
@Nullable WSBinding binding,
@Nullable SDDocumentSource primaryWsdl,
@Nullable Collection<? extends SDDocumentSource> metadata,
@Nullable EntityResolver resolver,
boolean isTransportSynchronous) {
return create(implType, processHandlerAnnotation, invoker, serviceName, portName, container, binding, primaryWsdl, metadata, resolver, isTransportSynchronous, true);
}
public static <T> WSEndpoint<T> create(
@NotNull Class<T> implType,
boolean processHandlerAnnotation,
@Nullable Invoker invoker,
@Nullable QName serviceName,
@Nullable QName portName,
@Nullable Container container,
@Nullable WSBinding binding,
@Nullable SDDocumentSource primaryWsdl,
@Nullable Collection<? extends SDDocumentSource> metadata,
@Nullable EntityResolver resolver,
boolean isTransportSynchronous,
boolean isStandard)
{
final WSEndpoint<T> endpoint =
EndpointFactory.createEndpoint(
implType,processHandlerAnnotation, invoker,serviceName,portName,container,binding,primaryWsdl,metadata,resolver,isTransportSynchronous,isStandard);
final Iterator<ManagedEndpointFactory> managementFactories = ServiceFinder.find(ManagedEndpointFactory.class).iterator();
if (managementFactories.hasNext()) {
final ManagedEndpointFactory managementFactory = managementFactories.next();
final EndpointCreationAttributes attributes = new EndpointCreationAttributes(
processHandlerAnnotation, invoker, resolver, isTransportSynchronous);
WSEndpoint<T> managedEndpoint = managementFactory.createEndpoint(endpoint, attributes);
if (endpoint.getAssemblerContext().getTerminalTube() instanceof EndpointAwareTube) {
((EndpointAwareTube)endpoint.getAssemblerContext().getTerminalTube()).setEndpoint(managedEndpoint);
}
return managedEndpoint;
}
return endpoint;
}
Deprecated version that assumes isTransportSynchronous==false
/**
* Deprecated version that assumes {@code isTransportSynchronous==false}
*/
@Deprecated
public static <T> WSEndpoint<T> create(
@NotNull Class<T> implType,
boolean processHandlerAnnotation,
@Nullable Invoker invoker,
@Nullable QName serviceName,
@Nullable QName portName,
@Nullable Container container,
@Nullable WSBinding binding,
@Nullable SDDocumentSource primaryWsdl,
@Nullable Collection<? extends SDDocumentSource> metadata,
@Nullable EntityResolver resolver) {
return create(implType,processHandlerAnnotation,invoker,serviceName,portName,container,binding,primaryWsdl,metadata,resolver,false);
}
The same as create(Class<Object>, boolean, Invoker, QName, QName, Container, WSBinding, SDDocumentSource, Collection<? extends SDDocumentSource>, EntityResolver)
except that this version takes an url of the jax-ws-catalog.xml
. Params: - catalogUrl – if not null, an
EntityResolver
is created from it and used. otherwise no resolution will be performed.
/**
* The same as
* {@link #create(Class, boolean, Invoker, QName, QName, Container, WSBinding, SDDocumentSource, Collection, EntityResolver)}
* except that this version takes an url of the {@code jax-ws-catalog.xml}.
*
* @param catalogUrl
* if not null, an {@link EntityResolver} is created from it and used.
* otherwise no resolution will be performed.
*/
public static <T> WSEndpoint<T> create(
@NotNull Class<T> implType,
boolean processHandlerAnnotation,
@Nullable Invoker invoker,
@Nullable QName serviceName,
@Nullable QName portName,
@Nullable Container container,
@Nullable WSBinding binding,
@Nullable SDDocumentSource primaryWsdl,
@Nullable Collection<? extends SDDocumentSource> metadata,
@Nullable URL catalogUrl) {
return create(
implType,processHandlerAnnotation,invoker,serviceName,portName,container,binding,primaryWsdl,metadata,
XmlUtil.createEntityResolver(catalogUrl),false);
}
Gives the wsdl:service default name computed from the endpoint implementaiton class
/**
* Gives the wsdl:service default name computed from the endpoint implementaiton class
*/
public static @NotNull QName getDefaultServiceName(Class endpointClass){
return getDefaultServiceName(endpointClass, true, null);
}
public static @NotNull QName getDefaultServiceName(Class endpointClass, MetadataReader metadataReader){
return getDefaultServiceName(endpointClass, true, metadataReader);
}
public static @NotNull QName getDefaultServiceName(Class endpointClass, boolean isStandard){
return getDefaultServiceName(endpointClass, isStandard, null);
}
public static @NotNull QName getDefaultServiceName(Class endpointClass, boolean isStandard, MetadataReader metadataReader){
return EndpointFactory.getDefaultServiceName(endpointClass, isStandard, metadataReader);
}
Gives the wsdl:service/wsdl:port default name computed from the endpoint implementaiton class
/**
* Gives the wsdl:service/wsdl:port default name computed from the endpoint implementaiton class
*/
public static @NotNull QName getDefaultPortName(@NotNull QName serviceName, Class endpointClass) {
return getDefaultPortName(serviceName, endpointClass, null);
}
public static @NotNull QName getDefaultPortName(@NotNull QName serviceName, Class endpointClass, MetadataReader metadataReader) {
return getDefaultPortName(serviceName, endpointClass, true, metadataReader);
}
public static @NotNull QName getDefaultPortName(@NotNull QName serviceName, Class endpointClass, boolean isStandard) {
return getDefaultPortName(serviceName, endpointClass, isStandard, null);
}
public static @NotNull QName getDefaultPortName(@NotNull QName serviceName, Class endpointClass, boolean isStandard, MetadataReader metadataReader){
return EndpointFactory.getDefaultPortName(serviceName, endpointClass, isStandard, metadataReader);
}
Return EndpointReference instance, based on passed parameters and spec version represented by clazz
Params: - clazz – represents spec version
- address – endpoint address
- wsdlAddress – wsdl address
- referenceParameters – any reference parameters to be added to the instance
Type parameters: - <T> –
Returns: EndpointReference instance based on passed parameters and values obtained from current instance
/**
* Return EndpointReference instance, based on passed parameters and spec version represented by clazz
* @param <T>
* @param clazz represents spec version
* @param address endpoint address
* @param wsdlAddress wsdl address
* @param referenceParameters any reference parameters to be added to the instance
* @return EndpointReference instance based on passed parameters and values obtained from current instance
*/
public abstract <T extends EndpointReference> T getEndpointReference(Class<T> clazz, String address, String wsdlAddress, Element... referenceParameters);
Params: - clazz –
- address –
- wsdlAddress –
- metadata –
- referenceParameters –
Type parameters: - <T> –
Returns: EndpointReference instance based on passed parameters and values obtained from current instance
/**
*
* @param <T>
* @param clazz
* @param address
* @param wsdlAddress
* @param metadata
* @param referenceParameters
* @return EndpointReference instance based on passed parameters and values obtained from current instance
*/
public abstract <T extends EndpointReference> T getEndpointReference(Class<T> clazz,
String address, String wsdlAddress, List<Element> metadata,
List<Element> referenceParameters);
Used for managed endpoints infrastructure to compare equality of proxies vs proxied endpoints.
Params: - endpoint –
Returns: true if the proxied endpoint instance held by this instance equals to 'endpoint', otherwise return false.
/**
* Used for managed endpoints infrastructure to compare equality of proxies vs proxied endpoints.
* @param endpoint
* @return true if the proxied endpoint instance held by this instance equals to 'endpoint', otherwise return false.
*/
public boolean equalsProxiedInstance(WSEndpoint endpoint) {
if (endpoint == null) return false;
return this.equals(endpoint);
}
Nullable when there is no associated WSDL Model
Returns:
/**
* Nullable when there is no associated WSDL Model
* @return
*/
public abstract @Nullable OperationDispatcher getOperationDispatcher();
This is used by WsaServerTube and WSEndpointImpl to create a Packet with SOAPFault message from a Java exception.
/**
* This is used by WsaServerTube and WSEndpointImpl to create a Packet with SOAPFault message from a Java exception.
*/
public abstract Packet createServiceResponseForException(final ThrowableContainerPropertySet tc,
final Packet responsePacket,
final SOAPVersion soapVersion,
final WSDLPort wsdlPort,
final SEIModel seiModel,
final WSBinding binding);
}