001: /**
002: * Speedo: an implementation of JDO compliant personality on top of JORM generic
003: * I/O sub-system.
004: * Copyright (C) 2001-2004 France Telecom R&D
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This library 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 GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: *
021: *
022: * Contact: speedo@objectweb.org
023: *
024: * Authors: S.Chassande-Barrioz.
025: *
026: */package org.objectweb.speedo.metadata;
027:
028: import org.objectweb.speedo.api.SpeedoException;
029: import org.objectweb.speedo.generation.lib.NamingRules;
030: import org.objectweb.util.monolog.api.Logger;
031:
032: import java.util.ArrayList;
033: import java.util.Collections;
034: import java.util.Enumeration;
035: import java.util.HashMap;
036: import java.util.HashSet;
037: import java.util.Iterator;
038: import java.util.List;
039: import java.util.Map;
040: import java.util.Set;
041:
042: /**
043: * This class describes all persistence capable classes.
044: * @author S.Chassande-Barrioz
045: */
046: public class SpeedoXMLDescriptor {
047: /**
048: * List of packages descriptions which contains persistence capable classes.
049: */
050: public Map packages = new HashMap();
051:
052: public SpeedoMetaInfo smi;
053:
054: public String xmlFile = null;
055:
056: public boolean requireEnhancement = true;
057:
058: public List queries = null;
059:
060: /**
061: * The list of meta objects to serialize
062: */
063: public Set mos = new HashSet();
064:
065: public SpeedoXMLDescriptor(SpeedoMetaInfo smi) {
066: this .smi = smi;
067: }
068:
069: /**
070: * Transform this object into a String.
071: * @return the string corresponding to the object.
072: */
073: public String toString() {
074: Enumeration e = Collections.enumeration(packages.values());
075: String s = "descriptor ";
076: while (e.hasMoreElements()) {
077: s = s + " " + e.nextElement().toString();
078: }
079: return s;
080: }
081:
082: /**
083: * Adds a package descriptor to the global descriptor.
084: * Throws an exception if there are persistent capable fields defined twice.
085: * @param pac package descriptor to add.
086: * @param failsOnError if an error provoques an exception or a warning message.
087: * @param logger logger where to put warning message.
088: * @exception SpeedoException If a persistent field of the package was already
089: * described in the global descriptor.
090: */
091: public void add(Object pac, boolean failsOnError, Logger logger)
092: throws SpeedoException {
093: SpeedoPackage p = (SpeedoPackage) pac;
094: //the package already exixts in the descriptor.
095: if (packages.containsKey(p.name)) {
096: SpeedoPackage pref = (SpeedoPackage) packages.get(p.name);
097: //we add all its classes
098: Enumeration e = Collections.enumeration(p.classes.values());
099: while (e.hasMoreElements()) {
100: pref.addClass(e.nextElement(), failsOnError, logger);
101: }
102: //we add all its sequences
103: e = Collections.enumeration(p.sequences.values());
104: while (e.hasMoreElements()) {
105: pref.addSequence(e.nextElement());
106: }
107: }
108: //we add the entire package
109: else {
110: p.xmlDescriptor = this ;
111: packages.put(p.name, pac);
112: }
113: }
114:
115: public List getSpeedoClasses() {
116: List scs = new ArrayList();
117: Iterator it = packages.values().iterator();
118: while (it.hasNext()) {
119: scs.addAll(((SpeedoPackage) it.next()).classes.values());
120: }
121: return scs;
122: }
123:
124: public List getSpeedoSequences() {
125: List ss = new ArrayList();
126: Iterator it = packages.values().iterator();
127: while (it.hasNext()) {
128: ss.addAll(((SpeedoPackage) it.next()).sequences.values());
129: }
130: return ss;
131: }
132:
133: public SpeedoClass getSpeedoClass(String fqn, boolean other) {
134: //System.out.println("XML.getSpeedoClass(" + fqn + ", " + other + "): XML=" + xmlFile);
135: SpeedoClass sc = null;
136: if (other) {
137: sc = smi.getSpeedoClass(fqn, this );
138: }
139: if (sc != null) {
140: //System.out.println("XML.getSpeedoClass(): return " + sc);
141: return sc;
142: }
143: SpeedoPackage sp = (SpeedoPackage) packages.get(NamingRules
144: .packageName(fqn));
145: if (sp != null) {
146: sc = (SpeedoClass) sp.classes.get(NamingRules
147: .className(fqn));
148: }
149: //System.out.println("XML.getSpeedoClass(): return " + sc);
150: return sc;
151: }
152: }
|