001: /*
002: * Jacareto Copyright (c) 2002-2005
003: * Applied Computer Science Research Group, Darmstadt University of
004: * Technology, Institute of Mathematics & Computer Science,
005: * Ludwigsburg University of Education, and Computer Based
006: * Learning Research Group, Aachen University. All rights reserved.
007: *
008: * Jacareto is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation; either
011: * version 2 of the License, or (at your option) any later version.
012: *
013: * Jacareto is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * General Public License for more details.
017: *
018: * You should have received a copy of the GNU General Public
019: * License along with Jacareto; if not, write to the Free
020: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
021: *
022: */
023:
024: package jacareto.convert.conceptualmodel;
025:
026: import jacareto.conceptualmodel.ConceptualModelElement;
027: import jacareto.conceptualmodel.FolderElement;
028: import jacareto.convert.RecursiveConceptualModelConverter;
029: import jacareto.convert.SelectionConceptualModelConverter;
030: import jacareto.system.Environment;
031:
032: import org.jdom.Element;
033:
034: import java.util.Iterator;
035: import java.util.Vector;
036:
037: /**
038: * A converter which is able to convert task to xml representations, and vice versa.
039: *
040: * @author <a href="mailto:markus.bois@web.de">Markus Bois</a>
041: * @version 1.02
042: */
043: public class XMLFolderConverter extends
044: RecursiveConceptualModelConverter {
045: /**
046: * Creates a new converter.
047: *
048: * @param env DOCUMENT ME!
049: */
050: public XMLFolderConverter(Environment env) {
051: super (env);
052: setSelectionConceptualModelConverter(new SelectionConceptualModelConverter(
053: env, "ConceptualModelElements.Converters",
054: SelectionConceptualModelConverter.INIT_CUSTOM));
055: }
056:
057: /**
058: * Creates a new recursive converter
059: *
060: * @param env the enviroment
061: * @param selectionConceptualModelConverter the available converters
062: */
063: public XMLFolderConverter(
064: Environment env,
065: SelectionConceptualModelConverter selectionConceptualModelConverter) {
066: super (env);
067: setSelectionConceptualModelConverter(selectionConceptualModelConverter);
068: }
069:
070: /**
071: * Returns whether this converter is able to transform the specified conceptual-model element
072: * to an internal structure representation. This converter is responsible for the given
073: * conceptual-model element if it is of type {@link jacareto.conceptualmodel.FolderElement}.
074: *
075: * @param element the conceptual-model element
076: *
077: * @return <code>true</code> if this converter is responsible for the given conceptual-model
078: * element; otherwise <code>false</code>.
079: */
080: public boolean handlesElement(ConceptualModelElement element) {
081: return (element != null) && element instanceof FolderElement;
082: }
083:
084: /**
085: * Converts the specified object to an object, if this converter is responsible for it. For
086: * responsibility see {@link #handlesElement(ConceptualModelElement)}.
087: *
088: * @param element the conceptual-model element to convert
089: *
090: * @return the structure object (which is a xml element)
091: */
092: public Object convertElement(ConceptualModelElement element) {
093: FolderElement folderElement = (FolderElement) element;
094: Iterator it = folderElement.children();
095:
096: Element result = new Element("folder");
097: Element name = new Element("name");
098:
099: name.setText(folderElement.getName());
100: result.addContent(name);
101:
102: while (it.hasNext()) {
103: ConceptualModelElement next = (ConceptualModelElement) it
104: .next();
105:
106: if ((next != null) && !(next instanceof FolderElement)) {
107: if (selectionConceptualModelConverter
108: .handlesElement(next)) {
109: Object toAdd = selectionConceptualModelConverter
110: .convertElement(next);
111:
112: if ((toAdd != null)
113: && !(next instanceof FolderElement)) {
114: result.addContent((Element) toAdd);
115: }
116: }
117: }
118: }
119:
120: return result;
121: }
122:
123: /**
124: * Returns whether this converter is able to transform the specified other representation (here
125: * a xml element) to a conceptual-model element. This converter is responsible if the other
126: * representation is of type <code>jdom.org.Element</code> and the name of the element is
127: * "folder"
128: *
129: * @param other the other representation
130: *
131: * @return <code>true</code> if this converter is responsible for the specified other
132: * representation; otherwise <code>false</code>.
133: */
134: public boolean handlesOther(Object other) {
135: try {
136: Element e = (Element) other;
137:
138: return e.getName().equals("folder");
139: } catch (Throwable t) {
140: return false;
141: }
142: }
143:
144: /**
145: * Converts the specified other representation to a conceptual-model element, if this converter
146: * is responsible for it (reverses {@link #convertElement(ConceptualModelElement)}). For
147: * responsibility see {@link #handlesOther(Object)}.
148: *
149: * @param other the other representation to convert
150: *
151: * @return the conceptual-model element (of type {@link
152: * jacareto.conceptualmodel.FolderElement})
153: */
154: public ConceptualModelElement convertOther(Object other) {
155: Element element = (Element) other;
156: Vector children = new Vector();
157: String name = element.getAttributeValue("name");
158:
159: Iterator iterator = element.getChildren().iterator();
160:
161: while (iterator.hasNext()) {
162: Object internalRepresentation = iterator.next();
163:
164: if (selectionConceptualModelConverter
165: .handlesOther(internalRepresentation)) {
166: ConceptualModelElement toAdd = selectionConceptualModelConverter
167: .convertOther(internalRepresentation);
168:
169: if (toAdd != null) {
170: children.add(toAdd);
171: }
172: }
173: }
174:
175: return new FolderElement(env, name, ConceptualModelElement
176: .vectorToArray(children));
177: }
178: }
|