blob: 28b6c40847a93b7a624039b80306a07775165de2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.websvc.jaxws.api;
import java.util.HashMap;
import java.util.Map;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/** ConteHandler that gives information if wsdl wrapper need to be created
* This is the case when service element is missing
*
* @author mkuchtiak
*/
public class WsdlWrapperHandler extends DefaultHandler{
public static final String WSDL_SOAP_URI = "http://schemas.xmlsoap.org/wsdl/"; //NOI18N
public static final String SOAP_BINDING_PREFIX = "http://schemas.xmlsoap.org/wsdl/soap"; //NOI18N
private boolean isService, isPortType, isBinding;
private String tns;
private Map<String, String> prefixes;
private Map<String, BindingInfo> bindings;
private Map<String, String> ports;
private BindingInfo bindingInfo;
private boolean insideBinding, insideService;
/** Creates a new instance of WsdlWrapperHandler */
public WsdlWrapperHandler() {
prefixes = new HashMap<String, String>();
bindings = new HashMap<String, BindingInfo>();
ports = new HashMap<String, String>();
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
if (!prefixes.containsKey(uri)) prefixes.put(uri,prefix);
}
public void startElement(String uri, String localName, String qname, org.xml.sax.Attributes attributes) throws org.xml.sax.SAXException {
if("portType".equals(localName)) { // NOI18N
isPortType=true;
} else if("binding".equals(localName)) { // NOI18N
isBinding=true;
if (WSDL_SOAP_URI.equals(uri)) {
String bindingName=attributes.getValue("name"); // NOI18N
insideBinding=true;
if (bindingName!=null) {
bindingInfo = new BindingInfo(bindingName);
bindings.put(bindingName,bindingInfo);
}
} else if (insideBinding && bindingInfo!=null && uri.startsWith(SOAP_BINDING_PREFIX)) {
bindingInfo.setBindingType(uri);
}
} else if("service".equals(localName)) { // NOI18N
isService=true;
insideService=true;
} else if("port".equals(localName) && insideService) { // NOI18N
String portName = attributes.getValue("name"); // NOI18N
if (portName!=null) ports.put(portName, attributes.getValue("binding")); // NOI18N
} else if("definitions".equals(localName)) { // NOI18N
tns=attributes.getValue("targetNamespace"); // NOI18N
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if("binding".equals(localName) && WSDL_SOAP_URI.equals(uri)) { // NOI18N
bindingInfo=null;
insideBinding=false;
} else if ("service".equals(localName)) {
insideService=false;
}
}
public String getBindingTypeForPort(String name) {
String fullBindingName = ports.get(name);
if (fullBindingName!=null) {
String bindingName = getLocalPart(fullBindingName);
BindingInfo info = bindings.get(bindingName);
if (info!=null) return info.getBindingType();
}
return null;
}
public boolean isServiceElement() {
return isService;
}
public String getTargetNsPrefix() {
return (prefixes == null) ? null : prefixes.get(tns);
}
public void endDocument() throws SAXException {
// throw exception if service & binding & portType are missing
if (!isService && !isBinding && !isPortType) throw new SAXException("Missing wsdl elements (wsdl:service | wsdl:binding | wsdl:portType)"); //NOI18N
}
private class BindingInfo {
private String bindingName;
private String bindingType;
BindingInfo(String bindingName) {
this.bindingName=bindingName;
}
void setBindingType(String bindingType) {
this.bindingType=bindingType;
}
String getBindingType() {
return bindingType;
}
}
private String getLocalPart(String fullName) {
int index = fullName.indexOf(":"); //NOI18N
return (index>=0?fullName.substring(index+1):fullName);
}
}