/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* 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.
*/
/**
* Base class for stubs, which accept method invocations from
* client applications and pass the message to a {@link Tube}
* for processing.
*
* <p>
* This class implements the management of pipe instances,
* and most of the {@link BindingProvider} methods.
*
* @author Kohsuke Kawaguchi
*/
/**
* Reuse pipelines as it's expensive to create.
* <p>
* Set to null when {@link #close() closed}.
*/
/**
* The {@link WSServiceDelegate} object that owns us.
*/
/**
* Non-null if this stub is configured to talk to an EPR.
* <p>
* When this field is non-null, its reference parameters are sent as out-bound headers.
* This field can be null even when addressing is enabled, but if the addressing is
* not enabled, this field must be null.
* <p>
* Unlike endpoint address, we are not letting users to change the EPR,
* as it contains references to services and so on that we don't want to change.
*/
/**
* represents AddressingVersion on binding if enabled, otherwise null;
*/
/**
* {@link ResponseContext} from the last synchronous operation.
*/
/**
* {@link Header}s to be added to outbound {@link Packet}.
* The contents is determined by the user.
*/
private boolean managedObjectManagerClosed = false;
/**
* @param master The created stub will send messages to this pipe.
* @param binding As a {@link BindingProvider}, this object will
* return this binding from {@link BindingProvider#getBinding()}.
* @param defaultEndPointAddress The destination of the message. The actual destination
* could be overridden by {@link RequestContext}.
* @param epr To create a stub that sends out reference parameters
* of a specific EPR, give that instance. Otherwise null.
* Its address field will not be used, and that should be given
* separately as the <tt>defaultEndPointAddress</tt>.
*/
protected Stub(WSServiceDelegate owner, Tube master, BindingImpl binding, WSDLPort wsdlPort, EndpointAddress defaultEndPointAddress, @Nullable WSEndpointReference epr) {
}
/**
* @param portInfo PortInfo for this stub
* @param binding As a {@link BindingProvider}, this object will
* return this binding from {@link BindingProvider#getBinding()}.
* @param defaultEndPointAddress The destination of the message. The actual destination
* could be overridden by {@link RequestContext}.
* @param epr To create a stub that sends out reference parameters
* of a specific EPR, give that instance. Otherwise null.
* Its address field will not be used, and that should be given
* separately as the <tt>defaultEndPointAddress</tt>.
*/
protected Stub(WSPortInfo portInfo, BindingImpl binding, EndpointAddress defaultEndPointAddress, @Nullable WSEndpointReference epr) {
this((WSServiceDelegate)portInfo.getOwner(),null, portInfo, binding,portInfo.getPort(),defaultEndPointAddress,epr);
}
private Stub(WSServiceDelegate owner, @Nullable Tube master, @Nullable WSPortInfo portInfo, BindingImpl binding, @Nullable WSDLPort wsdlPort, EndpointAddress defaultEndPointAddress, @Nullable WSEndpointReference epr) {
// if there is an EPR, EPR's address should be used for invocation instead of default address
else
this.endpointReference = epr;
// ManagedObjectManager MUST be created before the pipeline
// is constructed.
else
// This needs to happen after createPipeline.
// TBD: Check if it needs to happen outside the Stub constructor.
}
/**
* Creates a new pipeline for the given port name.
*/
//Check all required WSDL extensions are understood
if(portInfo instanceof SEIPortInfo) {
}
return assembler.createClient(
}
/**
* Checks only if RespectBindingFeature is enabled
* checks if all required wsdl extensions in the
* corresponding wsdl:Port are understood when RespectBindingFeature is enabled.
* @throws WebServiceException
* when any wsdl extension that has wsdl:required=true is not understood
*/
}
}
return portInfo;
}
/**
* Nullable when there is no associated WSDL Model
* @return
*/
return operationDispatcher;
}
/**
* Gets the port name that this stub is configured to talk to.
* <p>
* When {@link #wsdlPort} is non-null, the port name is always
* the same as {@link WSDLPort#getName()}, but this method
* returns a port name even if no WSDL is available for this stub.
*/
/**
* Gets the service name that this stub is configured to talk to.
* <p>
* When {@link #wsdlPort} is non-null, the service name is always
* the same as the one that's inferred from {@link WSDLPort#getOwner()},
* but this method returns a port name even if no WSDL is available for
* this stub.
*/
return owner.getServiceName();
}
/**
* Gets the {@link Executor} to be used for asynchronous method invocations.
* <p>
* Note that the value this method returns may different from invocations
* to invocations. The caller must not cache.
*
* @return always non-null.
*/
return owner.getExecutor();
}
/**
* Passes a message to a pipe for processing.
* <p>
* Unlike {@link Tube} instances,
* this method is thread-safe and can be invoked from
* multiple threads concurrently.
*
* @param packet The message to be sent to the server
* @param requestContext The {@link RequestContext} when this invocation is originally scheduled.
* This must be the same object as {@link #requestContext} for synchronous
* invocations, but for asynchronous invocations, it needs to be a snapshot
* captured at the point of invocation, to correctly satisfy the spec requirement.
* @param receiver Receives the {@link ResponseContext}. Since the spec requires
* that the asynchronous invocations must not update response context,
* depending on the mode of invocation they have to go to different places.
* So we take a setter that abstracts that away.
*/
protected final Packet process(Packet packet, RequestContext requestContext, ResponseContextReceiver receiver) {
// then send it away!
try {
} finally {
// this allows us to capture the packet even when the call failed with an exception.
// when the call fails with an exception it's no longer a 'reply' but it may provide some information
// about what went wrong.
// note that Packet can still be updated after
// ResponseContext is created.
}
}
// fill in Packet
if (wsdlProperties != null) {
}
if (addrVersion != null) {
// populate request WS-Addressing headers
// Spec is not clear on if ReferenceParameters are to be added when addressing is not enabled,
// but the EPR has ReferenceParameters.
// Current approach: Add ReferenceParameters only if addressing enabled.
if (endpointReference != null)
}
// to make it multi-thread safe we need to first get a stable snapshot
}
/**
* Passes a message through a {@link Tube}line for processing. The processing happens
* asynchronously and when the response is available, Fiber.CompletionCallback is
* called. The processing could happen on multiple threads.
*
* <p>
* Unlike {@link Tube} instances,
* this method is thread-safe and can be invoked from
* multiple threads concurrently.
*
* @param request The message to be sent to the server
* @param requestContext The {@link RequestContext} when this invocation is originally scheduled.
* This must be the same object as {@link #requestContext} for synchronous
* invocations, but for asynchronous invocations, it needs to be a snapshot
* captured at the point of invocation, to correctly satisfy the spec requirement.
* @param completionCallback Once the processing is done, the callback is invoked.
*/
protected final void processAsync(Packet request, RequestContext requestContext, final Fiber.CompletionCallback completionCallback) {
// fill in Packet
// then send it away!
}
// let's not reuse tubes as they might be in a wrong state, so not
// calling pool.recycle()
}
});
}
public void close() {
// multi-thread safety of 'close' needs to be considered more carefully.
// some calls might be pending while this method is invoked. Should we
// block until they are complete, or should we abort them (but how?)
p.preDestroy();
}
if (managedObjectManagerClosed) {
return;
} else {
managedObjectManagerClosed = true;
}
}
return binding;
}
return requestContext.getMapView();
}
return responseContext;
}
this.responseContext = rc;
}
return RuntimeVersion.VERSION + ": Stub for " + getRequestContext().get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY);
}
throw new java.lang.UnsupportedOperationException(ClientMessages.UNSUPPORTED_OPERATION("BindingProvider.getEndpointReference(Class<T> class)", "XML/HTTP Binding", "SOAP11 or SOAP12 Binding"));
if (endpointReference != null) {
return endpointReference;
}
List<WSEndpointReference.EPRExtension> wsdlEPRExtensions = new ArrayList<WSEndpointReference.EPRExtension>();
//gather EPRExtensions specified in WSDL.
try {
XMLStreamBuffer.createNewBufferFromXMLStreamReader(extnEl.readAsXMLStreamReader()), extnEl.getQName()));
}
}
} catch (XMLStreamException ex) {
throw new WebServiceException(ex);
}
}
this.endpointReference = new WSEndpointReference(
av, eprAddress, getServiceName(), getPortName(), portTypeName, null, wsdlAddress, null,wsdlEPRExtensions,null);
return this.endpointReference;
}
throw new java.lang.UnsupportedOperationException(ClientMessages.UNSUPPORTED_OPERATION("BindingProvider.getEndpointReference()", "XML/HTTP Binding", "SOAP11 or SOAP12 Binding"));
return getEndpointReference(W3CEndpointReference.class);
}
}
return managedObjectManager;
}
//
//
// WSBindingProvider methods
//
//
this.userOutboundHeaders = null;
} else {
if(h==null)
throw new IllegalArgumentException();
}
}
}
this.userOutboundHeaders = null;
} else {
if(h==null)
throw new IllegalArgumentException();
}
}
}
}
}
}