/**
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided
* that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright
* statements and notices. Redistributions must also contain a
* copy of this document.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. The name "Exolab" must not be used to endorse or promote
* products derived from this Software without prior written
* permission of Intalio, Inc. For written permission,
* please contact info@exolab.org.
*
* 4. Products derived from this Software may not be called "Exolab"
* nor may "Exolab" appear in their names without prior written
* permission of Intalio, Inc. Exolab is a registered
* trademark of Intalio, Inc.
*
* 5. Due credit should be given to the Exolab Project
* (http://www.exolab.org/).
*
* THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
*
* $Id$
*/
package org.exolab.castor.mapping.loader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.exolab.castor.mapping.ClassDescriptor;
import org.exolab.castor.mapping.FieldDescriptor;
import org.exolab.castor.mapping.xml.ClassMapping;
/**
* The standard {@link ClassDescriptor} implementation, holding general OO information
* about the class <i>described</i>.<p/>
*
* Engines will use {@link Nature}s to augment this class with engine-specific knowledge
* and functionality, using {@link #addNature(String)} to register these views
* with this class.<p/>
*
* Once a Nature has been registered with this {@link ClassDescriptor}, the nature
* can be applied to the {@link ClassDescriptor} and nature-specific properties
* can be accessed in a type-safe way.
*
* @see Nature
* @see #addNature(String)
* @see #hasNature(String)
*
* @author <a href="mailto:arkin AT intalio DOT com">Assaf Arkin</a>
* @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a>
* @author <a href="mailto:wguttmn AT codehaus DOT org">Werner Guttmann</a>
* @version $Revision$ $Date: 2006-01-07 15:48:31 -0700 (Sat, 07 Jan 2006) $
*/
public class ClassDescriptorImpl implements ClassDescriptor {
/**
* {@link ClassMapping} instance holding class mapping information required
* during initialisation of e.g. (JDO) ClassMolder.
*/
private ClassMapping _mapping;
/**
* The Java class for this descriptor.
*/
private Class<?> _javaClass;
/**
* The descriptor of the class which this class extends,
* or null if this is a top-level class.
*/
private ClassDescriptor _extends;
/**
* The {@link ClassDescriptor} of the class which this class
* depends upon.
*/
private ClassDescriptor _depends;
/** #
* The fields described for this class.
*/
private FieldDescriptor[] _fields;
/**
* Map holding the properties set and read by natures.
*/
private Map<String, Object> _properties = new HashMap<String, Object>();
/**
* Map holding the available natures.
*/
private Set<String> _natures = new HashSet<String>();
/**
* Identity {@link FieldDescriptor}s.
*/
private FieldDescriptor[] _identities;
/**
* Sets the {@link ClassMapping} instance.
* @param mapping The {@link ClassMapping} instance to be used.
*/
public void setMapping(final ClassMapping mapping) {
_mapping = mapping;
}
/**
* Returns the {@link ClassMapping} instance used.
* @return The {@link ClassMapping} instance used.
*/
public ClassMapping getMapping() {
return _mapping;
}
/**
* Sets the Java {@link Class} as described by this descriptor.
* @param javaClass The Java {@link Class} instance as described by this descriptor.
*/
public void setJavaClass(final Class<?> javaClass) {
_javaClass = javaClass;
}
/**
* {@inheritDoc}
*
* @see org.exolab.castor.mapping.ClassDescriptor#getJavaClass()
*/
public Class<?> getJavaClass() {
return _javaClass;
}
/**
* Sets the descriptor of the class which this class extends.
* @param extend the descriptor of the class which this class extends.
*/
public void setExtends(final ClassDescriptor extend) {
_extends = extend;
}
/**
* {@inheritDoc}
*
* @see org.exolab.castor.mapping.ClassDescriptor#getExtends()
*/
public ClassDescriptor getExtends() {
return _extends;
}
/**
* Sets the {@link ClassDescriptor} of the class which this class
* depends upon.
* @param depends the {@link ClassDescriptor} of the class which this class
* depends upon
*/
public void setDepends(final ClassDescriptor depends) {
_depends = depends;
}
/**
* Returns the {@link ClassDescriptor} of the class which this class
* depends upon.
* @return the {@link ClassDescriptor} of the class which this class
* depends upon.
*/
public ClassDescriptor getDepends() {
return _depends;
}
/**
* Sets the {@link FieldDescriptor}s that describe the fields defined for this class.
* @param fields the {@link FieldDescriptor}s that describe the fields defined for this class.
*/
public void setFields(final FieldDescriptor[] fields) {
_fields = fields;
}
/**
* {@inheritDoc}
* @see org.exolab.castor.mapping.ClassDescriptor#getFields()
*/
public FieldDescriptor[] getFields() {
return _fields;
}
/**
* {@inheritDoc}
* @see java.lang.Object#toString()
*/
public String toString() {
return _javaClass.getName() + "[" + _natures.toString() + "]";
}
/**
* @see org.exolab.castor.builder.info.nature.PropertyHolder#
* getProperty(java.lang.String)
* @param name
* of the property
* @return value of the property
*/
public Object getProperty(final String name) {
return _properties.get(name);
}
/**
* @see org.exolab.castor.builder.info.nature.PropertyHolder#
* setProperty(java.lang.String, java.lang.Object)
* @param name
* of the property
* @param value
* of the property
*/
public void setProperty(final String name, final Object value) {
_properties.put(name, value);
}
/**
* @see org.exolab.castor.builder.info.nature.NatureExtendable#
* addNature(java.lang.String)
* @param nature
* ID of the Nature
*/
public void addNature(final String nature) {
_natures.add(nature);
}
/**
* @see org.exolab.castor.builder.info.nature.NatureExtendable#
* hasNature(java.lang.String)
* @param nature
* ID of the Nature
* @return true if the Nature ID was added.
*/
public boolean hasNature(final String nature) {
return _natures.contains(nature);
}
/**
* Sets the {@link FieldDescriptor}s that describe the identities as defined for this class.
* @param identities the {@link FieldDescriptor}s that describe the identities as defined
* for this class.
*/
public void setIdentities(final FieldDescriptor[] identities) {
_identities = identities;
}
/**
* Returns the {@link FieldDescriptor}s that describe the identities as defined for this class.
* @return the {@link FieldDescriptor}s that describe the identities as defined for this class.
*/
public FieldDescriptor[] getIdentities() {
return _identities;
}
/**
* Returns the first {@link FieldDescriptor} instance.
* @return the first {@link FieldDescriptor} instance
*/
public FieldDescriptor getIdentity() {
FieldDescriptor[] identities = getIdentities();
if (identities == null) {
return null;
}
return identities[0];
}
}