// 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);
PolicyMap policyMap = null;
// create terminal pipe that invokes the application
if (implType.getAnnotation(WebServiceProvider.class)!=null) {
//TODO incase of Provider, provide a way to User for complete control of the message processing by giving
// ability to turn off the WSDL/Policy based features and its associated tubes.
//Even in case of Provider, merge all features configured via WSDL/Policy or deployment configuration
Iterable<WebServiceFeature> configFtrs;
if(wsdlPort != null) {
policyMap = wsdlPort.getOwner().getParent().getPolicyMap();
//Merge features from WSDL and other policy configuration
configFtrs = wsdlPort.getFeatures();
} else {
//No WSDL, so try to merge features from Policy configuration
policyMap = PolicyResolverFactory.create().resolve(
new PolicyResolver.ServerContext(null, container, implType, false));
configFtrs = PolicyUtil.getPortScopedFeatures(policyMap,serviceName,portName);
}
features.mergeFeatures(configFtrs, 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);
}
policyMap = wsdlPort.getOwner().getParent().getPolicyMap();
// New Features might have been added in WSDL through Policy.
//Merge features from WSDL and other policy configuration
// This sets only the wsdl features that are not already set(enabled/disabled)
features.mergeFeatures(wsdlPort.getFeatures(), true);
terminal= new SEIInvokerTube(seiModel,invoker,binding);
}
// Process @HandlerChain, if handler-chain is not set via Deployment Descriptor
if (processHandlerAnnotation) {