提交 190ca662 编写于 作者: J Joram Barrez

Manually ported all fixes to the CXF module to v6

上级 f6bba712
......@@ -31,6 +31,7 @@ import javax.xml.namespace.QName;
import org.activiti.bpmn.model.Import;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.bpmn.data.PrimitiveStructureDefinition;
import org.activiti.engine.impl.bpmn.data.SimpleStructureDefinition;
import org.activiti.engine.impl.bpmn.data.StructureDefinition;
import org.activiti.engine.impl.bpmn.parser.BpmnParseXMLImportHandler;
......@@ -51,6 +52,8 @@ import com.ibm.wsdl.extensions.schema.SchemaImpl;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JJavaName;
import com.sun.codemodel.JType;
import com.sun.tools.xjc.ConsoleErrorReporter;
import com.sun.tools.xjc.api.ErrorListener;
import com.sun.tools.xjc.api.Mapping;
......@@ -97,7 +100,7 @@ public class CxfWSDLImporter implements XMLImporter {
}
}
private void transferImportsToParse(BpmnParseXMLImportHandler parseHandler) {
protected void transferImportsToParse(BpmnParseXMLImportHandler parseHandler) {
if (parseHandler != null) {
for (StructureDefinition structure : this.structures.values()) {
parseHandler.addStructure(structure);
......@@ -144,13 +147,13 @@ public class CxfWSDLImporter implements XMLImporter {
throw new ActivitiException("The JAXB binding definitions are not found for activiti-cxf: " + JAXB_BINDINGS_RESOURCE);
}
} catch (WSDLException e) {
e.printStackTrace();
e.printStackTrace();
} catch (IOException e) {
throw new ActivitiException("Error retrieveing the JAXB binding definitions", e);
}
}
private WSService importService(ServiceInfo service) {
protected WSService importService(ServiceInfo service) {
String name = service.getName().getLocalPart();
String location = "";
......@@ -168,12 +171,12 @@ public class CxfWSDLImporter implements XMLImporter {
return wsService;
}
private WSOperation importOperation(OperationInfo operation, WSService service) {
protected WSOperation importOperation(OperationInfo operation, WSService service) {
WSOperation wsOperation = new WSOperation(this.namespace + operation.getName().getLocalPart(), operation.getName().getLocalPart(), service);
return wsOperation;
}
private void importTypes(Types types) {
protected void importTypes(Types types) {
SchemaCompiler compiler = XJC.createSchemaCompiler();
ErrorListener elForRun = new ConsoleErrorReporter();
compiler.setErrorListener(elForRun);
......@@ -188,21 +191,34 @@ public class CxfWSDLImporter implements XMLImporter {
}
}
private void importStructure(Mapping mapping) {
protected void importStructure(Mapping mapping) {
QName qname = mapping.getElement();
JDefinedClass theClass = (JDefinedClass) mapping.getType().getTypeClass();
SimpleStructureDefinition structure = new SimpleStructureDefinition(this.namespace + qname.getLocalPart());
this.structures.put(structure.getId(), structure);
importFields(theClass, structure);
final JType type = mapping.getType().getTypeClass();
if (type.isPrimitive()) {
final Class<?> primitiveClass = ReflectUtil.loadClass(type.boxify().fullName());
final StructureDefinition structure = new PrimitiveStructureDefinition(this.namespace + qname.getLocalPart(), primitiveClass);
this.structures.put(structure.getId(), structure);
} else if (type instanceof JDefinedClass) {
JDefinedClass theClass = (JDefinedClass) type;
SimpleStructureDefinition structure = new SimpleStructureDefinition(this.namespace + qname.getLocalPart());
this.structures.put(structure.getId(), structure);
importFields(theClass, structure);
} else {
final Class<?> referencedClass = ReflectUtil.loadClass(type.fullName());
final StructureDefinition structure = new PrimitiveStructureDefinition(this.namespace + qname.getLocalPart(), referencedClass);
this.structures.put(structure.getId(), structure);
}
}
private static void importFields(final JDefinedClass theClass, final SimpleStructureDefinition structure) {
protected static void importFields(final JDefinedClass theClass, final SimpleStructureDefinition structure) {
final AtomicInteger index = new AtomicInteger(0);
_importFields(theClass, index, structure);
}
private static void _importFields(final JDefinedClass theClass, final AtomicInteger index, final SimpleStructureDefinition structure) {
protected static void _importFields(final JDefinedClass theClass, final AtomicInteger index, final SimpleStructureDefinition structure) {
final JClass parentClass = theClass._extends();
if (parentClass != null && parentClass instanceof JDefinedClass) {
......@@ -210,12 +226,19 @@ public class CxfWSDLImporter implements XMLImporter {
}
for (Entry<String, JFieldVar> entry : theClass.fields().entrySet()) {
Class<?> fieldClass = ReflectUtil.loadClass(entry.getValue().type().boxify().fullName());
structure.setFieldName(index.getAndIncrement(), entry.getKey(), fieldClass);
String fieldName = entry.getKey();
if (fieldName.startsWith("_")) {
if (!JJavaName.isJavaIdentifier(fieldName.substring(1))) {
fieldName = fieldName.substring(1); //it was prefixed with '_' so we should use the original name.
}
}
structure.setFieldName(index.getAndIncrement(), fieldName, fieldClass);
}
}
private S2JJAXBModel compileModel(Types types, SchemaCompiler compiler, org.w3c.dom.Element rootTypes) {
protected S2JJAXBModel compileModel(Types types, SchemaCompiler compiler, org.w3c.dom.Element rootTypes) {
Schema schema = (Schema) types.getExtensibilityElements().get(0);
compiler.parseSchema(schema.getDocumentBaseURI() + "#types1", rootTypes);
S2JJAXBModel intermediateModel = compiler.bind();
......
......@@ -21,8 +21,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import junit.framework.Assert;
import org.activiti.engine.impl.bpmn.data.SimpleStructureDefinition;
import org.activiti.engine.impl.bpmn.data.StructureDefinition;
import org.activiti.engine.impl.util.ReflectUtil;
......@@ -40,75 +38,87 @@ public class WSDLImporterTest {
public void setUp() {
importer = new CxfWSDLImporter();
}
@Test
public void testImportCounter() throws Exception {
URL url = ReflectUtil.getResource("org/activiti/engine/impl/webservice/counter.wsdl");
importer.importFrom(url.toString());
List<WSService> services = new ArrayList<WSService>(importer.getServices());
Assert.assertEquals(1, services.size());
assertEquals(1, services.size());
WSService service = services.get(0);
Assert.assertEquals("Counter", service.getName());
Assert.assertEquals("http://localhost:63081/counter", service.getLocation());
assertEquals("Counter", service.getName());
assertEquals("http://localhost:63081/webservicemock", service.getLocation());
List<StructureDefinition> structures = sortStructures();
List<WSOperation> operations = sortOperations();
Assert.assertEquals(5, operations.size());
assertEquals(7, operations.size());
this.assertOperation(operations.get(0), "getCount", service);
this.assertOperation(operations.get(1), "inc", service);
this.assertOperation(operations.get(2), "prettyPrintCount", service);
this.assertOperation(operations.get(3), "reset", service);
this.assertOperation(operations.get(4), "setTo", service);
Assert.assertEquals(10, structures.size());
this.assertOperation(operations.get(2), "noNameResult", service);
this.assertOperation(operations.get(3), "prettyPrintCount", service);
this.assertOperation(operations.get(4), "reservedWordAsName", service);
this.assertOperation(operations.get(5), "reset", service);
this.assertOperation(operations.get(6), "setTo", service);
assertEquals(14, structures.size());
this.assertStructure(structures.get(0), "getCount", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(1), "getCountResponse", new String[] { "count" }, new Class<?>[] { Integer.class });
this.assertStructure(structures.get(2), "inc", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(3), "incResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(4), "prettyPrintCount", new String[] { "prefix", "suffix" }, new Class<?>[] { String.class, String.class });
this.assertStructure(structures.get(5), "prettyPrintCountResponse", new String[] { "prettyPrint" }, new Class<?>[] { String.class });
this.assertStructure(structures.get(6), "reset", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(7), "resetResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(8), "setTo", new String[] { "value" }, new Class<?>[] { Integer.class });
this.assertStructure(structures.get(9), "setToResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(4), "noNameResult", new String[] {"prefix", "suffix"}, new Class<?>[] {String.class, String.class});
this.assertStructure(structures.get(5), "noNameResultResponse", new String[] {"return"}, new Class<?>[] {String.class});
this.assertStructure(structures.get(6), "prettyPrintCount", new String[] {"prefix", "suffix"}, new Class<?>[] {String.class, String.class});
this.assertStructure(structures.get(7), "prettyPrintCountResponse", new String[] {"prettyPrint"}, new Class<?>[] {String.class});
this.assertStructure(structures.get(8), "reservedWordAsName", new String[] {"prefix","suffix"}, new Class<?>[] {String.class, String.class});
this.assertStructure(structures.get(9), "reservedWordAsNameResponse", new String[] {"static"}, new Class<?>[] {String.class});
this.assertStructure(structures.get(10), "reset", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(11), "resetResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(12), "setTo", new String[] {"value"}, new Class<?>[] {Integer.class});
this.assertStructure(structures.get(13), "setToResponse", new String[] {}, new Class<?>[] {});
}
@Test
public void testImportCounterWithImport() throws Exception {
URL url = ReflectUtil.getResource("org/activiti/engine/impl/webservice/counterWithImport.wsdl");
importer.importFrom(url.toString());
List<WSService> services = new ArrayList<WSService>(importer.getServices());
Assert.assertEquals(1, services.size());
assertEquals(1, services.size());
WSService service = services.get(0);
Assert.assertEquals("Counter", service.getName());
Assert.assertEquals("http://localhost:63081/counter", service.getLocation());
assertEquals("Counter", service.getName());
assertEquals("http://localhost:63081/counter", service.getLocation());
List<StructureDefinition> structures = sortStructures();
List<WSOperation> operations = sortOperations();
Assert.assertEquals(5, operations.size());
assertEquals(7, operations.size());
this.assertOperation(operations.get(0), "getCount", service);
this.assertOperation(operations.get(1), "inc", service);
this.assertOperation(operations.get(2), "prettyPrintCount", service);
this.assertOperation(operations.get(3), "reset", service);
this.assertOperation(operations.get(4), "setTo", service);
Assert.assertEquals(10, structures.size());
this.assertOperation(operations.get(2), "noNameResult", service);
this.assertOperation(operations.get(3), "prettyPrintCount", service);
this.assertOperation(operations.get(4), "reservedWordAsName", service);
this.assertOperation(operations.get(5), "reset", service);
this.assertOperation(operations.get(6), "setTo", service);
assertEquals(14, structures.size());
this.assertStructure(structures.get(0), "getCount", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(1), "getCountResponse", new String[] { "count" }, new Class<?>[] { Integer.class });
this.assertStructure(structures.get(2), "inc", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(3), "incResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(4), "prettyPrintCount", new String[] { "prefix", "suffix" }, new Class<?>[] { String.class, String.class });
this.assertStructure(structures.get(5), "prettyPrintCountResponse", new String[] { "prettyPrint" }, new Class<?>[] { String.class });
this.assertStructure(structures.get(6), "reset", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(7), "resetResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(8), "setTo", new String[] { "value" }, new Class<?>[] { Integer.class });
this.assertStructure(structures.get(9), "setToResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(4), "noNameResult", new String[] {"prefix", "suffix"}, new Class<?>[] {String.class, String.class});
this.assertStructure(structures.get(5), "noNameResultResponse", new String[] {"return"}, new Class<?>[] {String.class});
this.assertStructure(structures.get(6), "prettyPrintCount", new String[] {"prefix", "suffix"}, new Class<?>[] {String.class, String.class});
this.assertStructure(structures.get(7), "prettyPrintCountResponse", new String[] {"prettyPrint"}, new Class<?>[] {String.class});
this.assertStructure(structures.get(8), "reservedWordAsName", new String[] {"prefix", "suffix"}, new Class<?>[] {String.class, String.class});
this.assertStructure(structures.get(9), "reservedWordAsNameResponse", new String[] {"static"}, new Class<?>[] {String.class});
this.assertStructure(structures.get(10), "reset", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(11), "resetResponse", new String[] {}, new Class<?>[] {});
this.assertStructure(structures.get(12), "setTo", new String[] {"value"}, new Class<?>[] {Integer.class});
this.assertStructure(structures.get(13), "setToResponse", new String[] {}, new Class<?>[] {});
}
private List<WSOperation> sortOperations() {
......@@ -130,20 +140,20 @@ public class WSDLImporterTest {
});
return structures;
}
private void assertOperation(WSOperation wsOperation, String name, WSService service) {
Assert.assertEquals(name, wsOperation.getName());
Assert.assertEquals(service, wsOperation.getService());
assertEquals(name, wsOperation.getName());
assertEquals(service, wsOperation.getService());
}
private void assertStructure(StructureDefinition structure, String structureId, String[] parameters, Class<?>[] classes) {
SimpleStructureDefinition simpleStructure = (SimpleStructureDefinition) structure;
Assert.assertEquals(structureId, simpleStructure.getId());
assertEquals(structureId, simpleStructure.getId());
for (int i = 0; i < simpleStructure.getFieldSize(); i++) {
Assert.assertEquals(parameters[i], simpleStructure.getFieldNameAt(i));
Assert.assertEquals(classes[i], simpleStructure.getFieldTypeAt(i));
assertEquals(parameters[i], simpleStructure.getFieldNameAt(i));
assertEquals(classes[i], simpleStructure.getFieldTypeAt(i));
}
}
......@@ -156,7 +166,7 @@ public class WSDLImporterTest {
List<StructureDefinition> structures = sortStructures();
assertEquals(1, structures.size());
final Object structureTypeInst = ReflectUtil.instantiate("org.activiti.webservice.counter.StructureType");
final Class structureType = structureTypeInst.getClass();
final Class<? extends Object> structureType = structureTypeInst.getClass();
this.assertStructure(structures.get(0), "inheritedRequest", new String[] { "rootElt", "inheritedElt", "newSimpleElt",
"newStructuredElt" }, new Class<?>[] { Short.class, Integer.class, String.class, structureType });
assertEquals(2, structureType.getDeclaredFields().length);
......@@ -165,4 +175,11 @@ public class WSDLImporterTest {
assertEquals(1, structureType.getSuperclass().getDeclaredFields().length);
assertNotNull(structureType.getSuperclass().getDeclaredField("rootElt"));
}
@Test
public void testImportBasicElement() throws Exception {
URL url = ReflectUtil.getResource("org/activiti/engine/impl/webservice/basic-elements-in-types.wsdl");
assertNotNull(url);
importer.importFrom(url.toString());
}
}
......@@ -78,4 +78,10 @@ public interface WebServiceMock {
*/
@WebResult(name="currentStructure")
WebServiceDataStructure getDataStructure();
@WebResult
String noNameResult(@WebParam(name="prefix") String prefix, @WebParam(name="suffix") String suffix);
@WebResult(name = "static")
String reservedWordAsName(@WebParam(name="prefix") String prefix, @WebParam(name="suffix") String suffix);
}
......@@ -82,4 +82,18 @@ public class WebServiceMockImpl implements WebServiceMock {
public WebServiceDataStructure getDataStructure() {
return this.dataStructure;
}
/**
* {@inheritDoc}
*/
public String noNameResult(String prefix, String suffix) {
return prefix + this.getCount() + suffix;
}
/**
* {@inheritDoc}
*/
public String reservedWordAsName(String prefix, String suffix) {
return prefix + this.getCount() + suffix;
}
}
\ No newline at end of file
......@@ -27,7 +27,7 @@ public class WebServiceSimplisticTest extends AbstractWebServiceTaskTest {
protected boolean isValidating() {
return false;
}
@Deployment
public void testAsyncInvocationWithSimplisticDataFlow() throws Exception {
assertEquals(-1, webServiceMock.getCount());
......
......@@ -35,12 +35,17 @@ public class WebServiceUELTest extends AbstractWebServiceTaskTest {
public void testAsyncInvocationWithDataFlowUEL() throws Exception {
assertEquals(-1, webServiceMock.getCount());
ProcessDefinitionEntity processDefinition = processEngineConfiguration.getCommandExecutor().execute(new Command<ProcessDefinitionEntity>() {
public ProcessDefinitionEntity execute(CommandContext commandContext) {
return Context.getProcessEngineConfiguration().getDeploymentManager().findDeployedLatestProcessDefinitionByKey("asyncWebServiceInvocationWithDataFlowUEL");
}
});
ProcessDefinitionEntity processDefinition = processEngineConfiguration
.getCommandExecutor()
.execute(new Command<ProcessDefinitionEntity>() {
public ProcessDefinitionEntity execute(CommandContext commandContext) {
return Context
.getProcessEngineConfiguration()
.getDeploymentManager()
.findDeployedLatestProcessDefinitionByKey("asyncWebServiceInvocationWithDataFlowUEL");
}
});
ItemDefinition itemDefinition = processDefinition.getIoSpecification().getDataInputs().get(0).getDefinition();
ItemInstance itemInstance = itemDefinition.createInstance();
......
......@@ -26,7 +26,7 @@ public class WebServiceSimplisticTest extends AbstractWebServiceTaskTest {
protected boolean isValidating() {
return false;
}
@Deployment
public void testWebServiceInvocationWithSimplisticDataFlow() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
......@@ -39,4 +39,30 @@ public class WebServiceSimplisticTest extends AbstractWebServiceTaskTest {
String response = (String) processEngine.getRuntimeService().getVariable(instance.getId(), "OutputVariable");
assertEquals("The counter has the value -1. Good news", response);
}
@Deployment
public void testWebResponseNoName() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("PrefixVariable", "The counter has the value ");
variables.put("SuffixVariable", ". Good news (NO NAME)");
ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey("webServiceInvocationWithSimplisticDataFlow", variables);
waitForJobExecutorToProcessAllJobs(10000L, 250L);
String response = (String) processEngine.getRuntimeService().getVariable(instance.getId(), "OutputVariable");
assertEquals("The counter has the value -1. Good news (NO NAME)", response);
}
@Deployment
public void testWebResponseKeywordName() throws Exception {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("PrefixVariable", "The counter has the value ");
variables.put("SuffixVariable", ". Good news Keyword");
ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey("webServiceInvocationWithSimplisticDataFlow", variables);
waitForJobExecutorToProcessAllJobs(10000L, 250L);
String response = (String) processEngine.getRuntimeService().getVariable(instance.getId(), "OutputVariable");
assertEquals("The counter has the value -1. Good news Keyword", response);
}
}
......@@ -32,13 +32,18 @@ public class WebServiceUELTest extends AbstractWebServiceTaskTest {
@Deployment
public void testWebServiceInvocationWithDataFlowUEL() throws Exception {
ProcessDefinitionEntity processDefinition = processEngineConfiguration.getCommandExecutor().execute(new Command<ProcessDefinitionEntity>() {
public ProcessDefinitionEntity execute(CommandContext commandContext) {
return Context.getProcessEngineConfiguration().getDeploymentManager().findDeployedLatestProcessDefinitionByKey("webServiceInvocationWithDataFlowUEL");
}
});
ItemDefinition itemDefinition = processDefinition.getIoSpecification().getDataInputs().get(0).getDefinition();
ProcessDefinitionEntity processDefinition = processEngineConfiguration
.getCommandExecutor()
.execute(new Command<ProcessDefinitionEntity>() {
public ProcessDefinitionEntity execute(CommandContext commandContext) {
return Context
.getProcessEngineConfiguration()
.getDeploymentManager()
.findDeployedLatestProcessDefinitionByKey("webServiceInvocationWithDataFlowUEL");
}
});
ItemDefinition itemDefinition = processDefinition.getIoSpecification().getDataInputs().get(0).getDefinition();
ItemInstance itemInstance = itemDefinition.createInstance();
FieldBaseStructureInstance structureInstance = (FieldBaseStructureInstance) itemInstance.getStructureInstance();
......
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="Counter" targetNamespace="http://webservice.activiti.org/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.activiti.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://webservice.activiti.org/"
xmlns:tns="http://webservice.activiti.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="int" type="xsd:int" />
<xs:element name="long" type="xsd:long" />
<xs:element name="short" type="xsd:short" />
<xs:element name="boolean" type="xsd:boolean" />
<xs:element name="double" type="xsd:double" />
<xs:element name="string" type="xsd:string" />
<xs:element name="date" type="xsd:date" />
<xs:element name="uri" type="xsd:anyURI" />
</xs:schema>
</wsdl:types>
<wsdl:message name="int">
<wsdl:part element="tns:int" name="int" />
</wsdl:message>
<wsdl:message name="long">
<wsdl:part element="tns:long" name="long" />
</wsdl:message>
<wsdl:message name="short">
<wsdl:part element="tns:short" name="short" />
</wsdl:message>
<wsdl:message name="boolean">
<wsdl:part element="tns:boolean" name="boolean" />
</wsdl:message>
<wsdl:message name="double">
<wsdl:part element="tns:double" name="double" />
</wsdl:message>
<wsdl:message name="string">
<wsdl:part element="tns:string" name="string" />
</wsdl:message>
<wsdl:message name="date">
<wsdl:part element="tns:date" name="date" />
</wsdl:message>
<wsdl:message name="uri">
<wsdl:part element="tns:uri" name="uri" />
</wsdl:message>
<wsdl:portType name="Basic">
<wsdl:operation name="op1">
<wsdl:input message="tns:int" name="int" />
<wsdl:output message="tns:long" name="long" />
</wsdl:operation>
<wsdl:operation name="op2">
<wsdl:input message="tns:short" name="short" />
<wsdl:output message="tns:boolean" name="boolean" />
</wsdl:operation>
<wsdl:operation name="op3">
<wsdl:input message="tns:double" name="double" />
<wsdl:output message="tns:string" name="string" />
</wsdl:operation>
<wsdl:operation name="op4">
<wsdl:input message="tns:date" name="date" />
<wsdl:output message="tns:uri" name="uri" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicSoapBinding" type="tns:Basic">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="op1">
<soap:operation soapAction="" style="document" />
<wsdl:input name="int">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="long">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="op2">
<soap:operation soapAction="" style="document" />
<wsdl:input name="short">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="boolean">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="op3">
<soap:operation soapAction="" style="document" />
<wsdl:input name="double">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="string">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="op4">
<soap:operation soapAction="" style="document" />
<wsdl:input name="date">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="uri">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Basic">
<wsdl:port binding="tns:BasicSoapBinding" name="BasicImplPort">
<soap:address location="http://localhost:63081/basic" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="Counter" targetNamespace="http://webservice.activiti.org/counter" xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.activiti.org/counter" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="Counter" targetNamespace="http://webservice.activiti.org/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.activiti.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://webservice.activiti.org/counter"
xmlns:tns="http://webservice.activiti.org/counter" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified"
targetNamespace="http://webservice.activiti.org/"
xmlns:tns="http://webservice.activiti.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="getCount" type="tns:getCount" />
<xs:element name="getCountResponse" type="tns:getCountResponse" />
<xs:element name="inc" type="tns:inc" />
<xs:element name="incResponse" type="tns:incResponse" />
<xs:element name="prettyPrintCount" type="tns:prettyPrintCount" />
<xs:element name="prettyPrintCountResponse" type="tns:prettyPrintCountResponse" />
<xs:element name="noNameResult" type="tns:noNameResult" />
<xs:element name="noNameResultResponse" type="tns:noNameResultResponse" />
<xs:element name="reservedWordAsName" type="tns:reservedWordAsName" />
<xs:element name="reservedWordAsNameResponse" type="tns:reservedWordAsNameResponse" />
<xs:element name="reset" type="tns:reset" />
<xs:element name="resetResponse" type="tns:resetResponse" />
<xs:element name="setTo" type="tns:setTo" />
......@@ -46,6 +48,31 @@
<xs:element minOccurs="0" name="prettyPrint" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="noNameResult">
<xs:sequence>
<xs:element minOccurs="0" name="prefix" type="xs:string" />
<xs:element minOccurs="0" name="suffix" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="noNameResultResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="reservedWordAsName">
<xs:sequence>
<xs:element minOccurs="0" name="prefix" type="xs:string" />
<xs:element minOccurs="0" name="suffix" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="reservedWordAsNameResponse">
<xs:sequence>
<xs:element minOccurs="0" name="static" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="getCount">
<xs:sequence />
</xs:complexType>
......@@ -68,6 +95,15 @@
<wsdl:part element="tns:prettyPrintCountResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="noNameResultResponse">
<wsdl:part element="tns:noNameResultResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="reservedWordAsNameResponse">
<wsdl:part element="tns:reservedWordAsNameResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="resetResponse">
<wsdl:part element="tns:resetResponse" name="parameters">
</wsdl:part>
......@@ -88,6 +124,14 @@
<wsdl:part element="tns:prettyPrintCount" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="noNameResult">
<wsdl:part element="tns:noNameResult" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="reservedWordAsName">
<wsdl:part element="tns:reservedWordAsName" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="inc">
<wsdl:part element="tns:inc" name="parameters">
</wsdl:part>
......@@ -121,6 +165,18 @@
<wsdl:output message="tns:prettyPrintCountResponse" name="prettyPrintCountResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="noNameResult">
<wsdl:input message="tns:noNameResult" name="noNameResult">
</wsdl:input>
<wsdl:output message="tns:noNameResultResponse" name="noNameResultResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="reservedWordAsName">
<wsdl:input message="tns:reservedWordAsName" name="reservedWordAsName">
</wsdl:input>
<wsdl:output message="tns:reservedWordAsNameResponse" name="reservedWordAsNameResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getCount">
<wsdl:input message="tns:getCount" name="getCount">
</wsdl:input>
......@@ -166,6 +222,25 @@
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="noNameResult">
<soap:operation soapAction="" style="document" />
<wsdl:input name="noNameResult">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="noNameResultResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="reservedWordAsName">
<soap:operation soapAction="" style="document" />
<wsdl:input name="reservedWordAsName">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="reservedWordAsNameResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getCount">
<soap:operation soapAction="" style="document" />
<wsdl:input name="getCount">
......@@ -178,7 +253,7 @@
</wsdl:binding>
<wsdl:service name="Counter">
<wsdl:port binding="tns:CounterSoapBinding" name="CounterImplPort">
<soap:address location="http://localhost:63081/counter" />
<soap:address location="http://localhost:63081/webservicemock" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
\ No newline at end of file
......@@ -12,6 +12,14 @@
<xs:element name="prettyPrintCountResponse" type="tns:prettyPrintCountResponse"></xs:element>
<xs:element name="noNameResult" type="tns:noNameResult"></xs:element>
<xs:element name="noNameResultResponse" type="tns:noNameResultResponse"></xs:element>
<xs:element name="reservedWordAsName" type="tns:reservedWordAsName"></xs:element>
<xs:element name="reservedWordAsNameResponse" type="tns:reservedWordAsNameResponse"></xs:element>
<xs:element name="reset" type="tns:reset"></xs:element>
<xs:element name="resetResponse" type="tns:resetResponse"></xs:element>
......@@ -31,6 +39,32 @@
<xs:sequence>
<xs:element name="prettyPrint" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="reservedWordAsName">
<xs:sequence>
<xs:element name="prefix" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="suffix" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="reservedWordAsNameResponse">
<xs:sequence>
<xs:element name="static" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="noNameResult">
<xs:sequence>
<xs:element name="prefix" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="suffix" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="noNameResultResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="inc">
......
......@@ -16,11 +16,23 @@
<message name="setToResponse">
<part name="parameters" element="tns:setToResponse"></part>
</message>
<message name="prettyPrintCount">
<message name="noNameResult">
<part name="parameters" element="tns:noNameResult"></part>
</message>
<message name="prettyPrintCount">
<part name="parameters" element="tns:prettyPrintCount"></part>
</message>
<message name="prettyPrintCountResponse">
<part name="parameters" element="tns:prettyPrintCountResponse"></part>
</message>
<message name="reservedWordAsName">
<part name="parameters" element="tns:reservedWordAsName"></part>
</message>
<message name="reservedWordAsNameResponse">
<part name="parameters" element="tns:reservedWordAsNameResponse"></part>
</message>
<message name="noNameResultResponse">
<part name="parameters" element="tns:noNameResultResponse"></part>
</message>
<message name="reset">
<part name="parameters" element="tns:reset"></part>
......@@ -46,6 +58,15 @@
<operation name="prettyPrintCount">
<input message="tns:prettyPrintCount"></input>
<output message="tns:prettyPrintCountResponse"></output>
</operation>
<operation name="reservedWordAsName">
<input message="tns:reservedWordAsName"></input>
<output message="tns:reservedWordAsNameResponse"></output>
</operation>
<operation name="noNameResult">
<input message="tns:noNameResult"></input>
<output message="tns:noNameResultResponse"></output>
</operation>
<operation name="reset">
<input message="tns:reset"></input>
......@@ -84,6 +105,24 @@
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
<operation name="reservedWordAsName">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
<operation name="noNameResult">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
<operation name="reset">
<soap:operation soapAction=""></soap:operation>
......
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="definitions"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://java.sun.com/products/jsp/"
targetNamespace="org.activiti.engine.test.bpmn.servicetask"
xmlns:tns="org.activiti.engine.test.bpmn.servicetask"
xmlns:counter="http://webservice.activiti.org/">
<!--
XML Schema is used as type language for the model whereas the Java
Unified Expression Language serves as language for Expressions.
-->
<import importType="http://schemas.xmlsoap.org/wsdl/"
location="http://localhost:63081/webservicemock?wsdl"
namespace="http://webservice.activiti.org/" />
<process id="webServiceInvocationWithSimplisticDataFlow">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="webService" />
<serviceTask id="webService"
name="Web service invocation"
implementation="##WebService"
operationRef="tns:reservedWordAsNameOperation">
<!--
Warning: The following code abuses the syntax of Data Associations
for a radical shortcut.
-->
<dataInputAssociation>
<sourceRef>PrefixVariable</sourceRef><!-- name of an Activiti variable -->
<targetRef>prefix</targetRef><!-- name of an element of the input message -->
</dataInputAssociation>
<dataInputAssociation>
<sourceRef>SuffixVariable</sourceRef><!-- name of an Activiti variable -->
<targetRef>suffix</targetRef><!-- name of an element of the input message -->
</dataInputAssociation>
<dataOutputAssociation>
<sourceRef>static</sourceRef><!-- name of an element of the output message -->
<targetRef>OutputVariable</targetRef><!-- name of an Activiti variable -->
</dataOutputAssociation>
</serviceTask>
<sequenceFlow id="flow2" sourceRef="webService" targetRef="waitState" />
<receiveTask id="waitState" />
<sequenceFlow id="flow3" sourceRef="waitState" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
<itemDefinition id="PrefixVariable" structureRef="string" />
<itemDefinition id="prefix" structureRef="string" />
<itemDefinition id="SuffixVariable" structureRef="string" />
<itemDefinition id="suffix" structureRef="string" />
<itemDefinition id="static" structureRef="string" />
<itemDefinition id="OutputVariable" structureRef="string" />
<!-- Interface: implementationRef = QName of WSDL Port Type -->
<interface name="Counter Interface" implementationRef="counter:Counter">
<!-- Operation: implementationRef = QName of WSDL Operation -->
<operation id="reservedWordAsNameOperation" name="reservedWordAsName Operation" implementationRef="counter:reservedWordAsName">
<inMessageRef>tns:reservedWordAsNameRequestMessage</inMessageRef>
<outMessageRef>tns:reservedWordAsNameResponseMessage</outMessageRef>
</operation>
</interface>
<message id="reservedWordAsNameRequestMessage" itemRef="tns:reservedWordAsNameRequestItem" />
<message id="reservedWordAsNameResponseMessage" itemRef="tns:reservedWordAsNameResponseItem" />
<itemDefinition id="reservedWordAsNameRequestItem" structureRef="counter:reservedWordAsName" /><!-- QName of input element -->
<itemDefinition id="reservedWordAsNameResponseItem" structureRef="counter:reservedWordAsNameResponse" /><!-- QName of output element -->
</definitions>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="definitions"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://java.sun.com/products/jsp/"
targetNamespace="org.activiti.engine.test.bpmn.servicetask"
xmlns:tns="org.activiti.engine.test.bpmn.servicetask"
xmlns:counter="http://webservice.activiti.org/">
<!--
XML Schema is used as type language for the model whereas the Java
Unified Expression Language serves as language for Expressions.
-->
<import importType="http://schemas.xmlsoap.org/wsdl/"
location="http://localhost:63081/webservicemock?wsdl"
namespace="http://webservice.activiti.org/" />
<process id="webServiceInvocationWithSimplisticDataFlow">
<startEvent id="theStart" />
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="webService" />
<serviceTask id="webService"
name="Web service invocation"
implementation="##WebService"
operationRef="tns:noNameResultOperation">
<!--
Warning: The following code abuses the syntax of Data Associations
for a radical shortcut.
-->
<dataInputAssociation>
<sourceRef>PrefixVariable</sourceRef><!-- name of an Activiti variable -->
<targetRef>prefix</targetRef><!-- name of an element of the input message -->
</dataInputAssociation>
<dataInputAssociation>
<sourceRef>SuffixVariable</sourceRef><!-- name of an Activiti variable -->
<targetRef>suffix</targetRef><!-- name of an element of the input message -->
</dataInputAssociation>
<dataOutputAssociation>
<sourceRef>return</sourceRef><!-- name of an element of the output message -->
<targetRef>OutputVariable</targetRef><!-- name of an Activiti variable -->
</dataOutputAssociation>
</serviceTask>
<sequenceFlow id="flow2" sourceRef="webService" targetRef="waitState" />
<receiveTask id="waitState" />
<sequenceFlow id="flow3" sourceRef="waitState" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
<itemDefinition id="PrefixVariable" structureRef="string" />
<itemDefinition id="prefix" structureRef="string" />
<itemDefinition id="SuffixVariable" structureRef="string" />
<itemDefinition id="suffix" structureRef="string" />
<itemDefinition id="return" structureRef="string" />
<itemDefinition id="OutputVariable" structureRef="string" />
<!-- Interface: implementationRef = QName of WSDL Port Type -->
<interface name="Counter Interface" implementationRef="counter:Counter">
<!-- Operation: implementationRef = QName of WSDL Operation -->
<operation id="noNameResultOperation" name="noNameResult Operation" implementationRef="counter:noNameResult">
<inMessageRef>tns:noNameResultRequestMessage</inMessageRef>
<outMessageRef>tns:noNameResultResponseMessage</outMessageRef>
</operation>
</interface>
<message id="noNameResultRequestMessage" itemRef="tns:noNameResultRequestItem" />
<message id="noNameResultResponseMessage" itemRef="tns:noNameResultResponseItem" />
<itemDefinition id="noNameResultRequestItem" structureRef="counter:noNameResult" /><!-- QName of input element -->
<itemDefinition id="noNameResultResponseItem" structureRef="counter:noNameResultResponse" /><!-- QName of output element -->
</definitions>
\ No newline at end of file
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="Counter" targetNamespace="http://webservice.activiti.org/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.activiti.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://webservice.activiti.org/" xmlns:tns="http://webservice.activiti.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified"
targetNamespace="http://webservice.activiti.org/"
xmlns:tns="http://webservice.activiti.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="getCount" type="tns:getCount" />
<xs:element name="getCountResponse" type="tns:getCountResponse" />
<xs:element name="inc" type="tns:inc" />
<xs:element name="incResponse" type="tns:incResponse" />
<xs:element name="prettyPrintCount" type="tns:prettyPrintCount" />
<xs:element name="prettyPrintCountResponse" type="tns:prettyPrintCountResponse" />
<xs:element name="noNameResult" type="tns:noNameResult" />
<xs:element name="noNameResultResponse" type="tns:noNameResultResponse" />
<xs:element name="reservedWordAsName" type="tns:reservedWordAsName" />
<xs:element name="reservedWordAsNameResponse" type="tns:reservedWordAsNameResponse" />
<xs:element name="reset" type="tns:reset" />
<xs:element name="resetResponse" type="tns:resetResponse" />
<xs:element name="setTo" type="tns:setTo" />
......@@ -42,6 +48,31 @@
<xs:element minOccurs="0" name="prettyPrint" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="noNameResult">
<xs:sequence>
<xs:element minOccurs="0" name="prefix" type="xs:string" />
<xs:element minOccurs="0" name="suffix" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="noNameResultResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="reservedWordAsName">
<xs:sequence>
<xs:element minOccurs="0" name="prefix" type="xs:string" />
<xs:element minOccurs="0" name="suffix" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="reservedWordAsNameResponse">
<xs:sequence>
<xs:element minOccurs="0" name="static" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="getCount">
<xs:sequence />
</xs:complexType>
......@@ -63,6 +94,15 @@
<wsdl:message name="prettyPrintCountResponse">
<wsdl:part element="tns:prettyPrintCountResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="noNameResultResponse">
<wsdl:part element="tns:noNameResultResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="reservedWordAsNameResponse">
<wsdl:part element="tns:reservedWordAsNameResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="resetResponse">
<wsdl:part element="tns:resetResponse" name="parameters">
......@@ -83,6 +123,14 @@
<wsdl:message name="prettyPrintCount">
<wsdl:part element="tns:prettyPrintCount" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="noNameResult">
<wsdl:part element="tns:noNameResult" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="reservedWordAsName">
<wsdl:part element="tns:reservedWordAsName" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="inc">
<wsdl:part element="tns:inc" name="parameters">
......@@ -116,6 +164,18 @@
</wsdl:input>
<wsdl:output message="tns:prettyPrintCountResponse" name="prettyPrintCountResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="noNameResult">
<wsdl:input message="tns:noNameResult" name="noNameResult">
</wsdl:input>
<wsdl:output message="tns:noNameResultResponse" name="noNameResultResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="reservedWordAsName">
<wsdl:input message="tns:reservedWordAsName" name="reservedWordAsName">
</wsdl:input>
<wsdl:output message="tns:reservedWordAsNameResponse" name="reservedWordAsNameResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getCount">
<wsdl:input message="tns:getCount" name="getCount">
......@@ -161,6 +221,25 @@
<wsdl:output name="prettyPrintCountResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="noNameResult">
<soap:operation soapAction="" style="document" />
<wsdl:input name="noNameResult">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="noNameResultResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="reservedWordAsName">
<soap:operation soapAction="" style="document" />
<wsdl:input name="reservedWordAsName">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="reservedWordAsNameResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getCount">
<soap:operation soapAction="" style="document" />
......@@ -174,7 +253,7 @@
</wsdl:binding>
<wsdl:service name="Counter">
<wsdl:port binding="tns:CounterSoapBinding" name="CounterImplPort">
<soap:address location="http://localhost:63081/counter" />
<soap:address location="http://localhost:63081/webservicemock" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册