1 /** 2 * Redistribution and use of this software and associated documentation 3 * ("Software"), with or without modification, are permitted provided 4 * that the following conditions are met: 5 * 6 * 1. Redistributions of source code must retain copyright 7 * statements and notices. Redistributions must also contain a 8 * copy of this document. 9 * 10 * 2. Redistributions in binary form must reproduce the 11 * above copyright notice, this list of conditions and the 12 * following disclaimer in the documentation and/or other 13 * materials provided with the distribution. 14 * 15 * 3. The name "Exolab" must not be used to endorse or promote 16 * products derived from this Software without prior written 17 * permission of Intalio, Inc. For written permission, 18 * please contact info@exolab.org. 19 * 20 * 4. Products derived from this Software may not be called "Exolab" 21 * nor may "Exolab" appear in their names without prior written 22 * permission of Intalio, Inc. Exolab is a registered 23 * trademark of Intalio, Inc. 24 * 25 * 5. Due credit should be given to the Exolab Project 26 * (http://www.exolab.org/). 27 * 28 * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS 29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT 30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 32 * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 39 * OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 * Copyright 1999 (C) Intalio, Inc. All Rights Reserved. 42 * 43 * $Id$ 44 */ 45 package org.exolab.castor.mapping.loader; 46 47 import java.util.HashMap; 48 import java.util.HashSet; 49 import java.util.Map; 50 import java.util.Set; 51 52 import org.exolab.castor.mapping.ClassDescriptor; 53 import org.exolab.castor.mapping.FieldDescriptor; 54 import org.exolab.castor.mapping.xml.ClassMapping; 55 56 /** 57 * The standard {@link ClassDescriptor} implementation, holding general OO information 58 * about the class <i>described</i>.<p/> 59 * 60 * Engines will use {@link Nature}s to augment this class with engine-specific knowledge 61 * and functionality, using {@link #addNature(String)} to register these views 62 * with this class.<p/> 63 * 64 * Once a Nature has been registered with this {@link ClassDescriptor}, the nature 65 * can be applied to the {@link ClassDescriptor} and nature-specific properties 66 * can be accessed in a type-safe way. 67 * 68 * @see Nature 69 * @see #addNature(String) 70 * @see #hasNature(String) 71 * 72 * @author <a href="mailto:arkin AT intalio DOT com">Assaf Arkin</a> 73 * @author <a href="mailto:ralf DOT joachim AT syscon DOT eu">Ralf Joachim</a> 74 * @author <a href="mailto:wguttmn AT codehaus DOT org">Werner Guttmann</a> 75 * @version $Revision$ $Date: 2006-01-07 15:48:31 -0700 (Sat, 07 Jan 2006) $ 76 */ 77 public class ClassDescriptorImpl implements ClassDescriptor { 78 79 /** 80 * {@link ClassMapping} instance holding class mapping information required 81 * during initialisation of e.g. (JDO) ClassMolder. 82 */ 83 private ClassMapping _mapping; 84 85 /** 86 * The Java class for this descriptor. 87 */ 88 private Class<?> _javaClass; 89 90 /** 91 * The descriptor of the class which this class extends, 92 * or null if this is a top-level class. 93 */ 94 private ClassDescriptor _extends; 95 96 /** 97 * The {@link ClassDescriptor} of the class which this class 98 * depends upon. 99 */ 100 private ClassDescriptor _depends; 101 102 /** # 103 * The fields described for this class. 104 */ 105 private FieldDescriptor[] _fields; 106 107 /** 108 * Map holding the properties set and read by natures. 109 */ 110 private Map<String, Object> _properties = new HashMap<String, Object>(); 111 112 /** 113 * Map holding the available natures. 114 */ 115 private Set<String> _natures = new HashSet<String>(); 116 117 /** 118 * Identity {@link FieldDescriptor}s. 119 */ 120 private FieldDescriptor[] _identities; 121 122 /** 123 * Sets the {@link ClassMapping} instance. 124 * @param mapping The {@link ClassMapping} instance to be used. 125 */ 126 public void setMapping(final ClassMapping mapping) { 127 _mapping = mapping; 128 } 129 130 /** 131 * Returns the {@link ClassMapping} instance used. 132 * @return The {@link ClassMapping} instance used. 133 */ 134 public ClassMapping getMapping() { 135 return _mapping; 136 } 137 138 /** 139 * Sets the Java {@link Class} as described by this descriptor. 140 * @param javaClass The Java {@link Class} instance as described by this descriptor. 141 */ 142 public void setJavaClass(final Class<?> javaClass) { 143 _javaClass = javaClass; 144 } 145 146 /** 147 * {@inheritDoc} 148 * 149 * @see org.exolab.castor.mapping.ClassDescriptor#getJavaClass() 150 */ 151 public Class<?> getJavaClass() { 152 return _javaClass; 153 } 154 155 /** 156 * Sets the descriptor of the class which this class extends. 157 * @param extend the descriptor of the class which this class extends. 158 */ 159 public void setExtends(final ClassDescriptor extend) { 160 _extends = extend; 161 } 162 163 /** 164 * {@inheritDoc} 165 * 166 * @see org.exolab.castor.mapping.ClassDescriptor#getExtends() 167 */ 168 public ClassDescriptor getExtends() { 169 return _extends; 170 } 171 172 /** 173 * Sets the {@link ClassDescriptor} of the class which this class 174 * depends upon. 175 * @param depends the {@link ClassDescriptor} of the class which this class 176 * depends upon 177 */ 178 public void setDepends(final ClassDescriptor depends) { 179 _depends = depends; 180 } 181 182 /** 183 * Returns the {@link ClassDescriptor} of the class which this class 184 * depends upon. 185 * @return the {@link ClassDescriptor} of the class which this class 186 * depends upon. 187 */ 188 public ClassDescriptor getDepends() { 189 return _depends; 190 } 191 192 /** 193 * Sets the {@link FieldDescriptor}s that describe the fields defined for this class. 194 * @param fields the {@link FieldDescriptor}s that describe the fields defined for this class. 195 */ 196 public void setFields(final FieldDescriptor[] fields) { 197 _fields = fields; 198 } 199 200 /** 201 * {@inheritDoc} 202 * @see org.exolab.castor.mapping.ClassDescriptor#getFields() 203 */ 204 public FieldDescriptor[] getFields() { 205 return _fields; 206 } 207 208 /** 209 * {@inheritDoc} 210 * @see java.lang.Object#toString() 211 */ 212 public String toString() { 213 return _javaClass.getName() + "[" + _natures.toString() + "]"; 214 } 215 216 /** 217 * @see org.exolab.castor.builder.info.nature.PropertyHolder# 218 * getProperty(java.lang.String) 219 * @param name 220 * of the property 221 * @return value of the property 222 */ 223 public Object getProperty(final String name) { 224 return _properties.get(name); 225 } 226 227 /** 228 * @see org.exolab.castor.builder.info.nature.PropertyHolder# 229 * setProperty(java.lang.String, java.lang.Object) 230 * @param name 231 * of the property 232 * @param value 233 * of the property 234 */ 235 public void setProperty(final String name, final Object value) { 236 _properties.put(name, value); 237 } 238 239 /** 240 * @see org.exolab.castor.builder.info.nature.NatureExtendable# 241 * addNature(java.lang.String) 242 * @param nature 243 * ID of the Nature 244 */ 245 public void addNature(final String nature) { 246 _natures.add(nature); 247 } 248 249 /** 250 * @see org.exolab.castor.builder.info.nature.NatureExtendable# 251 * hasNature(java.lang.String) 252 * @param nature 253 * ID of the Nature 254 * @return true if the Nature ID was added. 255 */ 256 public boolean hasNature(final String nature) { 257 return _natures.contains(nature); 258 259 } 260 261 /** 262 * Sets the {@link FieldDescriptor}s that describe the identities as defined for this class. 263 * @param identities the {@link FieldDescriptor}s that describe the identities as defined 264 * for this class. 265 */ 266 public void setIdentities(final FieldDescriptor[] identities) { 267 _identities = identities; 268 } 269 270 /** 271 * Returns the {@link FieldDescriptor}s that describe the identities as defined for this class. 272 * @return the {@link FieldDescriptor}s that describe the identities as defined for this class. 273 */ 274 public FieldDescriptor[] getIdentities() { 275 return _identities; 276 } 277 278 /** 279 * Returns the first {@link FieldDescriptor} instance. 280 * @return the first {@link FieldDescriptor} instance 281 */ 282 public FieldDescriptor getIdentity() { 283 FieldDescriptor[] identities = getIdentities(); 284 if (identities == null) { 285 return null; 286 } 287 return identities[0]; 288 } 289 290 291 } 292 293