You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jaxme-dev@ws.apache.org by jo...@apache.org on 2006/06/28 11:10:53 UTC

svn commit: r417702 - in /webservices/jaxme/branches: MAVEN/ MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/ MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/ MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/gener...

Author: jochen
Date: Wed Jun 28 02:10:52 2006
New Revision: 417702

URL: http://svn.apache.org/viewvc?rev=417702&view=rev
Log:
Fixed a serious performance problem in the handling of elements with mixed content and large text sections.

Added:
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java
    webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java
Modified:
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/GroupSG.java
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java
    webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXElementParser.java
    webservices/jaxme/branches/MAVEN/status.xml
    webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java
    webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/GroupSG.java
    webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java
    webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java
    webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXElementParser.java
    webservices/jaxme/branches/b0_5/status.xml

Modified: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/impl/Inliner.java Wed Jun 28 02:10:52 2006
@@ -44,7 +44,7 @@
 
 /** Performs the modifications on an XML schema file, as
  * specified by an external binding file. This is based
- * on a suggestion from Ortwin Glück, see
+ * on a suggestion from Ortwin Glueck, see
  * <a href="http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings">
  * http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings</a>.
  */

Modified: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/GroupSG.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/GroupSG.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/GroupSG.java (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/GroupSG.java Wed Jun 28 02:10:52 2006
@@ -15,12 +15,8 @@
  */
 package org.apache.ws.jaxme.generator.sg;
 
-import org.apache.ws.jaxme.js.JavaSource;
 import org.apache.ws.jaxme.xs.XSParticle;
 import org.apache.ws.jaxme.xs.xml.XsQName;
-import org.apache.ws.jaxme.generator.sg.Context;
-import org.apache.ws.jaxme.generator.sg.ParticleSG;
-import org.apache.ws.jaxme.generator.sg.SGItem;
 import org.xml.sax.SAXException;
 
 

Modified: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java Wed Jun 28 02:10:52 2006
@@ -42,6 +42,7 @@
 import org.apache.ws.jaxme.generator.sg.impl.ccsg.SimpleContentHandlerSG;
 import org.apache.ws.jaxme.impl.JMSAXDriver;
 import org.apache.ws.jaxme.impl.JMSAXElementParser;
+import org.apache.ws.jaxme.impl.JMSAXMixedElementParser;
 import org.apache.ws.jaxme.js.JavaQName;
 import org.apache.ws.jaxme.js.JavaSource;
 import org.apache.ws.jaxme.js.JavaSourceFactory;
@@ -292,7 +293,13 @@
 	}
 
 	private void createXMLHandler(ComplexTypeSG pController, JavaSource pJs) throws SAXException {
-		pJs.addExtends(JMSAXElementParser.class);
+	    final Class parserClass;
+        if (!pController.hasSimpleContent()  &&  pController.getComplexContentSG().isMixed()) {
+            parserClass = JMSAXMixedElementParser.class;
+        } else {
+            parserClass = JMSAXElementParser.class;
+        }
+        pJs.addExtends(parserClass);
 		HandlerSG handlerSG = newHandlerSG(pController, pJs);
 		handlerSG.generate();
 	}

Modified: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java Wed Jun 28 02:10:52 2006
@@ -305,6 +305,14 @@
 		return result;
 	}
 
