/** * Copyright 2007-2010 非也 * All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation。 * * This program 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 for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses. * */ package org.fireflow.pdl.fpdl.enginemodules.processlanguage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.wsdl.Binding; import javax.wsdl.BindingInput; import javax.wsdl.BindingOperation; import javax.wsdl.BindingOutput; import javax.wsdl.Definition; import javax.wsdl.Input; import javax.wsdl.Message; import javax.wsdl.Operation; import javax.wsdl.OperationType; import javax.wsdl.Output; import javax.wsdl.Part; import javax.wsdl.Port; import javax.wsdl.PortType; import javax.wsdl.Service; import javax.wsdl.Types; import javax.wsdl.WSDLException; import javax.wsdl.extensions.soap.SOAPAddress; import javax.wsdl.extensions.soap.SOAPBinding; import javax.wsdl.extensions.soap.SOAPBody; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLWriter; import javax.xml.namespace.QName; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.Endpoint; import org.apache.ws.commons.schema.XmlSchema; import org.apache.ws.commons.schema.XmlSchemaCollection; import org.apache.ws.commons.schema.XmlSchemaSerializer.XmlSchemaSerializerException; import org.fireflow.client.WorkflowQuery; import org.fireflow.client.WorkflowSession; import org.fireflow.client.WorkflowSessionFactory; import org.fireflow.client.query.Restrictions; import org.fireflow.engine.entity.repository.ProcessDescriptor; import org.fireflow.engine.entity.repository.ProcessDescriptorProperty; import org.fireflow.engine.entity.repository.ProcessKey; import org.fireflow.engine.entity.repository.ProcessRepository; import org.fireflow.engine.entity.repository.impl.ProcessDescriptorImpl; import org.fireflow.engine.entity.repository.impl.ProcessRepositoryImpl; import org.fireflow.engine.entity.runtime.ActivityInstance; import org.fireflow.engine.exception.WebservicePublishException; import org.fireflow.engine.modules.calendar.CalendarService; import org.fireflow.engine.modules.environment.Environment; import org.fireflow.engine.modules.ousystem.impl.FireWorkflowSystem; import org.fireflow.engine.modules.persistence.PersistenceService; import org.fireflow.engine.modules.persistence.ProcessPersister; import org.fireflow.engine.modules.processlanguage.AbsProcessLanguageManager; import org.fireflow.engine.modules.processlanguage.ProcessLanguageManager; import org.fireflow.model.InvalidModelException; import org.fireflow.model.binding.ResourceBinding; import org.fireflow.model.binding.ServiceBinding; import org.fireflow.model.data.Property; import org.fireflow.model.io.DeserializerException; import org.fireflow.model.io.SerializerException; import org.fireflow.model.resourcedef.ResourceDef; import org.fireflow.model.servicedef.InterfaceDef; import org.fireflow.model.servicedef.OperationDef; import org.fireflow.model.servicedef.ServiceDef; import org.fireflow.model.servicedef.impl.CommonInterfaceDef; import org.fireflow.pdl.fpdl.io.FPDLDeserializer; import org.fireflow.pdl.fpdl.io.FPDLSerializer; import org.fireflow.pdl.fpdl.io.ImportLoader; import org.fireflow.pdl.fpdl.misc.FpdlConstants; import org.fireflow.pdl.fpdl.process.Activity; import org.fireflow.pdl.fpdl.process.Node; import org.fireflow.pdl.fpdl.process.StartNode; import org.fireflow.pdl.fpdl.process.SubProcess; import org.fireflow.pdl.fpdl.process.WorkflowProcess; import org.fireflow.pdl.fpdl.process.features.Feature; import org.fireflow.pdl.fpdl.process.features.startnode.TimerStartFeature; import org.fireflow.pdl.fpdl.process.features.startnode.WebserviceStartFeature; /* 暂时屏蔽该功能 import org.fireflow.service.callback.CallbackService; import org.fireflow.service.callback.ProcessServiceProvider; */ import org.firesoa.common.schema.NameSpaces; import org.firesoa.common.schema.WSDLConstants; import org.w3c.dom.Document; import com.ibm.wsdl.extensions.schema.SchemaImpl; import com.ibm.wsdl.extensions.soap.SOAPAddressImpl; import com.ibm.wsdl.extensions.soap.SOAPBindingImpl; import com.ibm.wsdl.extensions.soap.SOAPBodyImpl; /** * TODO 等fire2.0 流程xsd出来后,此处需要用FPDLSerializer和FPDLDeserializer改造。 * @author 非也 * @version 2.0 */ public class FpdlManager extends AbsProcessLanguageManager implements ProcessLanguageManager { Map<QName,Boolean> servicePublishRegistry = new HashMap<QName,Boolean>(); public String getProcessEntryId(String workflowProcessId, int version,String processType){ return workflowProcessId+"."+WorkflowProcess.MAIN_PROCESS_NAME; } public ServiceBinding getServiceBinding(Object argActivity)throws InvalidModelException{ Activity activity = (Activity)argActivity; if (activity==null){ return null; }else{ return activity.getServiceBinding(); } } public ResourceBinding getResourceBinding(Object argActivity)throws InvalidModelException{ Activity activity = (Activity)argActivity; if (activity==null){ return null; }else{ return activity.getResourceBinding(); } } public Object findActivity(ProcessKey processKey,String subflowId, String activityId)throws InvalidModelException{ WorkflowProcess process = (WorkflowProcess)this.getWorkflowProcess(processKey); if (process==null) return null; SubProcess subflow = process.getLocalSubProcess(subflowId); Activity activity = subflow.getActivity(activityId); return activity; } public Object findSubProcess(ProcessKey processKey,String subProcessId)throws InvalidModelException{ WorkflowProcess process = (WorkflowProcess)this.getWorkflowProcess(processKey); if (process==null) return null; SubProcess subflow = process.getLocalSubProcess(subProcessId); return subflow; } /* (non-Javadoc) * @see org.fireflow.engine.repository.ProcessRepositoryService#getWorkflowProcess(org.fireflow.engine.entity.repository.ProcessKey) */ protected Object getWorkflowProcess(ProcessKey processKey) throws InvalidModelException{ PersistenceService persistenceService = ctx.getEngineModule(PersistenceService.class, FpdlConstants.PROCESS_TYPE_FPDL20); ProcessPersister processPersister = persistenceService.getProcessPersister(); ProcessRepository repository = processPersister.findProcessRepositoryByProcessKey(processKey); return repository.getProcessObject(); } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#deserializeXml2Process(java.lang.String) */ public Object deserializeXml2Process(InputStream inStream) throws InvalidModelException{ if (inStream==null) return null; FPDLDeserializer parser = new FPDLDeserializer(); //2012-02-02 InnerImportLoader importLoader = new InnerImportLoader(); parser.setImportLoader(importLoader); try { WorkflowProcess process; process = parser.deserialize(inStream); return process; } catch(IOException e){ throw new InvalidModelException(e); } catch (DeserializerException e) { throw new InvalidModelException(e); } } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#serializeProcess2Xml(java.lang.Object) */ public String serializeProcess2Xml(Object process) throws InvalidModelException{ WorkflowProcess wfProcess = (WorkflowProcess)process; FPDLSerializer ser = new FPDLSerializer(); try { return ser.serializeToXmlString(wfProcess); } catch (IOException e) { throw new InvalidModelException(e); } catch (SerializerException e) { throw new InvalidModelException(e); } } public ProcessDescriptor generateProcessDescriptor(Object process){ WorkflowProcess wfProcess = (WorkflowProcess)process; ProcessDescriptorImpl descriptor = new ProcessDescriptorImpl(); descriptor.setProcessId(wfProcess.getId()); descriptor.setPackageId(wfProcess.getPackageId()); descriptor.setVersion(0); descriptor.setTimerStart(isTimerStart(wfProcess)); descriptor.setHasCallbackService(hasCallbackService(wfProcess)); descriptor.setProcessType(FpdlConstants.PROCESS_TYPE_FPDL20); descriptor.setName(wfProcess.getName()); String displayName = wfProcess.getDisplayName(); descriptor.setDisplayName((displayName==null || displayName.trim().equals(""))?wfProcess.getName():displayName); descriptor.setDescription(wfProcess.getDescription()); CalendarService calendarService = ctx.getEngineModule(CalendarService.class,FpdlConstants.PROCESS_TYPE_FPDL20); descriptor.setPublishState(false);//发布状态false; descriptor.setValidDateFrom(calendarService.getSysDate()); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2099); cal.set(Calendar.MONTH, 12); cal.set(Calendar.DATE, 31); descriptor.setValidDateTo(cal.getTime()); return descriptor; } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#serializeProcess2ProcessRepository(java.lang.Object) */ public ProcessRepository serializeProcess2ProcessRepository(Object process) throws InvalidModelException{ ProcessDescriptor descriptor = generateProcessDescriptor(process); ProcessRepositoryImpl repository = (ProcessRepositoryImpl)descriptor.toProcessRepository(); repository.setProcessObject(process); repository.setProcessContent(this.serializeProcess2Xml(process)); return repository; } private boolean hasCallbackService(WorkflowProcess workflowProcess){ /* 暂时屏蔽call back service List<SubProcess> subflowList = workflowProcess.getLocalSubProcesses(); if (subflowList == null || subflowList.size() == 0) return false; for (SubProcess subflow : subflowList) { // 首先检查Activity是否绑定了Callback service List<Activity> activityList = subflow.getActivities(); if (activityList != null) { for (Activity activity : activityList) { ServiceBinding svcBinding = activity.getServiceBinding(); if (svcBinding != null) { ServiceDef svcDef = workflowProcess.getService(svcBinding.getServiceId()); if (svcDef != null && svcDef instanceof CallbackService) { return true; } } } } // 然后检查Main subflow 的 StartNode是否绑定了CallbackService if (WorkflowProcess.MAIN_PROCESS_NAME.equals(subflow.getName())){ List<StartNode> startNodeList = subflow.getStartNodes(); if (startNodeList != null) { for (StartNode startNode : startNodeList) { Feature ft = startNode.getFeature(); if (ft != null && ft instanceof WebserviceStartFeature) { WebserviceStartFeature wsFt = (WebserviceStartFeature) ft; ServiceBinding svcBinding = wsFt.getServiceBinding(); if (svcBinding != null) { ServiceDef svcDef = workflowProcess.getService(svcBinding.getServiceId()); if (svcDef != null && svcDef instanceof CallbackService) { return true; } } } } } } }*/ return false; } private boolean isTimerStart(WorkflowProcess wfProcess){ SubProcess subflow = wfProcess.getMainSubProcess(); if (subflow==null) return false; StartNode startNode = (StartNode)subflow.getEntry(); if (startNode==null) return false; Feature startNodeFeature = startNode.getFeature(); if (startNodeFeature!=null && startNodeFeature instanceof TimerStartFeature){ return true; } return false; } private class InnerImportLoader implements ImportLoader{ /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.io.ImportLoader#loadResources(java.lang.String) */ // public List<ResourceDef> loadResources(String resourceLocation) // throws DeserializerException, IOException { // PersistenceService persistenceService = ctx.getEngineModule(PersistenceService.class, FpdlConstants.PROCESS_TYPE_FPDL20); // ResourcePersister resourcePersister = persistenceService.getResourcePersister(); // // ResourceRepository repository = resourcePersister.findResourceRepositoryByFileName(resourceLocation); // return repository.getResources(); // } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.io.ImportLoader#loadServices(java.lang.String) */ // public List<ServiceDef> loadServices(String serviceLocation) // throws DeserializerException, IOException { // PersistenceService persistenceService = ctx.getEngineModule(PersistenceService.class, FpdlConstants.PROCESS_TYPE_FPDL20); // ServicePersister servicePersister = persistenceService.getServicePersister(); // // ServiceRepository repository = servicePersister.findServiceRepositoryByFileName(serviceLocation); // return repository.getServices(); // } /* (non-Javadoc) * @see org.fireflow.pdl.fpdl.io.ImportLoader#loadProcess(java.lang.String) */ public WorkflowProcess loadProcess(String processLocation) throws InvalidModelException, DeserializerException, IOException { // TODO Auto-generated method stub return null; } } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#getProperty(org.fireflow.engine.entity.repository.ProcessKey, java.lang.String, java.lang.String) */ public Property getProperty(Object workflowElement, String propertyName) { if (workflowElement instanceof SubProcess){ return ((SubProcess)workflowElement).getProperty(propertyName); }else if (workflowElement instanceof Activity){ return ((Activity)workflowElement).getProperty(propertyName); } return null; } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#getServiceDef(org.fireflow.engine.entity.runtime.ActivityInstance, java.lang.Object, java.lang.String) */ public ServiceDef getServiceDef(ActivityInstance activityInstance, Object activity, String serviceId) { Activity theActivity = (Activity)activity; SubProcess subflow = (SubProcess)theActivity.getParent(); WorkflowProcess process = (WorkflowProcess)subflow.getParent(); return process.getService(serviceId); } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#getResourceDef(org.fireflow.engine.entity.runtime.ActivityInstance, java.lang.Object, java.lang.String) */ public ResourceDef getResourceDef(ActivityInstance activityInstance, Object activity, String resourceId) { SubProcess subProcess = (SubProcess)((Activity)activity).getParent(); WorkflowProcess process = (WorkflowProcess)subProcess.getParent(); return process.getResource(resourceId); } /* (non-Javadoc) * @see org.fireflow.engine.modules.processlanguage.ProcessLanguageManager#publishAllProcessServices() */ public void publishAllProcessServices() throws WebservicePublishException { // 1、查询所有的WorkflowProcess找到其中的Callback定义 WorkflowSession session = WorkflowSessionFactory.createWorkflowSession( ctx, FireWorkflowSystem.getInstance()); WorkflowQuery<ProcessDescriptor> processDescQuery = session .createWorkflowQuery(ProcessDescriptor.class); // 未发布的也应该查询出来,因为已经运行的实例,即便流程未发布,也要响应webservice请求。 processDescQuery.add(Restrictions.eq( ProcessDescriptorProperty.HAS_CALLBACK_SERVICE, Boolean.TRUE)); List<ProcessDescriptor> descriptorList = processDescQuery.list(); if (descriptorList == null && descriptorList.size() == 0) return; PersistenceService persistenceService = ctx.getEngineModule( PersistenceService.class, FpdlConstants.PROCESS_TYPE_FPDL20); ProcessPersister processPersister = persistenceService .getProcessPersister(); // 2、针对每个流程的Callback,发布Webservice for (ProcessDescriptor descriptor : descriptorList) { try { ProcessRepository repository = processPersister .findProcessRepositoryByProcessKey(new ProcessKey( descriptor.getProcessId(), descriptor .getVersion(), descriptor .getProcessType())); publishCallbackService((WorkflowProcess) repository .getProcessObject()); } catch (InvalidModelException ex) { // TODO 记录操作日志 ex.printStackTrace(); } } } protected void publishCallbackService(WorkflowProcess workflowProcess)throws WebservicePublishException { /* 暂时屏蔽该功能 List<SubProcess> subflowList = workflowProcess.getLocalSubProcesses(); if (subflowList == null || subflowList.size() == 0) return; for (SubProcess subflow : subflowList) { // 首先检查Activity是否绑定了Callback service List<Activity> activityList = subflow.getActivities(); if (activityList != null) { for (Activity activity : activityList) { ServiceBinding svcBinding = activity.getServiceBinding(); if (svcBinding != null) { ServiceDef svcDef = workflowProcess.getService(svcBinding.getServiceId()); if (svcDef != null && svcDef instanceof CallbackService) { publishCallbackService(workflowProcess, subflow, activity, (CallbackService) svcDef); } } } } // 然后检查main subflow 的StartNode是否绑定了CallbackService if (WorkflowProcess.MAIN_PROCESS_NAME.equals(subflow.getName())) { List<StartNode> startNodeList = subflow.getStartNodes(); if (startNodeList != null) { for (StartNode startNode : startNodeList) { Feature ft = startNode.getFeature(); if (ft != null && ft instanceof WebserviceStartFeature) { WebserviceStartFeature wsFt = (WebserviceStartFeature) ft; ServiceBinding svcBinding = wsFt.getServiceBinding(); if (svcBinding != null) { ServiceDef svcDef = workflowProcess.getService(svcBinding.getServiceId()); if (svcDef != null && svcDef instanceof CallbackService) { publishCallbackService(workflowProcess, subflow, startNode, (CallbackService) svcDef); } } } } } } } */ } /* 暂时屏蔽 该功能 protected void publishCallbackService(WorkflowProcess workflowProcess, SubProcess subflow, Node node, CallbackService callbackService) throws WebservicePublishException{ CommonInterfaceDef commonInterfaceDef = (CommonInterfaceDef) callbackService .getInterface(); String serviceName = callbackService.getName()+"_"+callbackService.getVersion(); QName serviceQName = new QName(callbackService.getTargetNamespaceUri(), serviceName); if (servicePublishRegistry.get(serviceQName)!=null && servicePublishRegistry.get(serviceQName)){ return;//已经发布,不必重复发布; } QName portQName = new QName(callbackService.getTargetNamespaceUri(), commonInterfaceDef.getName()+"_Port");// // 1、构造address,wsdlfilename // TODO 如何组织address,使之与已有的Server context适应? Environment evn = ctx .getDefaultEngineModule(Environment.class); String contextPath = evn.getWebserviceContextPath(); if (!contextPath.startsWith("/")){ contextPath = "/"+contextPath; } String address = "http://"+evn.getWebserviceIP()+":" +Integer.toString(evn.getWebservicePort()) +contextPath; // 2、构造wsdl List<Source> wsdls = null; try { wsdls = this .buildWSDL(callbackService, commonInterfaceDef,address,evn.getWorkDir(),serviceQName,portQName); } catch (FileNotFoundException e) { throw new WebservicePublishException(e); } catch (WSDLException e) { throw new WebservicePublishException(e); }catch(IOException e){ throw new WebservicePublishException(e); } // 3、指定service name 和port name Map<String, Object> properties = new HashMap<String, Object>(); properties.put(Endpoint.WSDL_SERVICE, serviceQName); properties.put(Endpoint.WSDL_PORT, portQName); // 4、构建Implementor ProcessServiceProvider implementor = new ProcessServiceProvider(); implementor.setWorkflowRuntimeContext(ctx); implementor.setProcessId(workflowProcess.getId()); implementor.setProcessType(FpdlConstants.PROCESS_TYPE_FPDL20); if (node instanceof Activity){ Activity activity = (Activity)node; ServiceBinding binding = activity.getServiceBinding(); implementor.setServiceBinding(binding); }else if (node instanceof StartNode){ implementor.setStartNewProcess(true); WebserviceStartFeature wsFt = (WebserviceStartFeature)((StartNode)node).getFeature(); ServiceBinding svcBinding = wsFt.getServiceBinding(); implementor.setServiceBinding(svcBinding); } implementor.setCallbackService(callbackService); implementor.setTransactionTemplate(this.getTransactionTemplate()); // 5、发布服务 Endpoint endpoint = Endpoint.create(implementor); endpoint.setMetadata(wsdls); endpoint.setProperties(properties); endpoint.publish(address); servicePublishRegistry.put(serviceQName, Boolean.TRUE); } */ /** * 该段代码参考javaeye一篇帖子,作者为:步行者; * 链接是:http://www.iteye.com/topic/421068 * @param callbackService * @param _interface * @param serviceName callbackService.getName()+"_"+callbackService.getVersion() * @return */ /* protected List<Source> buildWSDL(CallbackService callbackService, InterfaceDef _interface,String address,String workDir,QName serviceQName,QName portQName) throws WSDLException,FileNotFoundException,IOException{ //为该Web service创建子目录 String fullDirName = workDir+File.separator+serviceQName.getLocalPart(); File serviceDir = new File(fullDirName); if (!serviceDir.exists()){ boolean b = serviceDir.mkdir(); if (!b){ throw new IOException("Can NOT create work dir for service "+serviceQName.toString()+"; the dir path is "+fullDirName); } } List<Source> result = new ArrayList<Source>(); List<OperationDef> operationDefs = _interface.getOperations(); if (operationDefs==null || operationDefs.size()==0){ //TODO 记录错误信息 return result; } OperationDef operationDef = operationDefs.get(0);//CallbackService仅允许一个Operation // 根据Interface定义构建WSDL,使用wsdl4j; String tns = callbackService.getTargetNamespaceUri(); WSDLFactory wsdlFactory = WSDLFactory.newInstance(); // 创建一个 WSDL definition Definition definition = wsdlFactory.newDefinition(); // 设置 targetNamespace definition.setTargetNamespace(tns); definition.setQName(new QName(tns, callbackService.getName())); // 添加命名空间 (一些常用的命名空间) definition.addNamespace("tns", tns); definition.addNamespace("xsd", NameSpaces.XSD.getUri()); definition.addNamespace("wsdlsoap", "http://schemas.xmlsoap.org/wsdl/soap/"); definition.addNamespace("soapenc11", "http://schemas.xmlsoap.org/soap/encoding/"); definition.addNamespace("soapenc12", "http://www.w3.org/2003/05/soap-encoding"); definition.addNamespace("soap11", "http://schemas.xmlsoap.org/soap/envelope/"); definition.addNamespace("soap12", "http://www.w3.org/2003/05/soap-envelope"); //0、创建data types XmlSchemaCollection schemaCollection = callbackService.getXmlSchemaCollection(); //将schemaCollections写入WsdlDefinitions.types段落? if (schemaCollection!=null){ Types types = definition.createTypes(); XmlSchema[] xmlSchemas = schemaCollection.getXmlSchemas(); for (XmlSchema xmlSchema : xmlSchemas){ if (!NameSpaces.XSD.getUri().equals(xmlSchema.getTargetNamespace())){ try { Document schemaDocument; schemaDocument = xmlSchema.getSchemaDocument(); SchemaImpl wsdlSchema = new SchemaImpl(); wsdlSchema.setRequired(true); wsdlSchema.setElementType(WSDLConstants.QNAME_SCHEMA); wsdlSchema.setElement(schemaDocument.getDocumentElement()); types.addExtensibilityElement(wsdlSchema); } catch (XmlSchemaSerializerException e) { throw new WSDLException(WSDLException.OTHER_ERROR,e.getMessage(),e); } } } definition.setTypes(types); } //一、创建消息 // 创建消息(Message) Message requestMsg = definition.createMessage(); requestMsg.setQName(new QName(tns, operationDef.getOperationName()+"RequestMessage")); requestMsg.setUndefined(false); Message responseMsg = definition.createMessage(); responseMsg.setQName(new QName(tns, operationDef.getOperationName()+"ResponseMessage")); responseMsg.setUndefined(false); definition.addMessage(requestMsg); definition.addMessage(responseMsg); // 创建RequestMessage的 Part Part part1 = definition.createPart(); part1.setName(operationDef.getOperationName()+"Request"); // 设置 part1 的 Schema Type QName part1Element = new QName(tns,operationDef.getOperationName()+"Request"); part1.setElementName(part1Element); requestMsg.addPart(part1); // 创建ResponseMessage的Part Part part2 = definition.createPart(); part2.setName(operationDef.getOperationName()+"Response"); // 设置 part2 的 Schema Type QName part2Element = new QName(tns,operationDef.getOperationName()+"Response"); part2.setElementName(part2Element); responseMsg.addPart(part2); // List<org.fireflow.model.data.Input> inputList = operationDef.getInputs(); // for (org.fireflow.model.data.Input ffInput:inputList){ // ffInput.getDataType(); // // // 创建 Part // Part part1 = definition.createPart(); // part1.setName(ffInput.getName()+"Part"); // // 设置 part1 的 Schema Type // part1.setTypeName(ffInput.getDataType()); // requestMsg.addPart(part1); // } // List<org.fireflow.model.data.Output> outputList = operationDef.getOutputs(); // for (org.fireflow.model.data.Output ffOutput : outputList){ // Part part2 = definition.createPart(); // part2.setName(ffOutput.getName()+"Part"); // // 设置 part2 的 Schema Type // part2.setTypeName(ffOutput.getDataType()); // // responseMsg.addPart(part2); // } //二、 创建 portType PortType portType = definition.createPortType(); portType.setQName(new QName(tns, _interface.getName()+"_PortType")); // 创建 Operation Operation operation = definition.createOperation(); operation.setName(operationDef.getOperationName()); // 创建 Input,并设置 Input 的 message Input input = definition.createInput(); input.setName(operationDef.getOperationName()+"Request"); input.setMessage(requestMsg); // 创建 Output,并设置 Output 的 message Output output = definition.createOutput(); output.setName(operationDef.getOperationName()+"Response"); output.setMessage(responseMsg); // 设置 Operation 的输入,输出,操作类型 operation.setInput(input); operation.setOutput(output); operation.setStyle(OperationType.REQUEST_RESPONSE); // 这行语句很重要 ! operation.setUndefined(false); portType.addOperation(operation); portType.setUndefined(false); definition.addPortType(portType); //三、创建绑定(binding) Binding binding = definition.createBinding(); binding.setQName(new QName(tns, _interface.getName()+"_Binding")); // 创建SOAP绑定(SOAP binding) SOAPBinding soapBinding = new SOAPBindingImpl(); // 设置 style = "document" soapBinding.setStyle("document"); // 设置 SOAP传输协议 为 HTTP soapBinding.setTransportURI("http://schemas.xmlsoap.org/soap/http"); // soapBinding 是 WSDL 中的扩展元素, // 为 binding 添加扩展元素 soapBinding binding.addExtensibilityElement(soapBinding); // 设置绑定的端口类型 binding.setPortType(portType); // 创建绑定操作(Binding Operation) BindingOperation bindingOperation = definition.createBindingOperation(); // 创建 bindingInput BindingInput bindingInput = definition.createBindingInput(); bindingInput.setName(operationDef.getOperationName()+"Request"); // 创建 SOAP body ,设置 use = "literal" SOAPBody soapBody1 = new SOAPBodyImpl(); soapBody1.setUse("literal"); bindingInput.addExtensibilityElement(soapBody1); BindingOutput bindingOutput = definition.createBindingOutput(); bindingOutput.setName(operationDef.getOperationName()+"Response"); SOAPBody soapBody2 = new SOAPBodyImpl(); soapBody2.setUse("literal"); bindingOutput.addExtensibilityElement(soapBody2); // 设置 bindingOperation 的名称,绑定输入 和 绑定输出 bindingOperation.setName(operationDef.getOperationName()); bindingOperation.setBindingInput(bindingInput); bindingOperation.setBindingOutput(bindingOutput); binding.addBindingOperation(bindingOperation); // 这行语句很重要 ! binding.setUndefined(false); definition.addBinding(binding); //四、创建Service及port // 创建 service Service service = definition.createService(); service.setQName(serviceQName); // 创建服务端口 port Port port = definition.createPort(); // 设置服务端口的 binding,名称,并添加SOAP地址 port.setBinding(binding); port.setName(portQName.getLocalPart()); SOAPAddress soapAddress = new SOAPAddressImpl(); soapAddress.setLocationURI(address); port.addExtensibilityElement(soapAddress); service.addPort(port); definition.addService(service); // 打印刚创建的 WSDL String wsdlFileName = fullDirName+File.separator+serviceQName.getLocalPart()+".wsdl"; File f = new File(wsdlFileName); if (f.exists()){ boolean b = f.delete(); if (!b){ throw new IOException("Can NOT delete old wsdl file '"+wsdlFileName+"'"); } } FileOutputStream fOut = new FileOutputStream(f); WSDLWriter writer = wsdlFactory.newWSDLWriter(); writer.writeWSDL(definition,fOut); fOut.flush(); StreamSource streamSource = new StreamSource(f); result.add(streamSource); return result; } */ }