You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by gd...@apache.org on 2001/07/08 16:18:40 UTC
cvs commit: xml-axis/java/test/functional AltStockQuoteService.jws TestStockSample.java
gdaniels 01/07/08 07:18:40
Modified: java/samples/addr AddressBookProxy.java deploy.xml
java/samples/bidbuy TestClient.java deploy.xml v3.java
java/samples/echo TestClient.java deploy.xml
java/samples/encoding DataSer.java
java/src/org/apache/axis AxisEngine.java MessageContext.java
java/src/org/apache/axis/deployment
SimpleDeploymentManager.java
java/src/org/apache/axis/encoding ArraySerializer.java
Base64Serializer.java BeanSerializer.java
BooleanDeserializerFactory.java DateSerializer.java
DeserializationContext.java DeserializerBase.java
DeserializerFactory.java SOAPEncoding.java
SOAPTypeMappingRegistry.java
TypeMappingRegistry.java
java/src/org/apache/axis/handlers DebugHandler.java
java/src/org/apache/axis/handlers/soap SOAPService.java
java/src/org/apache/axis/message MessageElement.java
SOAPBodyElement.java SOAPSAXHandler.java
java/src/org/apache/axis/providers/java JavaProvider.java
MsgProvider.java
java/src/org/apache/axis/utils Admin.java
java/test build_functional_tests.xml
java/test/RPCDispatch TestRPC.java TestSerializedRPC.java
java/test/encoding DataSer.java TestDeser.java
java/test/functional TestStockSample.java
Added: java/src/org/apache/axis AxisServiceConfig.java
java/test/functional AltStockQuoteService.jws
Log:
(Apologies for the size of this checkin, I ended up doing a bit much
in parallel)
* Store type mappings as XML. We support two syntaxes right now,
one like this (the old <bean> syntax):
<beanMappings>
<ns:type classname="some.bean" xmlns:ns="myNamespace"/>
</beanMappings>
and the other like this:
<typeMappings>
<typeMapping type="xsd:string" classname="java.lang.String"
serializer="ser.StringSer" deserializerFactory="tst.Factory"/>
</typeMappings>
These should probably be condensed into a single <typeMappings> outer
element containing <typeMapping> and <beanMapping> elements.
We no longer use the typemap-supp.reg file, and a complete engine config
is stored in the [client,server]-config.xml file.
* Give SOAPServices a serviceDescription field. This allows us to figure
out by parse time whether a service is message-based (i.e. has
MsgDispatcher as its pivot) or RPC-based, which lets us build the
appropriate MessageElements.
* Body-based dispatch now occurs in the BodyFactory inside SOAPSAXHandler
instead of in the SOAPBodyElement constructor, because we might need
the service to be able to determine which kind of SOAPBodyElement to
build (see above).
** NOTE : one consequence of this is that we no longer do body-based
dispatch OUTSIDE the context of a parse. I removed the unit test in
TestRPC which tested this, on the assumption that it's not going to be
a real use-case. If we want to be able to do this in situations where
we just pass a dynamically constructed message into the engine, we
should add the code back to the SOAPBodyElement constructor and re-
instate the test.
* Modify the way ID/HREF works at parse time, decoupling deserialization-
based tasks from parsing. The HREFs will only get resolved at deser
time (i.e. when you call getValue() on MessageElement). This is cleaner
for now, and if we move to a "real" streaming model where processing
happens during the parse, we can consider reinstating the fixup-based
model.
* Give MessageElement a getValueAsType() method, which will try to
deserialize this element as a particular XSD type. See DebugHandler for
an example (note that we no longer use the DebugHeader class by default).
* Add an AxisServiceConfig interface which service provider classes can
implement to let the engine know about service metadata. Right now the
only method there is getMethods(), which allows a class (a JWS class in
particular) to specify which are available for access via SOAP. Add a
modified StockQuoteService JWS to the functional tests, and test the
new functionality.
Revision Changes Path
1.3 +2 -2 xml-axis/java/samples/addr/AddressBookProxy.java
Index: AddressBookProxy.java
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/addr/AddressBookProxy.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- AddressBookProxy.java 2001/06/29 19:58:22 1.2
+++ AddressBookProxy.java 2001/07/08 14:18:35 1.3
@@ -94,13 +94,13 @@
QName qn1 = new QName(serviceName, "Address");
Class cls = Address.class;
call.addSerializer(cls, qn1, new BeanSerializer(cls));
- call.addDeserializerFactory(qn1, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(qn1, cls, BeanSerializer.getFactory());
// register the PhoneNumber class
QName qn2 = new QName(serviceName, "PhoneNumber");
cls = PhoneNumber.class;
call.addSerializer(cls, qn2, new BeanSerializer(cls));
- call.addDeserializerFactory(qn2, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(qn2, cls, BeanSerializer.getFactory());
} catch (Exception ex) {
throw new IllegalArgumentException("Exception configurizing bean serialization: "+ex);
}
1.3 +4 -4 xml-axis/java/samples/addr/deploy.xml
Index: deploy.xml
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/addr/deploy.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- deploy.xml 2001/06/29 18:36:51 1.2
+++ deploy.xml 2001/07/08 14:18:35 1.3
@@ -17,10 +17,10 @@
<option name="scope" value="Session" />
</service>
- <bean xmlns:book2="urn:AddressFetcher2">
+ <beanMappings xmlns:book2="urn:AddressFetcher2">
<book2:Address classname="samples.addr.Address"/>
<book2:PhoneNumber classname="samples.addr.PhoneNumber"/>
- </bean>
+ </beanMappings>
<!--
Commented out this test for now. This seems to conflict somehow with the first
@@ -36,10 +36,10 @@
<option name="scope" value="Application" />
</service>
- <bean xmlns:book3="urn:AddressFetcher3">
+ <beanMappings xmlns:book3="urn:AddressFetcher3">
<book3:Address classname="samples.addr.Address"/>
<book3:PhoneNumber classname="samples.addr.PhoneNumber"/>
- </bean>
+ </beanMappings>
-->
</m:deploy>
1.6 +3 -3 xml-axis/java/samples/bidbuy/TestClient.java
Index: TestClient.java
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/bidbuy/TestClient.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TestClient.java 2001/06/29 19:58:31 1.5
+++ TestClient.java 2001/07/08 14:18:35 1.6
@@ -112,19 +112,19 @@
"PurchaseOrder");
Class cls = PurchaseOrder.class;
call.addSerializer(cls, poqn, new BeanSerializer(cls));
- call.addDeserializerFactory(poqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(poqn, cls, BeanSerializer.getFactory());
// register the Address class
QName aqn = new QName("http://www.soapinterop.org/Bid", "Address");
cls = Address.class;
call.addSerializer(cls, aqn, new BeanSerializer(cls));
- call.addDeserializerFactory(aqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(aqn, cls, BeanSerializer.getFactory());
// register the LineItem class
QName liqn = new QName("http://www.soapinterop.org/Bid", "LineItem");
cls = LineItem.class;
call.addSerializer(cls, liqn, new BeanSerializer(cls));
- call.addDeserializerFactory(liqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(liqn, cls, BeanSerializer.getFactory());
try {
// Default return type based on what we expect
1.7 +4 -4 xml-axis/java/samples/bidbuy/deploy.xml
Index: deploy.xml
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/bidbuy/deploy.xml,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- deploy.xml 2001/06/21 02:45:23 1.6
+++ deploy.xml 2001/07/08 14:18:35 1.7
@@ -30,11 +30,11 @@
<option name="methodName" value="Ping" />
</service>
- <bean xmlns:bid="http://www.soapinterop.org/Bid">
+ <beanMappings xmlns:bid="http://www.soapinterop.org/Bid">
<bid:PurchaseOrder classname="samples.bidbuy.PurchaseOrder"/>
<bid:Address classname="samples.bidbuy.Address"/>
<bid:LineItem classname="samples.bidbuy.LineItem"/>
- </bean>
+ </beanMappings>
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * -->
@@ -60,8 +60,8 @@
<option name="methodName" value="LookupAsString" />
</service>
- <bean xmlns:reg="http://www.soapinterop.org/Registry">
+ <beanMappings xmlns:reg="http://www.soapinterop.org/Registry">
<reg:Service classname="samples.bidbuy.Service"/>
- </bean>
+ </beanMappings>
</m:deploy>
1.7 +3 -3 xml-axis/java/samples/bidbuy/v3.java
Index: v3.java
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/bidbuy/v3.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- v3.java 2001/06/29 19:58:33 1.6
+++ v3.java 2001/07/08 14:18:35 1.7
@@ -197,19 +197,19 @@
"PurchaseOrder");
Class cls = PurchaseOrder.class;
call.addSerializer(cls, poqn, new BeanSerializer(cls));
- call.addDeserializerFactory(poqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(poqn, cls, BeanSerializer.getFactory());
// register the Address class
QName aqn = new QName("http://www.soapinterop.org/Bid", "Address");
cls = Address.class;
call.addSerializer(cls, aqn, new BeanSerializer(cls));
- call.addDeserializerFactory(aqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(aqn, cls, BeanSerializer.getFactory());
// register the LineItem class
QName liqn = new QName("http://www.soapinterop.org/Bid", "LineItem");
cls = LineItem.class;
call.addSerializer(cls, liqn, new BeanSerializer(cls));
- call.addDeserializerFactory(liqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(liqn, cls, BeanSerializer.getFactory());
LineItem[] lineItems = new LineItem[numItems];
1.12 +1 -1 xml-axis/java/samples/echo/TestClient.java
Index: TestClient.java
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/echo/TestClient.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- TestClient.java 2001/07/08 00:50:33 1.11
+++ TestClient.java 2001/07/08 14:18:35 1.12
@@ -156,7 +156,7 @@
QName ssqn = new QName("http://soapinterop.org/xsd", "SOAPStruct");
Class cls = SOAPStruct.class;
call.addSerializer(cls, ssqn, new BeanSerializer(cls));
- call.addDeserializerFactory(ssqn, cls, BeanSerializer.getFactory(cls));
+ call.addDeserializerFactory(ssqn, cls, BeanSerializer.getFactory());
// execute the tests
test("String", "abcdefg");
1.2 +2 -2 xml-axis/java/samples/echo/deploy.xml
Index: deploy.xml
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/echo/deploy.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- deploy.xml 2001/07/02 16:11:04 1.1
+++ deploy.xml 2001/07/08 14:18:35 1.2
@@ -15,7 +15,7 @@
<option name="methodName" value="*" />
</service>
- <bean xmlns:echo="http://soapinterop.org/xsd">
+ <beanMappings xmlns:echo="http://soapinterop.org/xsd">
<echo:SOAPStruct classname="samples.echo.SOAPStruct"/>
- </bean>
+ </beanMappings>
</m:deploy>
1.5 +1 -1 xml-axis/java/samples/encoding/DataSer.java
Index: DataSer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/samples/encoding/DataSer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DataSer.java 2001/05/22 18:42:22 1.4
+++ DataSer.java 2001/07/08 14:18:36 1.5
@@ -15,7 +15,7 @@
public static final QName myTypeQName = new QName("typeNS", "Data");
public static class DataSerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() {
+ public DeserializerBase getDeserializer(Class cls) {
return new DataSer();
}
}
1.22 +4 -8 xml-axis/java/src/org/apache/axis/AxisEngine.java
Index: AxisEngine.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/AxisEngine.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- AxisEngine.java 2001/07/01 03:30:37 1.21
+++ AxisEngine.java 2001/07/08 14:18:36 1.22
@@ -92,7 +92,7 @@
/** This Engine's global type mappings */
protected TypeMappingRegistry _typeMappingRegistry =
- new SOAPTypeMappingRegistry();
+ new TypeMappingRegistry();
protected Properties props = new Properties();
@@ -146,6 +146,8 @@
propVal = props.getProperty("debugFile");
Debug.setToFile(propVal != null);
+ _typeMappingRegistry.setParent(SOAPTypeMappingRegistry.getSingleton());
+
Debug.Print( 1, "Enter: AxisEngine::init" );
readConfiguration();
@@ -193,13 +195,6 @@
e.printStackTrace();
return;
}
-
- // Load the registry of deployed types
- TypeMappingRegistry tmr = new TypeMappingRegistry("typemap-supp.reg");
- tmr.setParent(new SOAPTypeMappingRegistry());
- _typeMappingRegistry = tmr;
-
- tmr.init();
}
/** Write out our engine configuration.
@@ -275,6 +270,7 @@
DeserializerFactory deserFactory,
Serializer serializer)
{
+ Debug.Print(3, "Registering type mapping " + qName + " -> " + cls.getName());
if (deserFactory != null)
_typeMappingRegistry.addDeserializerFactory(qName, cls, deserFactory);
if (serializer != null)
1.42 +6 -1 xml-axis/java/src/org/apache/axis/MessageContext.java
Index: MessageContext.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/MessageContext.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- MessageContext.java 2001/07/07 13:24:02 1.41
+++ MessageContext.java 2001/07/08 14:18:36 1.42
@@ -316,8 +316,13 @@
Debug.Print(2,"MessageContext: setServiceHandler("+sh+")");
serviceHandler = sh;
if (sh != null && sh instanceof SOAPService) {
- TypeMappingRegistry tmr = ((SOAPService)sh).getTypeMappingRegistry();
+ SOAPService service = (SOAPService)sh;
+ TypeMappingRegistry tmr = service.getTypeMappingRegistry();
setTypeMappingRegistry(tmr);
+
+ if (serviceDesc == null) {
+ serviceDesc = service.getServiceDescription();
+ }
}
}
1.1 xml-axis/java/src/org/apache/axis/AxisServiceConfig.java
Index: AxisServiceConfig.java
===================================================================
package org.apache.axis;
/** If a Java class which acts as the target for an Axis service
* implements this interface, it may convey metadata about its
* configuration to the Axis engine.
*
* @author Glen Daniels (gdaniels@macromedia.com)
*/
public interface AxisServiceConfig
{
/** Get the allowed method names.
*
* (The only method right now)
*
* @return a space-delimited list of method names which may be called
* via SOAP.
*/
public String getMethods();
}
1.4 +1 -0 xml-axis/java/src/org/apache/axis/deployment/SimpleDeploymentManager.java
Index: SimpleDeploymentManager.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/SimpleDeploymentManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SimpleDeploymentManager.java 2001/05/05 09:03:31 1.3
+++ SimpleDeploymentManager.java 2001/07/08 14:18:36 1.4
@@ -104,6 +104,7 @@
* Deploy the given WSDD Deployable Item
*/
public void deployItem(DeployableItem item) throws DeploymentException {
+ System.out.println("Deploying '" +item.getQName().toString()+"', "+item);
items.put(item.getQName().toString(), item);
}
1.8 +1 -1 xml-axis/java/src/org/apache/axis/encoding/ArraySerializer.java
Index: ArraySerializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ArraySerializer.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ArraySerializer.java 2001/07/08 11:59:49 1.7
+++ ArraySerializer.java 2001/07/08 14:18:36 1.8
@@ -89,7 +89,7 @@
}
public static class Factory implements DeserializerFactory {
- public DeserializerBase getDeserializer() {
+ public DeserializerBase getDeserializer(Class cls) {
return new ArraySerializer();
}
}
1.2 +1 -1 xml-axis/java/src/org/apache/axis/encoding/Base64Serializer.java
Index: Base64Serializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/Base64Serializer.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Base64Serializer.java 2001/07/08 00:54:59 1.1
+++ Base64Serializer.java 2001/07/08 14:18:36 1.2
@@ -81,7 +81,7 @@
static public class Base64DeserializerFactory
implements DeserializerFactory
{
- public DeserializerBase getDeserializer() {return new Base64Deser();}
+ public DeserializerBase getDeserializer(Class cls) {return new Base64Deser();}
}
/**
1.6 +21 -16 xml-axis/java/src/org/apache/axis/encoding/BeanSerializer.java
Index: BeanSerializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/BeanSerializer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- BeanSerializer.java 2001/06/07 14:01:48 1.5
+++ BeanSerializer.java 2001/07/08 14:18:36 1.6
@@ -61,6 +61,7 @@
import java.beans.BeanInfo;
import java.beans.Introspector;
+import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import org.apache.axis.encoding.*;
@@ -128,21 +129,32 @@
* An array of nothing, defined only once.
*/
private static final Object[] noArgs = new Object[] {};
+
+ public static DeserializerFactory getFactory()
+ {
+ return new BeanSerFactory();
+ }
/**
* BeanSerializer Factory that creates instances with the specified
* class. Caches the PropertyDescriptor
*/
- private static class BeanSerFactory implements DeserializerFactory {
- private Class cls;
- private PropertyDescriptor[] pd;
-
- public BeanSerFactory(Class cls) throws Exception{
- this.cls = cls;
- this.pd = Introspector.getBeanInfo(cls).getPropertyDescriptors();
- }
+ public static class BeanSerFactory implements DeserializerFactory {
+ private Hashtable propertyDescriptors = new Hashtable();
- public DeserializerBase getDeserializer() {
+ public DeserializerBase getDeserializer(Class cls) {
+ PropertyDescriptor [] pd =
+ (PropertyDescriptor [])propertyDescriptors.get(cls);
+
+ if (pd == null) {
+ try {
+ pd = Introspector.getBeanInfo(cls).getPropertyDescriptors();
+ } catch (IntrospectionException e) {
+ return null;
+ }
+ propertyDescriptors.put(cls, pd);
+ }
+
BeanSerializer bs = new BeanSerializer();
bs.setCls(cls);
bs.setPd(pd);
@@ -162,13 +174,6 @@
*/
private static final ObjectStreamField[] serialPersistentFields =
{new ObjectStreamField("cls", Class.class)};
- }
-
- /**
- * Accessor for the BeanSerializerFactory
- */
- public static DeserializerFactory getFactory(Class cls) throws Exception {
- return new BeanSerFactory(cls);
}
/**
1.3 +1 -1 xml-axis/java/src/org/apache/axis/encoding/BooleanDeserializerFactory.java
Index: BooleanDeserializerFactory.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/BooleanDeserializerFactory.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- BooleanDeserializerFactory.java 2001/07/08 00:50:34 1.2
+++ BooleanDeserializerFactory.java 2001/07/08 14:18:37 1.3
@@ -94,6 +94,6 @@
}
}
- public DeserializerBase getDeserializer() { return new BooleanDeser(); }
+ public DeserializerBase getDeserializer(Class cls) { return new BooleanDeser(); }
}
1.5 +1 -1 xml-axis/java/src/org/apache/axis/encoding/DateSerializer.java
Index: DateSerializer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DateSerializer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DateSerializer.java 2001/05/21 00:44:43 1.4
+++ DateSerializer.java 2001/07/08 14:18:37 1.5
@@ -159,7 +159,7 @@
}
static public class DateDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new DateDeser(); }
+ public DeserializerBase getDeserializer(Class cls) { return new DateDeser(); }
}
/**
1.11 +0 -46 xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
Index: DeserializationContext.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- DeserializationContext.java 2001/05/05 22:16:56 1.10
+++ DeserializationContext.java 2001/07/08 14:18:37 1.11
@@ -75,8 +75,6 @@
{
public SOAPSAXHandler baseHandler;
public Hashtable idMappings = new Hashtable();
- public Hashtable fixups = new Hashtable();
- public boolean hasUnresolvedHrefs = false;
private MessageContext msgContext;
@@ -90,50 +88,6 @@
public SOAPSAXHandler getSAXHandler()
{
return baseHandler;
- }
-
- public void addFixupHandler(String id, DeserializerBase handler)
- {
- DeserializerBase oldHandler = (DeserializerBase)fixups.get(id);
-
- /** !!! This is kind of messy. Basically, if multiple references
- * to the same object occur, we need to make sure that when it gets
- * found, all of the fixup points are loaded with the correct value.
- *
- * Right now this happens by checking the deserializer types and
- * copying the targets across to the new one. To make this nicer,
- * we should integrate knowledge of the HREF attribute further up
- * the chain (in SOAPSAXHandler), to avoid even creating a new
- * deserializer once one is already registered for a given ID.
- *
- */
- if (oldHandler != null) {
- // Make sure types match...
- if (!handler.getClass().equals(oldHandler.getClass())) {
- System.err.println("Non-compatible deserializers for multiple refs to ID " + id);
- return;
- }
-
- handler.copyValueTargets(oldHandler);
- }
-
- fixups.put(id, handler);
- hasUnresolvedHrefs = true;
- }
-
- public DeserializerBase getHandlerForID(String id)
- {
- DeserializerBase handler = (DeserializerBase)fixups.get(id);
- if (handler != null) {
- fixups.remove(id);
- hasUnresolvedHrefs = !fixups.isEmpty();
- }
- return handler;
- }
-
- public boolean unresolvedHrefs()
- {
- return hasUnresolvedHrefs;
}
public void pushElementHandler(DeserializerBase handler)
1.8 +3 -1 xml-axis/java/src/org/apache/axis/encoding/DeserializerBase.java
Index: DeserializerBase.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerBase.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DeserializerBase.java 2001/05/07 02:20:58 1.7
+++ DeserializerBase.java 2001/07/08 14:18:37 1.8
@@ -57,6 +57,8 @@
import org.xml.sax.*;
import org.xml.sax.helpers.*;
+
+import org.apache.axis.Constants;
import org.apache.axis.message.*;
import java.util.*;
@@ -206,7 +208,7 @@
this.context = context;
}
- /** Base-class startElement() handler. Deals with HREFs
+ /** Base-class startElement() handler.
*/
public void startElement(String namespace, String localName,
String qName, Attributes attributes)
1.3 +1 -1 xml-axis/java/src/org/apache/axis/encoding/DeserializerFactory.java
Index: DeserializerFactory.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerFactory.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DeserializerFactory.java 2001/06/07 14:01:49 1.2
+++ DeserializerFactory.java 2001/07/08 14:18:37 1.3
@@ -2,5 +2,5 @@
public interface DeserializerFactory extends java.io.Serializable
{
- public DeserializerBase getDeserializer();
+ public DeserializerBase getDeserializer(Class cls);
}
1.7 +1 -1 xml-axis/java/src/org/apache/axis/encoding/SOAPEncoding.java
Index: SOAPEncoding.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SOAPEncoding.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SOAPEncoding.java 2001/07/01 12:58:53 1.6
+++ SOAPEncoding.java 2001/07/08 14:18:37 1.7
@@ -10,7 +10,7 @@
import java.io.IOException;
import java.math.BigDecimal;
-public class SOAPEncoding implements Serializer, java.io.Serializable {
+public class SOAPEncoding implements Serializer {
private Hashtable typemap = new Hashtable();
private Hashtable namemap = new Hashtable();
1.21 +58 -63 xml-axis/java/src/org/apache/axis/encoding/SOAPTypeMappingRegistry.java
Index: SOAPTypeMappingRegistry.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SOAPTypeMappingRegistry.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- SOAPTypeMappingRegistry.java 2001/07/08 11:59:49 1.20
+++ SOAPTypeMappingRegistry.java 2001/07/08 14:18:37 1.21
@@ -59,6 +59,8 @@
import org.apache.axis.utils.QName;
import org.xml.sax.*;
+import java.lang.reflect.Constructor;
+
import java.util.Date;
import java.util.List;
import java.math.BigDecimal;
@@ -98,71 +100,63 @@
}
public static abstract class BasicDeser extends DeserializerBase {
+ StringBuffer val = new StringBuffer();
+
public void characters(char [] chars, int start, int end)
throws SAXException
+ {
+ val.append(chars, start, end);
+ }
+ public void endElement(String namespace, String localName,
+ String qName)
+ throws SAXException
{
- value = makeValue(new String(chars, start, end));
+ value = makeValue(val.toString());
valueComplete();
}
+
abstract Object makeValue(String source);
- }
- class IntDeser extends BasicDeser {
- Object makeValue(String source) { return new Integer(source); }
- }
- class IntDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new IntDeser(); }
- }
- class FloatDeser extends BasicDeser {
- Object makeValue(String source) { return new Float(source); }
}
- class FloatDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new FloatDeser(); }
- }
- class LongDeser extends BasicDeser {
- Object makeValue(String source) { return new Long(source); }
- }
- class LongDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new LongDeser(); }
- }
- class StringDeser extends BasicDeser {
- public void characters(char [] chars, int start, int end) {
- String work = new String(chars, start, end);
- if (value == null)
- value = work;
- else
- value = (String)value + work;
+
+ /** A deserializer for any simple type with a (String) constructor.
+ *
+ * The factory below will build one of these configured for the
+ * desired Class each time.
+ */
+ public static class BasicDeserializer extends BasicDeser {
+ Constructor constructor;
+ public BasicDeserializer(Class cls)
+ {
+ try {
+ constructor = cls.getDeclaredConstructor(
+ new Class [] { String.class });
+ } catch (Exception e) {
+ // TODO : Handle errors / throw?
+ e.printStackTrace();
+ }
}
- Object makeValue(String source) { return null; }
- }
- class StringDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new StringDeser(); }
- }
- class DoubleDeser extends BasicDeser {
- Object makeValue(String source) { return new Double(source); }
- }
- class DoubleDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new DoubleDeser(); }
- }
- class ShortDeser extends BasicDeser {
- Object makeValue(String source) { return new Short(source); }
- }
- class ShortDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new ShortDeser(); }
- }
- class ByteDeser extends BasicDeser {
- Object makeValue(String source) { return new Byte(source); }
- }
- class ByteDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new ByteDeser(); }
- }
- class DecimalDeser extends BasicDeser {
- Object makeValue(String source) { return new BigDecimal(source); }
- }
- class DecimalDeserializerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() { return new DecimalDeser(); }
+
+ public Object makeValue(String source)
+ {
+ try {
+ return constructor.newInstance(new Object [] { source });
+ } catch (Exception e) {
+ // TODO: Handle errors / throw?
+ e.printStackTrace();
+ return null;
+ }
+ }
}
+ public static class BasicDeserializerFactory implements DeserializerFactory {
+ public DeserializerBase getDeserializer(Class cls)
+ {
+ return new BasicDeserializer(cls);
+ }
+ }
+
private ArraySerializer arraySer = new ArraySerializer();
+ private BasicDeserializerFactory factory = new BasicDeserializerFactory();
/**
* Alias common DeserializerFactories across the various popular schemas
@@ -222,16 +216,17 @@
addSerializer(java.util.Date.class, XSD_DATE, new DateSerializer());
addSerializer(byte[].class, XSD_BASE64, new Base64Serializer());
addSerializer(java.math.BigDecimal.class, XSD_DECIMAL, se);
+
+ addDeserializersFor(XSD_STRING, java.lang.String.class, factory);
+ addDeserializersFor(XSD_BOOLEAN, java.lang.Boolean.class, factory);
+ addDeserializersFor(XSD_DOUBLE, java.lang.Double.class, factory);
+ addDeserializersFor(XSD_FLOAT, java.lang.Float.class, factory);
+ addDeserializersFor(XSD_INT, java.lang.Integer.class, factory);
+ addDeserializersFor(XSD_LONG, java.lang.Long.class, factory);
+ addDeserializersFor(XSD_SHORT, java.lang.Short.class, factory);
+ addDeserializersFor(XSD_BYTE, java.lang.Byte.class, factory);
+ addDeserializersFor(XSD_DECIMAL, java.math.BigDecimal.class, factory);
- addDeserializersFor(XSD_STRING, java.lang.String.class, new StringDeserializerFactory());
- addDeserializersFor(XSD_BOOLEAN, java.lang.Boolean.class, new BooleanDeserializerFactory());
- addDeserializersFor(XSD_DOUBLE, java.lang.Double.class, new DoubleDeserializerFactory());
- addDeserializersFor(XSD_FLOAT, java.lang.Float.class, new FloatDeserializerFactory());
- addDeserializersFor(XSD_INT, java.lang.Integer.class, new IntDeserializerFactory());
- addDeserializersFor(XSD_LONG, java.lang.Long.class, new LongDeserializerFactory());
- addDeserializersFor(XSD_SHORT, java.lang.Short.class, new ShortDeserializerFactory());
- addDeserializersFor(XSD_BYTE, java.lang.Byte.class, new ByteDeserializerFactory());
- addDeserializersFor(XSD_DECIMAL, java.math.BigDecimal.class, new DecimalDeserializerFactory());
addDeserializersFor(XSD_BASE64, byte[].class, new Base64Serializer.Base64DeserializerFactory());
// handle the various datetime QNames...
1.17 +84 -59 xml-axis/java/src/org/apache/axis/encoding/TypeMappingRegistry.java
Index: TypeMappingRegistry.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/TypeMappingRegistry.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- TypeMappingRegistry.java 2001/07/08 11:30:50 1.16
+++ TypeMappingRegistry.java 2001/07/08 14:18:37 1.17
@@ -63,6 +63,7 @@
import org.apache.axis.message.*;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
import org.xml.sax.*;
import org.xml.sax.helpers.AttributesImpl;
import java.io.*;
@@ -71,31 +72,12 @@
* @author James Snell (jasnell@us.ibm.com)
* @author Sam Ruby (rubys@us.ibm.com)
*/
-public class TypeMappingRegistry implements Serializer, Serializable {
-
- // default location for save/load
- private String fileName = null;
-
- /**
- * Constructor for persistent registries
- */
- public TypeMappingRegistry(String fileName) {
- this();
- this.fileName = fileName;
- }
-
+public class TypeMappingRegistry implements Serializer {
/**
* Default constructor (transient registry)
*/
public TypeMappingRegistry() {}
- /**
- * Init (ie. load settings...)
- */
- public void init() {
- load();
- }
-
static class SerializerDescriptor implements Serializable {
QName typeQName;
Serializer serializer;
@@ -120,6 +102,11 @@
Hashtable s;
Hashtable d;
+ public boolean isEmpty()
+ {
+ return (d == null || d.isEmpty());
+ }
+
/**
* Define a "parent" TypeMappingRegistry that will be used to service
* any requests that are not satisfied by this this instance. This
@@ -150,7 +137,6 @@
Serializer serializer) {
if (s == null) s = new Hashtable();
s.put(_class, new SerializerDescriptor(qName, serializer));
- save();
}
public void addDeserializerFactory(QName qname,
@@ -158,7 +144,6 @@
DeserializerFactory deserializerFactory) {
if (d == null) d= new Hashtable();
d.put(qname, new DeserializerDescriptor(_class, deserializerFactory));
- save();
}
public Serializer getSerializer(Class _class) {
@@ -192,7 +177,7 @@
if (d != null) {
DeserializerDescriptor desc = (DeserializerDescriptor)d.get(qname);
if ((desc != null) && (desc.factory != null))
- return desc.factory.getDeserializer();
+ return desc.factory.getDeserializer(desc.cls);
}
if (parent != null) return parent.getDeserializer(qname);
return null;
@@ -200,12 +185,10 @@
public void removeSerializer(Class _class) {
if (s != null) s.remove(_class);
- save();
}
public void removeDeserializer(QName qname) {
if (d != null) d.remove(qname);
- save();
}
public boolean hasSerializer(Class _class) {
@@ -220,38 +203,6 @@
return false;
}
- public void save() {
- if (fileName == null) return;
-
- try {
- FileOutputStream out = new FileOutputStream(fileName);
- Hashtable reg = new Hashtable();
- if (s!=null) reg.put("SERIALIZERS", s);
- if (d!=null) reg.put("DESERIALIZERS", d);
- ObjectOutputStream oos = new ObjectOutputStream(out);
- oos.writeObject(reg);
- oos.close();
- } catch (Exception e) {
- e.printStackTrace( System.err );
- }
- }
-
- private void load() {
- if (fileName == null) return;
-
- try {
- FileInputStream in = new FileInputStream(fileName);
- ObjectInputStream ois = new ObjectInputStream(in);
- Hashtable reg = (Hashtable)ois.readObject();
- s = (Hashtable)reg.get("SERIALIZERS");
- d = (Hashtable)reg.get("DESERIALIZERS");
- ois.close();
- } catch (FileNotFoundException fnfe) {
- } catch (Exception e) {
- e.printStackTrace( System.err );
- }
- }
-
public Attributes setTypeAttribute(Attributes attributes, QName type,
SerializationContext context)
{
@@ -289,8 +240,6 @@
public void dump(PrintStream out, String header) {
out.println(header);
- if (fileName != null)
- out.println(" File: " + fileName);
out.println(" Deserializers:");
if (d != null) {
java.util.Enumeration e = d.keys();
@@ -303,5 +252,81 @@
}
if (parent != null)
parent.dump(out, "Parent");
+ }
+
+ public static final QName typeMappingQName = new QName("axis",
+ "typeMapping");
+
+ public void dumpToSerializationContext(SerializationContext ctx)
+ throws IOException
+ {
+ if (d == null) {
+ return;
+ }
+
+ Enumeration enum = d.keys();
+ while (enum.hasMoreElements()) {
+ QName typeQName = (QName)enum.nextElement();
+ DeserializerDescriptor desc =
+ (DeserializerDescriptor)d.get(typeQName);
+ if (desc.cls == null)
+ continue;
+
+ AttributesImpl attrs = new AttributesImpl();
+ attrs.addAttribute("", "type", "type",
+ "CDATA", ctx.qName2String(typeQName));
+ attrs.addAttribute("", "class", "class",
+ "CDATA", desc.cls.getName());
+
+ String dser = desc.factory.getClass().getName();
+ attrs.addAttribute("", "dser", "dser",
+ "CDATA", dser);
+
+ SerializerDescriptor serDesc = (SerializerDescriptor)s.get(desc.cls);
+ if (serDesc != null) {
+ attrs.addAttribute("", "ser", "ser",
+ "CDATA",
+ serDesc.serializer.getClass().getName());
+ }
+
+ ctx.startElement(typeMappingQName, attrs);
+ ctx.endElement();
+ }
+ }
+
+ public void dumpToElement(Element root)
+ {
+ if ((d == null) || (parent == null)) {
+ return;
+ }
+
+ Document doc = root.getOwnerDocument();
+
+ Enumeration enum = d.keys();
+ while (enum.hasMoreElements()) {
+ QName typeQName = (QName)enum.nextElement();
+ DeserializerDescriptor desc =
+ (DeserializerDescriptor)d.get(typeQName);
+ if (desc.cls == null)
+ continue;
+
+ Element mapEl = doc.createElement("typeMapping");
+
+ mapEl.setAttribute("type", "ns:" + typeQName.getLocalPart());
+ mapEl.setAttribute("xmlns:ns", typeQName.getNamespaceURI());
+
+ mapEl.setAttribute("classname", desc.cls.getName());
+
+ String dser = desc.factory.getClass().getName();
+ mapEl.setAttribute("deserializerFactory", dser);
+
+ SerializerDescriptor serDesc = (SerializerDescriptor)s.get(desc.cls);
+ if (serDesc != null) {
+ mapEl.setAttribute("serializer", serDesc.serializer.
+ getClass().getName());
+ }
+
+ root.appendChild(mapEl);
+ }
}
}
1.16 +7 -2 xml-axis/java/src/org/apache/axis/handlers/DebugHandler.java
Index: DebugHandler.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/DebugHandler.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- DebugHandler.java 2001/06/12 15:43:09 1.15
+++ DebugHandler.java 2001/07/08 14:18:38 1.16
@@ -58,6 +58,7 @@
import java.util.* ;
import org.apache.axis.* ;
+import org.apache.axis.encoding.*;
import org.apache.axis.utils.* ;
import org.apache.axis.message.DebugHeader;
import org.apache.axis.message.SOAPEnvelope;
@@ -79,8 +80,12 @@
SOAPEnvelope message = (SOAPEnvelope)msg.getAsSOAPEnvelope();
SOAPHeader header = message.getHeaderByName(Constants.URI_DEBUG,
"Debug");
- if ((header != null) && (header instanceof DebugHeader)) {
- int debugVal = ((DebugHeader)header).getDebugLevel();
+
+ if (header != null) {
+ int debugVal =
+ ((Integer)header
+ .getValueAsType(SOAPTypeMappingRegistry.XSD_INT))
+ .intValue();
Debug.Print( 1, "Setting debug level to: " + debugVal );
Debug.setDebugLevel(debugVal);
header.setProcessed(true);
1.13 +20 -0 xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java
Index: SOAPService.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- SOAPService.java 2001/07/01 14:32:16 1.12
+++ SOAPService.java 2001/07/08 14:18:38 1.13
@@ -85,6 +85,10 @@
*/
private TypeMappingRegistry typeMap;
+ /** Our service description
+ */
+ private ServiceDescription serviceDescription;
+
/** Standard, no-arg constructor.
*/
public SOAPService()
@@ -103,6 +107,16 @@
typeMap = map;
}
+ public ServiceDescription getServiceDescription()
+ {
+ return serviceDescription;
+ }
+
+ public void setServiceDescription(ServiceDescription sd)
+ {
+ serviceDescription = sd;
+ }
+
/** Convenience constructor for wrapping SOAP semantics around
* "service handlers" which actually do work.
*/
@@ -188,6 +202,12 @@
Element root = doc.createElement( "service" );
fillInDeploymentData(root);
+
+ if (!getTypeMappingRegistry().isEmpty()) {
+ Element elem = doc.createElement("typeMappings");
+ getTypeMappingRegistry().dumpToElement(elem);
+ root.appendChild(elem);
+ }
Debug.Print( 1, "Exit: SOAPService::getDeploymentData" );
return( root );
1.24 +56 -15 xml-axis/java/src/org/apache/axis/message/MessageElement.java
Index: MessageElement.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- MessageElement.java 2001/07/01 03:30:56 1.23
+++ MessageElement.java 2001/07/08 14:18:38 1.24
@@ -60,8 +60,10 @@
import org.xml.sax.helpers.AttributesImpl;
import org.w3c.dom.*;
import org.apache.axis.Constants;
+import org.apache.axis.AxisFault;
import org.apache.axis.message.events.*;
import org.apache.axis.encoding.*;
+import org.apache.axis.utils.Debug;
import org.apache.axis.utils.QName;
import org.apache.axis.utils.DOM2Writer;
import java.util.*;
@@ -172,30 +174,62 @@
{
return null;
}
+
+ public MessageElement getRealElement()
+ {
+ if (href == null)
+ return this;
+
+ return context.getElementByID(href.substring(1));
+ }
public Object getValue()
{
- if (value instanceof ElementRecorder) {
- // !!! Lazy deserialization here... We have the SAX events,
- // but haven't run them through a deserializer yet.
- StringWriter xml = new StringWriter();
- try {
- SerializationContext xmlContext = new SerializationContext(xml, context.getMessageContext());
- ((ElementRecorder)value).outputChildren(xmlContext);
- } catch (Exception e) {
- if (DEBUG_LOG) e.printStackTrace();
- return null;
- }
- return xml.getBuffer().toString();
+ if (value != null)
+ return value;
+
+ if (href != null) {
+ return getRealElement().getValue();
}
if (deserializer != null) {
value = deserializer.getValue();
deserializer = null;
+ } else {
+ // No attached deserializer, try it as a String...
+ try {
+ value = getValueAsType(SOAPTypeMappingRegistry.XSD_STRING);
+ } catch (AxisFault fault) {
+ Debug.Print(1, "Couldn't deserialize as String : " + fault);
+ }
}
return value;
}
+
+ public Object getValueAsType(QName typeQName) throws AxisFault
+ {
+ MessageElement realEl = getRealElement();
+
+ if (realEl.typeQName != null) {
+ if (!realEl.typeQName.equals(typeQName))
+ throw new AxisFault("Couldn't convert " + realEl.typeQName +
+ " to requested type " + typeQName);
+ return getValue();
+ }
+
+ DeserializerBase dser = realEl.context.getDeserializer(typeQName);
+ if (dser == null)
+ throw new AxisFault("No deserializer for type " + typeQName);
+
+ try {
+ realEl.publishToHandler(dser);
+ } catch (SAXException e) {
+ throw new AxisFault(e);
+ }
+
+ return dser.getValue();
+ }
public void startElement(String namespace, String localName,
String qName, Attributes attributes)
@@ -258,6 +292,14 @@
public DeserializerBase getContentHandler()
{
if (isDeserializing()) {
+
+ if (href != null) {
+ deserializer = context.getElementByID(href.substring(1));
+ System.out.println("Got href dser " + deserializer);
+ if (deserializer != null)
+ return deserializer;
+ }
+
// Look up type and return an appropriate deserializer
if ((typeQName != null) && (deserializer == null)) {
deserializer = context.getDeserializer(typeQName);
@@ -279,9 +321,8 @@
if (DEBUG_LOG) {
System.err.println("Creating recorder for " + this.getName());
}
- value = new ElementRecorder();
- recorder = (ElementRecorder)value;
- return (ElementRecorder)value;
+ recorder = new ElementRecorder();
+ return recorder;
}
public void setContentHandler(DeserializerBase handler)
1.5 +0 -13 xml-axis/java/src/org/apache/axis/message/SOAPBodyElement.java
Index: SOAPBodyElement.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPBodyElement.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SOAPBodyElement.java 2001/06/26 21:01:07 1.4
+++ SOAPBodyElement.java 2001/07/08 14:18:38 1.5
@@ -69,19 +69,6 @@
Attributes attributes, DeserializationContext context)
{
super(namespace, localPart, attributes, context);
-
- /** The algorithm we use here is to find the first
- * element without an ID attribute (assuming that
- * ID'ed attributes are multi-ref encodings).
- */
- if (context!= null && getID()==null) {
- MessageContext msgContext = context.getMessageContext();
- if (msgContext.getServiceHandler() == null) {
- Debug.Print(2, "Dispatching to body namespace '",
- namespace, "'");
- msgContext.setTargetService(namespace);
- }
- }
}
public SOAPBodyElement()
1.18 +31 -29 xml-axis/java/src/org/apache/axis/message/SOAPSAXHandler.java
Index: SOAPSAXHandler.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPSAXHandler.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- SOAPSAXHandler.java 2001/06/12 15:43:14 1.17
+++ SOAPSAXHandler.java 2001/07/08 14:18:38 1.18
@@ -64,6 +64,7 @@
import org.apache.axis.utils.NSStack;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
+import org.apache.axis.utils.Debug;
/** The main SOAP envelope parsing class. This whole system is based on
* SAX event-style parsing, and this is the core "engine". Subclasses
@@ -134,11 +135,37 @@
context);
}
+ /** We're about to create a body element. So we really need
+ * to know at this point if this is an RPC service or not. It's
+ * possible that no one has set the service up until this point,
+ * so if that's the case we should attempt to set it based on the
+ * namespace of the first body element without an ID (assuming
+ * that ID'ed attributes are multi-ref encodings). Setting the
+ * service may (should?) result in setting the service
+ * description, which can then tell us what to create.
+ */
+ String id = attributes.getValue("id");
+
+ if (id == null &&
+ context.getMessageContext().getServiceHandler() == null) {
+ Debug.Print(2, "Dispatching to body namespace '",
+ namespace, "'");
+ context.getMessageContext().setTargetService(namespace);
+ }
+
+ /** Now we make a plain SOAPBodyElement IF we either:
+ * a) have an ID attribute, or
+ * b) have a non-RPC service
+ */
ServiceDescription serviceDesc = context.getServiceDescription();
- if ((serviceDesc != null) && (!serviceDesc.isRPC())) {
+ if (((serviceDesc != null) &&
+ (!serviceDesc.isRPC())) ||
+ (id != null)) {
return new SOAPBodyElement(namespace, localName, attributes, context);
}
+ /** We're RPC, so make an RPCElement.
+ */
RPCElement body = (RPCElement)
RPCElement.getFactory().createElement(namespace,
localName,
@@ -149,26 +176,17 @@
}
}
- /** These guys know how to create the right MessageElements (and thus
- * sub-handlers) for particular XML elements. Right now the headers
- * can be registered (see DebugHeader for an example), but the bodies
- * are fixed as RPCElements.
- */
-
// Header factory.
ElementRegistry headerRegistry =
new ElementRegistry(SOAPHeader.factory());
- // Body factory. Only doing rpc bodies for right now...
+ // Body factory.
ElementFactory bodyFactory = new BodyFactory();
public SOAPSAXHandler(MessageContext msgContext)
{
envelope = new SOAPEnvelope(this);
this.context = new DeserializationContext(this,msgContext);
-
- // just testing...
- headerRegistry.registerFactory(Constants.URI_DEBUG, "Debug", DebugHeader.getFactory());
}
public int getState()
@@ -449,7 +467,6 @@
return false;
}
- context.addFixupHandler(href.substring(1), elementHandler);
return false;
}
@@ -587,23 +604,8 @@
element.setEnvelope(envelope);
element.setPrefix(namespaces.getPrefix(namespace));
-
- DeserializerBase handler = null;
- if (context.unresolvedHrefs() && (element.getID() != null)) {
- handler = context.getHandlerForID(element.getID());
- if (handler == null) {
- handler = element.getContentHandler();
- } else {
- if (DEBUG_LOG) {
- System.out.println("found handler for ID " + element.getID() + " : " + handler);
- }
- element.setContentHandler(handler);
- }
- } else {
- handler = element.getContentHandler();
- }
-
- pushElementHandler(handler);
+
+ pushElementHandler(element.getContentHandler());
elementHandler.setDeserializationContext(context);
1.5 +7 -0 xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java
Index: JavaProvider.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/providers/java/JavaProvider.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- JavaProvider.java 2001/07/01 12:38:46 1.4
+++ JavaProvider.java 2001/07/08 14:18:38 1.5
@@ -220,6 +220,13 @@
new SOAPEnvelope() :
(SOAPEnvelope)resMsg.getAsSOAPEnvelope();
+ /** If the class knows what it should be exporting,
+ * respect its wishes.
+ */
+ if (obj instanceof AxisServiceConfig) {
+ methodName = ((AxisServiceConfig)obj).getMethods();
+ }
+
processMessage(msgContext, serviceName, methodName, reqEnv, resEnv, jc, obj);
if (resMsg == null) {
1.2 +0 -12 xml-axis/java/src/org/apache/axis/providers/java/MsgProvider.java
Index: MsgProvider.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/providers/java/MsgProvider.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MsgProvider.java 2001/05/31 09:25:07 1.1
+++ MsgProvider.java 2001/07/08 14:18:38 1.2
@@ -93,18 +93,6 @@
Class[] argClasses = new Class[2];
Object[] argObjects = new Object[2];
- /** !!! KLUDGE WARNING
- * We need some way of associating ServiceDescriptions with actual
- * services... and then at the point when we figure out which service
- * we'll be calling (which might be right away (static dispatch), after
- * looking at the URL (transport-level dispatch), or even after looking
- * into the SOAP message itself...)
- */
- if (clsName.equals("org.apache.axis.utils.Admin")) {
- ServiceDescription sd = new ServiceDescription("Admin", false);
- msgContext.setServiceDescription(sd);
- }
-
SOAPBodyElement reqBody = reqEnv.getFirstBody();
StringWriter writer = new StringWriter();
1.52 +108 -32 xml-axis/java/src/org/apache/axis/utils/Admin.java
Index: Admin.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/Admin.java,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -r1.51 -r1.52
--- Admin.java 2001/07/01 14:32:17 1.51
+++ Admin.java 2001/07/08 14:18:39 1.52
@@ -118,12 +118,30 @@
private static void registerTypeMappings(Element root, SOAPService service)
throws Exception
{
- NodeList list = root.getElementsByTagName("bean");
- Debug.Print(2, "Registering " + list.getLength() + " service-specific beans.");
+ TypeMappingRegistry reg = service.getTypeMappingRegistry();
+ NodeList list = root.getElementsByTagName("beanMappings");
for (int i = 0; list != null && i < list.getLength(); i++) {
Element el = (Element)list.item(i);
- registerBeanMapping(el, service.getTypeMappingRegistry());
+ registerTypes(el, reg, true);
}
+
+ list = root.getElementsByTagName("typeMappings");
+ for (int i = 0; list != null && i < list.getLength(); i++) {
+ Element el = (Element)list.item(i);
+ registerTypes(el, reg, false);
+ }
+ }
+
+ private static void registerTypes(Element root,
+ TypeMappingRegistry map,
+ boolean isBean)
+ throws Exception
+ {
+ NodeList list = root.getChildNodes();
+ for (int i = 0; (list != null) && (i < list.getLength()); i++) {
+ if (!(list.item(i) instanceof Element)) continue;
+ registerTypeMapping((Element)list.item(i), map, isBean);
+ }
}
/**
@@ -151,7 +169,8 @@
{
Element el = doc.getDocumentElement();
if (!el.getTagName().equals("engineConfig"))
- throw new Exception("Wanted 'engineConfig' element, got '" + el.getTagName() + "'");
+ throw new Exception("Wanted 'engineConfig' element, got '" +
+ el.getTagName() + "'");
NodeList nl = el.getElementsByTagName("handlers");
deploy(nl, engine);
@@ -162,6 +181,15 @@
nl = el.getElementsByTagName("transports");
deploy(nl, engine);
+ nl = el.getElementsByTagName("typeMappings");
+ deploy(nl, engine);
+ /*
+ if (nl.getLength() > 0)
+ registerTypes((Element)nl.item(0),
+ engine.getTypeMappingRegistry(),
+ false);
+ */
+
engine.saveConfiguration();
}
@@ -200,6 +228,9 @@
else if (type.equals("transport")) {
registerTransport(item, engine);
}
+ else if (type.equals("typeMapping")) {
+ registerTypeMapping(item, engine.getTypeMappingRegistry(), false);
+ }
}
}
}
@@ -290,10 +321,13 @@
// A streamlined means of deploying both a serializer and a deserializer
// for a bean at the same time.
- else if ( type.equals( "bean" ) ) {
- Debug.Print( 2, "Deploying bean: " + name );
+ else if ( type.equals( "beanMappings" ) ) {
TypeMappingRegistry engineTypeMap = engine.getTypeMappingRegistry();
- registerBeanMapping(elem, engineTypeMap);
+ registerTypes(elem, engineTypeMap, true);
+ }
+ else if (type.equals("typeMappings")) {
+ TypeMappingRegistry engineTypeMap = engine.getTypeMappingRegistry();
+ registerTypes(elem, engineTypeMap, false);
} else
throw new AxisFault( "Admin.error",
"Unknown type to " + action + ": " + type,
@@ -341,6 +375,11 @@
el = doc.createElement("transports");
list(el, engine.getTransportRegistry());
tmpEl.appendChild(el);
+
+ Debug.Print(2, "Outputting registry");
+ el = doc.createElement("typeMappings");
+ engine.getTypeMappingRegistry().dumpToElement(el);
+ tmpEl.appendChild(el);
return( doc );
}
@@ -525,6 +564,11 @@
": couldn't find pivot Handler '" + pivot + "'");
service.setPivotHandler( tmpH );
+
+ if (pivot.equals("MsgDispatcher")) {
+ ServiceDescription sd = new ServiceDescription("msgService", false);
+ service.setServiceDescription(sd);
+ }
}
if ( response != null && !"".equals(response) ) {
@@ -646,45 +690,77 @@
* @param root the type mapping element.
* @param map the TypeMappingRegistry which gets this mapping.
*/
- private static void registerBeanMapping(Element root, TypeMappingRegistry map)
+ private static void registerTypeMapping(Element elem,
+ TypeMappingRegistry map,
+ boolean isBean)
throws Exception
{
- NodeList list = root.getChildNodes();
- for ( int i = 0 ; list != null && i < list.getLength() ; i++ ) {
- Node node = list.item(i);
- if ( node.getNodeType() != Node.ELEMENT_NODE ) continue ;
- Element elem = (Element) node ;
-
- // Retrieve classname attribute
-
- String classname = elem.getAttribute("classname");
- if ((classname == null) || classname.equals(""))
- throw new AxisFault("Server.Admin.error",
- "No classname attribute in bean mapping",
- null, null);
+ Serializer ser;
+ DeserializerFactory dserFactory;
- // Resolve class name
+ // Retrieve classname attribute
+ String classname = elem.getAttribute("classname");
+ if ((classname == null) || classname.equals(""))
+ throw new AxisFault("Server.Admin.error",
+ "No classname attribute in type mapping",
+ null, null);
+
+ // Resolve class name
- Class cls;
- try {
- cls = Class.forName(classname);
- } catch (Exception e) {
- throw new AxisFault( "Admin.error", e.toString(), null, null);
- }
+ Class cls;
+ QName qn;
+
+ try {
+ cls = Class.forName(classname);
+ } catch (Exception e) {
+ throw new AxisFault( "Admin.error", e.toString(), null, null);
+ }
+ if (isBean) {
// Resolve qname based on prefix and localpart
String namespaceURI = elem.getNamespaceURI();
String localName = elem.getLocalName();
- QName qn = new QName(namespaceURI, localName);
+ qn = new QName(namespaceURI, localName);
Debug.Print(2, "Registering mapping for " + qn + " -> " + classname);
// register both serializers and deserializers for this bean
-
- map.addSerializer(cls, qn, new BeanSerializer(cls));
- map.addDeserializerFactory(qn, cls, BeanSerializer.getFactory(cls));
+ ser = new BeanSerializer(cls);
+ dserFactory = BeanSerializer.getFactory();
+ } else {
+ String typeName = elem.getAttribute("type");
+ int idx = typeName.indexOf(":");
+ String prefix = typeName.substring(0, idx);
+ String localPart = typeName.substring(idx + 1);
+
+ qn = new QName(XMLUtils.getNamespace(prefix, elem), localPart);
+
+ classname = elem.getAttribute("serializer");
+ Debug.Print(3, "Serializer class is " + classname);
+ try {
+ ser = (Serializer)Class.forName(classname).newInstance();
+ } catch (Exception e) {
+ throw new AxisFault( "Admin.error",
+ "Couldn't load serializer class " + e.toString(),
+ null, null);
+ }
+ classname = elem.getAttribute("deserializerFactory");
+ Debug.Print(3, "DeserializerFactory class is " + classname);
+ try {
+ dserFactory = (DeserializerFactory)Class.forName(classname).
+ newInstance();
+ } catch (Exception e) {
+ throw new AxisFault( "Admin.error",
+ "Couldn't load deserializerFactory " +
+ e.toString(),
+ null, null);
+ }
+
}
+
+ map.addSerializer(cls, qn, ser);
+ map.addDeserializerFactory(qn, cls, dserFactory);
}
public static void main(String args[]) throws Exception {
1.7 +1 -0 xml-axis/java/test/build_functional_tests.xml
Index: build_functional_tests.xml
===================================================================
RCS file: /home/cvs/xml-axis/java/test/build_functional_tests.xml,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- build_functional_tests.xml 2001/06/27 14:57:55 1.6
+++ build_functional_tests.xml 2001/07/08 14:18:39 1.7
@@ -61,6 +61,7 @@
<!-- first, put the JWS where the functional test can see it -->
<mkdir dir="build/jws" />
<copy file="samples/stock/StockQuoteService.jws" todir="build/jws" />
+ <copy file="test/functional/AltStockQuoteService.jws" todir="build/jws" />
<!-- now, run the actual test -->
<junit dir="." printsummary="yes" haltonfailure="yes" fork="yes">
1.14 +2 -0 xml-axis/java/test/RPCDispatch/TestRPC.java
Index: TestRPC.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/RPCDispatch/TestRPC.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- TestRPC.java 2001/06/25 14:31:14 1.13
+++ TestRPC.java 2001/07/08 14:18:39 1.14
@@ -120,6 +120,7 @@
assertEquals("cba", rpc("reverseString", new Object[] {"abc"}, true));
}
+ /*
public void testReverseBodyDispatch() throws Exception {
// Register the reverseString service
SOAPService reverse = new SOAPService(RPCDispatcher, "RPCDispatcher");
@@ -130,6 +131,7 @@
// invoke the service and verify the result
assertEquals("cba", rpc("reverseString", new Object[] {"abc"}, false));
}
+ */
/**
* Test a method that reverses a data structure
1.3 +1 -1 xml-axis/java/test/RPCDispatch/TestSerializedRPC.java
Index: TestSerializedRPC.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/RPCDispatch/TestSerializedRPC.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestSerializedRPC.java 2001/06/25 14:31:16 1.2
+++ TestSerializedRPC.java 2001/07/08 14:18:39 1.3
@@ -131,7 +131,7 @@
*/
public void testSerReverseData() throws Exception {
BeanSerializer ser = new BeanSerializer(Data.class);
- DeserializerFactory dSerFactory = ser.getFactory(Data.class);
+ DeserializerFactory dSerFactory = BeanSerializer.getFactory();
QName qName = new QName("urn:foo", "Data");
engine.registerTypeMapping(qName, Data.class, dSerFactory,
ser);
1.2 +1 -1 xml-axis/java/test/encoding/DataSer.java
Index: DataSer.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/encoding/DataSer.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DataSer.java 2001/05/04 00:20:45 1.1
+++ DataSer.java 2001/07/08 14:18:39 1.2
@@ -13,7 +13,7 @@
public static final String FLOATMEMBER = "floatMember";
public static class DataSerFactory implements DeserializerFactory {
- public DeserializerBase getDeserializer() {
+ public DeserializerBase getDeserializer(Class cls) {
return new DataSer();
}
}
1.10 +3 -2 xml-axis/java/test/encoding/TestDeser.java
Index: TestDeser.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/encoding/TestDeser.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- TestDeser.java 2001/06/12 15:43:24 1.9
+++ TestDeser.java 2001/07/08 14:18:39 1.10
@@ -21,6 +21,7 @@
private String header;
private String footer;
+ private AxisServer server = new AxisServer();
public TestDeser(String name) {
this(name, Constants.URI_CURRENT_SCHEMA_XSI,
@@ -65,7 +66,7 @@
*/
protected void deserialize(String data, Object expected) {
Message message = new Message(header + data + footer);
- message.setMessageContext(new MessageContext(new AxisServer()));
+ message.setMessageContext(new MessageContext(server));
SOAPEnvelope envelope = (SOAPEnvelope)message.getAsSOAPEnvelope();
assertNotNull("envelope", envelope);
@@ -81,7 +82,7 @@
assertNotNull("param", param);
Object result = param.getValue();
- if (!equals(expected,result)) assertEquals(expected, result);
+ if (!equals(result, expected)) assertEquals(expected, result);
}
public void testString() {
1.5 +10 -0 xml-axis/java/test/functional/TestStockSample.java
Index: TestStockSample.java
===================================================================
RCS file: /home/cvs/xml-axis/java/test/functional/TestStockSample.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TestStockSample.java 2001/06/27 04:45:16 1.4
+++ TestStockSample.java 2001/07/08 14:18:40 1.5
@@ -83,6 +83,16 @@
String[] args = { "-uuser1", "-wpass1", "XXX", "-sjws/StockQuoteService.jws" };
float val = new GetQuote().getQuote(args);
assertEquals("TestStockSample.doTestStockJWS(): stock price should be 66.25", val, 66.25, 0.01);
+
+ // This should FAIL
+ args[3] = "-sjws/AltStockQuoteService.jws";
+ try {
+ val = new GetQuote().getQuote(args);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ }
+ assertNull("not null");
}
public void doTestDeploy () throws Exception {
1.1 xml-axis/java/test/functional/AltStockQuoteService.jws
Index: AltStockQuoteService.jws
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "AXIS" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
import java.io.*;
import java.util.* ;
import java.net.URL;
import org.w3c.dom.* ;
import org.apache.axis.AxisServiceConfig;
import org.apache.axis.utils.XMLUtils ;
import org.apache.axis.utils.Debug;
/**
* See \samples\stock\readme for info.
*
* @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
* @author Doug Davis (dug@us.ibm.com)
*/
public class AltStockQuoteService implements AxisServiceConfig {
public String getMethods() {
return "echo";
}
public String echo(String s)
{
return s;
}
public float getQuote (String symbol) throws Exception {
// get a real (delayed by 20min) stockquote from
// http://www.xmltoday.com/examples/stockquote/. The IP addr
// below came from the host that the above form posts to ..
// NOTE THAT THIS RETURNS 66.25 WHERE THE ORDINARY EXAMPLE RETURNS 55.25!
if ( symbol.equals("XXX") ) return( (float) 66.25 );
Document doc = null ;
doc = XMLUtils.newDocument( "http://www.xmltoday.com/examples/" +
"stockquote/getxmlquote.vep?s="+symbol );
Element elem = doc.getDocumentElement();
NodeList list = elem.getElementsByTagName("stock_quote");
elem = (Element) list.item(0);
list = elem.getElementsByTagName( "price" );
elem = (Element) list.item( 0 );
String quoteStr = elem.getAttribute("value");
try {
return Float.valueOf(quoteStr).floatValue();
} catch (NumberFormatException e1) {
// maybe its an int?
try {
return Integer.valueOf(quoteStr).intValue() * 1.0F;
} catch (NumberFormatException e2) {
return -1.0F;
}
}
}
}
Re: cvs commit: xml-axis/java/test/functional AltStockQuoteService.jws TestStockSample.java
Posted by Glen Daniels <gd...@macromedia.com>.
I forgot to mention one of the other changes I made as a consequence of
moving the typemappings over to XML.
DeserializerFactory now takes a Class argument in the getDeserializer()
method. This allows a single factory to service many different target
classes. SOAPTypeMappingRegistry, instead of the plethora of deser classes
that were in there before, now contains a single BasicDeserializer class
which handles all of the types which have a Class(String) constructor. Also
the BeanSerializerFactory can now be shared and generates bean deserializers
for multiple target classes on the fly.
Although I haven't done this yet, I think that getDeserializer() should
throw an exception, since there is ample opportunity for instantiation
problems to occur.
--Glen