endpointdescriptionimpl.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,359 行 · 第 1/5 页
JAVA
1,359 行
else
webServiceProviderAnnotation = composite.getWebServiceProviderAnnot();
// REVIEW: Maybe this should be an error if the name has already been set and it doesn't match
// Note that on the client side, the service QN should be set; on the server side it will not be.
if (DescriptionUtils.isEmpty(getServiceDescription().getServiceQName())) {
getServiceDescriptionImpl().setServiceQName(getServiceQName());
}
//Call the getter to insure the qualified port name is set.
getPortQName();
// TODO: Refactor this with the consideration of no WSDL/Generic Service/Annotated SEI
setupAxisServiceFromDBL();
addToAxisService(); //Add a reference to this EndpointDescription to the AxisService
//TODO: Need to remove operations from AxisService that have 'exclude = true
// then call 'validateOperations' to verify that WSDL and AxisService match up,
// Remember that this will only happen when we generate an AxisService from existing
// WSDL and then need to perform further processing because we have annotations as well
// If there is no WSDL, we would never process the Method to begin with.
buildDescriptionHierachy();
WsdlComposite wsdlComposite = null;
String bindingType = getBindingType();
boolean isSOAP11 =
(bindingType.equals(javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING) ||
bindingType.equals(javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING))
? true : false;
// Determine if we need to generate WSDL
// First, make sure that this is only a SOAP 1.1 based binding, per JAXWS spec. we cannot
// generate WSDL if the binding type is not SOAP 1.1 based.
// Then, assuming the composite does not contain a
// Wsdl Definition, go ahead and generate it
// REVIEW: I think this should this be isSOAP11 so the generators are only called for
// SOAP11; i.e. NOT for SOAP12 or XML/HTTP bindings.
if (isSOAP11){
if (
(isEndpointBased() &&
DescriptionUtils.isEmpty(getAnnoWebServiceEndpointInterface()))
||
(!isEndpointBased())
) {
//This is either an implicit SEI, or a WebService Provider
wsdlComposite = generateWSDL(composite);
} else if (isEndpointBased()) {
//This impl class specifies an SEI...this is a special case. There is a bug
//in the tooling that allows for the wsdllocation to be specifed on either the
//impl. class, or the SEI, or both. So, we need to look for the wsdl as follows:
// 1. If the Wsdl exists on the SEI, then check for it on the impl.
// 2. If it is not found in either location, in that order, then generate
DescriptionBuilderComposite seic =
getServiceDescriptionImpl().getDBCMap()
.get(composite.getWebServiceAnnot().endpointInterface());
//Only generate WSDL if a definition doesn't already exist
if (seic.getWsdlDefinition() == null)
wsdlComposite = generateWSDL(composite);
}
} else if (composite.getWsdlDefinition() == null) {
//This is a SOAP12 binding that does not contain a WSDL definition, log a WARNING
log.warn("This implementation does not contain a WSDL definition and is not a SOAP 1.1 based binding. "
+ "Per JAXWS spec. - a WSDL definition cannot be generated for this implementation. Name: "
+ composite.getClassName());
}
if (isSOAP11){
//Save the WSDL Location and the WsdlDefinition, value depends on whether wsdl was generated
Parameter wsdlLocationParameter = new Parameter();
wsdlLocationParameter.setName(MDQConstants.WSDL_LOCATION);
Parameter wsdlDefParameter = new Parameter();
wsdlDefParameter.setName(MDQConstants.WSDL_DEFINITION);
Parameter wsdlCompositeParameter = new Parameter();
wsdlCompositeParameter.setName(MDQConstants.WSDL_COMPOSITE);
if (wsdlComposite != null) {
//We have a wsdl composite, so set these values for the generated wsdl
wsdlCompositeParameter.setValue(wsdlComposite);
wsdlLocationParameter.setValue(wsdlComposite.getWsdlFileName());
wsdlDefParameter.setValue(
getServiceDescriptionImpl().getGeneratedWsdlWrapper().getDefinition());
} else if (getServiceDescriptionImpl().getWSDLWrapper() != null) {
//No wsdl composite because wsdl already exists
wsdlLocationParameter.setValue(getAnnoWebServiceWSDLLocation());
wsdlDefParameter.setValue(getServiceDescriptionImpl().getWSDLWrapper().getDefinition());
} else {
//There is no wsdl composite and there is NOT a wsdl definition
wsdlLocationParameter.setValue(null);
wsdlDefParameter.setValue(null);
}
try {
if (wsdlComposite != null) {
axisService.addParameter(wsdlCompositeParameter);
}
axisService.addParameter(wsdlDefParameter);
axisService.addParameter(wsdlLocationParameter);
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(
"EndpointDescription: Unable to add parameters to AxisService");
}
}
else {
// Need to account for SOAP 1.2 WSDL when supplied with application
Parameter wsdlDefParameter = new Parameter();
wsdlDefParameter.setName(MDQConstants.WSDL_DEFINITION);
Parameter wsdlLocationParameter = new Parameter();
wsdlLocationParameter.setName(MDQConstants.WSDL_LOCATION);
if (getServiceDescriptionImpl().getWSDLWrapper() != null) {
wsdlLocationParameter.setValue(getAnnoWebServiceWSDLLocation());
wsdlDefParameter.setValue(getServiceDescriptionImpl().getWSDLWrapper()
.getDefinition());
}
// No WSDL supplied and we do not generate for non-SOAP 1.1/HTTP
// endpoints
else {
wsdlLocationParameter.setValue(null);
wsdlDefParameter.setValue(null);
}
try {
axisService.addParameter(wsdlDefParameter);
axisService.addParameter(wsdlLocationParameter);
} catch (Exception e) {
throw ExceptionFactory
.makeWebServiceException("EndpointDescription: Unable to add parameters to AxisService");
}
}
}
/**
* Create from an annotated implementation or SEI class. Note this is
* currently used only on the server-side (this probably won't change).
*
* @param theClass An implemntation or SEI class
* @param portName May be null; if so the annotation is used
* @param parent
*/
EndpointDescriptionImpl(Class theClass, QName portName, AxisService axisService,
ServiceDescriptionImpl parent) {
this.parentServiceDescription = parent;
this.portQName = portName;
this.implOrSEIClass = theClass;
this.axisService = axisService;
addToAxisService();
buildEndpointDescriptionFromAnnotations();
// The anonymous AxisOperations are currently NOT added here. The reason
// is that (for now) this is a SERVER-SIDE code path, and the anonymous operations
// are only needed on the client side.
}
private void addToAxisService() {
// Add a reference to this EndpointDescription object to the AxisService
if (axisService != null) {
Parameter parameter = new Parameter();
parameter.setName(EndpointDescription.AXIS_SERVICE_PARAMETER);
parameter.setValue(this);
// TODO: What to do if AxisFault
try {
axisService.addParameter(parameter);
} catch (AxisFault e) {
// TODO: Throwing wrong exception
e.printStackTrace();
throw new UnsupportedOperationException("Can't add AxisService param: " + e);
}
}
}
private void buildEndpointDescriptionFromAnnotations() {
// TODO: The comments below are not quite correct; this method is used on BOTH the
// client and server. On the client the class is always an SEI. On the server it
// is always a service impl which may be a provider or endpoint based;
// endpoint based may reference an SEI class
// The Service Implementation class could be either Provider-based or Endpoint-based. The
// annotations that are present are similar but different. Conformance requirements
// per JAX-WS
// - A Provider based implementation MUST carry the @WebServiceProvider annotation
// per section 5.1 javax.xml.ws.Provider on page 63
// - An Endpoint based implementation MUST carry the @WebService annotation per JSR-181
// (reference TBD) and JAX-WS (reference TBD)
// - An Endpoint based implementation @WebService annotation MAY reference an endpoint
// interface
// - The @WebService and @WebServiceProvider annotations can not appear in the same class per
// JAX-WS section 7.7 on page 82.
// Verify that one (and only one) of the required annotations is present.
// TODO: Add tests to verify this error checking
if (!getServiceDescriptionImpl().isDBCMap()) {
webServiceAnnotation = (WebService)implOrSEIClass.getAnnotation(WebService.class);
webServiceProviderAnnotation =
(WebServiceProvider)implOrSEIClass.getAnnotation(WebServiceProvider.class);
if (webServiceAnnotation == null && webServiceProviderAnnotation == null)
// TODO: NLS
throw ExceptionFactory.makeWebServiceException(
"Either WebService or WebServiceProvider annotation must be present on " +
implOrSEIClass);
else if (webServiceAnnotation != null && webServiceProviderAnnotation != null)
// TODO: NLS
throw ExceptionFactory.makeWebServiceException(
"Both WebService or WebServiceProvider annotations cannot be presenton " +
implOrSEIClass);
}
// If portName was specified, set it. Otherwise, we will get it from the appropriate
// annotation when the getter is called.
// TODO: If the portName is specified, should we verify it against the annotation?
// TODO: Add tests: null portName, !null portName, portName != annotation value
// TODO: Get portName from annotation if it is null.
// If this is an Endpoint-based service implementation (i.e. not a
// Provider-based one), then create the EndpointInterfaceDescription to contain
// the operations on the endpoint. Provider-based endpoints don't have operations
// associated with them, so they don't have an EndpointInterfaceDescription.
if (webServiceAnnotation != null) {
// If this impl class references an SEI, then use that SEI to create the EndpointInterfaceDesc.
// TODO: Add support for service impl endpoints that don't reference an SEI; remember
// that this is also called with just an SEI interface from svcDesc.updateWithSEI()
String seiClassName = getAnnoWebServiceEndpointInterface();
if (!getServiceDescriptionImpl().isDBCMap()) {
Class seiClass = null;
if (DescriptionUtils.isEmpty(seiClassName)) {
// For now, just build the EndpointInterfaceDesc based on the class itself.
// TODO: The EID ctor doesn't correctly handle anything but an SEI at this
// point; e.g. it doesn't publish the correct methods of just an impl.
seiClass = implOrSEIClass;
} else {
try {
// TODO: Using Class forName() is probably not the best long-term way to get the SEI class from the annotation
seiClass = ClassLoaderUtils.forName(seiClassName, false,
ClassLoaderUtils.getContextClassLoader());
// Catch Throwable as ClassLoader can throw an NoClassDefFoundError that
// does not extend Exception, so lets catch everything that extends Throwable
// rather than just Exception.
} catch (Throwable e) {
// TODO: Throwing wrong exception
e.printStackTrace();
throw new UnsupportedOperationException("Can't create SEI class: " + e);
}
}
endpointInterfaceDescription = new EndpointInterfaceDescriptionImpl(seiClass, this);
} else {
//TODO: Determine if we need logic here to determine implied SEI or not. This logic
// may be handled by EndpointInterfaceDescription
if (DescriptionUtils.isEmpty(getAnnoWebServiceEndpointInterface())) {
//TODO: Build the EndpointInterfaceDesc based on the class itself
endpointInterfaceDescription =
new EndpointInterfaceDescriptionImpl(composite, true, this);
} else {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?