public static WSEndpoint<T> createEndpoint(Class<T> implType,
boolean processHandlerAnnotation,
Invoker invoker,
QName serviceName,
QName portName,
Container container,
WSBinding binding,
SDDocumentSource primaryWsdl,
Collection<SDDocumentSource> metadata,
EntityResolver resolver,
boolean isTransportSynchronous) {
if(implType ==null)
throw new IllegalArgumentException();
verifyImplementorClass(implType);
if (invoker == null) {
invoker = InstanceResolver.createDefault(implType).createInvoker();
}
List< SDDocumentSource > md = new ArrayList< SDDocumentSource >();
if(metadata!=null)
md.addAll(metadata);
if(primaryWsdl!=null && !md.contains(primaryWsdl))
md.add(primaryWsdl);
if(container==null)
container = ContainerResolver.getInstance().getContainer();
if(serviceName==null)
serviceName = getDefaultServiceName(implType);
if(portName==null)
portName = getDefaultPortName(serviceName,implType);
{// error check
String serviceNS = serviceName.getNamespaceURI();
String portNS = portName.getNamespaceURI();
if (!serviceNS.equals(portNS)) {
throw new ServerRtException("wrong.tns.for.port",portNS, serviceNS);
}
}
// setting a default binding
if (binding == null)
binding = BindingImpl.create(BindingID.parse(implType));
if (primaryWsdl != null) {
verifyPrimaryWSDL(primaryWsdl, serviceName);
}
QName portTypeName = null;
if (implType.getAnnotation(WebServiceProvider.class)==null) {
portTypeName = RuntimeModeler.getPortTypeName(implType);
}
// Categorises the documents as WSDL, Schema etc
List< SDDocumentImpl > docList = categoriseMetadata(md, serviceName, portTypeName);
// Finds the primary WSDL and makes sure that metadata doesn't have
// two concrete or abstract WSDLs
SDDocumentImpl primaryDoc = findPrimary(docList);
InvokerTube terminal;
WSDLPortImpl wsdlPort = null;
AbstractSEIModelImpl seiModel = null;
// create WSDL model
if (primaryDoc != null) {
wsdlPort = getWSDLPort(primaryDoc, docList, serviceName, portName, container);
}
WebServiceFeatureList features=((BindingImpl)binding).getFeatures();
features.parseAnnotations(implType);
// create terminal pipe that invokes the application
if (implType.getAnnotation(WebServiceProvider.class)!=null) {
//Provider case: Enable Addressing from WSDL only if it has RespectBindingFeature enabled
if (wsdlPort != null)
features.mergeFeatures(wsdlPort,true,true);
terminal = ProviderInvokerTube.create(implType,binding,invoker);
} else {
// Create runtime model for non Provider endpoints
seiModel = createSEIModel(wsdlPort, implType, serviceName, portName, binding);
if(binding instanceof SOAPBindingImpl){
//set portKnownHeaders on Binding, so that they can be used for MU processing
((SOAPBindingImpl)binding).setPortKnownHeaders(
((SOAPSEIModel)seiModel).getKnownHeaders());
}
// Generate WSDL for SEI endpoints(not for Provider endpoints)
if (primaryDoc == null) {
primaryDoc = generateWSDL(binding, seiModel, docList, container, implType);
// create WSDL model
wsdlPort = getWSDLPort(primaryDoc, docList, serviceName, portName, container);
seiModel.freeze(wsdlPort);
}
// New Features might have been added in WSDL through Policy.
// This sets only the wsdl features that are not already set(enabled/disabled)
features.mergeFeatures(wsdlPort, false, true);
terminal= new SEIInvokerTube(seiModel,invoker,binding);
}
// Process @HandlerChain, if handler-chain is not set via Deployment Descriptor
if (processHandlerAnnotation) {
processHandlerAnnotation(binding, implType, serviceName, portName);
}
// Selects only required metadata for this endpoint from the passed-in metadata
if (primaryDoc != null) {
docList = findMetadataClosure(primaryDoc, docList);
}
ServiceDefinitionImpl serviceDefiniton = (primaryDoc != null) ? new ServiceDefinitionImpl(docList, primaryDoc) : null;
return new WSEndpointImpl< T >(serviceName, portName, binding,container,seiModel,wsdlPort,implType, serviceDefiniton,terminal, isTransportSynchronous);
}
|