[jboss-svn-commits] JBoss Common SVN: r3869 - in jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling: position and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Dec 18 06:27:17 EST 2009
Author: alex.loubyansky at jboss.com
Date: 2009-12-18 06:27:16 -0500 (Fri, 18 Dec 2009)
New Revision: 3869
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java
jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java
Log:
got rid of the stack impl (as a component/API thing)
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java 2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/PositionStack.java 2009-12-18 11:27:16 UTC (rev 3869)
@@ -23,7 +23,6 @@
import org.jboss.xb.binding.NamespaceRegistry;
import org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.UnmarshallingContextImpl;
-import org.jboss.xb.binding.sunday.unmarshalling.position.Position;
/**
* @author <a href="mailto:alex at jboss.org">Alexey Loubyansky</a>
@@ -31,16 +30,6 @@
*/
public interface PositionStack
{
- void push(Position o);
-
- Position pop();
-
- Position head();
-
- void clear();
-
- // TODO not really stack methods
-
NamespaceRegistry getNamespaceRegistry();
UnmarshallingContextImpl getContext();
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/SundayContentHandler.java 2009-12-18 11:27:16 UTC (rev 3869)
@@ -47,7 +47,7 @@
* @version <tt>$Revision$</tt>
*/
public class SundayContentHandler
- implements JBossXBParser.DtdAwareContentHandler
+ implements JBossXBParser.DtdAwareContentHandler, PositionStack
{
final static Logger log = Logger.getLogger(SundayContentHandler.class);
@@ -56,10 +56,8 @@
private final SchemaBindingResolver schemaResolver;
private final SchemaBinding schema;
- private final StackImpl stack = new StackImpl();
-
- private Object root;
-
+ private Position head;
+
// DTD information frm startDTD
private String dtdRootName;
private String dtdPublicId;
@@ -99,7 +97,7 @@
public void characters(char[] ch, int start, int length)
{
- Position position = stack.head();
+ Position position = head;
if(!position.isElement())
return;
@@ -116,69 +114,39 @@
public void endElement(String namespaceURI, String localName, String qName)
{
- ElementBinding elementBinding = null;
- Position position = stack.head;
- while(elementBinding == null && position != null)
+ while(head != null)
{
- if(position.isElement())
+ if(head.isElement())
{
- if(position.isEnded())
+ if(!head.isEnded())
{
- if(position.getRepeatableParticleValue() != null)
- position.endRepeatableParticle();
- stack.pop();
- }
- else
- {
- elementBinding = (ElementBinding)position.getParticle().getTerm();
-
+ QName elementQName = head.getParticle().getTerm().getQName();
QName endName = localName.length() == 0 ? new QName(qName) : new QName(namespaceURI, localName);
- if(!elementBinding.getQName().equals(endName))
+ if(!elementQName.equals(endName))
{
throw new JBossXBRuntimeException("Failed to end element " +
new QName(namespaceURI, localName) +
- ": element on the stack is " + elementBinding.getQName()
+ ": element on the stack is " + elementQName
);
}
-
- position.endParticle();
+ head.endParticle();
+ break;
}
}
else
{
- position.endParticle();
- if(position.getRepeatableParticleValue() != null)
- position.endRepeatableParticle();
- stack.pop();
+ head.endParticle();
}
- position = stack.head;
- }
- if(elementBinding == null)
- throw new JBossXBRuntimeException("Failed to endElement " + qName + ": binding not found");
+ // assert head.isEnded() == true
+ if(head.getRepeatableParticleValue() != null)
+ head.endRepeatableParticle();
- if(stack.head.getPrevious() == null)
- {
- root = elementBinding.getType().getValueAdapter().cast(position.getValue(), Object.class);
- stack.clear();
-
- if(sawDTD)
- {
- // Probably should be integrated into schema binding?
- try
- {
- // setDTD(String root, String publicId, String systemId)
- Class[] sig = {String.class, String.class, String.class};
- Method setDTD = root.getClass().getMethod("setDTD", sig);
- Object[] args = {dtdRootName, dtdPublicId, dtdSystemId};
- setDTD.invoke(root, args);
- }
- catch(Exception e)
- {
- log.debug("No setDTD found on root: " + root);
- }
- }
+ head = head.getPrevious();
}
+
+ if(head == null)
+ throw new JBossXBRuntimeException("Failed to endElement " + qName + ": binding not found");
}
public void startElement(String namespaceURI,
@@ -192,7 +160,7 @@
atts = preprocessAttributes(atts);
- if(stack.head == null)
+ if(head == null)
{
ParticleBinding particle = null;
if(schemaBinding != null)
@@ -229,19 +197,22 @@
throw new JBossXBRuntimeException(sb.toString());
}
- new ElementPosition(startName, particle).push(stack, atts, false);
+ ElementPosition next = new ElementPosition(startName, particle);
+ next.push(this, atts, false);
+ head = next;
return;
}
- while (stack.head != null)
+ while (head != null)
{
- ElementPosition next = stack.head.startParticle(startName, atts);
+ ElementPosition next = head.startParticle(startName, atts);
if (next != null)
{
- next.push(stack, atts, stack.head == next);
+ next.push(this, atts, head == next);
+ head = next;
break;
}
- stack.pop();
+ head = head.getPrevious();
}
}
@@ -261,6 +232,31 @@
public Object getRoot()
{
+ if(head.getPrevious() != null)
+ throw new IllegalStateException("The stack still contains positions!");
+
+ ElementBinding elementBinding = (ElementBinding) head.getParticle().getTerm();
+ Object root = elementBinding.getType().getValueAdapter().cast(head.getValue(), Object.class);
+ head = null;
+
+ if (sawDTD)
+ {
+ // Probably should be integrated into schema binding?
+ try
+ {
+ // setDTD(String root, String publicId, String systemId)
+ Class[] sig = {String.class, String.class, String.class};
+ Method setDTD = root.getClass().getMethod("setDTD", sig);
+ Object[] args = {dtdRootName, dtdPublicId, dtdSystemId};
+ setDTD.invoke(root, args);
+ }
+ catch (Exception e)
+ {
+ if(trace)
+ log.trace("No setDTD found on root: " + root);
+ }
+ }
+
return root;
}
@@ -305,54 +301,18 @@
return attrs;
}
- // Inner
+ public UnmarshallingContextImpl getContext()
+ {
+ return ctx;
+ }
- public class StackImpl implements PositionStack
+ public NamespaceRegistry getNamespaceRegistry()
{
- private Position head;
- private Position peek1;
+ return nsRegistry;
+ }
- public void clear()
- {
- head = null;
- peek1 = null;
- }
+ // Inner
- public void push(Position o)
- {
- peek1 = head;
- head = o;
- o.setStack(this);
- if(trace)
- log.trace("pushed " + o.getParticle().getTerm());
- }
-
- public Position pop()
- {
- Position popped = head;
- head = peek1;
- peek1 = peek1.getPrevious();
- if(trace)
- log.trace("popped " + popped.getParticle().getTerm());
- return popped;
- }
-
- public Position head()
- {
- return head;
- }
-
- public UnmarshallingContextImpl getContext()
- {
- return ctx;
- }
-
- public NamespaceRegistry getNamespaceRegistry()
- {
- return nsRegistry;
- }
- }
-
public static class UnmarshallingContextImpl implements UnmarshallingContext
{
public Object parent;
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java 2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/ElementPosition.java 2009-12-18 11:27:16 UTC (rev 3869)
@@ -230,7 +230,7 @@
if (newPosition.getParticle().isRepeatable())
newPosition.startRepeatableParticle();
- stack.push(newPosition);
+ newPosition.setStack(stack);
newPosition.initValue(atts);
newPosition.setParentType(parentType);
newPosition = newPosition.getNext();
@@ -532,6 +532,7 @@
public void push(PositionStack stack, Attributes atts, boolean repeated)
{
+ this.stack = stack;
ElementBinding element = (ElementBinding) particle.getTerm();
// TODO xsi:type support should be implemented in a better way
@@ -624,9 +625,6 @@
interceptorObjects[ioIndex--] = parent;
}
}
-
- if (!repeated)
- stack.push(this);
String nil = atts.getValue(Constants.NS_XML_SCHEMA_INSTANCE, "nil");
if (nil == null || !("1".equals(nil) || "true".equals(nil)))
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java 2009-12-16 12:45:58 UTC (rev 3868)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/binding/sunday/unmarshalling/position/NonElementPosition.java 2009-12-18 11:27:16 UTC (rev 3869)
@@ -88,7 +88,7 @@
if (newPosition.getParticle().isRepeatable())
newPosition.startRepeatableParticle();
- stack.push(newPosition);
+ newPosition.setStack(stack);
newPosition.initValue(atts);
newPosition.setParentType(parentType);
newPosition = newPosition.getNext();
@@ -103,8 +103,6 @@
endParticle();
if(repeatableParticleValue != null)
endRepeatableParticle();
-
- previous = null;
next = null;
occurrence = 0;
}
More information about the jboss-svn-commits
mailing list