J2EEServerDeployWriter.java

00001 /*
00002  * Copyright 2001-2004 The Apache Software Foundation.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00040 package org.objectweb.jonas_ws.wsgen.generator.ews.wsdltoj2ee.writer;
00041 
00042 import java.io.IOException;
00043 import java.io.PrintWriter;
00044 import java.util.ArrayList;
00045 import java.util.HashSet;
00046 import java.util.Iterator;
00047 import java.util.List;
00048 import java.util.Map;
00049 
00050 import javax.wsdl.Binding;
00051 import javax.wsdl.BindingOperation;
00052 import javax.wsdl.Definition;
00053 import javax.wsdl.Operation;
00054 import javax.wsdl.OperationType;
00055 import javax.wsdl.Port;
00056 import javax.wsdl.Service;
00057 import javax.wsdl.extensions.UnknownExtensibilityElement;
00058 import javax.wsdl.extensions.soap.SOAPBinding;
00059 import javax.xml.namespace.QName;
00060 
00061 import org.apache.axis.Constants;
00062 import org.apache.axis.enum.Scope;
00063 import org.apache.axis.enum.Style;
00064 import org.apache.axis.enum.Use;
00065 import org.apache.axis.utils.JavaUtils;
00066 import org.apache.axis.utils.Messages;
00067 import org.apache.axis.wsdl.symbolTable.BindingEntry;
00068 import org.apache.axis.wsdl.symbolTable.Parameters;
00069 import org.apache.axis.wsdl.symbolTable.SymbolTable;
00070 import org.apache.axis.wsdl.toJava.Emitter;
00071 import org.apache.axis.wsdl.toJava.Utils;
00072 
00073 import org.objectweb.jonas_lib.deployment.api.HandlerDesc;
00074 
00075 import org.objectweb.jonas_ws.deployment.api.PortComponentDesc;
00076 import org.objectweb.jonas_ws.deployment.api.SSBPortComponentDesc;
00077 import org.objectweb.jonas_ws.deployment.api.ServiceDesc;
00078 
00084 public class J2EEServerDeployWriter extends JOnASDeployWriter {
00085 
00089     private static final String WSDD_PREFIX = "deploy-server-";
00090 
00094     private static final String SERVICE_ENDPOINT_INTERFACE_NAME = "serviceEndpointInterfaceName";
00095 
00099     private static final String SERVICE_ENDPOINT_JNDI_NAME = "serviceEndpointJndiName";
00100 
00107     public J2EEServerDeployWriter(Emitter emitter, Definition definition, SymbolTable symbolTable) {
00108         super(emitter, definition, symbolTable);
00109     } // ctor
00110 
00116     protected void writeDeployServices(PrintWriter pw) throws IOException {
00117 
00118         // deploy the ports on each service
00119         Map serviceMap = getDefinition().getServices();
00120         ServiceDesc desc = getJonasWSContext().getServiceDesc();
00121 
00122         for (Iterator mapIterator = serviceMap.values().iterator(); mapIterator.hasNext();) {
00123             Service myService = (Service) mapIterator.next();
00124 
00125             pw.println();
00126             pw.println("  <!-- " + Messages.getMessage("wsdlService00", myService.getQName().getLocalPart()) + " -->");
00127             pw.println();
00128 
00129             for (Iterator portIterator = myService.getPorts().values().iterator(); portIterator.hasNext();) {
00130                 Port myPort = (Port) portIterator.next();
00131                 BindingEntry bEntry = getSymbolTable().getBindingEntry(myPort.getBinding().getQName());
00132 
00133                 // If this isn't an SOAP binding, skip it
00134                 if (bEntry.getBindingType() != BindingEntry.TYPE_SOAP) {
00135                     continue;
00136                 }
00137 
00138                 PortComponentDesc portDesc = findPortComponentDesc(desc, myPort);
00139 
00140                 if (portDesc != null) {
00141                     // write ports described by the current ServiceDesc
00142                     writeDeployPort(pw, myService, bEntry, portDesc);
00143                 }
00144             }
00145         }
00146     } // writeDeployServices
00147 
00153     private static PortComponentDesc findPortComponentDesc(ServiceDesc desc, Port myPort) {
00154 
00155         PortComponentDesc port = null;
00156         List ports = desc.getPortComponents();
00157         for (Iterator i = ports.iterator(); i.hasNext() && port == null;) {
00158             PortComponentDesc pcd = (PortComponentDesc) i.next();
00159             if (pcd.getQName().getLocalPart().equals(myPort.getName())) {
00160                 port = pcd;
00161             }
00162         }
00163         return port;
00164     }
00165 
00174     protected void writeDeployPort(PrintWriter pw, Service service, BindingEntry bEntry,
00175             PortComponentDesc portComponentDesc) throws IOException {
00176 
00177         String serviceName = portComponentDesc.getServiceName();
00178         boolean hasLiteral = bEntry.hasLiteral();
00179         boolean hasMIME = Utils.hasMIME(bEntry);
00180         String styleStr = "";
00181         Use use = Use.DEFAULT;
00182         Iterator iterator = bEntry.getBinding().getExtensibilityElements().iterator();
00183 
00184         // iterate throught extensibilityElements of given Port's Binding
00185         while (iterator.hasNext()) {
00186             Object obj = iterator.next();
00187 
00188             if (obj instanceof SOAPBinding) {
00189                 use = Use.ENCODED;
00190             } else if (obj instanceof UnknownExtensibilityElement) {
00191 
00192                 // TODO After WSDL4J supports soap12, change this code
00193                 UnknownExtensibilityElement unkElement = (UnknownExtensibilityElement) obj;
00194                 QName name = unkElement.getElementType();
00195 
00196                 if (name.getNamespaceURI().equals(Constants.URI_WSDL12_SOAP) && name.getLocalPart().equals("binding")) {
00197                     use = Use.ENCODED;
00198                 }
00199             }
00200         }
00201 
00202         if (getSymbolTable().isWrapped()) {
00203             styleStr = " style=\"" + Style.WRAPPED + "\"";
00204             use = Use.LITERAL;
00205         } else {
00206             styleStr = " style=\"" + bEntry.getBindingStyle().getName() + "\"";
00207 
00208             if (hasLiteral) {
00209                 use = Use.LITERAL;
00210             }
00211         }
00212 
00213         String useStr = " use=\"" + use + "\"";
00214 
00215         if (portComponentDesc.hasBeanImpl()) {
00216             pw.println("  <service name=\"" + serviceName + "\" provider=\"java:JOnASEJB\"" + styleStr + useStr + ">");
00217 
00218             SSBPortComponentDesc ssbPCD = (SSBPortComponentDesc) portComponentDesc;
00219 
00220             pw.println("      <parameter name=\"" + SERVICE_ENDPOINT_INTERFACE_NAME + "\" value=\""
00221                     + ssbPCD.getServiceEndpointInterface().getName() + "\"/>");
00222             pw.println("      <parameter name=\"" + SERVICE_ENDPOINT_JNDI_NAME + "\" value=\""
00223                     + ssbPCD.getSessionStatelessDesc().getJndiServiceEndpointName() + "\"/>");
00224 
00225         } else {
00226             pw.println("  <service name=\"" + serviceName + "\" provider=\"java:RPC\"" + styleStr + useStr + ">");
00227             pw.println("      <parameter name=\"className\" value=\"" + portComponentDesc.getSIBClassname() + "\"/>");
00228 
00229         }
00230 
00231         pw.println("      <parameter name=\"wsdlTargetNamespace\" value=\"" + service.getQName().getNamespaceURI()
00232                 + "\"/>");
00233         pw
00234                 .println("      <parameter name=\"wsdlServiceElement\" value=\"" + service.getQName().getLocalPart()
00235                         + "\"/>");
00236         pw.println("      <parameter name=\"wsdlServicePort\" value=\"" + serviceName + "\"/>");
00237 
00238         // MIME attachments don't work with multiref, so turn it off.
00239         if (hasMIME) {
00240             pw.println("      <parameter name=\"sendMultiRefs\" value=\"false\"/>");
00241         }
00242 
00243         writeDeployBinding(pw, bEntry);
00244         writeDeployTypes(pw, bEntry.getBinding(), hasLiteral, hasMIME, use);
00245 
00246         List handlers = portComponentDesc.getHandlers();
00247         if (!handlers.isEmpty()) {
00248             pw.println("    <handlerInfoChain>");
00249             for (Iterator i = handlers.iterator(); i.hasNext();) {
00250                 writeHandler(pw, (HandlerDesc) i.next());
00251             }
00252             pw.println("    </handlerInfoChain>");
00253         }
00254         pw.println("  </service>");
00255     }
00256 
00263     protected void writeDeployBinding(PrintWriter pw, BindingEntry bEntry) throws IOException {
00264 
00265         Binding binding = bEntry.getBinding();
00266 
00267         pw.println("      <parameter name=\"wsdlPortType\" value=\"" + binding.getPortType().getQName().getLocalPart()
00268                 + "\"/>");
00269 
00270         HashSet allowedMethods = new HashSet();
00271 
00272         if (!emitter.isSkeletonWanted()) {
00273             Iterator operationsIterator = binding.getBindingOperations().iterator();
00274 
00275             for (; operationsIterator.hasNext();) {
00276                 BindingOperation bindingOper = (BindingOperation) operationsIterator.next();
00277                 Operation operation = bindingOper.getOperation();
00278                 OperationType type = operation.getStyle();
00279                 String javaOperName = JavaUtils.xmlNameToJava(operation.getName());
00280 
00281                 // These operation types are not supported. The signature
00282                 // will be a string stating that fact.
00283                 if ((type == OperationType.NOTIFICATION) || (type == OperationType.SOLICIT_RESPONSE)) {
00284                     continue;
00285                 }
00286 
00287                 allowedMethods.add(javaOperName);
00288 
00289                 // We pass "" as the namespace argument because we're just
00290                 // interested in the return type for now.
00291                 Parameters params = getSymbolTable().getOperationParameters(operation, "", bEntry);
00292 
00293                 if (params != null) {
00294 
00295                     // Get the operation QName
00296                     QName elementQName = Utils.getOperationQName(bindingOper, bEntry, getSymbolTable());
00297 
00298                     // Get the operation's return QName and type
00299                     QName returnQName = null;
00300                     QName returnType = null;
00301 
00302                     if (params.returnParam != null) {
00303                         returnQName = params.returnParam.getQName();
00304                         returnType = Utils.getXSIType(params.returnParam);
00305                     }
00306 
00307                     // Get the operations faults
00308                     Map faultMap = bEntry.getFaults();
00309                     ArrayList faults = null;
00310 
00311                     if (faultMap != null) {
00312                         faults = (ArrayList) faultMap.get(bindingOper);
00313                     }
00314 
00315                     // Write the operation metadata
00316                     writeOperation(pw, javaOperName, elementQName, returnQName, returnType, params, binding.getQName(),
00317                             faults);
00318                 }
00319             }
00320         }
00321 
00322         pw.print("      <parameter name=\"allowedMethods\" value=\"");
00323 
00324         if (allowedMethods.isEmpty()) {
00325             pw.println("*\"/>");
00326         } else {
00327             boolean first = true;
00328 
00329             for (Iterator i = allowedMethods.iterator(); i.hasNext();) {
00330                 String method = (String) i.next();
00331 
00332                 if (first) {
00333                     pw.print(method);
00334 
00335                     first = false;
00336                 } else {
00337                     pw.print(" " + method);
00338                 }
00339             }
00340 
00341             pw.println("\"/>");
00342         }
00343 
00344         Scope scope = emitter.getScope();
00345 
00346         if (scope != null) {
00347             pw.println("      <parameter name=\"scope\" value=\"" + scope.getName() + "\"/>");
00348         }
00349     }
00350 
00355     protected void writeHandler(PrintWriter pw, HandlerDesc handler) {
00356         pw.println("      <handlerInfo classname=\"" + handler.getHandlerClassName() + "\">");
00357         Map params = handler.getInitParams();
00358         for (Iterator i = params.keySet().iterator(); i.hasNext();) {
00359             String pName = (String) i.next();
00360             pw.println("        <parameter name=\"" + pName + "\" value=\""
00361                     + params.get(pName) + "\"/>");
00362         }
00363         List headers = handler.getSOAPHeaders();
00364         for (Iterator i = headers.iterator(); i.hasNext();) {
00365             QName sh = (QName) i.next();
00366             pw.println("        <header xmlns:ns=\"" + sh.getNamespaceURI() + "\" qname=\"ns:"
00367                     + sh.getLocalPart() + "\"/>");
00368         }
00369         pw.println("      </handlerInfo>");
00370         List roles = handler.getSOAPRoles();
00371         for (Iterator i = roles.iterator(); i.hasNext();) {
00372             String role = (String) i.next();
00373             pw.println("      <role soapActorName=\"" + role + "\"/>");
00374         }
00375     }
00376 
00380     protected String getPrefix() {
00381         return WSDD_PREFIX;
00382     }
00383 
00384 }

Generated on Tue Feb 15 15:06:02 2005 for JOnAS by  doxygen 1.3.9.1