providerdispatcher.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 425 行 · 第 1/2 页
JAVA
425 行
responseMsgCtx = MessageContextUtils.createResponseMessageContext(mc);
responseMsgCtx.setMessage(responseMsg);
}
} else {
// If we have a one-way operation, then we cannot create a MessageContext for the response.
return null;
}
return responseMsgCtx;
}
protected Object invokeProvider(MessageContext ctx,
Provider provider,
Object input) throws Exception {
return provider.invoke(input);
}
/**
* Get the endpoint provider instance
*
* @return Provider
* @throws Exception
*/
public Provider getProvider() throws Exception {
Provider p = getProviderInstance();
setProvider(p);
return p;
}
/**
* Set the endpoint provider instance
*
* @param _provider
*/
public void setProvider(Provider _provider) {
this.providerInstance = _provider;
}
/**
* Get the parameter for a given endpoint invocation
*
* @return
* @throws Exception
*/
public Message getMessage() throws Exception {
return message;
}
/**
* Set the parameter for a given endpoint invocation
*
* @param msg
*/
public void setMessage(Message msg) {
this.message = msg;
}
/*
* Create a Message object out of the value object that was returned.
*/
private Message createMessageFromValue(Object value) throws Exception {
MessageFactory msgFactory =
(MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
Message message = null;
if (value != null) {
BlockFactory factory = createBlockFactory(providerType);
if (value instanceof XMLFault) {
message = msgFactory.create(messageProtocol);
message.setXMLFault((XMLFault)value);
} else if (providerServiceMode != null && providerServiceMode == Service.Mode.MESSAGE) {
// For MESSAGE mode, work with the entire message, Headers and Body
// This is based on logic in org.apache.axis2.jaxws.client.XMLDispatch.createMessageFromBundle()
if (value instanceof SOAPMessage) {
message = msgFactory.createFrom((SOAPMessage)value);
} else {
Block block = factory.createFrom(value, null, null);
message = msgFactory.createFrom(block, null, messageProtocol);
}
} else {
// PAYLOAD mode deals only with the body of the message.
Block block = factory.createFrom(value, null, null);
message = msgFactory.create(messageProtocol);
message.setBodyBlock(block);
}
}
if (message == null)
// If we didn't create a message above (because there was no value), create one here
message = msgFactory.create(messageProtocol);
return message;
}
/*
* Determine the Provider type for this instance
*/
private Provider getProviderInstance() throws Exception {
Class<?> clazz = getProviderType();
if (!isValidProviderType(clazz)) {
//TODO This will change once deployment code it in place
throw new Exception(Messages.getMessage("InvalidProvider", clazz.getName()));
}
Provider provider = null;
if (clazz == String.class) {
provider = (Provider<String>)serviceInstance;
} else if (clazz == Source.class) {
provider = (Provider<Source>)serviceInstance;
} else if (clazz == SOAPMessage.class) {
provider = (Provider<SOAPMessage>)serviceInstance;
} else if (clazz == JAXBContext.class) {
provider = (Provider<JAXBContext>)serviceInstance;
}
if (provider == null) {
throw ExceptionFactory.makeWebServiceException(
Messages.getMessage("InvalidProviderCreate", clazz.getName()));
}
return provider;
}
/*
* Get the provider type from a given implemention class instance
*/
private Class<?> getProviderType() throws Exception {
Class providerType = null;
Type[] giTypes = serviceImplClass.getGenericInterfaces();
for (Type giType : giTypes) {
ParameterizedType paramType = null;
try {
paramType = (ParameterizedType)giType;
} catch (ClassCastException e) {
//TODO NLS
throw new Exception(
"Provider based SEI Class has to implement javax.xml.ws.Provider as javax.xml.ws.Provider<String>, javax.xml.ws.Provider<SOAPMessage>, javax.xml.ws.Provider<Source> or javax.xml.ws.Provider<JAXBContext>");
}
Class interfaceName = (Class)paramType.getRawType();
if (interfaceName == javax.xml.ws.Provider.class) {
if (paramType.getActualTypeArguments().length > 1) {
//TODO NLS
throw new Exception(
"Provider cannot have more than one Generic Types defined as Per JAX-WS Specification");
}
providerType = (Class)paramType.getActualTypeArguments()[0];
}
}
return providerType;
}
/*
* Validate whether or not the Class passed in is a valid type of
* javax.xml.ws.Provider<T>. Per the JAX-WS 2.0 specification, the
* parameterized type of a Provider can only be:
*
* javax.xml.transform.Source
* javax.xml.soap.SOAPMessage
* javax.activation.DataSource
*
* We've also added support for String types which is NOT dictated
* by the spec.
*/
private boolean isValidProviderType(Class clazz) {
boolean valid = clazz == String.class ||
clazz == SOAPMessage.class ||
clazz == Source.class ||
clazz == DataSource.class;
if (!valid) {
if (log.isDebugEnabled()) {
log.debug("Class " + clazz.getName() + " is not a valid Provider<T> type");
}
}
return valid;
}
/*
* Given a target class type for a payload, load the appropriate BlockFactory.
*/
private BlockFactory createBlockFactory(Class type) {
if (blockFactory != null)
return blockFactory;
if (type.equals(String.class)) {
blockFactory = (XMLStringBlockFactory)FactoryRegistry.getFactory(
XMLStringBlockFactory.class);
} else if (type.equals(Source.class)) {
blockFactory = (SourceBlockFactory)FactoryRegistry.getFactory(
SourceBlockFactory.class);
} else if (type.equals(SOAPMessage.class)) {
blockFactory = (SOAPEnvelopeBlockFactory)FactoryRegistry.getFactory(
SOAPEnvelopeBlockFactory.class);
} else {
ExceptionFactory.makeWebServiceException("Unable to find BlockFactory " +
"for type: " + type.getClass().getName());
}
return blockFactory;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?