diff -r 88b85470e72c -r f50545b5e2f1 src/share/jaxws_classes/com/sun/xml/internal/ws/model/wsdl/WSDLModelImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/jaxws_classes/com/sun/xml/internal/ws/model/wsdl/WSDLModelImpl.java Tue Mar 06 16:09:35 2012 -0800 @@ -0,0 +1,256 @@ +/* + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.xml.internal.ws.model.wsdl; + +import com.sun.istack.internal.NotNull; +import com.sun.xml.internal.ws.api.model.ParameterBinding; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLBoundPortType; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLMessage; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLModel; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLOperation; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLPortType; +import com.sun.xml.internal.ws.api.model.wsdl.WSDLService; +import com.sun.xml.internal.ws.policy.PolicyMap; + +import javax.jws.WebParam.Mode; +import javax.xml.namespace.QName; +import java.net.URL; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Implementation of {@link WSDLModel} + * + * @author Vivek Pandey + */ +public final class WSDLModelImpl extends AbstractExtensibleImpl implements WSDLModel { + private final Map messages = new HashMap(); + private final Map portTypes = new HashMap(); + private final Map bindings = new HashMap(); + private final Map services = new LinkedHashMap(); + + private PolicyMap policyMap; + private final Map unmBindings + = Collections.unmodifiableMap(bindings); + + + public WSDLModelImpl(@NotNull String systemId) { + super(systemId,-1); + } + + /** + * To create {@link WSDLModelImpl} from WSDL that doesn't have a system ID. + */ + public WSDLModelImpl() { + super(null,-1); + } + + public void addMessage(WSDLMessageImpl msg){ + messages.put(msg.getName(), msg); + } + + public WSDLMessageImpl getMessage(QName name){ + return messages.get(name); + } + + public void addPortType(WSDLPortTypeImpl pt){ + portTypes.put(pt.getName(), pt); + } + + public WSDLPortTypeImpl getPortType(QName name){ + return portTypes.get(name); + } + + public void addBinding(WSDLBoundPortTypeImpl boundPortType){ + assert !bindings.containsValue(boundPortType); + bindings.put(boundPortType.getName(), boundPortType); + } + + public WSDLBoundPortTypeImpl getBinding(QName name){ + return bindings.get(name); + } + + public void addService(WSDLServiceImpl svc){ + services.put(svc.getName(), svc); + } + + public WSDLServiceImpl getService(QName name){ + return services.get(name); + } + + public Map getMessages() { + return messages; + } + + public @NotNull Map getPortTypes() { + return portTypes; + } + + public @NotNull Map getBindings() { + return unmBindings; + } + + public @NotNull Map getServices(){ + return services; + } + + /** + * Returns the first service QName from insertion order + */ + public QName getFirstServiceName(){ + if(services.isEmpty()) + return null; + return services.values().iterator().next().getName(); + } + + /** + * Returns first port QName from first service as per the insertion order + */ + public QName getFirstPortName(){ + WSDLPort fp = getFirstPort(); + if(fp==null) + return null; + else + return fp.getName(); + } + + private WSDLPort getFirstPort(){ + if(services.isEmpty()) + return null; + WSDLService service = services.values().iterator().next(); + Iterator iter = service.getPorts().iterator(); + WSDLPort port = iter.hasNext()?iter.next():null; + return port; + } + + /** + * gets the first port in the wsdl which matches the serviceName and portType + */ + public WSDLPortImpl getMatchingPort(QName serviceName, QName portType){ + return getService(serviceName).getMatchingPort(portType); + } + + /** + * + * @param serviceName non-null service QName + * @param portName non-null port QName + * @return + * WSDLBoundOperation on success otherwise null. throws NPE if any of the parameters null + */ + public WSDLBoundPortTypeImpl getBinding(QName serviceName, QName portName){ + WSDLServiceImpl service = services.get(serviceName); + if(service != null){ + WSDLPortImpl port = service.get(portName); + if(port != null) + return port.getBinding(); + } + return null; + } + + void finalizeRpcLitBinding(WSDLBoundPortTypeImpl boundPortType){ + assert(boundPortType != null); + QName portTypeName = boundPortType.getPortTypeName(); + if(portTypeName == null) + return; + WSDLPortType pt = portTypes.get(portTypeName); + if(pt == null) + return; + for (WSDLBoundOperationImpl bop : boundPortType.getBindingOperations()) { + WSDLOperation pto = pt.get(bop.getName().getLocalPart()); + WSDLMessage inMsgName = pto.getInput().getMessage(); + if(inMsgName == null) + continue; + WSDLMessageImpl inMsg = messages.get(inMsgName.getName()); + int bodyindex = 0; + if(inMsg != null){ + for(WSDLPartImpl part:inMsg.parts()){ + String name = part.getName(); + ParameterBinding pb = bop.getInputBinding(name); + if(pb.isBody()){ + part.setIndex(bodyindex++); + part.setBinding(pb); + bop.addPart(part, Mode.IN); + } + } + } + bodyindex=0; + if(pto.isOneWay()) + continue; + WSDLMessage outMsgName = pto.getOutput().getMessage(); + if(outMsgName == null) + continue; + WSDLMessageImpl outMsg = messages.get(outMsgName.getName()); + if(outMsg!= null){ + for(WSDLPartImpl part:outMsg.parts()){ + String name = part.getName(); + ParameterBinding pb = bop.getOutputBinding(name); + if(pb.isBody()){ + part.setIndex(bodyindex++); + part.setBinding(pb); + bop.addPart(part, Mode.OUT); + } + } + } + } + } + + /** + * Gives the PolicyMap associated with the WSDLModel + * + * @return PolicyMap + */ + public PolicyMap getPolicyMap() { + return policyMap; + } + + /** + * Set PolicyMap for the WSDLModel. + * @param policyMap + */ + public void setPolicyMap(PolicyMap policyMap) { + this.policyMap = policyMap; + } + + /** + * Invoked at the end of the model construction to fix up references, etc. + */ + public void freeze() { + for (WSDLServiceImpl service : services.values()) { + service.freeze(this); + } + for (WSDLBoundPortTypeImpl bp : bindings.values()) { + bp.freeze(); + } + // Enforce freeze all the portTypes referenced by this endpoints, see Bug8966673 for detail + for (WSDLPortTypeImpl pt : portTypes.values()) { + pt.freeze(); + } + } +}