You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rd...@apache.org on 2004/04/19 23:27:23 UTC
cvs commit: jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read ReadContext.java
rdonkin 2004/04/19 14:27:23
Modified: betwixt/src/java/org/apache/commons/betwixt/io/read Tag:
REFACTORING-BRANCH_2004-01-13 ReadContext.java
Log:
Added stack for updaters. This should help to transparently deal with temporary objects.
Revision Changes Path
No revision
No revision
1.4.2.11 +74 -17 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read/ReadContext.java
Index: ReadContext.java
===================================================================
RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/io/read/ReadContext.java,v
retrieving revision 1.4.2.10
retrieving revision 1.4.2.11
diff -u -r1.4.2.10 -r1.4.2.11
--- ReadContext.java 18 Apr 2004 20:29:07 -0000 1.4.2.10
+++ ReadContext.java 19 Apr 2004 21:27:23 -0000 1.4.2.11
@@ -109,6 +109,8 @@
private ArrayStack objectStack = new ArrayStack();
private ArrayStack descriptorStack = new ArrayStack();
+
+ private ArrayStack updaterStack = new ArrayStack();
private Class rootClass;
/** The <code>XMLIntrospector</code> to be used to map the xml*/
@@ -241,6 +243,10 @@
descriptorStack.pop();
}
+ if (!updaterStack.isEmpty()) {
+ updaterStack.pop();
+ }
+
Object top = null;
if (!elementMappingStack.isEmpty()) {
top = elementMappingStack.pop();
@@ -315,6 +321,11 @@
nextDescriptor = currentDescriptor.getElementDescriptor(elementName);
}
}
+ Updater updater = null;
+ if (nextDescriptor != null) {
+ updater = nextDescriptor.getUpdater();
+ }
+ updaterStack.push(updater);
descriptorStack.push(nextDescriptor);
}
@@ -326,9 +337,13 @@
*/
public void markClassMap(Class mappedClazz) throws IntrospectionException {
elementMappingStack.push(mappedClazz);
+
XMLBeanInfo mappedClassInfo = getXMLIntrospector().introspect(mappedClazz);
ElementDescriptor mappedElementDescriptor = mappedClassInfo.getElementDescriptor();
descriptorStack.push(mappedElementDescriptor);
+
+ Updater updater = mappedElementDescriptor.getUpdater();
+ updaterStack.push(updater);
}
/**
@@ -481,21 +496,63 @@
}
}
- public Updater getCurrentUpdater() throws Exception {
- //TODO: add dyna-bean support!
- // probably refactoring needed
- ElementDescriptor currentDescriptor = getCurrentDescriptor();
- Updater updater = null;
- if (currentDescriptor != null) {
- updater = currentDescriptor.getUpdater();
- }
- if (updater == null) {
- ElementDescriptor parentDescriptor = getParentDescriptor();
- if (parentDescriptor != null) {
- updater = parentDescriptor.getUpdater();
+ /**
+ * <p>Pushes an <code>Updater</code> onto the stack.</p>
+ * <p>
+ * <strong>Note</strong>Any action pushing an <code>Updater</code> onto
+ * the stack should take responsibility for popping
+ * the updater from the stack at an appropriate time.
+ * </p>
+ * <p>
+ * <strong>Usage:</strong> this may be used by actions
+ * which require a temporary object to be updated.
+ * Pushing an updater onto the stack allow actions
+ * downstream to transparently update the temporary proxy.
+ * </p>
+ * @param updater Updater, possibly null
+ */
+ public void pushUpdater(Updater updater) {
+ updaterStack.push(updater);
+ }
+
+ /**
+ * Pops the top <code>Updater</code> from the stack.
+ * <p>
+ * <strong>Note</strong>Any action pushing an <code>Updater</code> onto
+ * the stack should take responsibility for popping
+ * the updater from the stack at an appropriate time.
+ * </p>
+ * @return <code>Updater</code>, possibly null
+ */
+ public Updater popUpdater() {
+ return (Updater) updaterStack.pop();
+ }
+
+ /**
+ * Gets the current <code>Updater</code>.
+ * This may (or may not) be the updater for the current
+ * descriptor.
+ * If the current descriptor is a bean child,
+ * the the current updater will (most likely)
+ * be the updater for the property.
+ * Actions (that, for example, use proxy objects)
+ * may push updaters onto the stack.
+ * @return Updater, possibly null
+ */
+ public Updater getCurrentUpdater() {
+ // TODO: think about whether this is right
+ // it makes some sense to look back up the
+ // stack until a non-empty updater is found.
+ // actions who need to put a stock to this
+ // behaviour can always use an ignoring implementation.
+ Updater result = null;
+ if (!updaterStack.empty()) {
+ result = (Updater) updaterStack.peek();
+ if ( result == null && updaterStack.size() >1 ) {
+ result = (Updater) updaterStack.peek(1);
}
}
- return updater;
+ return result;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org