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 aj...@apache.org on 2006/02/09 12:00:06 UTC
svn commit: r376259 - in /webservices/axis2/trunk/java/modules:
adb/src/org/apache/axis2/databinding/utils/
codegen/src/org/apache/axis2/schema/
codegen/src/org/apache/axis2/schema/template/
wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/
Author: ajith
Date: Thu Feb 9 03:00:02 2006
New Revision: 376259
URL: http://svn.apache.org/viewcvs?rev=376259&view=rev
Log:
1.Updated the state machines to handle ignorable whitespaces
2.The ADB generated code had a slight problem in the parser position. It's being fixed.
3.SchemaCompiler picked up local elements as global elements. It's being fixed also
Modified:
webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java
webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl
webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
Modified: webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java (original)
+++ webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleArrayReaderStateMachine.java Thu Feb 9 03:00:02 2006
@@ -41,7 +41,7 @@
public void setNillable(){
- nillable = true;
+ nillable = true;
}
/**
@@ -70,12 +70,12 @@
//test for the nillable attribute
if (currentState==START_ELEMENT_FOUND_STATE &&
- nillable){
- if (TRUE.equals(reader.getAttributeValue("",NIL))){
- list.add(null);
- //force the state to be null found
- currentState= NULLED_STATE;
- }
+ nillable){
+ if (TRUE.equals(reader.getAttributeValue("",NIL))){
+ list.add(null);
+ //force the state to be null found
+ currentState= NULLED_STATE;
+ }
}
if (currentState==TEXT_FOUND_STATE){
@@ -84,11 +84,11 @@
}
//increment the parser only if the state is
//not finished
- if (currentState!=FINISHED_STATE
- && currentState!= ILLEGAL_STATE){
- reader.next();
+ if (currentState!=FINISHED_STATE
+ && currentState!= ILLEGAL_STATE){
+ reader.next();
}
-
+
}while(currentState!=FINISHED_STATE
&& currentState!= ILLEGAL_STATE);
@@ -109,23 +109,23 @@
if (event== XMLStreamConstants.START_DOCUMENT && currentState==INIT_STATE){
currentState = STARTED_STATE;
- //start element found at init
+ //start element found at init
}else if (event==XMLStreamConstants.START_ELEMENT && currentState==INIT_STATE){
if (elementNameToTest.equals(reader.getName())){
currentState = START_ELEMENT_FOUND_STATE;
}else{
currentState = STARTED_STATE;
}
- //start element found after starting
+ //start element found after starting
}else if (event==XMLStreamConstants.START_ELEMENT && currentState==STARTED_STATE) {
if (elementNameToTest.equals(reader.getName())){
currentState = START_ELEMENT_FOUND_STATE;
}
- //characters found after start
+ //characters found after start
}else if (event==XMLStreamConstants.CHARACTERS && currentState==START_ELEMENT_FOUND_STATE){
currentState = TEXT_FOUND_STATE;
- //end element found after characters
+ //end element found after characters
} else if (event==XMLStreamConstants.END_ELEMENT && currentState==TEXT_FOUND_STATE){
if (elementNameToTest.equals(reader.getName())){
currentState = END_ELEMENT_FOUND_STATE;
@@ -133,30 +133,41 @@
currentState = ILLEGAL_STATE;
}
- //another start element found after end-element
+ //characters found - if this is a characters event that was in the correct place then
+ //it would have been handled already. we need to check whether this is a ignorable
+ //whitespace and if not push the state machine to a illegal state.
+ }else if (event==XMLStreamConstants.CHARACTERS){
+ if (reader.getText().trim().length()==0){
+ //the text is empty - don't change the state
+ }else{
+ //we do NOT handle mixed content
+ currentState = ILLEGAL_STATE;
+ }
+
+ //another start element found after end-element
}else if (event==XMLStreamConstants.START_ELEMENT && currentState==END_ELEMENT_FOUND_STATE ) {
if (elementNameToTest.equals(reader.getName())){
currentState = START_ELEMENT_FOUND_STATE;
}else{
currentState = FINISHED_STATE;
}
- //another end element found after end-element
+ //another end element found after end-element
}else if (event==XMLStreamConstants.END_ELEMENT && currentState==END_ELEMENT_FOUND_STATE ) {
currentState = FINISHED_STATE;
- //end document found
+ //end document found
}else if (event==XMLStreamConstants.END_DOCUMENT){
currentState = FINISHED_STATE;
- //the element was found to be null and this state was forced.
- //we are sure here that the parser was at the START_ELEMENT_FOUND_STATE before
- //being forced. Hence we need to advance the parser upto the end element and
- //set the state to be end element found
+ //the element was found to be null and this state was forced.
+ //we are sure here that the parser was at the START_ELEMENT_FOUND_STATE before
+ //being forced. Hence we need to advance the parser upto the end element and
+ //set the state to be end element found
}else if (currentState==NULLED_STATE){
- while (event!= XMLStreamConstants.END_ELEMENT){
- event=reader.next();
- }
- currentState = END_ELEMENT_FOUND_STATE;
- //all other combinations are invalid
+ while (event!= XMLStreamConstants.END_ELEMENT){
+ event=reader.next();
+ }
+ currentState = END_ELEMENT_FOUND_STATE;
+ //all other combinations are invalid
}else{
currentState = ILLEGAL_STATE;
}
Modified: webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java (original)
+++ webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/SimpleElementReaderStateMachine.java Thu Feb 9 03:00:02 2006
@@ -33,6 +33,7 @@
private int currentState = INIT_STATE;
private boolean nillable = false;
private String text="";
+ private String errorMessage = "";
/**
*
@@ -54,6 +55,7 @@
*/
public void setElementNameToTest(QName elementNameToTest) {
this.elementNameToTest = elementNameToTest;
+
}
/**
@@ -65,6 +67,7 @@
currentState = INIT_STATE;
nillable = false;
text="";
+ errorMessage = "";
}
/**
* public read method - reads a given reader to extract the text value
@@ -98,7 +101,7 @@
&& currentState!= ILLEGAL_STATE);
if (currentState==ILLEGAL_STATE){
- throw new RuntimeException("Illegal state!");
+ throw new RuntimeException("Illegal state!" + errorMessage);
}
}
@@ -126,19 +129,32 @@
if (elementNameToTest.equals(reader.getName())){
currentState = START_ELEMENT_FOUND_STATE;
}
- //characteres found after starting
+ //characteres found after start element
}else if (event==XMLStreamConstants.CHARACTERS && currentState==START_ELEMENT_FOUND_STATE){
currentState = TEXT_FOUND_STATE;
+ //characters found - if this is a characters event that was in the correct place then
+ //it would have been handled already. we need to check whether this is a ignorable
+ //whitespace and if not push the state machine to a illegal state.
+ }else if (event==XMLStreamConstants.CHARACTERS){
+ if (reader.getText().trim().length()==0){
+ //the text is empty - don't change the state
+ }else{
+ //we do NOT handle mixed content
+ currentState = ILLEGAL_STATE;
+ errorMessage = "Mixed Content " +reader.getText(); //todo I18n this
+ }
+
//End element found after starting This means we've found an empty element like <foo/>
}else if (event==XMLStreamConstants.END_ELEMENT && currentState==START_ELEMENT_FOUND_STATE){
//force the text to be empty!
text = "";
-
+
if (elementNameToTest.equals(reader.getName())){
currentState = END_ELEMENT_FOUND_STATE;
}else{
currentState = ILLEGAL_STATE;
+ errorMessage = "Wrong element name " +reader.getName(); //todo I18n this
}
// end element found after characters
@@ -147,6 +163,8 @@
currentState = END_ELEMENT_FOUND_STATE;
}else{
currentState = ILLEGAL_STATE;
+ //set the error message
+ errorMessage = "Wrong element name " +reader.getName(); //todo I18n this
}
//end has been reached
@@ -165,6 +183,7 @@
}else{
currentState = ILLEGAL_STATE;
+ errorMessage = "Current state is " + currentState ; //todo I18n this
}
}
Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/SchemaCompiler.java Thu Feb 9 03:00:02 2006
@@ -65,9 +65,13 @@
private CompilerOptions options;
private HashMap processedTypemap;
- //The processedElementMap and the processedElementList have a subtle difference
- //The writing to the processedElementList happens when an outer element is processed.
+ //the list of processedElements for the outer elements
private HashMap processedElementMap;
+
+ // keeps a list of child element references per outer element. the content of this
+ // map would be a QName and another hashmap
+ private HashMap processedElementChildrenMap;
+
private HashMap processedAnonymousComplexTypesMap;
//we need this map to keep the referenced elements. these elements need to be kept seperate
//to avoid conflicts
@@ -138,6 +142,7 @@
processedTypeMetaInfoMap = new HashMap();
processedElementRefMap = new HashMap();
nillableElementList = new ArrayList();
+ processedElementChildrenMap = new HashMap();
//load the writer a nd initiliaze the base type
writer = SchemaPropertyLoader.getBeanWriterInstance();
@@ -200,7 +205,7 @@
//this is the set of outer elements so we need to generate classes
//The outermost elements do not contain occurence counts (!) so we do not need
//to check for arraytypes
- processElement((XmlSchemaElement) xmlSchemaElement1Iterator.next(), true, schema);
+ processElement((XmlSchemaElement) xmlSchemaElement1Iterator.next(), schema);
}
@@ -295,9 +300,26 @@
processedElementMap.put(xsElt.getQName(), writtenClassName);
}
+ /**
+ * For inner elements
+ * @param xsElt
+ * @param innerElementMap
+ * @param parentSchema
+ * @throws SchemaCompilationException
+ */
+ private void processElement(XmlSchemaElement xsElt,Map innerElementMap,List localNillableList,XmlSchema parentSchema) throws SchemaCompilationException {
+ processElement(xsElt,false,innerElementMap,localNillableList,parentSchema);
+ }
-
-
+ /**
+ * For outer elements
+ * @param xsElt
+ * @param parentSchema
+ * @throws SchemaCompilationException
+ */
+ private void processElement(XmlSchemaElement xsElt,XmlSchema parentSchema) throws SchemaCompilationException {
+ processElement(xsElt,true,null,null,parentSchema);
+ }
/**
* Process and Element
*
@@ -307,7 +329,7 @@
* @param isArray- flag saying whether the elements represents an array
* @throws SchemaCompilationException
*/
- private void processElement(XmlSchemaElement xsElt, boolean isOuter,XmlSchema parentSchema) throws SchemaCompilationException {
+ private void processElement(XmlSchemaElement xsElt, boolean isOuter,Map innerElementMap,List localNillableList, XmlSchema parentSchema) throws SchemaCompilationException {
//The processing element logic seems to be quite simple. Look at the relevant schema type
//for each and every element and process that accordingly.
@@ -326,19 +348,20 @@
if (!isOuter) {
String className = findClassName(schemaType.getQName(), isArray(xsElt));
- this.processedElementMap.put(xsElt.getQName(), className);
+ //since this is a inner element we should add it to the inner element map
+ innerElementMap.put(xsElt.getQName(), className);
+ }else{
+ this.processedElementList.add(xsElt.getQName());
}
- this.processedElementList.add(xsElt.getQName());
}else if (xsElt.getRefName()!=null){
//process the referenced type. It could be thought that the referenced element replaces this
//element
XmlSchemaElement referencedElement = parentSchema.getElementByName(xsElt.getRefName());
- processElement(referencedElement,
- true, //if the element is referenced, then it should be one of the outer (global) ones
- parentSchema);
+ //if the element is referenced, then it should be one of the outer (global) ones
+ processElement(referencedElement, parentSchema);
//no outer check required here. If the element is having a ref, then it is definitely
//not an outer element.
@@ -353,14 +376,20 @@
//this specifically happens with xsd:anyType.
if (!isOuter) {
String className = findClassName(xsElt.getSchemaTypeName(), isArray(xsElt));
- this.processedElementMap.put(xsElt.getQName(), className);
+ innerElementMap.put(xsElt.getQName(), className);
+ }else{
+ this.processedElementList.add(xsElt.getQName());
}
- this.processedElementList.add(xsElt.getQName());
+
}
//add this elements QName to the nillable group if it has the nillable attribute
if (xsElt.isNillable()){
- this.nillableElementList.add(xsElt.getQName());
+ if (isOuter){
+ this.nillableElementList.add(xsElt.getQName());
+ }else{
+ localNillableList.add(xsElt.getQName());
+ }
}
}
@@ -713,7 +742,10 @@
boolean order,
XmlSchema parentSchema) throws SchemaCompilationException {
int count = items.getCount();
- Map processedElements = new HashMap();
+ Map processedElementArrayStatusMap = new HashMap();
+ Map processedElementTypeMap = new HashMap();
+ List localNillableList = new ArrayList();
+
Map elementOrderMap = new HashMap();
for (int i = 0; i < count; i++) {
@@ -724,8 +756,8 @@
XmlSchemaElement xsElt = (XmlSchemaElement) item;
boolean isArray = isArray(xsElt);
- processElement(xsElt, false,parentSchema); //we know for sure this is not an outer type
- processedElements.put(xsElt, (isArray) ? Boolean.TRUE : Boolean.FALSE);
+ processElement(xsElt, processedElementTypeMap,localNillableList,parentSchema); //we know for sure this is not an outer type
+ processedElementArrayStatusMap.put(xsElt, (isArray) ? Boolean.TRUE : Boolean.FALSE);
if (order) {
//we need to keep the order of the elements. So push the elements to another
//hashmap with the order number
@@ -744,29 +776,29 @@
}
// loop through the processed items and add them to the matainf object
- Iterator processedElementsIterator = processedElements.keySet().iterator();
+ Iterator processedElementsIterator = processedElementArrayStatusMap.keySet().iterator();
int startingItemNumberOrder = metainfHolder.getOrderStartPoint();
while (processedElementsIterator.hasNext()) {
XmlSchemaElement elt = (XmlSchemaElement) processedElementsIterator.next();
String clazzName;
QName qName;
- if (elt.getQName()!=null){ //probably this is referenced
- clazzName = (String) processedElementMap.get(elt.getQName());
+ if (elt.getQName()!=null){
+ clazzName = (String) processedElementTypeMap.get(elt.getQName());
qName = elt.getQName();
metainfHolder.registerMapping(qName,
elt.getSchemaTypeName()
, clazzName,
- ((Boolean) processedElements.get(elt)).booleanValue() ?
+ ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
SchemaConstants.ANY_ARRAY_TYPE :
SchemaConstants.ELEMENT_TYPE);
- }else{
+ }else{ //probably this is referenced
clazzName = (String)processedElementRefMap.get(elt.getRefName());
qName = elt.getRefName();
metainfHolder.registerMapping(qName,
parentSchema.getElementByName(elt.getRefName()).getSchemaTypeName()
, clazzName,
- ((Boolean) processedElements.get(elt)).booleanValue() ?
+ ((Boolean) processedElementArrayStatusMap.get(elt)).booleanValue() ?
SchemaConstants.ANY_ARRAY_TYPE :
SchemaConstants.ELEMENT_TYPE);
}
@@ -785,7 +817,7 @@
}
//get the nillable state and register that on the metainf holder
- if (nillableElementList.contains(elt.getQName())){
+ if (localNillableList.contains(elt.getQName())){
metainfHolder.registerNillableQName(elt.getQName());
}
Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/schema/template/ADBBeanTemplate.xsl Thu Feb 9 03:00:02 2006
@@ -323,13 +323,31 @@
"<xsl:value-of select="$namespace"/>",
"<xsl:value-of select="$propertyName"/>");
+ // Find the first element
+ while (!<xsl:value-of select="$loopBoolName"/>){
+ event = reader.getEventType();
+ if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
+ && <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ //we are at the first element
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else{
+ reader.next();
+ }
+
+ }
+
+ //Now loop and populate the array
+ <xsl:value-of select="$loopBoolName"/> = false;
while (!<xsl:value-of select="$loopBoolName"/>){
event = reader.getEventType();
if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
&& <xsl:value-of select="$startQname"/>.equals(reader.getName())){
<xsl:value-of select="$listName"/>.add(<xsl:value-of select="$basePropertyType"/>.Factory.parse(reader));
- } else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
- <xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ }else if (javax.xml.stream.XMLStreamConstants.START_ELEMENT == event
+ && !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
+ <xsl:value-of select="$loopBoolName"/> = true;
+ }else if (javax.xml.stream.XMLStreamConstants.END_ELEMENT == event &&
+ !<xsl:value-of select="$startQname"/>.equals(reader.getName())){
<xsl:value-of select="$loopBoolName"/> = true;
}else{
reader.next();
@@ -406,6 +424,13 @@
</xsl:when>
<!-- End of Array handling of ADB classes -->
<xsl:otherwise>
+ <xsl:if test="position()>1">
+ // Move to a start element
+ event = reader.getEventType();
+ while (event!= javax.xml.stream.XMLStreamReader.START_ELEMENT) {
+ event = reader.next();
+ }
+ </xsl:if>
<!-- Start of Array handling of simple types -->
org.apache.axis2.databinding.utils.SimpleArrayReaderStateMachine <xsl:value-of select="$stateMachineName"/> = new
org.apache.axis2.databinding.utils.SimpleArrayReaderStateMachine();
@@ -430,8 +455,10 @@
<xsl:when test="@ours">
<!--No concerns of being nillable here. if it's ours and if the nillable attribute was present
we would have outputted a null already-->
- object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(
- reader));
+ object.set<xsl:value-of select="$javaName"/>(<xsl:value-of select="$propertyType"/>.Factory.parse(
+ reader));
+
+
</xsl:when>
<!-- end of adb type handling code -->
<!-- start of OMelement handling -->
@@ -462,6 +489,13 @@
<!-- end of OMelement handling -->
<!-- start of the simple types handling -->
<xsl:otherwise>
+ <xsl:if test="position()>1">
+ // Move to a start element
+ event = reader.getEventType();
+ while (event!= javax.xml.stream.XMLStreamReader.START_ELEMENT) {
+ event = reader.next();
+ }
+ </xsl:if>
org.apache.axis2.databinding.utils.SimpleElementReaderStateMachine <xsl:value-of select="$stateMachineName"/>
= new org.apache.axis2.databinding.utils.SimpleElementReaderStateMachine();
javax.xml.namespace.QName <xsl:value-of select="$startQname"/> = new javax.xml.namespace.QName(
Modified: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java?rev=376259&r1=376258&r2=376259&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/builder/wsdl4j/WSDLPump.java Thu Feb 9 03:00:02 2006
@@ -193,6 +193,9 @@
ExtensionConstants.SCHEMA);
wsdlTypes.addExtensibilityElement(schemaExtensibilityElement);
schemaExtensibilityElement.setElement(schemaElement);
+
+
+
}
}
@@ -489,11 +492,11 @@
Message message = wsdl4jInputMessage.getMessage();
if (null != message) {
- //wrapping has to be done on per message basis
-
wsdlInputMessage.setElementQName(
- this.generateReferenceQname(wrappedInputName
- ,message,findWrapppable(message)));
+ this.generateReferenceQname(
+ wrappedInputName
+ ,message,
+ findWrapppable(message)));
this.copyExtensibleElements(
(message).getExtensibilityElements(),
wsdlInputMessage, null);