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 ga...@apache.org on 2004/11/19 00:39:18 UTC
cvs commit: ws-axis/java/src/org/apache/axis/encoding/ser BaseDeserializerFactory.java BaseSerializerFactory.java SimpleDeserializer.java SimpleDeserializerFactory.java SimpleSerializerFactory.java
gawor 2004/11/18 15:39:18
Modified: java/src/org/apache/axis/encoding/ser
BaseDeserializerFactory.java
BaseSerializerFactory.java SimpleDeserializer.java
SimpleDeserializerFactory.java
SimpleSerializerFactory.java
Log:
just some optimizations to avoid reflection for selected builtin types
Revision Changes Path
1.24 +4 -4 ws-axis/java/src/org/apache/axis/encoding/ser/BaseDeserializerFactory.java
Index: BaseDeserializerFactory.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/BaseDeserializerFactory.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- BaseDeserializerFactory.java 15 Nov 2004 07:13:11 -0000 1.23
+++ BaseDeserializerFactory.java 18 Nov 2004 23:39:18 -0000 1.24
@@ -106,7 +106,7 @@
*/
protected Deserializer getGeneralPurpose(String mechanismType) {
if (javaType != null && xmlType != null) {
- Constructor deserClassConstructor = getDeserClassConstructor();
+ Constructor deserClassConstructor = getDeserClassConstructor();
if (deserClassConstructor != null) {
try {
return (Deserializer)
@@ -148,7 +148,7 @@
*/
protected Deserializer getSpecialized(String mechanismType) {
if (javaType != null && xmlType != null) {
- Method getDeserializer = getGetDeserializer();
+ Method getDeserializer = getGetDeserializer();
if (getDeserializer != null) {
try {
return (Deserializer)
@@ -279,7 +279,7 @@
* Returns the deserClassConstructor.
* @return Constructor
*/
- protected Constructor getDeserClassConstructor() {
+ protected Constructor getDeserClassConstructor() {
if (deserClassConstructor == null) {
deserClassConstructor = getConstructor(deserClass);
}
@@ -290,7 +290,7 @@
* Returns the getDeserializer.
* @return Method
*/
- protected Method getGetDeserializer() {
+ protected Method getGetDeserializer() {
if (getDeserializer == null) {
getDeserializer = getMethod(javaType,"getDeserializer");
}
1.32 +7 -5 ws-axis/java/src/org/apache/axis/encoding/ser/BaseSerializerFactory.java
Index: BaseSerializerFactory.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/BaseSerializerFactory.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- BaseSerializerFactory.java 15 Nov 2004 07:13:11 -0000 1.31
+++ BaseSerializerFactory.java 18 Nov 2004 23:39:18 -0000 1.32
@@ -116,7 +116,7 @@
*/
protected Serializer getGeneralPurpose(String mechanismType) {
if (javaType != null && xmlType != null) {
- Constructor serClassConstructor = getSerClassConstructor();
+ Constructor serClassConstructor = getSerClassConstructor();
if (serClassConstructor != null) {
try {
return (Serializer)
@@ -159,6 +159,7 @@
*/
protected Serializer getSpecialized(String mechanismType) {
if (javaType != null && xmlType != null) {
+ Method getSerializer = getGetSerializer();
if (getSerializer != null) {
try {
return (Serializer)
@@ -303,26 +304,27 @@
}
return sf;
}
+
/**
* Returns the getSerializer.
* @return Method
*/
- protected Method getGetSerializer() {
+ protected Method getGetSerializer() {
if (getSerializer == null) {
getSerializer = getMethod(javaType, "getSerializer");
}
return getSerializer;
}
-
+
/**
* Returns the serClassConstructor.
* @return Constructor
*/
- protected Constructor getSerClassConstructor() {
+ protected Constructor getSerClassConstructor() {
if (serClassConstructor == null) {
serClassConstructor = getConstructor(serClass);
}
return serClassConstructor;
}
-
+
}
1.42 +81 -34 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java
Index: SimpleDeserializer.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- SimpleDeserializer.java 16 Nov 2004 16:36:37 -0000 1.41
+++ SimpleDeserializer.java 18 Nov 2004 23:39:18 -0000 1.42
@@ -78,6 +78,7 @@
init();
}
+
public SimpleDeserializer(Class javaType, QName xmlType, TypeDesc typeDesc) {
this.xmlType = xmlType;
this.javaType = javaType;
@@ -191,17 +192,62 @@
*/
public Object makeValue(String source) throws Exception
{
+ if (javaType == java.lang.String.class) {
+ return source;
+ }
+
// Trim whitespace if non-String
- if (javaType != java.lang.String.class)
- source = source.trim();
+ source = source.trim();
- if (source.length() == 0 && typeDesc == null &&
- javaType != java.lang.String.class) {
+ if (source.length() == 0 && typeDesc == null) {
return null;
}
+ // if constructor is set skip all basic java type checks
+ if (this.constructor == null) {
+ Object value = makeBasicValue(source);
+ if (value != null) {
+ return value;
+ }
+ }
+
+ Object [] args = null;
+
+ boolean isQNameSubclass = QName.class.isAssignableFrom(javaType);
+
+ if (isQNameSubclass) {
+ int colon = source.lastIndexOf(":");
+ String namespace = colon < 0 ? "" :
+ context.getNamespaceURI(source.substring(0, colon));
+ String localPart = colon < 0 ? source : source.substring(colon + 1);
+ args = new Object [] {namespace, localPart};
+ }
+
+ if (constructor == null) {
+ try {
+ if (isQNameSubclass) {
+ constructor =
+ javaType.getDeclaredConstructor(STRING_STRING_CLASS);
+ } else {
+ constructor =
+ javaType.getDeclaredConstructor(STRING_CLASS);
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ if (args == null) {
+ args = new Object[] { source };
+ }
+
+ return constructor.newInstance(args);
+ }
+
+ private Object makeBasicValue(String source) throws Exception {
// If the javaType is a boolean, except a number of different sources
- if (javaType == boolean.class || javaType == Boolean.class) {
+ if (javaType == boolean.class ||
+ javaType == Boolean.class) {
// This is a pretty lame test, but it is what the previous code did.
switch (source.charAt(0)) {
case '0': case 'f': case 'F':
@@ -213,63 +259,64 @@
default:
throw new NumberFormatException(
Messages.getMessage("badBool00"));
- }
+ }
}
// If expecting a Float or a Double, need to accept some special cases.
if (javaType == float.class ||
- javaType == java.lang.Float.class) {
+ javaType == java.lang.Float.class) {
if (source.equals("NaN")) {
return new Float(Float.NaN);
} else if (source.equals("INF")) {
return new Float(Float.POSITIVE_INFINITY);
} else if (source.equals("-INF")) {
return new Float(Float.NEGATIVE_INFINITY);
+ } else {
+ return new Float(source);
}
}
+
if (javaType == double.class ||
- javaType == java.lang.Double.class) {
+ javaType == java.lang.Double.class) {
if (source.equals("NaN")) {
return new Double(Double.NaN);
} else if (source.equals("INF")) {
return new Double(Double.POSITIVE_INFINITY);
} else if (source.equals("-INF")) {
return new Double(Double.NEGATIVE_INFINITY);
+ } else {
+ return new Double(source);
}
}
-
- Object [] args = null;
- if (QName.class.isAssignableFrom(javaType)) {
- int colon = source.lastIndexOf(":");
- String namespace = colon < 0 ? "" :
- context.getNamespaceURI(source.substring(0, colon));
- String localPart = colon < 0 ? source : source.substring(colon + 1);
- args = new Object [] {namespace, localPart};
- }
-
- if (constructor == null) {
- try {
- if (QName.class.isAssignableFrom(javaType)) {
- constructor =
- javaType.getDeclaredConstructor(STRING_STRING_CLASS);
- } else {
- constructor =
- javaType.getDeclaredConstructor(STRING_CLASS);
- }
- } catch (Exception e) {
- return null;
- }
+ if (javaType == int.class ||
+ javaType == java.lang.Integer.class) {
+ return new Integer(source);
}
- if (args == null) {
- args = new Object[] { source };
+ if (javaType == short.class ||
+ javaType == java.lang.Short.class) {
+ return new Short(source);
}
- return constructor.newInstance(args);
+ if (javaType == long.class ||
+ javaType == java.lang.Long.class) {
+ return new Long(source);
+ }
+
+ if (javaType == byte.class ||
+ javaType == java.lang.Byte.class) {
+ return new Byte(source);
+ }
+
+ if (javaType == org.apache.axis.types.URI.class) {
+ return new org.apache.axis.types.URI(source);
+ }
+
+ return null;
}
-
+
/**
* Set the bean properties that correspond to element attributes.
*
1.11 +34 -17 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializerFactory.java
Index: SimpleDeserializerFactory.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializerFactory.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- SimpleDeserializerFactory.java 15 Nov 2004 07:13:11 -0000 1.10
+++ SimpleDeserializerFactory.java 18 Nov 2004 23:39:18 -0000 1.11
@@ -40,14 +40,17 @@
new Class [] {String.class};
private Constructor constructor = null;
+ private boolean isBasicType = false;
/**
* Note that the factory is constructed with the QName and xmlType. This is important
* to allow distinction between primitive values and java.lang wrappers.
**/
public SimpleDeserializerFactory(Class javaType, QName xmlType) {
super(SimpleDeserializer.class, xmlType, javaType);
- try {
- if (!javaType.isPrimitive()) {
+ this.isBasicType = isBasic(javaType);
+ if (!this.isBasicType) {
+ // discover the constructor for non basic types
+ try {
if (QName.class.isAssignableFrom(javaType)) {
constructor =
javaType.getDeclaredConstructor(STRING_STRING_CLASS);
@@ -55,18 +58,24 @@
constructor =
javaType.getDeclaredConstructor(STRING_CLASS);
}
- }
- else {
- Class wrapper = JavaUtils.getWrapperClass(javaType);
- if (wrapper != null)
- constructor =
- wrapper.getDeclaredConstructor(STRING_CLASS);
- }
- } catch (java.lang.NoSuchMethodException e) {
- throw new IllegalArgumentException(e.toString());
- }
+ } catch (java.lang.NoSuchMethodException e) {
+ throw new IllegalArgumentException(e.toString());
+ }
+ }
}
+ /*
+ * Any builtin type that has a constructor that takes a String is a basic
+ * type.
+ * This is for optimization purposes, so that we don't introspect
+ * primitive java types or some basic Axis types.
+ */
+ private static boolean isBasic(Class javaType) {
+ return (javaType.isPrimitive() ||
+ javaType == java.lang.String.class ||
+ javaType == org.apache.axis.types.URI.class);
+ }
+
/**
* Get the Deserializer and the set the Constructor so the
* deserializer does not have to do introspection.
@@ -76,10 +85,18 @@
if (javaType == java.lang.Object.class) {
return null;
}
- SimpleDeserializer deser = (SimpleDeserializer) super.getDeserializerAs(mechanismType);
- if (deser != null)
- deser.setConstructor(constructor);
- return deser;
+ if (this.isBasicType) {
+ return new SimpleDeserializer(javaType, xmlType);
+ } else {
+ // XXX: don't think we can always expect to be SimpleDeserializer
+ // since getSpecialized() might return a different type
+ SimpleDeserializer deser =
+ (SimpleDeserializer) super.getDeserializerAs(mechanismType);
+ if (deser != null) {
+ deser.setConstructor(constructor);
+ }
+ return deser;
+ }
}
-
+
}
1.4 +26 -0 ws-axis/java/src/org/apache/axis/encoding/ser/SimpleSerializerFactory.java
Index: SimpleSerializerFactory.java
===================================================================
RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/SimpleSerializerFactory.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SimpleSerializerFactory.java 25 Feb 2004 14:02:37 -0000 1.3
+++ SimpleSerializerFactory.java 18 Nov 2004 23:39:18 -0000 1.4
@@ -20,13 +20,39 @@
package org.apache.axis.encoding.ser;
import javax.xml.namespace.QName;
+import javax.xml.rpc.JAXRPCException;
public class SimpleSerializerFactory extends BaseSerializerFactory {
+
+ private boolean isBasicType = false;
+
/**
* Note that the factory is constructed with the QName and xmlType. This is important
* to allow distinction between primitive values and java.lang wrappers.
**/
public SimpleSerializerFactory(Class javaType, QName xmlType) {
super(SimpleSerializer.class, xmlType, javaType);
+ this.isBasicType = isBasic(javaType);
+ }
+
+ /*
+ * Any builtin type that has a constructor that takes a String is a basic
+ * type.
+ * This is for optimization purposes, so that we don't introspect
+ * primitive java types or some basic Axis types.
+ */
+ private static boolean isBasic(Class javaType) {
+ return (javaType.isPrimitive() ||
+ javaType == java.lang.String.class ||
+ javaType == org.apache.axis.types.URI.class);
+ }
+
+ public javax.xml.rpc.encoding.Serializer getSerializerAs(String mechanismType) throws JAXRPCException {
+ if (this.isBasicType) {
+ return new SimpleSerializer(javaType, xmlType);
+ } else {
+ return super.getSerializerAs(mechanismType);
+ }
}
+
}