001: /*
002: * This file is part of the WfMOpen project.
003: * Copyright (C) 2001-2003 Danet GmbH (www.danet.de), GS-AN.
004: * All rights reserved.
005: *
006: * This program is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation; either version 2 of the License, or
009: * (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * $Id: JDOMSerializationWrapper.java,v 1.2 2006/09/29 12:32:08 drmlipp Exp $
021: *
022: * $Log: JDOMSerializationWrapper.java,v $
023: * Revision 1.2 2006/09/29 12:32:08 drmlipp
024: * Consistently using WfMOpen as projct name now.
025: *
026: * Revision 1.1.1.1 2003/06/30 20:05:12 drmlipp
027: * Initial import
028: *
029: * Revision 1.3 2003/06/27 08:51:47 lipp
030: * Fixed copyright/license information.
031: *
032: * Revision 1.2 2003/03/31 16:50:27 huaiyang
033: * Logging using common-logging.
034: *
035: * Revision 1.1 2003/03/27 13:51:00 huaiyang
036: * Initial.
037: *
038: *
039: */
040: package de.danet.an.util;
041:
042: import java.io.IOException;
043: import java.io.ObjectInputStream;
044: import java.io.ObjectOutputStream;
045: import java.io.Serializable;
046:
047: import java.util.ArrayList;
048: import java.util.HashMap;
049: import java.util.Iterator;
050: import java.util.List;
051: import java.util.Map;
052:
053: import org.jdom.Element;
054: import org.jdom.Namespace;
055:
056: /**
057: * This class provides a wrapper or rather patch for a JDOM element of version
058: * jdom-b8 in which the variable of <code>additionalNamespaces</code> are
059: * transient, this results that the informations of
060: * <code>additionalNamespaces</code> get lost after the serialization. In this
061: * class the given JDOM Element with <code>additionalNamespaces</code> are
062: * serialized correctly.
063: *
064: * @author <a href="mailto:mao@danet.de">Huaiyang Mao</a>
065: * @version $Revision: 1.2 $
066: */
067:
068: public class JDOMSerializationWrapper implements Serializable {
069: private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
070: .getLog(JDOMSerializationWrapper.class);
071:
072: /** map of element and its additional namespaces */
073: private Map additionalNsByElement = null;
074:
075: /** the element to be wrapped */
076: private Element element = null;
077:
078: /**
079: * this class is used to wrap JDOM namespace, because it is not
080: * serializable.
081: */
082: private class NamespaceWrapper implements Serializable {
083: public String prefix;
084: public String uri;
085:
086: public NamespaceWrapper(String prefix, String uri) {
087: this .prefix = prefix;
088: this .uri = uri;
089: }
090: }
091:
092: /**
093: * Contructor class.
094: * @param element the given JDOM element.
095: */
096: public JDOMSerializationWrapper(Element element) {
097: this .element = element;
098: }
099:
100: /**
101: * Returns the JDOM element.
102: * @return the correctly deserialized/serialized JDOM element.
103: */
104: public Element getJDOM() {
105: return element;
106: }
107:
108: private void writeObject(ObjectOutputStream out) throws IOException {
109: // traverse the given JDOM tree and save all the founded additional
110: // namespaces in the map.
111: additionalNsByElement = new HashMap();
112: wrap(element);
113: out.defaultWriteObject();
114: }
115:
116: private void readObject(ObjectInputStream in) throws IOException,
117: ClassNotFoundException {
118: in.defaultReadObject();
119: unwrap(element);
120: }
121:
122: /**
123: * traverse the given JDOM tree and save all the founded additional
124: * namespaces in the additionalNsByElement for the correponding element.
125: */
126: private void wrap(Element element) {
127: wrapAdditionalNamespaces(element);
128: Iterator iterator = element.getChildren().iterator();
129: while (iterator.hasNext()) {
130: Element childElement = (Element) iterator.next();
131: wrapAdditionalNamespaces(childElement);
132: wrap(childElement);
133: }
134: }
135:
136: /**
137: * wrap all the founded additional namespaces of the given element
138: * in a <code>NamespaceWrapper</code>.
139: */
140: private void wrapAdditionalNamespaces(Element element) {
141: List additionalNsList = new ArrayList();
142: Iterator iterator = element.getAdditionalNamespaces()
143: .iterator();
144: while (iterator.hasNext()) {
145: Namespace namespace = (Namespace) iterator.next();
146: additionalNsList.add(new NamespaceWrapper(namespace
147: .getPrefix(), namespace.getURI()));
148: }
149: if (additionalNsList.size() != 0) {
150: // all the founded namespaces saved in the map
151: additionalNsByElement.put(element, additionalNsList);
152: }
153: }
154:
155: /**
156: * find out all the additional namespaces for all the elements and its
157: * child elements and add those namespace declaration to the element.
158: */
159: private void unwrap(Element element) {
160: unwrapAdditionalNamespaces(element);
161: Iterator iterator = element.getChildren().iterator();
162: while (iterator.hasNext()) {
163: Element childElement = (Element) iterator.next();
164: unwrapAdditionalNamespaces(childElement);
165: unwrap(childElement);
166: }
167: }
168:
169: private void unwrapAdditionalNamespaces(Element element) {
170: List additionalNs = (List) additionalNsByElement.get(element);
171: if (additionalNs == null) {
172: return;
173: }
174: Iterator iterator = additionalNs.iterator();
175: while (iterator.hasNext()) {
176: NamespaceWrapper ns = (NamespaceWrapper) iterator.next();
177: element.addNamespaceDeclaration(Namespace.getNamespace(
178: ns.prefix, ns.uri));
179: }
180: }
181: }
|