001: package xdoclet.modules.ojb.model;
002:
003: /* Copyright 2004-2005 The Apache Software Foundation
004: *
005: * Licensed under the Apache License, Version 2.0 (the "License");
006: * you may not use this file except in compliance with the License.
007: * You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: import java.util.*;
019:
020: import xdoclet.modules.ojb.constraints.*;
021:
022: /**
023: * Defines the model (class descriptors etc.).
024: *
025: * @author <a href="mailto:tomdz@users.sourceforge.net">Thomas Dudziak (tomdz@users.sourceforge.net)</a>
026: */
027: public class ModelDef extends DefBase {
028: /** The class definitions keyed by their names */
029: private SortedMap _classDefs = new TreeMap();
030: /** The tables keyed by their names */
031: private SortedMap _tableDefs = new TreeMap();
032:
033: /**
034: * Creates a new model object.
035: */
036: public ModelDef() {
037: super ("");
038: }
039:
040: /**
041: * Determines whether this model contains a class descriptor of the given name.
042: *
043: * @param qualifiedName The qualified name
044: * @return <code>true</code> if such a class descriptor exists in this model
045: */
046: public boolean hasClass(String qualifiedName) {
047: return _classDefs.containsKey(qualifiedName.replace('$', '.'));
048: }
049:
050: /**
051: * Returns the class descriptor of the given name contained in this model. The name can be both
052: * a fully qualified name as per java spec or a classloader-compatible full name (which uses
053: * '$' for inner/nested classes).
054: *
055: * @param qualifiedName The qualified name
056: * @return The class descriptor or <code>null</code> if there is no such class in this model
057: */
058: public ClassDescriptorDef getClass(String qualifiedName) {
059: return (ClassDescriptorDef) _classDefs.get(qualifiedName
060: .replace('$', '.'));
061: }
062:
063: /**
064: * Adds the class descriptor to this model.
065: *
066: * @param classDef The class descriptor
067: * @return The class descriptor or <code>null</code> if there is no such class in this model
068: */
069: public void addClass(ClassDescriptorDef classDef) {
070: classDef.setOwner(this );
071: // Regardless of the format of the class name, we're using the fully qualified format
072: // This is safe because of the package & class naming constraints of the Java language
073: _classDefs.put(classDef.getQualifiedName(), classDef);
074: }
075:
076: /**
077: * Returns all classes in this model.
078: *
079: * @return An iterator of all classes
080: */
081: public Iterator getClasses() {
082: return _classDefs.values().iterator();
083: }
084:
085: /**
086: * Returns the number of classes contained in this model.
087: *
088: * @return The number of classes
089: */
090: public int getNumClasses() {
091: return _classDefs.size();
092: }
093:
094: /**
095: * Processes all classes (flattens the hierarchy such that every class has declarations for all fields,
096: * references,collections that it will have in the descriptor) and applies modifications (removes ignored
097: * features, changes declarations).
098: *
099: * @throws ConstraintException If a constraint has been violated
100: */
101: public void process() throws ConstraintException {
102: ClassDescriptorDef classDef;
103:
104: // process all classes
105: for (Iterator it = getClasses(); it.hasNext();) {
106: classDef = (ClassDescriptorDef) it.next();
107: if (!classDef.hasBeenProcessed()) {
108: classDef.process();
109: }
110: }
111: }
112:
113: /**
114: * Checks constraints on this model.
115: *
116: * @param checkLevel The amount of checks to perform
117: * @throws ConstraintException If a constraint has been violated
118: */
119: public void checkConstraints(String checkLevel)
120: throws ConstraintException {
121: // check constraints now after all classes have been processed
122: for (Iterator it = getClasses(); it.hasNext();) {
123: ((ClassDescriptorDef) it.next())
124: .checkConstraints(checkLevel);
125: }
126: // additional model constraints that either deal with bigger parts of the model or
127: // can only be checked after the individual classes have been checked (e.g. specific
128: // attributes have been ensured)
129: new ModelConstraints().check(this, checkLevel);
130: }
131: }
|