001: /**********************************************************************
002: Copyright (c) 2004 Andy Jefferson and others. All rights reserved.
003: Licensed under the Apache License, Version 2.0 (the "License");
004: you may not use this file except in compliance with the License.
005: You may obtain a copy of the License at
006:
007: http://www.apache.org/licenses/LICENSE-2.0
008:
009: Unless required by applicable law or agreed to in writing, software
010: distributed under the License is distributed on an "AS IS" BASIS,
011: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: See the License for the specific language governing permissions and
013: limitations under the License.
014:
015:
016: Contributors:
017: ...
018: **********************************************************************/package org.jpox.metadata;
019:
020: import java.util.ArrayList;
021: import java.util.List;
022:
023: import org.jpox.ClassLoaderResolver;
024: import org.jpox.exceptions.ClassNotResolvedException;
025: import org.jpox.util.ClassUtils;
026: import org.jpox.util.JPOXLogger;
027:
028: /**
029: * The implements element declares a persistence-capable interface implemented by the
030: * persistence-capable class that contains this element. An extent of persistence-capable
031: * classes that implement this interface is managed by the JDO implementation. The extent
032: * can be used for queries or for iteration just like an extent of persistence-capable
033: * instances. The attribute name is required, and is the name of the interface. The java
034: * class naming rules apply: if the interface name is unqualified, the package is the name
035: * of the enclosing package.
036: * <H3>MetaData Element</H3>
037: * The MetaData Element represented here is as follows
038: * <PRE>
039: * <!ELEMENT implements ((property)+, (extension)*)>
040: * <!ATTLIST implements name CDATA #REQUIRED>
041: * </PRE>
042: *
043: * @version $Revision: 1.12 $
044: */
045: public class ImplementsMetaData extends MetaData {
046: /** Name of the interface implemented. */
047: protected String name;
048:
049: /** Properties implemented. */
050: protected final List properties = new ArrayList();
051:
052: /**
053: * Constructor.
054: * @param parent Parent class
055: * @param name Name of the interface being implemented
056: */
057: public ImplementsMetaData(ClassMetaData parent, final String name) {
058: super (parent);
059: this .name = ClassUtils.createFullClassName(parent
060: .getPackageName(), name);
061: }
062:
063: /**
064: * Accessor for name.
065: * @return Returns the name.
066: */
067: public String getName() {
068: return name;
069: }
070:
071: /**
072: * Method to add a property to this interface.
073: * @param pmd Property
074: */
075: public void addProperty(PropertyMetaData pmd) {
076: if (pmd == null) {
077: return;
078: }
079:
080: properties.add(pmd);
081: }
082:
083: /**
084: * Method to populate the details of the implements
085: *
086: * @param clr ClassLoaderResolver to use in loading any classes
087: */
088: public synchronized void populate(ClassLoaderResolver clr) {
089: // Check the class that we're modelling exists
090: try {
091: clr.classForName(name).getName();
092: } catch (ClassNotResolvedException cnre) {
093: JPOXLogger.METADATA.error(LOCALISER.msg("044097",
094: ((ClassMetaData) parent).getFullClassName(), name));
095: throw new InvalidMetaDataException(LOCALISER, "044097",
096: ((ClassMetaData) parent).getFullClassName(), name);
097: }
098:
099: super .populate();
100: }
101:
102: // ------------------------------ Utilities --------------------------------
103:
104: /**
105: * Returns a string representation of the object.
106: * This can be used as part of a facility to output a MetaData file.
107: * @param prefix prefix string
108: * @param indent indent string
109: * @return a string representation of the object.
110: */
111: public String toString(String prefix, String indent) {
112: StringBuffer sb = new StringBuffer();
113: sb.append(prefix)
114: .append("<implements name=\"" + name + "\">\n");
115:
116: // Add properties
117: for (int i = 0; i < properties.size(); i++) {
118: PropertyMetaData pmd = (PropertyMetaData) properties.get(i);
119: sb.append(pmd.toString(prefix + indent, indent));
120: }
121:
122: // Add extensions
123: sb.append(super .toString(prefix + indent, indent));
124:
125: sb.append(prefix + "</implements>\n");
126: return sb.toString();
127: }
128: }
|