You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by pr...@apache.org on 2008/01/15 17:22:27 UTC
svn commit: r612147 [16/17] - in /webservices/axis2/branches/java/jaxws21:
./ modules/adb-codegen/ modules/adb-codegen/src/org/apache/axis2/schema/
modules/adb-codegen/src/org/apache/axis2/schema/template/
modules/adb-codegen/src/org/apache/axis2/schem...
Modified: webservices/axis2/branches/java/jaxws21/modules/rmi/src/org/apache/axis2/rmi/databind/XmlStreamParser.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/rmi/src/org/apache/axis2/rmi/databind/XmlStreamParser.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/rmi/src/org/apache/axis2/rmi/databind/XmlStreamParser.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/rmi/src/org/apache/axis2/rmi/databind/XmlStreamParser.java Tue Jan 15 08:21:22 2008
@@ -1,661 +1,722 @@
-/*
- * Copyright 2004,2005 The Apache Software Foundation.
- *
- * Licensed 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.axis2.rmi.databind;
-
-import org.apache.axis2.rmi.metadata.*;
-import org.apache.axis2.rmi.metadata.impl.TypeImpl;
-import org.apache.axis2.rmi.exception.XmlParsingException;
-import org.apache.axis2.rmi.exception.MetaDataPopulateException;
-import org.apache.axis2.rmi.exception.SchemaGenerationException;
-import org.apache.axis2.rmi.util.Constants;
-import org.apache.axis2.rmi.util.JavaTypeToQNameMap;
-import org.apache.axis2.rmi.Configurator;
-import org.apache.axis2.rmi.types.MapType;
-
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.namespace.QName;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Array;
-import java.lang.reflect.Method;
-import java.util.*;
-
-
-
-public class XmlStreamParser {
-
- private Configurator configurator;
- private Map qNameToTypeMap;
- private SimpleTypeHandler simpleTypeHandler;
- private Class simpleTypeHandlerClass;
-
- public XmlStreamParser(Map processedTypeMap,
- Configurator configurator,
- Map schemaMap) {
- this.configurator = configurator;
- this.simpleTypeHandler = this.configurator.getSimpleTypeHandler();
- this.simpleTypeHandlerClass = this.simpleTypeHandler.getClass();
- try {
- populateQNameToTypeMap(processedTypeMap, schemaMap);
- } catch (MetaDataPopulateException e) {
- // TODO: what to do this exceptions is not going to happen
- } catch (SchemaGenerationException e) {
- // TODO: what to do thsi exceptions is not going to happen
- }
- }
-
- private void populateQNameToTypeMap(Map processedTypeMap, Map schemaMap)
- throws MetaDataPopulateException,
- SchemaGenerationException {
- // first add all the proceced type map values
- Set defaultTypeMapKeys = JavaTypeToQNameMap.getKeys();
- Class typeClass;
- for (Iterator iter = defaultTypeMapKeys.iterator(); iter.hasNext();) {
- typeClass = (Class) iter.next();
- if (!processedTypeMap.containsKey(typeClass)) {
- Type newType = new TypeImpl(typeClass);
- processedTypeMap.put(typeClass, newType);
- newType.populateMetaData(this.configurator, processedTypeMap);
- newType.generateSchema(this.configurator, schemaMap);
- }
- }
- this.qNameToTypeMap = new HashMap();
- Type type = null;
- for (Iterator iter = processedTypeMap.values().iterator(); iter.hasNext();) {
- type = (Type) iter.next();
- this.qNameToTypeMap.put(type.getXmlType().getQname(), type);
- }
-
- }
-
- public Object getOutputObject(XMLStreamReader reader,
- Operation operation)
- throws XMLStreamException, XmlParsingException {
- Object returnObject = null;
- // first we have to point to the reader to the begining of the element
- while (!reader.isStartElement() && !reader.isEndElement()) {
- reader.next();
- }
-
- // first check whether we have got the correct input element or not
- if (reader.getLocalName().equals(operation.getOutPutElement().getName()) &&
- reader.getNamespaceURI().equals(operation.getOutPutElement().getNamespace())) {
- reader.next();
- if (operation.getOutputParameter() != null) {
- // i.e this is not a void return type
- returnObject = getObjectForParameter(reader, operation.getOutputParameter());
- }
- }
- return returnObject;
- }
-
- public Object[] getInputParameters(XMLStreamReader reader,
- Operation operation)
- throws XMLStreamException,
- XmlParsingException {
-
- List returnObjects = new ArrayList();
- // first we have to point to the reader to the begining for the element
- while (!reader.isStartElement() && !reader.isEndElement()) {
- reader.next();
- }
-
- // first check whether we have got the correct input element or not
- if (reader.getLocalName().equals(operation.getInputElement().getName()) &&
- reader.getNamespaceURI().equals(operation.getInputElement().getNamespace())) {
- // point the reader to parameters
- reader.next();
- Parameter parameter = null;
- List inputParameters = operation.getInputParameters();
- QName parameterQName = null;
-
- for (Iterator iter = inputParameters.iterator(); iter.hasNext();) {
- parameter = (Parameter) iter.next();
- parameterQName = new QName(parameter.getNamespace(), parameter.getName());
- returnObjects.add(getObjectForParameter(reader, parameter));
- // if the reader is at the end of this parameter
- // then we move it to next element.
- if (reader.isEndElement() && reader.getName().equals(parameterQName)){
- reader.next();
- }
- }
-
- } else {
- throw new XmlParsingException("Unexpected Subelement " + reader.getName() + " but " +
- "expected " + operation.getInputElement().getName());
- }
- return returnObjects.toArray();
- }
-
- /**
- * parameter has the same logic as the attribute. so reader pre and post conditions same.
- *
- * @param reader
- * @param parameter
- * @return
- * @throws XMLStreamException
- * @throws XmlParsingException
- */
-
- public Object getObjectForParameter(XMLStreamReader reader,
- Parameter parameter)
- throws XMLStreamException,
- XmlParsingException {
-
- QName parameterQName = new QName(parameter.getNamespace(), parameter.getName());
- return getObjectForElement(reader,
- parameterQName,
- parameter.getType(),
- parameter.isArray(),
- parameter.getElement().isNillable(),
- parameter.getElement().isMinOccurs0(),
- parameter.getClassType(),
- parameter.getJavaClass());
-
- }
-
- /**
- * when calls to this method reader must point to the start of the type.
- * if it is a simple type it points the the text
- * if it is a complex type it points to the start element of the first attribute. and we returning
- * from the method it should point to the end element of the last parameter.
- *
- * @param reader
- * @param type
- * @return
- * @throws XMLStreamException
- * @throws XmlParsingException
- */
-
-
- public Object getObjectForType(XMLStreamReader reader,
- Type type)
- throws XMLStreamException,
- XmlParsingException {
-
- try {
- Object returnObject = null;
- if (type.getXmlType().isSimpleType()) {
- // this is a simple known type for us
- // constructor should be able to invoke with the string.
- if (type.getJavaClass().equals(Object.class)) {
- returnObject = new Object();
- } else {
- // find the object for this string using converter util classs
- returnObject = getSimpleTypeObject(type, reader, reader.getText());
- }
- } else {
- // first we have to point to the reader to the begining for the element
- while (!reader.isStartElement() && !reader.isEndElement()) {
- reader.next();
- }
- // this is a complex type
- returnObject = type.getJavaClass().newInstance();
- // we have to get all the elementField and populate them
- List elementFields = type.getAllElementFields();
- ElementField elementField;
- Object elementFieldObject;
- QName elementFieldQName = null;
-
- for (Iterator iter = elementFields.iterator(); iter.hasNext();) {
- elementField = (ElementField) iter.next();
- elementFieldObject = getObjectForElementField(reader, elementField);
- elementFieldQName = new QName(elementField.getNamespace(), elementField.getName());
- if (elementFieldObject != null) {
- elementField.getSetterMethod().invoke(returnObject, new Object[]{elementFieldObject});
- }
- // if the reader is at the end of this elementField
- // then we move it to next element.
- if (reader.isEndElement() && reader.getName().equals(elementFieldQName)){
- reader.next();
- }
-
- }
-
- }
- return returnObject;
- } catch (InstantiationException e) {
- throw new XmlParsingException("Constructor invoking exception for type " + type.getName());
- } catch (IllegalAccessException e) {
- throw new XmlParsingException("Constructor invoking exception for type " + type.getName());
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- throw new XmlParsingException("Constructor invoking exception for type " + type.getName());
- }
-
- }
-
- private Object getSimpleTypeObject(Type type, XMLStreamReader reader, String value)
- throws XmlParsingException {
- Object returnObject;
- String methodName = null;
- try {
- methodName = getMethodName(type.getJavaClass().getName());
- Method methodToInvoke = this.simpleTypeHandlerClass.getMethod(methodName,new Class[]{String.class});
- returnObject = methodToInvoke.invoke(this.simpleTypeHandler,new Object[]{value});
- } catch (NoSuchMethodException e) {
- throw new XmlParsingException("Can not invoke the converter util class method " + methodName, e);
- } catch (IllegalAccessException e) {
- throw new XmlParsingException("Can not invoke the converter util class method " + methodName, e);
- } catch (InvocationTargetException e) {
- throw new XmlParsingException("Can not invoke the converter util class method " + methodName, e);
- }
- return returnObject;
- }
-
- private String getMethodName(String className) {
- // first handle some exceptional casses
- if (className.equals(Integer.class.getName())) {
- return "convertToInt";
- } else if (className.equals(Calendar.class.getName())) {
- return "convertToDateTime";
- }
- if (className.indexOf(".") > -1) {
- className = className.substring(className.lastIndexOf(".") + 1);
- } else {
- // this is a primitive type class
- // so capitalize the firt letter
- className = className.substring(0, 1).toUpperCase() + className.substring(1);
- }
- return "convertTo" + className;
- }
-
- /**
- * give the relavent object for elementField.
- *
- * @param reader
- * @param elementField
- * @return
- * @throws XMLStreamException
- * @throws XmlParsingException
- */
-
- private Object getObjectForElementField(XMLStreamReader reader,
- ElementField elementField)
- throws XMLStreamException,
- XmlParsingException {
- QName elementFieldQName = new QName(elementField.getNamespace(), elementField.getName());
- return getObjectForElement(reader,
- elementFieldQName,
- elementField.getType(),
- elementField.isArray(),
- elementField.getElement().isNillable(),
- elementField.getElement().isMinOccurs0(),
- elementField.getClassType(),
- elementField.getPropertyDescriptor().getPropertyType());
-
- }
-
- /**
- * element parser corresponds to parse the element (for an attribute or parameter) correctly.
- * when calling to this method reader must point to the start element of the elemetnt. and when returning
- * it should point to the corresponding end eleemnt of the element.
- * if the element is an array it may point to the start element of the next element.
- *
- * @param reader
- * @param elementQName
- * @param elementType
- * @param isArray
- * @param classType
- * @param javaClass - if this is a list javaClass for the list
- * @return
- * @throws XMLStreamException
- * @throws XmlParsingException
- */
-
- private Object getObjectForElement(XMLStreamReader reader,
- QName elementQName,
- Type elementType,
- boolean isArray,
- boolean isNillable,
- boolean isMinOccurs0,
- int classType,
- Class javaClass)
- throws XMLStreamException,
- XmlParsingException {
- // first we have to point to the reader to the begining for the element
- while (!reader.isStartElement() && !reader.isEndElement()) {
- reader.next();
- }
-
- // first validate the attribute
- if (reader.getName().equals(elementQName)) {
-
- String nillble = reader.getAttributeValue(Constants.URI_DEFAULT_SCHEMA_XSI, "nil");
- // actual element type may be different from the element type given
- // if extensions has used.
- Type actualElementType = elementType;
- QName typeQName = getTypeQName(reader);
- if ((typeQName != null) && !elementType.getXmlType().getQname().equals(typeQName)) {
- // i.e this is an extension type
- if (this.qNameToTypeMap.containsKey(typeQName)) {
- actualElementType = (Type) this.qNameToTypeMap.get(typeQName);
- } else {
- throw new XmlParsingException("Unknown type found ==> " + typeQName);
- }
- }
- // point to the complex type elements
- if (isArray) {
- Collection objectsCollection = getCollectionObject(classType, javaClass);
-
- // read the first element
- if ("true".equals(nillble) || "1".equals(nillble)) {
- // this is a nill attribute
- while (!reader.isEndElement()) {
- reader.next();
- }
- if (isNillable){
- objectsCollection.add(null);
- } else {
- throw new XmlParsingException("Element " + elementQName + " can not be null");
- }
-
- } else {
-
- Object returnObject = getElementObjectFromReader(actualElementType, reader);
- objectsCollection.add(returnObject);
-
- // we have to move the cursor until the end element of this attribute
- while (!reader.isEndElement() || !reader.getName().equals(elementQName)) {
- reader.next();
- }
- }
- boolean loop = true;
- while (loop) {
- while (!reader.isEndElement()) {
- reader.next();
- }
- reader.next();
- // now we are at the end element of the first element
- while (!reader.isStartElement() && !reader.isEndElement()) {
- reader.next();
- }
-
- // in this step if it is an end element we have found an end element
- // so have to exit from the loop
- if (reader.isEndElement()) {
- loop = false;
- } else {
- // now it should be in a start element
- // check whether still we read the original element attributes. otherwise return
- if (reader.getName().equals(elementQName)) {
- nillble = reader.getAttributeValue(Constants.URI_DEFAULT_SCHEMA_XSI, "nil");
- // since this is a new element we check for extensions
- actualElementType = elementType;
- typeQName = getTypeQName(reader);
- if ((typeQName != null) && !elementType.getXmlType().getQname().equals(typeQName)) {
- // i.e this is an extension type
- if (this.qNameToTypeMap.containsKey(typeQName)) {
- actualElementType = (Type) this.qNameToTypeMap.get(typeQName);
- } else {
- throw new XmlParsingException("Unknown type found ==> " + typeQName);
- }
- }
- if ("true".equals(nillble) || "1".equals(nillble)) {
- // this is a nill attribute
- while (!reader.isEndElement()) {
- reader.next();
- }
- if (isNillable) {
- objectsCollection.add(null);
- } else {
- throw new XmlParsingException("Element " + elementQName + " can not be null");
- }
- } else {
- Object returnObject = getElementObjectFromReader(actualElementType, reader);
- objectsCollection.add(returnObject);
-
- // we have to move the cursor until the end element of this attribute
- while (!reader.isEndElement() || !reader.getName().equals(elementQName)) {
- reader.next();
- }
- }
- } else {
- loop = false;
- }
-
- }
- }
-
- // this is very important in handling primitivs
- // they can not have null values so if array then we have to return the
- // array object is null
- // for other also it is covenient to assume like that.
- if ((Constants.OTHER_TYPE & classType) == Constants.OTHER_TYPE){
- // i.e this is not a collection type
- List objectsList = (List) objectsCollection;
- if ((objectsCollection.size() == 0) ||
- ((objectsCollection.size() == 1) && (objectsList.get(0) == null))) {
- return null;
- } else {
- // create an array with the original element type
- Object objectArray = Array.newInstance(elementType.getJavaClass(), objectsCollection.size());
- for (int i = 0; i < objectsCollection.size(); i++) {
- Array.set(objectArray, i, objectsList.get(i));
- }
- return objectArray;
- }
- } else if ((Constants.COLLECTION_TYPE & classType) == Constants.COLLECTION_TYPE){
- if ((objectsCollection.size() == 0) ||
- ((objectsCollection.size() == 1) && (objectsCollection.iterator().next() == null))){
- return null;
- } else {
- return objectsCollection;
- }
-
- } else if ((Constants.MAP_TYPE & classType) == Constants.MAP_TYPE){
-
- if ((objectsCollection.size() == 0) ||
- ((objectsCollection.size() == 1) && (objectsCollection.iterator().next() == null))) {
- return null;
-
- } else {
- List mapObjectsList = (List) objectsCollection;
- MapType mapType = null;
- Map mapObject = null;
- if (javaClass.isInterface()) {
- mapObject = new HashMap();
- } else {
- try {
- mapObject = (Map) javaClass.newInstance();
- } catch (InstantiationException e) {
- throw new XmlParsingException("Can not instantiate the java class " + javaClass.getName(), e);
- } catch (IllegalAccessException e) {
- throw new XmlParsingException("Can not instantiate the java class " + javaClass.getName(), e);
- }
-
- }
- for (Iterator iter = mapObjectsList.iterator(); iter.hasNext();) {
- mapType = (MapType) iter.next();
- mapObject.put(mapType.getKey(), mapType.getValue());
- }
-
- return mapObject;
- }
-
- } else {
- throw new XmlParsingException("Unknow class type " + classType);
- }
-
- } else {
- if ("true".equals(nillble) || "1".equals(nillble)) {
- // this is a nill attribute
- while (!reader.isEndElement()) {
- reader.next();
- }
- reader.next();
- if (isNillable) {
- return null;
- } else {
- throw new XmlParsingException("Element " + elementQName + " can not be null");
- }
-
- } else {
-
- Object returnObject = getElementObjectFromReader(actualElementType, reader);
- // we have to move the cursor until the end element of this attribute
- while (!reader.isEndElement() || !reader.getName().equals(elementQName)) {
- reader.next();
- }
- return returnObject;
- }
- }
- } else {
- if (isMinOccurs0) {
- return null;
- } else {
- throw new XmlParsingException("Unexpected Subelement " + reader.getName() + " but " +
- "expected " + elementQName.getLocalPart());
- }
- }
- }
-
- private Object getElementObjectFromReader(Type elementType,
- XMLStreamReader reader)
- throws XmlParsingException, XMLStreamException {
- Object returnObject = null;
- if (RMIBean.class.isAssignableFrom(elementType.getJavaClass())) {
- // this is an rmi bean
- // so invoke the static parse method
- try {
- Method parseMethod = elementType.getJavaClass().getMethod("parse", new Class[]{XMLStreamReader.class, XmlStreamParser.class});
- returnObject = parseMethod.invoke(null, new Object[]{reader, this});
- } catch (NoSuchMethodException e) {
- throw new XmlParsingException("parse method has not been implemented correctly for the rmi bean "
- + elementType.getJavaClass().getName(), e);
- } catch (IllegalAccessException e) {
- throw new XmlParsingException("can not access parse method of the rmi bean "
- + elementType.getJavaClass().getName(), e);
- } catch (InvocationTargetException e) {
- throw new XmlParsingException("can not invoke parse method of the rmi bean "
- + elementType.getJavaClass().getName(), e);
- }
- } else {
- // read the attributes.
- Map javaMethodToValueMap = getJavaMethodValueHashMap(elementType, reader);
- reader.next();
- returnObject = getObjectForType(reader, elementType);
- populateObjectAttributes(javaMethodToValueMap, returnObject);
- }
-
- return returnObject;
- }
-
- private void populateObjectAttributes(Map javaMethodToValueMap, Object returnObject) throws XmlParsingException {
- Method javaMehtod;
- try {
- for (Iterator iter = javaMethodToValueMap.keySet().iterator();iter.hasNext();){
- javaMehtod = (Method) iter.next();
- javaMehtod.invoke(returnObject,new Object[]{javaMethodToValueMap.get(javaMehtod)});
- }
- } catch (IllegalAccessException e) {
- throw new XmlParsingException("Can not set the attribute value");
- } catch (InvocationTargetException e) {
- throw new XmlParsingException("Can not set the attribute value");
- }
- }
-
- private Map getJavaMethodValueHashMap(Type actualElementType, XMLStreamReader reader)
- throws XmlParsingException {
- AttributeField attributeField;
- String attributeVlaue;
- Object attributeObject;
- Map javaMethodToValueMap = new HashMap();
- for (Iterator iter = actualElementType.getAllAttributeFields().iterator();iter.hasNext();){
- attributeField = (AttributeField) iter.next();
- attributeVlaue = reader.getAttributeValue(attributeField.getNamespace(),
- attributeField.getName());
- if (attributeVlaue != null) {
- attributeObject = getSimpleTypeObject(attributeField.getType(), reader, attributeVlaue);
- javaMethodToValueMap.put(attributeField.getSetterMethod(), attributeObject);
- } else if (attributeField.isRequried()){
- throw new XmlParsingException("Required attribute " + attributeField.getName() + " is missing");
- }
-
- }
- return javaMethodToValueMap;
- }
-
- /**
- * returtns the collection object according to the type.
- * @param classType
- * @param javaClass
- * @return
- * @throws XmlParsingException
- */
-
- private Collection getCollectionObject(int classType,
- Class javaClass)
- throws XmlParsingException {
-
- Collection objectsCollection = null;
- try {
- if ((Constants.OTHER_TYPE & classType) == Constants.OTHER_TYPE) {
- // i.e this is not a list or a map
- objectsCollection = new ArrayList();
- } else {
- if (javaClass.isInterface()) {
- if ((Constants.LIST_TYPE & classType) == Constants.LIST_TYPE) {
- objectsCollection = new ArrayList();
- } else if ((Constants.SET_TYPE & classType) == Constants.SET_TYPE) {
- objectsCollection = new HashSet();
- } else if ((Constants.COLLECTION_TYPE & classType) == Constants.COLLECTION_TYPE) {
- objectsCollection = new ArrayList();
- } else if ((Constants.MAP_TYPE & classType) == Constants.MAP_TYPE) {
- objectsCollection = new ArrayList();
- }
- } else {
- if ((Constants.COLLECTION_TYPE & classType) == Constants.COLLECTION_TYPE) {
- objectsCollection = (Collection) javaClass.newInstance();
- } else if ((Constants.MAP_TYPE & classType) == Constants.MAP_TYPE) {
- objectsCollection = new ArrayList();
- }
- }
- }
-
- } catch (InstantiationException e) {
- throw new XmlParsingException("Problem with instanciating the element class " +
- javaClass.getName() , e);
- } catch (IllegalAccessException e) {
- throw new XmlParsingException("Problem with instanciating the element class " +
- javaClass.getName() , e);
- }
- return objectsCollection;
- }
-
- /**
- * reader must be at the start of the element
- *
- * @param reader
- * @return qName for the type attribute
- */
- private QName getTypeQName(XMLStreamReader reader) {
- QName typeQName = null;
- String typeValue = reader.getAttributeValue(Constants.URI_2001_SCHEMA_XSI, "type");
- if ((typeValue != null) && !typeValue.equals("")) {
- int index = typeValue.indexOf(":");
- String nsPrefix = "";
- if (index > -1) {
- nsPrefix = typeValue.substring(0, index);
- }
-
- String localPart = typeValue.substring(index + 1);
- typeQName = new QName(reader.getNamespaceURI(nsPrefix), localPart);
- }
- return typeQName;
- }
-
-}
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed 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.axis2.rmi.databind;
+
+import org.apache.axis2.rmi.metadata.*;
+import org.apache.axis2.rmi.metadata.impl.TypeImpl;
+import org.apache.axis2.rmi.exception.XmlParsingException;
+import org.apache.axis2.rmi.exception.MetaDataPopulateException;
+import org.apache.axis2.rmi.exception.SchemaGenerationException;
+import org.apache.axis2.rmi.util.Constants;
+import org.apache.axis2.rmi.util.JavaTypeToQNameMap;
+import org.apache.axis2.rmi.Configurator;
+import org.apache.axis2.rmi.types.MapType;
+
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.namespace.QName;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
+import java.util.*;
+
+public class XmlStreamParser {
+
+ private Configurator configurator;
+ private Map qNameToTypeMap;
+ private SimpleTypeHandler simpleTypeHandler;
+ private Class simpleTypeHandlerClass;
+ private boolean readerPriorAccess;
+ private boolean priorAccessDetermined = false;
+
+ public XmlStreamParser(Map processedTypeMap,
+ Configurator configurator,
+ Map schemaMap) {
+ this.configurator = configurator;
+ this.simpleTypeHandler = this.configurator.getSimpleTypeHandler();
+ this.simpleTypeHandlerClass = this.simpleTypeHandler.getClass();
+ try {
+ populateQNameToTypeMap(processedTypeMap, schemaMap);
+ } catch (MetaDataPopulateException e) {
+ // TODO: what to do this exceptions is not going to happen
+ } catch (SchemaGenerationException e) {
+ // TODO: what to do this exceptions is not going to happen
+ }
+ }
+
+ private void populateQNameToTypeMap(Map processedTypeMap, Map schemaMap)
+ throws MetaDataPopulateException,
+ SchemaGenerationException {
+ // first add all the proceced type map values
+ Set defaultTypeMapKeys = JavaTypeToQNameMap.getKeys();
+ Class typeClass;
+ for (Iterator iter = defaultTypeMapKeys.iterator(); iter.hasNext();) {
+ typeClass = (Class) iter.next();
+ if (!processedTypeMap.containsKey(typeClass)) {
+ Type newType = new TypeImpl(typeClass);
+ processedTypeMap.put(typeClass, newType);
+ newType.populateMetaData(this.configurator, processedTypeMap);
+ newType.generateSchema(this.configurator, schemaMap);
+ }
+ }
+ this.qNameToTypeMap = new HashMap();
+ Type type = null;
+ for (Iterator iter = processedTypeMap.values().iterator(); iter.hasNext();) {
+ type = (Type) iter.next();
+ this.qNameToTypeMap.put(type.getXmlType().getQname(), type);
+ }
+
+ }
+
+ public Object getOutputObject(XMLStreamReader reader_in,
+ Operation operation)
+ throws XMLStreamException, XmlParsingException {
+ Object returnObject = null;
+
+ determinePriorAccess(reader_in);
+ StatefulXMLStreamReader reader = getStatefulReader(reader_in);
+
+ advanceToFirstElement(reader);
+
+ // first check whether we have got the correct input element or not
+ if (reader.getLocalName().equals(operation.getOutPutElement().getName()) &&
+ reader.getNamespaceURI().equals(operation.getOutPutElement().getNamespace())) {
+ reader.next();
+ if (operation.getOutputParameter() != null) {
+ // i.e this is not a void return type
+ returnObject = getObjectForParameter(reader, operation.getOutputParameter());
+ }
+ }
+ return returnObject;
+ }
+
+ public Object[] getInputParameters(XMLStreamReader reader_in,
+ Operation operation)
+ throws XMLStreamException,
+ XmlParsingException {
+
+ determinePriorAccess(reader_in);
+ StatefulXMLStreamReader reader = getStatefulReader(reader_in);
+
+ List returnObjects = new ArrayList();
+ advanceToFirstElement(reader);
+
+ // first check whether we have got the correct input element or not
+ if (reader.getLocalName().equals(operation.getInputElement().getName()) &&
+ reader.getNamespaceURI().equals(operation.getInputElement().getNamespace())) {
+ // point the reader to parameters
+ reader.next();
+ Parameter parameter = null;
+ List inputParameters = operation.getInputParameters();
+ QName parameterQName = null;
+ int startDepth = reader.getDepth();
+
+ for (Iterator iter = inputParameters.iterator(); iter.hasNext();) {
+ parameter = (Parameter) iter.next();
+ parameterQName = new QName(parameter.getNamespace(), parameter.getName());
+ returnObjects.add(getObjectForParameter(reader, parameter));
+ // if the reader is at the end of this parameter
+ // then we move it to next element.
+ if (reader.isEndElement() && reader.getName().equals(parameterQName)
+ && (readerPriorAccess || reader.getDepth() == startDepth - 1)){
+ reader.next();
+ }
+ }
+
+ } else {
+ throw new XmlParsingException("Unexpected Subelement " + reader.getName() + " but " +
+ "expected " + operation.getInputElement().getName());
+ }
+ return returnObjects.toArray();
+ }
+
+ /**
+ * parameter has the same logic as the attribute. so reader pre and post conditions same.
+ *
+ * @param reader
+ * @param parameter
+ * @return
+ * @throws XMLStreamException
+ * @throws XmlParsingException
+ */
+
+ public Object getObjectForParameter(XMLStreamReader reader_in,
+ Parameter parameter)
+ throws XMLStreamException,
+ XmlParsingException {
+
+ QName parameterQName = new QName(parameter.getNamespace(), parameter.getName());
+
+ determinePriorAccess(reader_in);
+ StatefulXMLStreamReader reader = getStatefulReader(reader_in);
+
+ return getObjectForElement(reader,
+ parameterQName,
+ parameter.getType(),
+ parameter.isArray(),
+ parameter.getElement().isNillable(),
+ parameter.getElement().isMinOccurs0(),
+ parameter.getClassType(),
+ parameter.getJavaClass());
+
+ }
+
+ /**
+ * when calls to this method reader must point to the start of the type.
+ * if it is a simple type it points the the text
+ * if it is a complex type it points to the start element of the first attribute. and we returning
+ * from the method it should point to the end element of the last parameter.
+ *
+ * @param reader
+ * @param type
+ * @return
+ * @throws XMLStreamException
+ * @throws XmlParsingException
+ */
+
+
+ public Object getObjectForType(XMLStreamReader reader_in,
+ Type type)
+ throws XMLStreamException,
+ XmlParsingException {
+
+ try {
+ determinePriorAccess(reader_in);
+ StatefulXMLStreamReader reader = getStatefulReader(reader_in);
+
+ Object returnObject = null;
+ if (type.getXmlType().isSimpleType()) {
+ // this is a simple known type for us
+ // constructor should be able to invoke with the string.
+ if (type.getJavaClass().equals(Object.class)) {
+ returnObject = new Object();
+ } else {
+ // find the object for this string using converter util classes
+ returnObject = getSimpleTypeObject(type, reader, reader.getText());
+ }
+ } else {
+ // first we have to point to the reader to the beginning for the element
+ while (!reader.isStartElement() && !reader.isEndElement()) {
+ reader.next();
+ }
+ int startDepth = reader.getDepth();
+ // this is a complex type
+ returnObject = type.getJavaClass().newInstance();
+ // we have to get all the elementField and populate them
+ List elementFields = type.getAllElementFields();
+ ElementField elementField;
+ Object elementFieldObject;
+ QName elementFieldQName = null;
+
+ for (Iterator iter = elementFields.iterator(); iter.hasNext();) {
+ elementField = (ElementField) iter.next();
+ elementFieldObject = getObjectForElementField(reader, elementField);
+ elementFieldQName = new QName(elementField.getNamespace(), elementField.getName());
+ if (elementFieldObject != null) {
+ elementField.getSetterMethod().invoke(returnObject, new Object[]{elementFieldObject});
+ }
+ // if the reader is at the end of this elementField
+ // then we move it to next element.
+ if (reader.isEndElement() && reader.getName().equals(elementFieldQName)
+ && (readerPriorAccess || reader.getDepth() == startDepth - 1)){
+ reader.next();
+ }
+
+ }
+
+ }
+ return returnObject;
+ } catch (InstantiationException e) {
+ throw new XmlParsingException("Constructor invoking exception for type " + type.getName());
+ } catch (IllegalAccessException e) {
+ throw new XmlParsingException("Constructor invoking exception for type " + type.getName());
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ throw new XmlParsingException("Constructor invoking exception for type " + type.getName());
+ }
+
+ }
+
+ private Object getSimpleTypeObject(Type type, StatefulXMLStreamReader reader, String value)
+ throws XmlParsingException {
+ Object returnObject;
+ String methodName = null;
+ try {
+ methodName = getMethodName(type.getJavaClass().getName());
+ Method methodToInvoke = this.simpleTypeHandlerClass.getMethod(methodName,new Class[]{String.class});
+ returnObject = methodToInvoke.invoke(this.simpleTypeHandler,new Object[]{value});
+ } catch (NoSuchMethodException e) {
+ throw new XmlParsingException("Can not invoke the converter util class method " + methodName, e);
+ } catch (IllegalAccessException e) {
+ throw new XmlParsingException("Can not invoke the converter util class method " + methodName, e);
+ } catch (InvocationTargetException e) {
+ throw new XmlParsingException("Can not invoke the converter util class method " + methodName, e);
+ }
+ return returnObject;
+ }
+
+ private String getMethodName(String className) {
+ // first handle some exceptional classes
+ if (className.equals(Integer.class.getName())) {
+ return "convertToInt";
+ } else if (className.equals(Calendar.class.getName())) {
+ return "convertToDateTime";
+ }
+ if (className.indexOf(".") > -1) {
+ className = className.substring(className.lastIndexOf(".") + 1);
+ } else {
+ // this is a primitive type class
+ // so capitalize the first letter
+ className = className.substring(0, 1).toUpperCase() + className.substring(1);
+ }
+ return "convertTo" + className;
+ }
+
+ /**
+ * give the relevant object for elementField.
+ *
+ * @param reader
+ * @param elementField
+ * @return
+ * @throws XMLStreamException
+ * @throws XmlParsingException
+ */
+
+ private Object getObjectForElementField(StatefulXMLStreamReader reader,
+ ElementField elementField)
+ throws XMLStreamException,
+ XmlParsingException {
+ QName elementFieldQName = new QName(elementField.getNamespace(), elementField.getName());
+ return getObjectForElement(reader,
+ elementFieldQName,
+ elementField.getType(),
+ elementField.isArray(),
+ elementField.getElement().isNillable(),
+ elementField.getElement().isMinOccurs0(),
+ elementField.getClassType(),
+ elementField.getPropertyDescriptor().getPropertyType());
+
+ }
+
+ /**
+ * element parser corresponds to parse the element (for an attribute or parameter) correctly.
+ * when calling to this method reader must point to the start element of the element. and when returning
+ * it should point to the corresponding end element of the element.
+ * if the element is an array it may point to the start element of the next element.
+ *
+ * @param reader
+ * @param elementQName
+ * @param elementType
+ * @param isArray
+ * @param classType
+ * @param javaClass - if this is a list javaClass for the list
+ * @return
+ * @throws XMLStreamException
+ * @throws XmlParsingException
+ */
+
+ private Object getObjectForElement(StatefulXMLStreamReader reader,
+ QName elementQName,
+ Type elementType,
+ boolean isArray,
+ boolean isNillable,
+ boolean isMinOccurs0,
+ int classType,
+ Class javaClass)
+ throws XMLStreamException,
+ XmlParsingException {
+ // first we have to point to the reader to the beginning for the element
+ while (!reader.isStartElement() && !reader.isEndElement()) {
+ reader.next();
+ }
+
+ // first validate the attribute
+ if (reader.getName().equals(elementQName)) {
+
+ String nillble = reader.getAttributeValue(Constants.URI_DEFAULT_SCHEMA_XSI, "nil");
+ // actual element type may be different from the element type given
+ // if extensions has used.
+ Type actualElementType = elementType;
+ QName typeQName = getTypeQName(reader);
+ if ((typeQName != null) && !elementType.getXmlType().getQname().equals(typeQName)) {
+ // i.e this is an extension type
+ if (this.qNameToTypeMap.containsKey(typeQName)) {
+ actualElementType = (Type) this.qNameToTypeMap.get(typeQName);
+ } else {
+ throw new XmlParsingException("Unknown type found ==> " + typeQName);
+ }
+ }
+ // point to the complex type elements
+ if (isArray) {
+ Collection objectsCollection = getCollectionObject(classType, javaClass);
+
+ // read the first element
+ if ("true".equals(nillble) || "1".equals(nillble)) {
+ // this is a nill attribute
+ while (!reader.isEndElement()) {
+ reader.next();
+ }
+ if (isNillable){
+ objectsCollection.add(null);
+ } else {
+ throw new XmlParsingException("Element " + elementQName + " can not be null");
+ }
+
+ } else {
+
+ Object returnObject = getElementObjectFromReader(actualElementType, reader);
+ objectsCollection.add(returnObject);
+
+ // we have to move the cursor until the end element of this attribute
+ while (!reader.isEndElement() || !reader.getName().equals(elementQName)) {
+ reader.next();
+ }
+ }
+ boolean loop = true;
+ while (loop) {
+ while (!reader.isEndElement()) {
+ reader.next();
+ }
+ reader.next();
+ // now we are at the end element of the first element
+ while (!reader.isStartElement() && !reader.isEndElement()) {
+ reader.next();
+ }
+
+ // in this step if it is an end element we have found an end element
+ // so have to exit from the loop
+ if (reader.isEndElement()) {
+ loop = false;
+ } else {
+ // now it should be in a start element
+ // check whether still we read the original element attributes. otherwise return
+ if (reader.getName().equals(elementQName)) {
+ nillble = reader.getAttributeValue(Constants.URI_DEFAULT_SCHEMA_XSI, "nil");
+ // since this is a new element we check for extensions
+ actualElementType = elementType;
+ typeQName = getTypeQName(reader);
+ if ((typeQName != null) && !elementType.getXmlType().getQname().equals(typeQName)) {
+ // i.e this is an extension type
+ if (this.qNameToTypeMap.containsKey(typeQName)) {
+ actualElementType = (Type) this.qNameToTypeMap.get(typeQName);
+ } else {
+ throw new XmlParsingException("Unknown type found ==> " + typeQName);
+ }
+ }
+ if ("true".equals(nillble) || "1".equals(nillble)) {
+ // this is a nill attribute
+ while (!reader.isEndElement()) {
+ reader.next();
+ }
+ if (isNillable) {
+ objectsCollection.add(null);
+ } else {
+ throw new XmlParsingException("Element " + elementQName + " can not be null");
+ }
+ } else {
+ Object returnObject = getElementObjectFromReader(actualElementType, reader);
+ objectsCollection.add(returnObject);
+
+ // we have to move the cursor until the end element of this attribute
+ while (!reader.isEndElement() || !reader.getName().equals(elementQName)) {
+ reader.next();
+ }
+ }
+ } else {
+ loop = false;
+ }
+
+ }
+ }
+
+ // this is very important in handling primitives
+ // they can not have null values so if array then we have to return the
+ // array object is null
+ // for other also it is convenient to assume like that.
+ if ((Constants.OTHER_TYPE & classType) == Constants.OTHER_TYPE){
+ // i.e this is not a collection type
+ List objectsList = (List) objectsCollection;
+ if ((objectsCollection.size() == 0) ||
+ ((objectsCollection.size() == 1) && (objectsList.get(0) == null))) {
+ return null;
+ } else {
+ // create an array with the original element type
+ Object objectArray = Array.newInstance(elementType.getJavaClass(), objectsCollection.size());
+ for (int i = 0; i < objectsCollection.size(); i++) {
+ Array.set(objectArray, i, objectsList.get(i));
+ }
+ return objectArray;
+ }
+ } else if ((Constants.COLLECTION_TYPE & classType) == Constants.COLLECTION_TYPE){
+ if ((objectsCollection.size() == 0) ||
+ ((objectsCollection.size() == 1) && (objectsCollection.iterator().next() == null))){
+ return null;
+ } else {
+ return objectsCollection;
+ }
+
+ } else if ((Constants.MAP_TYPE & classType) == Constants.MAP_TYPE){
+
+ if ((objectsCollection.size() == 0) ||
+ ((objectsCollection.size() == 1) && (objectsCollection.iterator().next() == null))) {
+ return null;
+
+ } else {
+ List mapObjectsList = (List) objectsCollection;
+ MapType mapType = null;
+ Map mapObject = null;
+ if (javaClass.isInterface()) {
+ mapObject = new HashMap();
+ } else {
+ try {
+ mapObject = (Map) javaClass.newInstance();
+ } catch (InstantiationException e) {
+ throw new XmlParsingException("Can not instantiate the java class " + javaClass.getName(), e);
+ } catch (IllegalAccessException e) {
+ throw new XmlParsingException("Can not instantiate the java class " + javaClass.getName(), e);
+ }
+
+ }
+ for (Iterator iter = mapObjectsList.iterator(); iter.hasNext();) {
+ mapType = (MapType) iter.next();
+ mapObject.put(mapType.getKey(), mapType.getValue());
+ }
+
+ return mapObject;
+ }
+
+ } else {
+ throw new XmlParsingException("Unknow class type " + classType);
+ }
+
+ } else {
+ if ("true".equals(nillble) || "1".equals(nillble)) {
+ // this is a nill attribute
+ while (!reader.isEndElement()) {
+ reader.next();
+ }
+ reader.next();
+ if (isNillable) {
+ return null;
+ } else {
+ throw new XmlParsingException("Element " + elementQName + " can not be null");
+ }
+
+ } else {
+
+ Object returnObject = getElementObjectFromReader(actualElementType, reader);
+ // we have to move the cursor until the end element of this attribute
+ while (!reader.isEndElement() || !reader.getName().equals(elementQName)) {
+ reader.next();
+ }
+ return returnObject;
+ }
+ }
+ } else {
+ if (isMinOccurs0) {
+ return null;
+ } else {
+ throw new XmlParsingException("Unexpected Subelement " + reader.getName() + " but " +
+ "expected " + elementQName.getLocalPart());
+ }
+ }
+ }
+
+ private Object getElementObjectFromReader(Type elementType,
+ StatefulXMLStreamReader reader)
+ throws XmlParsingException, XMLStreamException {
+ Object returnObject = null;
+ if (RMIBean.class.isAssignableFrom(elementType.getJavaClass())) {
+ // this is an rmi bean
+ // so invoke the static parse method
+ try {
+ Method parseMethod = elementType.getJavaClass().getMethod("parse", new Class[]{XMLStreamReader.class, XmlStreamParser.class});
+ returnObject = parseMethod.invoke(null, new Object[]{reader, this});
+ } catch (NoSuchMethodException e) {
+ throw new XmlParsingException("parse method has not been implemented correctly for the rmi bean "
+ + elementType.getJavaClass().getName(), e);
+ } catch (IllegalAccessException e) {
+ throw new XmlParsingException("can not access parse method of the rmi bean "
+ + elementType.getJavaClass().getName(), e);
+ } catch (InvocationTargetException e) {
+ throw new XmlParsingException("can not invoke parse method of the rmi bean "
+ + elementType.getJavaClass().getName(), e);
+ }
+ } else {
+ // read the attributes.
+ Map javaMethodToValueMap = getJavaMethodValueHashMap(elementType, reader);
+ reader.next();
+ returnObject = getObjectForType(reader, elementType);
+ populateObjectAttributes(javaMethodToValueMap, returnObject);
+ }
+
+ return returnObject;
+ }
+
+ private void populateObjectAttributes(Map javaMethodToValueMap, Object returnObject) throws XmlParsingException {
+ Method javaMehtod;
+ try {
+ for (Iterator iter = javaMethodToValueMap.keySet().iterator();iter.hasNext();){
+ javaMehtod = (Method) iter.next();
+ javaMehtod.invoke(returnObject,new Object[]{javaMethodToValueMap.get(javaMehtod)});
+ }
+ } catch (IllegalAccessException e) {
+ throw new XmlParsingException("Can not set the attribute value");
+ } catch (InvocationTargetException e) {
+ throw new XmlParsingException("Can not set the attribute value");
+ }
+ }
+
+ private Map getJavaMethodValueHashMap(Type actualElementType, StatefulXMLStreamReader reader)
+ throws XmlParsingException {
+ AttributeField attributeField;
+ String attributeVlaue;
+ Object attributeObject;
+ Map javaMethodToValueMap = new HashMap();
+ for (Iterator iter = actualElementType.getAllAttributeFields().iterator();iter.hasNext();){
+ attributeField = (AttributeField) iter.next();
+ attributeVlaue = reader.getAttributeValue(attributeField.getNamespace(),
+ attributeField.getName());
+ if (attributeVlaue != null) {
+ attributeObject = getSimpleTypeObject(attributeField.getType(), reader, attributeVlaue);
+ javaMethodToValueMap.put(attributeField.getSetterMethod(), attributeObject);
+ } else if (attributeField.isRequried()){
+ throw new XmlParsingException("Required attribute " + attributeField.getName() + " is missing");
+ }
+
+ }
+ return javaMethodToValueMap;
+ }
+
+ /**
+ * returns the collection object according to the type.
+ * @param classType
+ * @param javaClass
+ * @return
+ * @throws XmlParsingException
+ */
+
+ private Collection getCollectionObject(int classType,
+ Class javaClass)
+ throws XmlParsingException {
+
+ Collection objectsCollection = null;
+ try {
+ if ((Constants.OTHER_TYPE & classType) == Constants.OTHER_TYPE) {
+ // i.e this is not a list or a map
+ objectsCollection = new ArrayList();
+ } else {
+ if (javaClass.isInterface()) {
+ if ((Constants.LIST_TYPE & classType) == Constants.LIST_TYPE) {
+ objectsCollection = new ArrayList();
+ } else if ((Constants.SET_TYPE & classType) == Constants.SET_TYPE) {
+ objectsCollection = new HashSet();
+ } else if ((Constants.COLLECTION_TYPE & classType) == Constants.COLLECTION_TYPE) {
+ objectsCollection = new ArrayList();
+ } else if ((Constants.MAP_TYPE & classType) == Constants.MAP_TYPE) {
+ objectsCollection = new ArrayList();
+ }
+ } else {
+ if ((Constants.COLLECTION_TYPE & classType) == Constants.COLLECTION_TYPE) {
+ objectsCollection = (Collection) javaClass.newInstance();
+ } else if ((Constants.MAP_TYPE & classType) == Constants.MAP_TYPE) {
+ objectsCollection = new ArrayList();
+ }
+ }
+ }
+
+ } catch (InstantiationException e) {
+ throw new XmlParsingException("Problem with instanciating the element class " +
+ javaClass.getName() , e);
+ } catch (IllegalAccessException e) {
+ throw new XmlParsingException("Problem with instanciating the element class " +
+ javaClass.getName() , e);
+ }
+ return objectsCollection;
+ }
+
+ /**
+ * reader must be at the start of the element
+ *
+ * @param reader
+ * @return qName for the type attribute
+ */
+ private QName getTypeQName(StatefulXMLStreamReader reader) {
+ QName typeQName = null;
+ String typeValue = reader.getAttributeValue(Constants.URI_2001_SCHEMA_XSI, "type");
+ if ((typeValue != null) && !typeValue.equals("")) {
+ int index = typeValue.indexOf(":");
+ String nsPrefix = "";
+ if (index > -1) {
+ nsPrefix = typeValue.substring(0, index);
+ }
+
+ String localPart = typeValue.substring(index + 1);
+ typeQName = new QName(reader.getNamespaceURI(nsPrefix), localPart);
+ }
+ return typeQName;
+ }
+
+ /**
+ * Determine if the reader has been advanced beyond its initial location, prior
+ * to the methods within XmlStreamParser being called.
+ *
+ * @param reader The XMLStreamReader on which the XmlStreamParser is acting.
+ * @return true if the reader has been advanced beyond its initial location, false otherwise
+ */
+ private boolean determinePriorAccess(XMLStreamReader reader) {
+ if (!priorAccessDetermined) {
+ if (reader.getLocation().getCharacterOffset() == 0)
+ readerPriorAccess = false;
+ else
+ readerPriorAccess = true;
+
+ priorAccessDetermined = true;
+ }
+ return readerPriorAccess;
+ }
+
+ /**
+ * Provide a mechanism (a stack) to track the current state of the XMLStream
+ *
+ * @param reader_in the XMLStreamReader that the XmlStreamParser is acting on
+ * @return a StatefulXMLStreamReader to monitor the state of the XMLStreamReader
+ */
+ private StatefulXMLStreamReader getStatefulReader(XMLStreamReader reader_in) {
+ if (reader_in instanceof StatefulXMLStreamReader)
+ return (StatefulXMLStreamReader) reader_in;
+ else
+ return new StatefulXMLStreamReader(reader_in, readerPriorAccess);
+ }
+
+ /**
+ * Advance the reader to point to the beginning of the element
+ * @param reader the StatefulXMLStreamReader we are using to parse the XMLStream
+ */
+
+ private void advanceToFirstElement(StatefulXMLStreamReader reader) throws XMLStreamException {
+
+ if (readerPriorAccess) {
+ while (!reader.isStartElement() && !reader.isEndElement() && reader.hasNext()) {
+ reader.next();
+ }
+ } else {
+ while (reader.getDepth() == 0 && reader.hasNext()) {
+ reader.next();
+ }
+ }
+ }
+}
Modified: webservices/axis2/branches/java/jaxws21/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/saaj/src/org/apache/axis2/saaj/SOAPHeaderImpl.java Tue Jan 15 08:21:22 2008
@@ -138,14 +138,14 @@
* @throws SOAPException if a SOAP error occurs
*/
public SOAPHeaderElement addHeaderElement(Name name) throws SOAPException {
+
if (name.getURI() == null
- || name.getURI().trim().length() == 0
- || name.getPrefix() == null
- || name.getPrefix().trim().length() == 0) {
+ || name.getURI().trim().length() == 0) {
throw new SOAPException("SOAP1.1 and SOAP1.2 requires all HeaderElements to have " +
- "qualified namespace.");
+ "a namespace.");
}
- OMNamespace ns = new NamespaceImpl(name.getURI(), name.getPrefix());
+ String prefix = name.getPrefix() == null ? "" : name.getPrefix();
+ OMNamespace ns = new NamespaceImpl(name.getURI(), prefix);
SOAPHeaderBlock headerBlock = null;
if (this.element.getOMFactory() instanceof SOAP11Factory) {
Modified: webservices/axis2/branches/java/jaxws21/modules/scripting/src/org/apache/axis2/scripting/ScriptDeploymentEngine.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/scripting/src/org/apache/axis2/scripting/ScriptDeploymentEngine.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/scripting/src/org/apache/axis2/scripting/ScriptDeploymentEngine.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/scripting/src/org/apache/axis2/scripting/ScriptDeploymentEngine.java Tue Jan 15 08:21:22 2008
@@ -18,21 +18,13 @@
*/
package org.apache.axis2.scripting;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
import org.apache.axis2.AxisFault;
import org.apache.axis2.deployment.DeploymentEngine;
import org.apache.axis2.deployment.DeploymentErrorMsgs;
import org.apache.axis2.deployment.DeploymentException;
import org.apache.axis2.deployment.repository.util.DeploymentFileData;
import org.apache.axis2.deployment.repository.util.WSInfo;
+import org.apache.axis2.deployment.util.Utils;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
@@ -44,6 +36,15 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
/**
* An Axis2 DeploymentEngine subclass for deploying script services
* supporting hot deploy and hot update.
@@ -116,10 +117,11 @@
for (int i = 0; i < wsToUnDeploy.size(); i++) {
try {
WSInfo wsInfo = (WSInfo)wsToUnDeploy.get(i);
+ String fileName = Utils.getShortFileName(wsInfo.getFileName());
// if (wsInfo.getType() == TYPE_SERVICE) {
if (isHotUpdate()) {
try {
- serviceName = getAxisServiceName(wsInfo.getFileName());
+ serviceName = getAxisServiceName(fileName);
if (!undeployed.contains(serviceName)) {
realAxisConfig.removeServiceGroup(serviceName);
undeployed.add(serviceName);
@@ -129,11 +131,11 @@
} catch (AxisFault axisFault) {
// May be a faulty service
realAxisConfig.removeFaultyService(serviceName);
- log.debug("removeFaultyService: " + wsInfo.getFileName());
+ log.debug("removeFaultyService: " + fileName);
}
} else {
realAxisConfig.removeFaultyService(serviceName);
- log.debug("not hotUpdate, removeFaultyService: " + wsInfo.getFileName());
+ log.debug("not hotUpdate, removeFaultyService: " + fileName);
}
// }
} catch (Exception e) {
Modified: webservices/axis2/branches/java/jaxws21/modules/soapmonitor/src/org/apache/axis2/soapmonitor/applet/SOAPMonitorApplet.java
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/java/jaxws21/modules/soapmonitor/src/org/apache/axis2/soapmonitor/applet/SOAPMonitorApplet.java?rev=612147&r1=612146&r2=612147&view=diff
==============================================================================
--- webservices/axis2/branches/java/jaxws21/modules/soapmonitor/src/org/apache/axis2/soapmonitor/applet/SOAPMonitorApplet.java (original)
+++ webservices/axis2/branches/java/jaxws21/modules/soapmonitor/src/org/apache/axis2/soapmonitor/applet/SOAPMonitorApplet.java Tue Jan 15 08:21:22 2008
@@ -16,6 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
+package org.apache.axis2.soapmonitor.applet;
import java.awt.*;
import java.awt.event.*;
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org