+    public JavaMethod newIsFinishedMethod() throws SAXException {
+        JavaMethod jm = super.newIsFinishedMethod();
+        if (isMixed) {
+            jm.addLine("normalize();");
+        }
+        return jm;
+    }
+
 	private void handleEndElementState(JavaMethod pJm, LocalJavaField pElement,
 									   ParticleSG pParticle) throws SAXException {
 		if (pParticle.isElement()) {
@@ -396,33 +404,26 @@
 		if (!isMixed) {
 			return null;
 		}
+        if (ccSG != null) {
+            return null;
+        }
 		JavaMethod jm = getJavaSource().newJavaMethod("addText", void.class, JavaSource.PUBLIC);
 		Parameter buffer = jm.addParam(char[].class, "pBuffer");
 		Parameter offset = jm.addParam(int.class, "pOffset");
 		Parameter length = jm.addParam(int.class, "pLength");
-		if (ccSG == null) {
-			jm.addLine(outerHandler.getJavaSource().getQName(), ".this.addText(",
-					   buffer, ", ", offset, ", ", length, ");");
-		} else {
-			JavaQName elementInterface = ctSG.getClassContext().getXMLInterfaceName();
-			LocalJavaField element = jm.newJavaField(elementInterface);
-			element.addLine("(", elementInterface, ") result");
-			Object s = new Object[]{"new ", String.class, "(", buffer, ", ",
-									offset, ", ", length, ")"};
-			LocalJavaField list = jm.newJavaField(List.class);
-			list.addLine(element, ".getContent()");
-			jm.addIf(list, ".size() > 0");
-			LocalJavaField o = jm.newJavaField(Object.class);
-			o.addLine(list, ".get(", list, ".size()-1)");
-			jm.addIf(o, " instanceof ", String.class);
-			jm.addLine(list, ".set(", list, ".size()-1, ",
-					   "((", String.class, ") ", o, ") + ", s, ");");
-			jm.addLine("return;");
-			jm.addEndIf();
-			jm.addEndIf();
-			jm.addLine(list, ".add(", s, ");");
-		}
-		return jm;
+		jm.addLine(outerHandler.getJavaSource().getQName(), ".this.addText(",
+		        buffer, ", ", offset, ", ", length, ");");
+        return jm;
+    }
+
+    private JavaMethod newContentListMethod() {
+        if (!isMixed) {
+            return null;
+        }
+        JavaMethod jm = getJavaSource().newJavaMethod("getContentList", List.class, JavaSource.PROTECTED);
+        JavaQName elementInterface = ctSG.getClassContext().getXMLInterfaceName();
+        jm.addLine("return ((", elementInterface, ") result).getContent();");
+        return jm;
 	}
 
 	private JavaMethod newGetHandlerMethod(JavaSource pOuter) throws SAXException {
@@ -435,6 +436,7 @@
 		super.generate();
 		newAddTextMethod();
 		newIsMixedMethod();
+        newContentListMethod();
 		for (Iterator iter = groups.values().iterator();  iter.hasNext();  ) {
 			HandlerSG handler = (HandlerSG) iter.next();
 			handler.generate();

Modified: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXElementParser.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXElementParser.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXElementParser.java (original)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXElementParser.java Wed Jun 28 02:10:52 2006
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2005-2006  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.ws.jaxme.impl;
 
 import javax.xml.bind.ValidationEvent;

Added: webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java?rev=417702&view=auto
==============================================================================
--- webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java (added)
+++ webservices/jaxme/branches/MAVEN/projects/jm/src/main/java/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java Wed Jun 28 02:10:52 2006
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2006  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.ws.jaxme.impl;
+
+import java.util.List;
+
+
+/** A subclass of {@link org.apache.ws.jaxme.impl.JMSAXElementParser}
+ * for parsing complex elements.
+ */
+public abstract class JMSAXMixedElementParser extends JMSAXElementParser {
+    protected abstract List getContentList();
+
+    protected void normalize() {
+        List list = getContentList();
+        boolean previousIsString = false;
+        for (int i = list.size()-1;  i >= 0;  i--) {
+            Object o = list.get(i);
+            if (o instanceof StringBuffer) {
+                if (previousIsString) {
+                    StringBuffer sb = (StringBuffer) o;
+                    sb.append((String) list.remove(i+1));
+                }
+                list.set(i, o.toString());
+                previousIsString = true;
+            } else if (o instanceof String) {
+                if (previousIsString) {
+                    list.set(i, (String) o + (String) list.remove(i+1));
+                }
+                previousIsString = true;
+            } else {
+                previousIsString = false;
+            }
+        }
+    }
+
+    public void addText(char[] pBuffer, int pOffset, int pLength) {
+        java.util.List list = getContentList();
+        StringBuffer sb = null;
+        if (list.size() > 0) {
+            java.lang.Object _3 = list.get(list.size()-1);
+            if (_3 instanceof StringBuffer) {
+                sb = (StringBuffer) _3;
+            }
+        }
+        if (sb == null) {
+            sb = new StringBuffer();
+            list.add(sb);
+        }
+        sb.append(pBuffer, pOffset, pLength);
+    }
+}

Modified: webservices/jaxme/branches/MAVEN/status.xml
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/MAVEN/status.xml?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/MAVEN/status.xml (original)
+++ webservices/jaxme/branches/MAVEN/status.xml Wed Jun 28 02:10:52 2006
@@ -54,6 +54,10 @@
         The TaminoAPI4JPM wasn't supporting query parameters.
         (Theo Straeten, theo.straeten at softwareag.com)
       </action>
+      <action dev="JW" type="fix" context="jm">
+        Fixed a serious performance problem, if mixed content elements
+        had large embedded text segments.
+      </action>
     </release>
 	<release version="0.5.1" date="Not yet published">
       <action dev="JW" type="enhancement" context="js">

Modified: webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java (original)
+++ webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/impl/Inliner.java Wed Jun 28 02:10:52 2006
@@ -44,7 +44,7 @@
 
 /** Performs the modifications on an XML schema file, as
  * specified by an external binding file. This is based
- * on a suggestion from Ortwin Glück, see
+ * on a suggestion from Ortwin Glueck, see
  * <a href="http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings">
  * http://wiki.apache.org/ws/JaxMe/ExternalSchemaBindings</a>.
  */

Modified: webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/GroupSG.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/GroupSG.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/GroupSG.java (original)
+++ webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/GroupSG.java Wed Jun 28 02:10:52 2006
@@ -15,12 +15,8 @@
  */
 package org.apache.ws.jaxme.generator.sg;
 
-import org.apache.ws.jaxme.js.JavaSource;
 import org.apache.ws.jaxme.xs.XSParticle;
 import org.apache.ws.jaxme.xs.xml.XsQName;
-import org.apache.ws.jaxme.generator.sg.Context;
-import org.apache.ws.jaxme.generator.sg.ParticleSG;
-import org.apache.ws.jaxme.generator.sg.SGItem;
 import org.xml.sax.SAXException;
 
 

Modified: webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java (original)
+++ webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/JAXBComplexTypeSG.java Wed Jun 28 02:10:52 2006
@@ -42,6 +42,7 @@
 import org.apache.ws.jaxme.generator.sg.impl.ccsg.SimpleContentHandlerSG;
 import org.apache.ws.jaxme.impl.JMSAXDriver;
 import org.apache.ws.jaxme.impl.JMSAXElementParser;
+import org.apache.ws.jaxme.impl.JMSAXMixedElementParser;
 import org.apache.ws.jaxme.js.JavaQName;
 import org.apache.ws.jaxme.js.JavaSource;
 import org.apache.ws.jaxme.js.JavaSourceFactory;
@@ -292,7 +293,13 @@
 	}
 
 	private void createXMLHandler(ComplexTypeSG pController, JavaSource pJs) throws SAXException {
-		pJs.addExtends(JMSAXElementParser.class);
+	    final Class parserClass;
+        if (!pController.hasSimpleContent()  &&  pController.getComplexContentSG().isMixed()) {
+            parserClass = JMSAXMixedElementParser.class;
+        } else {
+            parserClass = JMSAXElementParser.class;
+        }
+        pJs.addExtends(parserClass);
 		HandlerSG handlerSG = newHandlerSG(pController, pJs);
 		handlerSG.generate();
 	}

Modified: webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java (original)
+++ webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java Wed Jun 28 02:10:52 2006
@@ -305,6 +305,14 @@
 		return result;
 	}
 
+    public JavaMethod newIsFinishedMethod() throws SAXException {
+        JavaMethod jm = super.newIsFinishedMethod();
+        if (isMixed) {
+            jm.addLine("normalize();");
+        }
+        return jm;
+    }
+
 	private void handleEndElementState(JavaMethod pJm, LocalJavaField pElement,
 									   ParticleSG pParticle) throws SAXException {
 		if (pParticle.isElement()) {
@@ -396,33 +404,26 @@
 		if (!isMixed) {
 			return null;
 		}
+        if (ccSG != null) {
+            return null;
+        }
 		JavaMethod jm = getJavaSource().newJavaMethod("addText", void.class, JavaSource.PUBLIC);
 		Parameter buffer = jm.addParam(char[].class, "pBuffer");
 		Parameter offset = jm.addParam(int.class, "pOffset");
 		Parameter length = jm.addParam(int.class, "pLength");
-		if (ccSG == null) {
-			jm.addLine(outerHandler.getJavaSource().getQName(), ".this.addText(",
-					   buffer, ", ", offset, ", ", length, ");");
-		} else {
-			JavaQName elementInterface = ctSG.getClassContext().getXMLInterfaceName();
-			LocalJavaField element = jm.newJavaField(elementInterface);
-			element.addLine("(", elementInterface, ") result");
-			Object s = new Object[]{"new ", String.class, "(", buffer, ", ",
-									offset, ", ", length, ")"};
-			LocalJavaField list = jm.newJavaField(List.class);
-			list.addLine(element, ".getContent()");
-			jm.addIf(list, ".size() > 0");
-			LocalJavaField o = jm.newJavaField(Object.class);
-			o.addLine(list, ".get(", list, ".size()-1)");
-			jm.addIf(o, " instanceof ", String.class);
-			jm.addLine(list, ".set(", list, ".size()-1, ",
-					   "((", String.class, ") ", o, ") + ", s, ");");
-			jm.addLine("return;");
-			jm.addEndIf();
-			jm.addEndIf();
-			jm.addLine(list, ".add(", s, ");");
-		}
-		return jm;
+		jm.addLine(outerHandler.getJavaSource().getQName(), ".this.addText(",
+		        buffer, ", ", offset, ", ", length, ");");
+        return jm;
+    }
+
+    private JavaMethod newContentListMethod() {
+        if (!isMixed) {
+            return null;
+        }
+        JavaMethod jm = getJavaSource().newJavaMethod("getContentList", List.class, JavaSource.PROTECTED);
+        JavaQName elementInterface = ctSG.getClassContext().getXMLInterfaceName();
+        jm.addLine("return ((", elementInterface, ") result).getContent();");
+        return jm;
 	}
 
 	private JavaMethod newGetHandlerMethod(JavaSource pOuter) throws SAXException {
@@ -435,6 +436,7 @@
 		super.generate();
 		newAddTextMethod();
 		newIsMixedMethod();
+        newContentListMethod();
 		for (Iterator iter = groups.values().iterator();  iter.hasNext();  ) {
 			HandlerSG handler = (HandlerSG) iter.next();
 			handler.generate();

Modified: webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXElementParser.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXElementParser.java?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXElementParser.java (original)
+++ webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXElementParser.java Wed Jun 28 02:10:52 2006
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2005-2006  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.ws.jaxme.impl;
 
 import javax.xml.bind.ValidationEvent;

Added: webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java?rev=417702&view=auto
==============================================================================
--- webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java (added)
+++ webservices/jaxme/branches/b0_5/src/jaxme/org/apache/ws/jaxme/impl/JMSAXMixedElementParser.java Wed Jun 28 02:10:52 2006
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2006  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.ws.jaxme.impl;
+
+import java.util.List;
+
+
+/** A subclass of {@link org.apache.ws.jaxme.impl.JMSAXElementParser}
+ * for parsing complex elements.
+ */
+public abstract class JMSAXMixedElementParser extends JMSAXElementParser {
+    protected abstract List getContentList();
+
+    protected void normalize() {
+        List list = getContentList();
+        boolean previousIsString = false;
+        for (int i = list.size()-1;  i >= 0;  i--) {
+            Object o = list.get(i);
+            if (o instanceof StringBuffer) {
+                if (previousIsString) {
+                    StringBuffer sb = (StringBuffer) o;
+                    sb.append((String) list.remove(i+1));
+                }
+                list.set(i, o.toString());
+                previousIsString = true;
+            } else if (o instanceof String) {
+                if (previousIsString) {
+                    list.set(i, (String) o + (String) list.remove(i+1));
+                }
+                previousIsString = true;
+            } else {
+                previousIsString = false;
+            }
+        }
+    }
+
+    public void addText(char[] pBuffer, int pOffset, int pLength) {
+        java.util.List list = getContentList();
+        StringBuffer sb = null;
+        if (list.size() > 0) {
+            java.lang.Object _3 = list.get(list.size()-1);
+            if (_3 instanceof StringBuffer) {
+                sb = (StringBuffer) _3;
+            }
+        }
+        if (sb == null) {
+            sb = new StringBuffer();
+            list.add(sb);
+        }
+        sb.append(pBuffer, pOffset, pLength);
+    }
+}

Modified: webservices/jaxme/branches/b0_5/status.xml
URL: http://svn.apache.org/viewvc/webservices/jaxme/branches/b0_5/status.xml?rev=417702&r1=417701&r2=417702&view=diff
==============================================================================
--- webservices/jaxme/branches/b0_5/status.xml (original)
+++ webservices/jaxme/branches/b0_5/status.xml Wed Jun 28 02:10:52 2006
@@ -46,6 +46,10 @@
         The methods AbstractJavaMethod.getParamNames() and getParamTypes()
         are throwing an ArrayIndexOutOfBoundsException.
       </action>
+      <action dev="JW" type="fix" context="jm">
+        Fixed a serious performance problem, if mixed content elements
+        had large embedded text segments.
+      </action>
     </release>
     <release version="0.5.1" date="06-Jan-2006">
       <action dev="JW" type="enhancement" context="js">



---------------------------------------------------------------------
To unsubscribe, e-mail: jaxme-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: jaxme-dev-help@ws.apache.org