From 02fda0d645f6e36b41c1df01fb4fd99494874416 Mon Sep 17 00:00:00 2001 From: Robert Schuster Date: Sun, 8 Jan 2006 19:31:37 +0000 Subject: 2006-01-08 Robert Schuster * java/beans/Statement.java: Doc fixes. (doExecute): Workaround for Class.forName call. (toString): Made output look more like on the JDK. * java/beans/Expression.java: Doc fixes. (toString): Made output look more like on the JDK. * java/beans/PersistenceDelegate.java, java/beans/DefaultPersistenceDelegate.java, java/beans/Encoder.java, java/beans/XMLEncoder.java: New file. * gnu/java/beans/encoder/ArrayPersistenceDelegate.java, gnu/java/beans/encoder/ClassPersistenceDelegate.java, gnu/java/beans/encoder/CollectionPersistenceDelegate.java, gnu/java/beans/encoder/Context.java, gnu/java/beans/encoder/GenericScannerState.java, gnu/java/beans/encoder/IgnoringScannerState.java, gnu/java/beans/encoder/MapPersistenceDelegate.java, gnu/java/beans/encoder/ObjectId.java, gnu/java/beans/encoder/PrimitivePersistenceDelegate.java, gnu/java/beans/encoder/ReportingScannerState.java, gnu/java/beans/encoder/Root.java, gnu/java/beans/encoder/ScanEngine.java, gnu/java/beans/encoder/ScannerState.java, gnu/java/beans/encoder/StAXWriter.java, gnu/java/beans/encoder/Writer.java: New file. * gnu/java/beans/encoder/elements/Array_Get.java, gnu/java/beans/encoder/elements/Element.java, gnu/java/beans/encoder/elements/List_Set.java, gnu/java/beans/encoder/elements/Array_Set.java, gnu/java/beans/encoder/elements/NullObject.java, gnu/java/beans/encoder/elements/StaticMethodInvocation.java, gnu/java/beans/encoder/elements/StaticFieldAccess.java, gnu/java/beans/encoder/elements/StringReference.java, gnu/java/beans/encoder/elements/ClassResolution.java, gnu/java/beans/encoder/elements/ArrayInstantiation.java, gnu/java/beans/encoder/elements/PrimitiveInstantiation.java, gnu/java/beans/encoder/elements/ObjectReference.java, gnu/java/beans/encoder/elements/ObjectInstantiation.java, gnu/java/beans/encoder/elements/List_Get.java, gnu/java/beans/encoder/elements/MethodInvocation.java: New file. --- gnu/java/beans/encoder/Root.java | 198 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 gnu/java/beans/encoder/Root.java (limited to 'gnu/java/beans/encoder/Root.java') diff --git a/gnu/java/beans/encoder/Root.java b/gnu/java/beans/encoder/Root.java new file mode 100644 index 000000000..f4eade193 --- /dev/null +++ b/gnu/java/beans/encoder/Root.java @@ -0,0 +1,198 @@ +/* Root.java -- The root of an object tree. + Copyright (C) 2005 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + +package gnu.java.beans.encoder; + +import java.beans.XMLEncoder; +import java.util.Iterator; +import java.util.Stack; + +import gnu.java.beans.encoder.elements.Element; + +/**

Root provides a simple interface to a tree of + * objects.

+ * + *

Using an instance of this class a logical representation of + * the real object tree that is serialized can be built. When the + * actual data should be written as XML Root and + * {@link gnu.java.beans.encoder.elements.Element} class can provide + * context information which is used to write the best fitting + * XML representation.

+ * + * @author Robert Schuster (robertschuster@fsfe.org) + */ +public class Root +{ + private Stack parents = new Stack(); + + private Element rootElement, current; + + private boolean started; + + public Root() + { + rootElement = current = new RootElement(); + } + + /**

Adds another child element to the tree.

+ * + *

The new element automatically becomes the current + * element.

+ * + * @param elem The new child element. + */ + public void addChild(Element elem) + { + current.addChild(elem); + + parents.push(current); + current = elem; + } + + /** + *

Marks that the end of the current element + * is reached and that no more childs are added to + * it.

+ * + *

The behavior is to return to the nearest parent + * element.

+ */ + public void end() + { + current = (Element) parents.pop(); + } + + /** + *

Goes back to the nearest parent element but + * deletes the just created child.

+ * + *

This is used if something went wrong while + * processing the child element's {@link java.beans.Expression} + * or {@link java.beans.Statement}.

+ * + */ + public void deleteLast() + { + current = (Element) parents.pop(); + + current.removeLast(); + } + + /** + *

Traverses the elements in the object tree + * and creates their XML representation in the output + * stream of the given {@link Writer}.

+ * + *

Finally the Writer is flushed.

+ * + * @param writer The Writer instance that generates the XML representation. + */ + public void traverse(Writer writer) + { + if (!started) + { + writer.writePreamble(); + rootElement.writeStart(writer); + } + started = true; + + traverse(writer, rootElement.iterator()); + + rootElement.clear(); + + writer.flush(); + } + + /** Writes the closing element and closes the {@link Writer} + * + * @param writer The Writer instance that generates the XML representation. + */ + public void close(Writer writer) + { + rootElement.writeEnd(writer); + writer.close(); + } + + /** Recursively traverses the object tree. + * + * @param writer The Writer instance that generates the XML representation. + * @param ite An Iterator returning Element instances. + */ + private void traverse(Writer writer, Iterator ite) + { + while (ite.hasNext()) + { + Element e = (Element) ite.next(); + e.writeStart(writer); + + traverse(writer, e.iterator()); + + e.writeEnd(writer); + + e.clear(); + } + } + + /**

A special Element implementation that represents the + * encoder's context.

+ * + *

This element is written only once per Writer.

+ * + *

It is assumed that this element is never empty to simplify + * the implementation.

+ * + * @author Robert Schuster (robertschuster@fsfe.org); + * + */ + static class RootElement extends Element + { + public void writeStart(Writer writer) + { + writer.write("java", new String[] { "version", "class" }, + new String[] { System.getProperty("java.version"), + XMLEncoder.class.getName() }, false); + } + + public void writeEnd(Writer writer) + { + writer.writeEnd(false); + } + + } + +} -- cgit v1.2.1