}
public WebServiceBinding read(XMLStreamReader reader, ProcessorContext context) throws ContributionReadException, XMLStreamException {
Monitor monitor = context.getMonitor();
// Read a <binding.ws>
WebServiceBinding wsBinding = wsFactory.createWebServiceBinding();
/*ExtensionType bindingType = intentAttachPointTypeFactory.createBindingType();
bindingType.setName(getArtifactType());
bindingType.setUnresolved(true);
((PolicySubject)wsBinding).setType(bindingType);*/
wsBinding.setUnresolved(true);
// Read policies
policyProcessor.readPolicies(wsBinding, reader);
// Read the binding name
String name = reader.getAttributeValue(null, NAME);
if (name != null) {
wsBinding.setName(name);
}
// a collection of endpoint specifications so that we can test that
// only one is present
List<String> endpointSpecifications = new ArrayList<String>();
// Read URI
String uri = getURIString(reader, URI);
if (uri != null) {
wsBinding.setURI(uri);
wsBinding.setUserSpecifiedURI(uri);
// BWS20001
if (context.getParentModel() instanceof Reference){
try {
URI tmpURI = new URI(uri);
if (!tmpURI.isAbsolute()){
error(monitor, "URINotAbsolute", reader, uri);
}
} catch (URISyntaxException ex){
error(monitor, "InvalidURISyntax", reader, ex.getMessage());
}
endpointSpecifications.add("uri");
}
// BWS20020
if ((context.getParentModel() instanceof Callback) &&
(((Callback)context.getParentModel()).getParentContract() instanceof org.apache.tuscany.sca.assembly.Service)){
error(monitor, "URIFoundForServiceCallback", reader, uri);
}
}
// Read a qname in the form:
// namespace#wsdl.???(name)
Boolean wsdlElementIsBinding = null;
String wsdlElement = getURIString(reader, WSDL_ELEMENT);
if (wsdlElement != null) {
int index = wsdlElement.indexOf('#');
if (index == -1) {
error(monitor, "InvalidWsdlElementAttr", reader, wsdlElement);
//throw new ContributionReadException("Invalid WebService binding wsdlElement attribute: " + wsdlElement);
return wsBinding;
}
String namespace = wsdlElement.substring(0, index);
wsBinding.setNamespace(namespace);
String localName = wsdlElement.substring(index + 1);
if (localName.startsWith("wsdl.service")) {
// BWS20003
if (context.getParentModel() instanceof org.apache.tuscany.sca.assembly.Service){
error(monitor, "WSDLServiceOnService", reader, wsdlElement);
}
// Read a wsdl.service
localName = localName.substring("wsdl.service(".length(), localName.length() - 1);
wsBinding.setServiceName(new QName(namespace, localName));
endpointSpecifications.add("#wsdl.service");
} else if (localName.startsWith("wsdl.port")) {
// Read a wsdl.port
localName = localName.substring("wsdl.port(".length(), localName.length() - 1);
int s = localName.indexOf('/');
if (s == -1) {
error(monitor, "InvalidWsdlElementAttr", reader, wsdlElement);
//throw new ContributionReadException("Invalid WebService binding wsdlElement attribute: " + wsdlElement);
} else {
wsBinding.setServiceName(new QName(namespace, localName.substring(0, s)));
wsBinding.setPortName(localName.substring(s + 1));
}
endpointSpecifications.add("#wsdl.port");
} else if (localName.startsWith("wsdl.endpoint")) {
// Read a wsdl.endpoint
localName = localName.substring("wsdl.endpoint(".length(), localName.length() - 1);
int s = localName.indexOf('/');
if (s == -1) {
error(monitor, "InvalidWsdlElementAttr", reader, wsdlElement);
//throw new ContributionReadException("Invalid WebService binding wsdlElement attribute: " + wsdlElement);
} else {
wsBinding.setServiceName(new QName(namespace, localName.substring(0, s)));
wsBinding.setEndpointName(localName.substring(s + 1));
}
} else if (localName.startsWith("wsdl.binding")) {
// Read a wsdl.binding
localName = localName.substring("wsdl.binding(".length(), localName.length() - 1);
wsBinding.setBindingName(new QName(namespace, localName));
wsdlElementIsBinding = true;
} else {
error(monitor, "InvalidWsdlElementAttr", reader, wsdlElement);
//throw new ContributionReadException("Invalid WebService binding wsdlElement attribute: " + wsdlElement);
}
}
// Read wsdlLocation
String wsdliLocation = reader.getAttributeValue(WSDLI_NS, WSDL_LOCATION);
if (wsdliLocation != null) {
if (wsdlElement == null) {
error(monitor, "WsdliLocationMissingWsdlElement", reader);
}
String[] iris = wsdliLocation.split(" ");
if (iris.length % 2 != 0) {
error(monitor, "WsdliLocationNotIRIPairs", reader);
}
for (int i=0; i<iris.length-1; i=i+2) {
wsBinding.getWsdliLocations().put(iris[i], iris[i+1]);
}
}
//add binding extensions
QName elementName = reader.getName();
for (int i = 0; i < reader.getAttributeCount(); i++) {
QName attributeName = reader.getAttributeName(i);
if(attributeName.getNamespaceURI() != null && attributeName.getNamespaceURI().length() > 0 && !(attributeName.getNamespaceURI().equals(WSDLI_NS))) {
if(!elementName.getNamespaceURI().equals(attributeName.getNamespaceURI()) ) {
Object attributeValue = extensionAttributeProcessor.read(attributeName, reader, processorContext);
Extension attributeExtension;
if (attributeValue instanceof Extension) {
attributeExtension = (Extension)attributeValue;
} else {
attributeExtension = assemblyFactory.createExtension();
attributeExtension.setQName(attributeName);
attributeExtension.setValue(attributeValue);
attributeExtension.setAttribute(true);
}
((Extensible)wsBinding).getAttributeExtensions().add(attributeExtension);
}
}
}
// Skip to end element
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case START_ELEMENT: {
if (END_POINT_REFERENCE.equals(reader.getName().getLocalPart())) {
if (wsdlElement != null && (wsdlElementIsBinding == null || !wsdlElementIsBinding)) {
error(monitor, "MustUseWsdlBinding", reader, wsdlElement);
String message = context.getMonitor().getMessageString(WebServiceBindingProcessor.class.getName(),
"binding-wsxml-validation-messages",
"MustUseWsdlBinding");
message = message.replace("{0}", wsdlElement);
throw new ContributionReadException(message);
}
wsBinding.setEndPointReference(EndPointReferenceHelper.readEndPointReference(reader));
endpointSpecifications.add("wsa:EndpointReference");
}
}
break;