org.apache.axis2.receivers
abstract public class: AbstractMessageReceiver [javadoc |
source]
java.lang.Object
org.apache.axis2.receivers.AbstractMessageReceiver
All Implemented Interfaces:
MessageReceiver
Direct Known Subclasses:
CorbaMessageReceiver, RawXMLINOnlyMessageReceiver, EJBMessageReceiver, RMIMessageReciever, RawXMLINOutMessageReceiver, AbstractInMessageReceiver, AbstractRobustInMessageReceiver, ScriptReceiver, EJBInOnlyMessageReceiver, RawXMLINOutAsyncMessageReceiver, CorbaInOnlyMessageReceiver, AbstractInOutSyncMessageReceiver, MexMessageReceiver, AbstractInOutMessageReceiver, RawXMLINOutMessageReceiver, RPCInOutAsyncMessageReceiver, PingMessageReceiver, AbstractInOutAsyncMessageReceiver, RawXMLINOnlyMessageReceiver, RPCInOnlyMessageReceiver, CorbaInOutAsyncMessageReceiver, EJBInOutAsyncMessageReceiver, RPCMessageReceiver
| Field Summary |
|---|
| protected static final Log | log | |
| public static final String | SCOPE | |
| protected String | serviceTCCL | |
| public static final String | SAVED_TCCL | |
| public static final String | SAVED_MC | |
| public static final String | DO_ASYNC | |
| Method from org.apache.axis2.receivers.AbstractMessageReceiver Detail: |
public SOAPFactory getSOAPFactory(MessageContext msgContext) throws AxisFault {
String nsURI = msgContext.getEnvelope().getNamespace().getNamespaceURI();
if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(nsURI)) {
return OMAbstractFactory.getSOAP12Factory();
} else if (SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(nsURI)) {
return OMAbstractFactory.getSOAP11Factory();
} else {
throw new AxisFault(Messages.getMessage("invalidSOAPversion"));
}
}
|
protected Object getTheImplementationObject(MessageContext msgContext) throws AxisFault {
ServiceContext serviceContext = msgContext.getServiceContext();
Object serviceimpl = serviceContext.getProperty(ServiceContext.SERVICE_OBJECT);
if (serviceimpl != null) {
// since service impl is there in service context , take that from there
return serviceimpl;
} else {
// create a new service impl class for that service
serviceimpl = makeNewServiceObject(msgContext);
//Service initialization
DependencyManager.initServiceObject(serviceimpl, msgContext.getServiceContext());
serviceContext.setProperty(ServiceContext.SERVICE_OBJECT, serviceimpl);
return serviceimpl;
}
}
Retrieve the implementation object. This will either return a cached
object if present in the ServiceContext, or create a new one via
makeNewServiceObject() (and then cache that). |
abstract protected void invokeBusinessLogic(MessageContext messageCtx) throws AxisFault
Do the actual work of the MessageReceiver. Must be overridden by concrete subclasses. |
protected Object makeNewServiceObject(MessageContext msgContext) throws AxisFault {
try {
final AxisService service = msgContext.getAxisService();
ClassLoader classLoader = service.getClassLoader();
// allow alternative definition of makeNewServiceObject
if (service.getParameter(Constants.SERVICE_OBJECT_SUPPLIER) != null) {
Parameter serviceObjectParam =
service.getParameter(Constants.SERVICE_OBJECT_SUPPLIER);
final Class serviceObjectMaker = Loader.loadClass(classLoader, ((String)
serviceObjectParam.getValue()).trim());
// Find static getServiceObject() method, call it if there
final Method method = (Method) org.apache.axis2.java.security.AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run() throws NoSuchMethodException {
return serviceObjectMaker.getMethod("getServiceObject",
new Class[]{AxisService.class});
}
}
);
if (method != null) {
return org.apache.axis2.java.security.AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run() throws InvocationTargetException, IllegalAccessException, InstantiationException {
return method.invoke(serviceObjectMaker.newInstance(), new Object[]{service});
}
}
);
}
}
Parameter implInfoParam = service.getParameter(Constants.SERVICE_CLASS);
if (implInfoParam != null) {
final Class implClass = Loader.loadClass(
classLoader,
((String) implInfoParam.getValue()).trim());
return org.apache.axis2.java.security.AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run() throws InstantiationException, IllegalAccessException {
return implClass.newInstance();
}
}
);
} else {
throw new AxisFault(
Messages.getMessage("paramIsNotSpecified", "SERVICE_OBJECT_SUPPLIER"));
}
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
}
Create a new service object. Override if you want to customize how
this happens in your own MessageReceiver. |
public void receive(MessageContext messageCtx) throws AxisFault {
if (messageCtx.isPropertyTrue(DO_ASYNC)
|| ((messageCtx.getParameter(DO_ASYNC) != null) &&
JavaUtils.isTrueExplicitly(messageCtx.getParameter(DO_ASYNC).getValue()))) {
String mep = messageCtx.getAxisOperation()
.getMessageExchangePattern();
EndpointReference replyTo = messageCtx.getReplyTo();
// In order to invoke the service in the ASYNC mode, the request
// should contain ReplyTo header if the MEP of the service is not
// InOnly type
if ((!WSDLUtil.isOutputPresentForMEP(mep))
|| (replyTo != null && !replyTo.hasAnonymousAddress())) {
AsyncMessageReceiverWorker worker = new AsyncMessageReceiverWorker(
messageCtx);
messageCtx.getEnvelope().build();
messageCtx.getConfigurationContext().getThreadPool().execute(
worker);
return;
}
}
ThreadContextDescriptor tc = setThreadContext(messageCtx);
try {
invokeBusinessLogic(messageCtx);
} catch (AxisFault fault) {
// If we're in-only, eat this. Otherwise, toss it upwards!
if ((messageCtx.getAxisOperation() instanceof InOnlyAxisOperation) &&
!WSDL2Constants.MEP_URI_ROBUST_IN_ONLY.equals(messageCtx.getAxisOperation().getMessageExchangePattern())) {
log.error(fault);
} else {
fault.setFaultType(Constants.APPLICATION_FAULT);
throw fault;
}
} finally {
restoreThreadContext(tc);
}
}
|
protected void replicateState(MessageContext messageContext) throws ClusteringFault {
Replicator.replicate(messageContext);
}
|
protected void restoreThreadContext(AbstractMessageReceiver.ThreadContextDescriptor tc) {
org.apache.axis2.java.security.AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
Thread.currentThread().setContextClassLoader(tc.oldClassLoader);
return null;
}
}
);
MessageContext.currentMessageContext.set(tc.oldMessageContext);
}
|
protected AbstractMessageReceiver.ThreadContextDescriptor setThreadContext(MessageContext msgContext) {
ThreadContextDescriptor tc = new ThreadContextDescriptor();
tc.oldMessageContext = (MessageContext) MessageContext.currentMessageContext.get();
final ClassLoader contextClassLoader = getContextClassLoader_doPriv();
tc.oldClassLoader = contextClassLoader;
AxisService service = msgContext.getAxisService();
String serviceTCCL = (String) service.getParameterValue(Constants.SERVICE_TCCL);
if (serviceTCCL != null) {
serviceTCCL = serviceTCCL.trim().toLowerCase();
if (serviceTCCL.equals(Constants.TCCL_COMPOSITE)) {
final ClassLoader loader = (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return new MultiParentClassLoader(new URL[]{},
new ClassLoader[]{
msgContext.getAxisService().getClassLoader(),
contextClassLoader
});
}
});
org.apache.axis2.java.security.AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
Thread.currentThread().setContextClassLoader(
loader);
return null;
}
}
);
} else if (serviceTCCL.equals(Constants.TCCL_SERVICE)) {
org.apache.axis2.java.security.AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
Thread.currentThread().setContextClassLoader(
msgContext.getAxisService().getClassLoader()
);
return null;
}
}
);
}
}
MessageContext.setCurrentMessageContext(msgContext);
return tc;
}
Several pieces of information need to be available to the service
implementation class. For one, the ThreadContextClassLoader needs
to be correct, and for another we need to give the service code
access to the MessageContext (getCurrentContext()). So we toss these
things in TLS. |