You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bi...@apache.org on 2007/12/10 15:16:15 UTC
svn commit: r602905 - in /incubator/cxf/trunk/rt/javascript/src:
main/java/org/apache/cxf/javascript/
main/java/org/apache/cxf/javascript/service/
main/java/org/apache/cxf/javascript/types/
test/java/org/apache/cxf/javascript/ test/java/org/apache/cxf/...
Author: bimargulies
Date: Mon Dec 10 06:16:13 2007
New Revision: 602905
URL: http://svn.apache.org/viewvc?rev=602905&view=rev
Log:
Turn on RPC style, at least for single outputs and simple types.
Added:
incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java (with props)
incubator/cxf/trunk/rt/javascript/src/test/resources/org/apache/cxf/javascript/RPCTests.js (with props)
Modified:
incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java
incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java
incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java
incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/Messages.properties
incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPC.java
incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPCImpl.java
incubator/cxf/trunk/rt/javascript/src/test/resources/RPCClientTestBeans.xml
Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/ElementInfo.java Mon Dec 10 06:16:13 2007
@@ -34,7 +34,22 @@
private SchemaCollection xmlSchemaCollection;
private String referencingURI;
private XmlSchemaType containingType;
+ // in the RPC case, we can have a type and no element.
+ private XmlSchemaType type;
+ private boolean empty;
+ public ElementInfo(XmlSchemaElement element, XmlSchemaType type, String partJavascriptVar,
+ String elementXmlRef, boolean empty) {
+ this.element = element;
+ this.type = type;
+ this.elementJavascriptName = partJavascriptVar;
+ this.elementXmlName = elementXmlRef;
+ this.empty = empty;
+ }
+
+ public ElementInfo() {
+ }
+
public String getUtilsVarName() {
return utilsVarName;
}
@@ -76,5 +91,17 @@
}
public void setContainingType(XmlSchemaType containingType) {
this.containingType = containingType;
+ }
+ public XmlSchemaType getType() {
+ return type;
+ }
+ public void setType(XmlSchemaType type) {
+ this.type = type;
+ }
+ public boolean isEmpty() {
+ return empty;
+ }
+ public void setEmpty(boolean empty) {
+ this.empty = empty;
}
}
Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/JavascriptUtils.java Mon Dec 10 06:16:13 2007
@@ -29,6 +29,7 @@
import org.apache.cxf.wsdl.WSDLConstants;
import org.apache.ws.commons.schema.XmlSchemaComplexType;
+import org.apache.ws.commons.schema.XmlSchemaElement;
import org.apache.ws.commons.schema.XmlSchemaSimpleType;
import org.apache.ws.commons.schema.XmlSchemaType;
@@ -191,28 +192,38 @@
}
public void generateCodeToSerializeElement(ElementInfo elementInfo) {
- boolean nillable = elementInfo.getElement().isNillable();
- boolean optional = XmlSchemaUtils.isParticleOptional(elementInfo.getElement());
-
- XmlSchemaType elType =
+ XmlSchemaElement element = elementInfo.getElement();
+ XmlSchemaType type = elementInfo.getType();
+ boolean nillable = element == null || elementInfo.getElement().isNillable();
+ boolean optional = element == null || XmlSchemaUtils.isParticleOptional(elementInfo.getElement());
+ boolean array = element != null && XmlSchemaUtils.isParticleArray(elementInfo.getElement());
+
+ XmlSchemaType elType = type;
+ // perhaps push this up into the callers.
+ if (elType == null) {
XmlSchemaUtils.getElementType(elementInfo.getXmlSchemaCollection(),
elementInfo.getReferencingURI(),
elementInfo.getElement(),
elementInfo.getContainingType());
+ if (elType == null) {
+ throw new UnsupportedConstruct("Null type");
+ }
+ }
+
// first question: optional?
if (optional) {
startIf(elementInfo.getElementJavascriptName() + " != null");
- }
+ }
// nillable and optional would be very strange together.
// and nillable in the array case applies to the elements.
- if (nillable && !XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
+ if (nillable && !array) {
startIf(elementInfo.getElementJavascriptName() + " == null");
appendString("<" + elementInfo.getElementXmlName() + " " + XmlSchemaUtils.NIL_ATTRIBUTES + "/>");
appendElse();
}
- if (XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
+ if (array) {
// protected against null in arrays.
startIf(elementInfo.getElementJavascriptName() + " != null");
startFor("var ax = 0", "ax < " + elementInfo.getElementJavascriptName() + ".length", "ax ++");
@@ -250,17 +261,17 @@
appendString("</" + elementInfo.getElementXmlName() + ">");
}
- if (XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
+ if (array) {
endBlock(); // for the extra level of nil checking, which might be wrong.
endBlock(); // for the for loop.
endBlock(); // the null protection.
}
- if (nillable && !XmlSchemaUtils.isParticleArray(elementInfo.getElement())) {
+ if (nillable && !array) {
endBlock();
}
- if (XmlSchemaUtils.isParticleOptional(elementInfo.getElement())) {
+ if (optional) {
endBlock();
}
Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/NamespacePrefixAccumulator.java Mon Dec 10 06:16:13 2007
@@ -46,7 +46,7 @@
}
public void collect(String prefix, String uri) {
- if (!prefixes.contains(prefix)) {
+ if (!("".equals(uri)) && !prefixes.contains(prefix)) {
attributes.append("xmlns:" + prefix + "='" + uri + "' ");
prefixes.add(prefix);
}
@@ -57,6 +57,9 @@
}
private String getPrefix(String namespaceURI) {
+ if ("".equals(namespaceURI)) {
+ throw new RuntimeException("Prefix requested for default namespace.");
+ }
String schemaPrefix = schemaCollection.getNamespaceContext().getPrefix(namespaceURI);
// there could also be a namespace context on an individual schema info.
// perhaps SchemaCollection should be enforcing some discipline there.
@@ -94,6 +97,10 @@
}
public String xmlElementString(QName name) { // used with part concrete names
+ if ("".equals(name.getNamespaceURI())) {
+ return name.getLocalPart();
+ }
+
String prefix = getPrefix(name.getNamespaceURI());
collect(prefix, name.getNamespaceURI());
return prefix + ":" + name.getLocalPart();
Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/service/ServiceJavascriptBuilder.java Mon Dec 10 06:16:13 2007
@@ -64,7 +64,6 @@
public class ServiceJavascriptBuilder extends ServiceModelVisitor {
private static final Logger LOG = LogUtils.getL7dLogger(ServiceJavascriptBuilder.class);
- private boolean isRPC;
private SoapBindingInfo soapBindingInfo;
private JavascriptUtils utils;
private NameManager nameManager;
@@ -92,7 +91,7 @@
// derived from the parts.
private List<String> inputParameterNames = new ArrayList<String>();
// when not wrapped, we use this to keep track of the bits.
- private List<ElementAndNames> unwrappedElementsAndNames;
+ private List<ElementInfo> unwrappedElementsAndNames;
private NamespacePrefixAccumulator prefixAccumulator;
private BindingInfo xmlBindingInfo;
@@ -107,6 +106,8 @@
private boolean nonVoidOutput;
+ private boolean isRPC;
+
public ServiceJavascriptBuilder(ServiceInfo serviceInfo, NamespacePrefixAccumulator prefixAccumulator,
NameManager nameManager) {
super(serviceInfo);
@@ -152,39 +153,6 @@
serviceTargetNamespace = serviceInfo.getTargetNamespace();
}
- private static class ElementAndNames {
- private XmlSchemaElement element;
- private String javascriptName;
- private String xmlName;
- private boolean empty;
-
- public ElementAndNames(XmlSchemaElement element,
- String javascriptName,
- String xmlName,
- boolean empty) {
- this.element = element;
- this.javascriptName = javascriptName;
- this.xmlName = xmlName;
- this.empty = empty;
- }
-
- public XmlSchemaElement getElement() {
- return element;
- }
-
- public String getXmlName() {
- return xmlName;
- }
-
- public String getJavascriptName() {
- return javascriptName;
- }
-
- public boolean isEmpty() {
- return empty;
- }
- }
-
private String getFunctionGlobalName(QName itemName, String itemType) {
return nameManager.getJavascriptName(itemName) + "_" + itemType;
}
@@ -211,10 +179,6 @@
return;
}
- if (isRPC) {
- unsupportedConstruct("RPC", op.getInterface().getName().toString());
- }
-
isWrapped = op.isUnwrappedCapable();
StringBuilder parameterList = new StringBuilder();
@@ -250,13 +214,13 @@
* visit the input message parts and collect relevant data.
*/
private void collectUnwrappedInputInfo() {
- unwrappedElementsAndNames = new ArrayList<ElementAndNames>();
+ unwrappedElementsAndNames = new ArrayList<ElementInfo>();
if (currentOperation.getInput() != null) {
getElementsForParts(currentOperation.getInput(), unwrappedElementsAndNames);
}
- for (ElementAndNames ean : unwrappedElementsAndNames) {
- inputParameterNames.add(ean.getJavascriptName());
+ for (ElementInfo ean : unwrappedElementsAndNames) {
+ inputParameterNames.add(ean.getElementJavascriptName());
}
}
@@ -417,12 +381,26 @@
if (parts.size() != 1) {
unsupportedConstruct("MULTIPLE_OUTPUTS", outputMessage.getName().toString());
}
- List<ElementAndNames> elements = new ArrayList<ElementAndNames>();
+ List<ElementInfo> elements = new ArrayList<ElementInfo>();
String functionName = outputDeserializerFunctionName(outputMessage);
code.append("function " + functionName + "(cxfjsutils, partElement) {\n");
getElementsForParts(outputMessage, elements);
- ElementAndNames element = elements.get(0);
- XmlSchemaType type = element.getElement().getSchemaType();
+ ElementInfo element = elements.get(0);
+ XmlSchemaType type;
+
+ if (isRPC) {
+ // in the RPC case, there is an extra level of element for the output message.
+ utils.appendLine("cxfjsutils.trace('rpc element: ' + cxfjsutils.traceElementName(partElement));");
+ utils.appendLine("partElement = cxfjsutils.getFirstElementChild(partElement);");
+ utils.appendLine("cxfjsutils.trace('rpc element: ' + cxfjsutils.traceElementName(partElement));");
+ }
+
+ if (element.getType() != null) {
+ type = element.getType();
+ } else {
+ type = element.getElement().getSchemaType();
+ }
+
if (!element.isEmpty()) {
if (type instanceof XmlSchemaComplexType) {
// if there are no response items, the type is likely to have no name and no particle.
@@ -490,6 +468,7 @@
ElementInfo elementInfo = new ElementInfo();
elementInfo.setContainingType(null);
elementInfo.setElement(inputWrapperElement);
+ elementInfo.setType(inputWrapperElement.getSchemaType());
elementInfo.setElementJavascriptName("wrapperObj");
elementInfo.setElementXmlName(wrapperXmlElementName);
elementInfo.setReferencingURI(serviceTargetNamespace);
@@ -498,26 +477,41 @@
utils.generateCodeToSerializeElement(elementInfo);
} else {
+ String operationXmlElement = null;
+ if (isRPC) {
+ operationXmlElement =
+ prefixAccumulator.xmlElementString(currentOperation.getName());
+
+ // RPC has a level of element for the entire operation.
+ // we might have some schema to model this, but the following seems
+ // sufficient.
+ utils.appendString("<" + operationXmlElement + ">");
+ }
int px = 0;
- // Multiple parts violates WS-I, but we can still do them.
+ // Multiple parts for doc/lit violates WS-I, but we can still do them.
+ // They are normal for RPC.
// Parts are top-level elements. As such, they cannot, directly, be arrays.
// If a part is declared as an array type, the schema has a non-array element
// with a complex type consisting of an element with array bounds. We don't
// want the JavasSript programmer to have to concoct an extra level of object
// (though if the same sort of thing happens elsewhere due to an XmlRootElement,
// the JavaScript programmer is stuck with the situation).
- for (ElementAndNames ean : unwrappedElementsAndNames) {
+ for (ElementInfo ean : unwrappedElementsAndNames) {
ElementInfo elementInfo = new ElementInfo();
elementInfo.setContainingType(null);
elementInfo.setElement(ean.getElement());
+ elementInfo.setType(ean.getType());
elementInfo.setElementJavascriptName("args[" + px + "]");
- elementInfo.setElementXmlName(ean.getXmlName());
+ elementInfo.setElementXmlName(ean.getElementXmlName());
elementInfo.setReferencingURI(serviceTargetNamespace);
elementInfo.setUtilsVarName("cxfutils");
elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
utils.generateCodeToSerializeElement(elementInfo);
px++;
}
+ if (isRPC) {
+ utils.appendString("</" + operationXmlElement + ">");
+ }
}
utils.appendLine("xml = xml + cxfutils.endSoap11Message();");
@@ -530,23 +524,23 @@
}
private XmlSchemaSequence getTypeSequence(XmlSchemaComplexType type,
- XmlSchemaElement parentElement) {
+ QName parentName) {
if (!(type.getParticle() instanceof XmlSchemaSequence)) {
unsupportedConstruct("NON_SEQUENCE_PARTICLE",
type.getQName() != null ? type.getQName()
:
- parentElement.getQName());
+ parentName);
}
return (XmlSchemaSequence)type.getParticle();
}
- private boolean isEmptyType(XmlSchemaType type, XmlSchemaElement parentElement) {
+ private boolean isEmptyType(XmlSchemaType type, QName parentName) {
if (type instanceof XmlSchemaComplexType) {
XmlSchemaComplexType complexType = (XmlSchemaComplexType)type;
if (complexType.getParticle() == null) {
return true;
}
- XmlSchemaSequence sequence = getTypeSequence(complexType, parentElement);
+ XmlSchemaSequence sequence = getTypeSequence(complexType, parentName);
if (sequence.getItems().getCount() == 0) {
return true;
}
@@ -555,8 +549,8 @@
}
private XmlSchemaElement getBuriedElement(XmlSchemaComplexType type,
- XmlSchemaElement parentElement) {
- XmlSchemaSequence sequence = getTypeSequence(type, parentElement);
+ QName parentName) {
+ XmlSchemaSequence sequence = getTypeSequence(type, parentName);
XmlSchemaObjectCollection insides = sequence.getItems();
if (insides.getCount() == 1) {
XmlSchemaObject item = insides.getItem(0);
@@ -572,39 +566,39 @@
* @param parts
* @param elements
*/
- private void getElementsForParts(MessageInfo message, List<ElementAndNames> elements) {
+ private void getElementsForParts(MessageInfo message, List<ElementInfo> elements) {
for (MessagePartInfo mpi : message.getMessageParts()) {
XmlSchemaElement element = null;
+ XmlSchemaType type = null;
+ QName diagnosticName = mpi.getName();
if (mpi.isElement()) {
element = (XmlSchemaElement)mpi.getXmlSchema();
if (element == null) {
element = XmlSchemaUtils.findElementByRefName(xmlSchemaCollection, mpi.getElementQName(),
serviceInfo.getTargetNamespace());
}
+ diagnosticName = element.getQName();
+ type = element.getSchemaType();
+ if (type == null) {
+ type = XmlSchemaUtils.getElementType(xmlSchemaCollection,
+ null,
+ element,
+ null);
+ }
} else {
- // dkulp may have fixed the problem that caused me to write this
- // code.
- // aside from the fact that in the !isElement case (rpc) we have
- // other work to do.
- LOG.severe("Missing element " + mpi.getElementQName().toString() + " in "
- + mpi.getName().toString());
- unsupportedConstruct("MISSING_PART_ELEMENT", mpi.getName().toString());
+ // RPC (!isElement)
+ type = (XmlSchemaType)mpi.getXmlSchema();
+ if (type == null) {
+ type = xmlSchemaCollection.getTypeByQName(mpi.getTypeQName());
+ diagnosticName = type.getQName();
+ }
}
- assert element != null;
- assert element.getQName() != null;
- XmlSchemaType type = element.getSchemaType();
- if (type == null) {
- type = XmlSchemaUtils.getElementType(xmlSchemaCollection,
- null,
- element,
- null);
- }
- boolean empty = isEmptyType(type, element);
+ boolean empty = isEmptyType(type, diagnosticName);
if (!empty && type instanceof XmlSchemaComplexType && type.getName() == null) {
XmlSchemaElement betterElement = getBuriedElement((XmlSchemaComplexType) type,
- element);
+ diagnosticName);
if (betterElement != null) {
element = betterElement;
if (element.getSchemaType() == null) {
@@ -612,17 +606,17 @@
.getTypeByQName(element.getSchemaTypeName()));
}
}
-
}
- String partJavascriptVar = JavascriptUtils.javaScriptNameToken(element.getQName().getLocalPart());
+ String partJavascriptVar =
+ JavascriptUtils.javaScriptNameToken(mpi.getConcreteName().getLocalPart());
String elementXmlRef = prefixAccumulator.xmlElementString(mpi.getConcreteName());
- elements.add(new ElementAndNames(element, partJavascriptVar, elementXmlRef, empty));
+ elements.add(new ElementInfo(element, type, partJavascriptVar, elementXmlRef, empty));
}
}
- // This function generated Javascript names for the parameters.
+ // This function finds all the information for the wrapper.
private void collectWrapperElementInfo() {
if (currentOperation.getInput() != null) {
Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/Messages.properties?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/Messages.properties (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/Messages.properties Mon Dec 10 06:16:13 2007
@@ -19,4 +19,5 @@
#
#
ELEMENT_MISSING_TYPE= Root element {0} refers to undefined type {1} in {2}.
-UNSUPPORTED_TYPE_CONSTRUCT= Unsupported schema construct {0}.
\ No newline at end of file
+UNSUPPORTED_TYPE_CONSTRUCT= Unsupported schema construct {0}.
+ELEMENT_DANGLING_REFERENCE= Element {0} refers to undefined element {1}.
\ No newline at end of file
Modified: incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java Mon Dec 10 06:16:13 2007
@@ -280,6 +280,16 @@
// assume that no lunatic has created multiple elements that differ only by namespace.
// or, perhaps, detect that when generating the parser?
+ if (elChild.getRefName() != null) {
+ XmlSchemaElement refElement = xmlSchemaCollection.getElementByQName(elChild.getRefName());
+ if (refElement == null) {
+ Message message = new Message("ELEMENT_DANGLING_REFERENCE", LOG,
+ elChild.getQName(),
+ elChild.getRefName());
+ throw new UnsupportedConstruct(message.toString());
+ }
+ elChild = refElement;
+ }
String elementName = elementPrefix + elChild.getName();
String elementXmlRef = prefixAccumulator.xmlElementString(schemaInfo, elChild);
@@ -291,6 +301,7 @@
elementInfo.setReferencingURI(null);
elementInfo.setUtilsVarName("cxfjsutils");
elementInfo.setXmlSchemaCollection(xmlSchemaCollection);
+ elementInfo.setType(elChild.getSchemaType());
utils.generateCodeToSerializeElement(elementInfo);
}
}
Added: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java?rev=602905&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java (added)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java Mon Dec 10 06:16:13 2007
@@ -0,0 +1,224 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.javascript;
+
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.javascript.JavascriptTestUtilities.JSRunnable;
+import org.apache.cxf.javascript.JavascriptTestUtilities.Notifier;
+import org.apache.cxf.javascript.fortest.SimpleRPCImpl;
+import org.apache.cxf.javascript.fortest.TestBean1;
+import org.apache.cxf.javascript.fortest.TestBean2;
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.test.AbstractCXFSpringTest;
+import org.junit.Before;
+import org.junit.Test;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Scriptable;
+import org.springframework.context.support.GenericApplicationContext;
+
+/*
+ * We end up here with a part with isElement == true, a non-array element,
+ * but a complex type for an array of the element.
+ */
+
+public class RPCClientTest extends AbstractCXFSpringTest {
+
+ private static final Logger LOG = LogUtils.getL7dLogger(RPCClientTest.class);
+
+ // shadow declaration from base class.
+ private JavascriptTestUtilities testUtilities;
+ private JaxWsProxyFactoryBean clientProxyFactory;
+ private EndpointImpl endpoint;
+ private SimpleRPCImpl implementor;
+
+ private Client client;
+ private ServiceInfo serviceInfo;
+
+ public RPCClientTest() throws Exception {
+ testUtilities = new JavascriptTestUtilities(getClass());
+ testUtilities.addDefaultNamespaces();
+ }
+
+ @Before
+ public void setupRhino() throws Exception {
+ testUtilities.setBus(getBean(Bus.class, "cxf"));
+ testUtilities.initializeRhino();
+ testUtilities.readResourceIntoRhino("/org/apache/cxf/javascript/cxf-utils.js");
+ clientProxyFactory = getBean(JaxWsProxyFactoryBean.class, "rpc-proxy-factory");
+ client = clientProxyFactory.getClientFactoryBean().create();
+ List<ServiceInfo> serviceInfos = client.getEndpoint().getService().getServiceInfos();
+ // there can only be one.
+ assertEquals(1, serviceInfos.size());
+ serviceInfo = serviceInfos.get(0);
+ testUtilities.loadJavascriptForService(serviceInfo);
+ testUtilities.readResourceIntoRhino("/org/apache/cxf/javascript/RPCTests.js");
+ endpoint = getBean(EndpointImpl.class, "rpc-service-endpoint");
+ // schema validation doesn't work in RPC. CXF-1277.
+ //endpoint.getService().put(org.apache.cxf.message.Message.Message.SCHEMA_VALIDATION_ENABLED,
+ // Boolean.TRUE);
+ implementor = (SimpleRPCImpl)endpoint.getImplementor();
+ implementor.resetLastValues();
+ }
+
+ @Override
+ protected void additionalSpringConfiguration(GenericApplicationContext context) throws Exception {
+ }
+
+ @Override
+ protected String[] getConfigLocations() {
+ return new String[] {"classpath:RPCClientTestBeans.xml"};
+ }
+
+ private Void simpleCaller(Context context) {
+
+ LOG.info("About to call simpleTest " + endpoint.getAddress());
+ Notifier notifier =
+ testUtilities.rhinoCallConvert("simpleTest", Notifier.class,
+ testUtilities.javaToJS(endpoint.getAddress()),
+ "String Parameter",
+ testUtilities.javaToJS(new Integer(1776)));
+
+ boolean notified = notifier.waitForJavascript(1000 * 10);
+ assertTrue(notified);
+ Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class);
+ assertNull(errorStatus);
+ String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class);
+ assertNull(errorText);
+
+ // this method returns a String.
+ String responseObject = testUtilities.rhinoEvaluateConvert("globalResponseObject", String.class);
+ // there is no response, this thing returns 'void'
+ assertEquals("String Parameter", responseObject);
+ SimpleRPCImpl impl = getBean(SimpleRPCImpl.class, "rpc-service");
+ assertEquals("String Parameter", impl.getLastString());
+ assertEquals(1776, impl.getLastInt());
+ return null;
+ }
+
+ private Void beanFunctionCaller(Context context) {
+
+ TestBean1 b1 = new TestBean1();
+ b1.stringItem = "strung";
+ TestBean1[] beans = new TestBean1[3];
+ beans[0] = new TestBean1();
+ beans[0].stringItem = "zerobean";
+ beans[0].beanTwoNotRequiredItem = new TestBean2("bean2");
+ beans[1] = null;
+ beans[2] = new TestBean1();
+ beans[2].stringItem = "twobean";
+ beans[2].optionalIntArrayItem = new int[2];
+ beans[2].optionalIntArrayItem[0] = 4;
+ beans[2].optionalIntArrayItem[1] = 6;
+
+ Object[] jsBeans = new Object[3];
+ jsBeans[0] = testBean1ToJS(testUtilities, context, beans[0]);
+ jsBeans[1] = null;
+ jsBeans[2] = testBean1ToJS(testUtilities, context, beans[2]);
+
+ Scriptable jsBean1 = testBean1ToJS(testUtilities, context, b1);
+ Scriptable jsBeanArray = context.newArray(testUtilities.getRhinoScope(), jsBeans);
+
+ LOG.info("About to call beanFunctionTest " + endpoint.getAddress());
+ Notifier notifier =
+ testUtilities.rhinoCallConvert("beanFunctionTest", Notifier.class,
+ testUtilities.javaToJS(endpoint.getAddress()),
+ jsBean1,
+ jsBeanArray);
+ boolean notified = notifier.waitForJavascript(1000 * 10);
+ assertTrue(notified);
+ Integer errorStatus = testUtilities.rhinoEvaluateConvert("globalErrorStatus", Integer.class);
+ assertNull(errorStatus);
+ String errorText = testUtilities.rhinoEvaluateConvert("globalErrorStatusText", String.class);
+ assertNull(errorText);
+
+ // this method returns void.
+ Scriptable responseObject = (Scriptable)testUtilities.rhinoEvaluate("globalResponseObject");
+ // there is no response, this thing returns 'void'
+ assertNull(responseObject);
+ SimpleRPCImpl impl = getBean(SimpleRPCImpl.class, "rpc-service");
+ TestBean1 b1returned = impl.getLastBean();
+ assertEquals(b1, b1returned);
+ return null;
+ }
+
+ @Test
+ public void callSimple() {
+ LOG.info("about to call simpleTest");
+ testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() {
+
+ public Void run(Context context) {
+ return simpleCaller(context);
+ }
+
+ });
+ }
+
+ @org.junit.Ignore
+ @Test
+ public void callFunctionWithBeans() {
+ LOG.info("about to call beanFunctionTest");
+ testUtilities.runInsideContext(Void.class, new JSRunnable<Void>() {
+ public Void run(Context context) {
+ return beanFunctionCaller(context);
+ }
+ });
+ }
+
+ public static Scriptable testBean1ToJS(JavascriptTestUtilities testUtilities,
+ Context context,
+ TestBean1 b1) {
+ if (b1 == null) {
+ return null; // black is always in fashion. (Really, we can be called with a null).
+ }
+ Scriptable rv = context.newObject(testUtilities.getRhinoScope(),
+ "org_apache_cxf_javascript_testns_testBean1");
+ testUtilities.rhinoCallMethod(rv, "setStringItem", testUtilities.javaToJS(b1.stringItem));
+ testUtilities.rhinoCallMethod(rv, "setIntItem", testUtilities.javaToJS(b1.intItem));
+ testUtilities.rhinoCallMethod(rv, "setLongItem", testUtilities.javaToJS(b1.longItem));
+ testUtilities.rhinoCallMethod(rv, "setBase64Item", testUtilities.javaToJS(b1.base64Item));
+ testUtilities.rhinoCallMethod(rv, "setOptionalIntItem", testUtilities.javaToJS(b1.optionalIntItem));
+ testUtilities.rhinoCallMethod(rv, "setOptionalIntArrayItem",
+ testUtilities.javaToJS(b1.optionalIntArrayItem));
+ testUtilities.rhinoCallMethod(rv, "setDoubleItem", testUtilities.javaToJS(b1.doubleItem));
+ testUtilities.rhinoCallMethod(rv, "setBeanTwoItem", testBean2ToJS(testUtilities,
+ context, b1.beanTwoItem));
+ testUtilities.rhinoCallMethod(rv, "setBeanTwoNotRequiredItem",
+ testBean2ToJS(testUtilities, context, b1.beanTwoNotRequiredItem));
+ return rv;
+ }
+
+ public static Object testBean2ToJS(JavascriptTestUtilities testUtilities,
+ Context context, TestBean2 beanTwoItem) {
+ if (beanTwoItem == null) {
+ return null;
+ }
+ Scriptable rv = context.newObject(testUtilities.getRhinoScope(),
+ "org_apache_cxf_javascript_testns3_testBean2");
+ testUtilities.rhinoCallMethod(rv, "setStringItem", beanTwoItem.stringItem);
+ return rv;
+ }
+}
Propchange: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/RPCClientTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPC.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPC.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPC.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPC.java Mon Dec 10 06:16:13 2007
@@ -34,5 +34,7 @@
String simpleType(@WebParam(name = "P1") String p1, @WebParam(name = "P2") int p2);
@WebMethod
void returnVoid(@WebParam(name = "P1") String p1, @WebParam(name = "P2") int p2);
+ @WebMethod
+ void beanType(@WebParam(name = "param1") TestBean1 p1);
}
Modified: incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPCImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPCImpl.java?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPCImpl.java (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/java/org/apache/cxf/javascript/fortest/SimpleRPCImpl.java Mon Dec 10 06:16:13 2007
@@ -23,14 +23,17 @@
@WebService(targetNamespace = "uri:cxf.apache.org.javascript.rpc",
endpointInterface = "org.apache.cxf.javascript.fortest.SimpleRPC")
+@org.apache.cxf.feature.Features(features = "org.apache.cxf.feature.LoggingFeature")
public class SimpleRPCImpl implements SimpleRPC {
private String lastString;
private int lastInt;
+ private TestBean1 lastBean;
public void resetLastValues() {
lastString = null;
lastInt = -1;
+ lastBean = null;
}
public void returnVoid(String p1, int p2) {
@@ -44,6 +47,10 @@
return lastString;
}
+ public void beanType(TestBean1 p1) {
+ lastBean = p1;
+ }
+
public String getLastString() {
return lastString;
}
@@ -58,6 +65,14 @@
public void setLastInt(int lastInt) {
this.lastInt = lastInt;
+ }
+
+ public TestBean1 getLastBean() {
+ return lastBean;
+ }
+
+ public void setLastBean(TestBean1 lastBean) {
+ this.lastBean = lastBean;
}
}
Modified: incubator/cxf/trunk/rt/javascript/src/test/resources/RPCClientTestBeans.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/resources/RPCClientTestBeans.xml?rev=602905&r1=602904&r2=602905&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/resources/RPCClientTestBeans.xml (original)
+++ incubator/cxf/trunk/rt/javascript/src/test/resources/RPCClientTestBeans.xml Mon Dec 10 06:16:13 2007
@@ -34,8 +34,8 @@
<bean id='rpc-service' class='org.apache.cxf.javascript.fortest.SimpleRPCImpl'/>
<!-- use # so that we can pull state out of the service object in the tests. -->
- <jaxws:endpoint id="dlb-service-endpoint"
- implementor="#dlb-service"
+ <jaxws:endpoint id="rpc-service-endpoint"
+ implementor="#rpc-service"
address="http://localhost:8808/SimpleRPC" >
</jaxws:endpoint>
Added: incubator/cxf/trunk/rt/javascript/src/test/resources/org/apache/cxf/javascript/RPCTests.js
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/javascript/src/test/resources/org/apache/cxf/javascript/RPCTests.js?rev=602905&view=auto
==============================================================================
--- incubator/cxf/trunk/rt/javascript/src/test/resources/org/apache/cxf/javascript/RPCTests.js (added)
+++ incubator/cxf/trunk/rt/javascript/src/test/resources/org/apache/cxf/javascript/RPCTests.js Mon Dec 10 06:16:13 2007
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+function assertionFailed(explanation)
+{
+ var assert = new Assert(explanation); // this will throw out in Java.
+}
+
+var globalNotifier = null;
+var globalErrorStatus = null;
+var globalErrorStatusText = null;
+var globalResponseObject = null;
+
+function resetGlobals() {
+ globalNotifier = null;
+ globalErrorStatus = null;
+ globalErrorStatusText = null;
+ globalResponseObject = null;
+}
+
+function testErrorCallback(httpStatus, httpStatusText)
+{
+ org_apache_cxf_trace.trace("test error");
+ globalErrorStatus = httpStatus;
+ globalStatusText = httpStatusText;
+ globalNotifier.notify();
+}
+
+// Because there is an explicit response wrapper declared, we have a JavaScript
+// object here that wraps up the simple 'string'. It is easier to validate it
+// from Java, I think.
+function testSuccessCallback(responseObject)
+{
+ org_apache_cxf_trace.trace("test success");
+ globalResponseObject = responseObject;
+ globalNotifier.notify();
+}
+
+function simpleTest(url, p1, p2)
+{
+ org_apache_cxf_trace.trace("Enter simpleTest.");
+ resetGlobals();
+ globalNotifier = new org_apache_cxf_notifier();
+
+ var intf;
+ intf = new cxf_apache_org_javascript_rpc_SimpleRPC();
+
+ intf.url = url;
+ intf.simpleType(testSuccessCallback, testErrorCallback, p1, p2);
+ // Return the notifier as a convenience to the Java code.
+ return globalNotifier;
+}
+
Propchange: incubator/cxf/trunk/rt/javascript/src/test/resources/org/apache/cxf/javascript/RPCTests.js
------------------------------------------------------------------------------
svn:eol-style = native