Author: mbo Date: Wed Apr 13 02:11:13 2005 New Revision: 161168 URL: http://svn.apache.org/viewcvs?view=rev&rev=161168 Log: Changed java model implementation in ri11 to reduce dependencies between enhancer and runtime
Added: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaField.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaType.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaField.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaModel.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaType.java Removed: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/ReflectionJavaField.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/ReflectionJavaType.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaField.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/jdo/util/Assertion.java Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaModel.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaType.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/jdoql/jdoqlc/TypeSupport.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/JavaModel-Impl.jpg incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/PredefinedType.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModel.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModelFactory.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaType.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/jdo/xml/JDOParser.java incubator/jdo/trunk/ri11/src/java/org/apache/jdo/model/java/JavaModel.mdl Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaModel.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaModel.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaModel.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaModel.java Wed Apr 13 02:11:13 2005 @@ -19,7 +19,7 @@ import java.io.InputStream; import org.apache.jdo.impl.enhancer.util.ResourceLocator; -import org.apache.jdo.impl.model.java.runtime.RuntimeJavaModel; +import org.apache.jdo.impl.model.java.reflection.ReflectionJavaModel; import org.apache.jdo.model.java.JavaType; import org.apache.jdo.model.jdo.JDOModel; @@ -30,7 +30,7 @@ * @author Martin Zaun */ public class EnhancerJavaModel - extends RuntimeJavaModel + extends ReflectionJavaModel { /** * The "package" jdo file. @@ -71,7 +71,7 @@ * @param clazz the Class instance representing the type * @return a new JavaType instance */ - protected JavaType createJavaType(Class clazz, JDOModel jdoModel) + protected JavaType createJavaType(Class clazz) { return new EnhancerJavaType(clazz, getJDOModel(), this); } Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaType.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaType.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaType.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/enhancer/meta/model/EnhancerJavaType.java Wed Apr 13 02:11:13 2005 @@ -17,7 +17,7 @@ package org.apache.jdo.impl.enhancer.meta.model; import org.apache.jdo.impl.enhancer.meta.EnhancerMetaDataFatalError; -import org.apache.jdo.impl.model.java.runtime.RuntimeJavaType; +import org.apache.jdo.impl.model.java.reflection.ReflectionJavaType; import org.apache.jdo.model.java.JavaModel; import org.apache.jdo.model.java.JavaType; import org.apache.jdo.model.jdo.JDOModel; @@ -31,7 +31,7 @@ * @since JDO 1.0.1 */ public class EnhancerJavaType - extends RuntimeJavaType + extends ReflectionJavaType { /** The declaring EnhancerJavaModel instance. */ private JavaModel javaModel = null; Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/jdoql/jdoqlc/TypeSupport.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/jdoql/jdoqlc/TypeSupport.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/jdoql/jdoqlc/TypeSupport.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/jdoql/jdoqlc/TypeSupport.java Wed Apr 13 02:11:13 2005 @@ -38,7 +38,7 @@ import org.apache.jdo.impl.model.java.ErrorType; import org.apache.jdo.impl.model.java.PredefinedType; import org.apache.jdo.impl.model.java.WrapperClassType; -import org.apache.jdo.impl.model.java.runtime.RuntimeJavaField; +import org.apache.jdo.impl.model.java.reflection.ReflectionJavaField; import org.apache.jdo.impl.model.java.runtime.RuntimeJavaModelFactory; import org.apache.jdo.jdoql.JDOQueryException; import org.apache.jdo.model.ModelFatalException; @@ -404,7 +404,7 @@ Class clazz = javaModelFactory.getJavaClass(javaField.getDeclaringClass()); String fieldName = javaField.getName(); final Field field = - RuntimeJavaField.getDeclaredFieldPrivileged(clazz, fieldName); + ReflectionJavaField.getDeclaredFieldPrivileged(clazz, fieldName); if (field == null) { throw new JDOQueryException( msg.msg("EXC_CannotFindField", //NOI18N Added: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaField.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaField.java?view=auto&rev=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaField.java (added) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaField.java Wed Apr 13 02:11:13 2005 @@ -0,0 +1,177 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jdo.impl.model.java; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.lang.reflect.Field; + +import org.apache.jdo.impl.model.java.AbstractJavaField; +import org.apache.jdo.model.ModelFatalException; +import org.apache.jdo.model.java.JavaField; +import org.apache.jdo.model.java.JavaType; +import org.apache.jdo.model.jdo.JDOField; +import org.apache.jdo.util.I18NHelper; + +/** + * This class provides a basic JavaField implementation using a reflection + * Field instance. The implementation supports lazy initialization of the + * wrapped reflection field instance (see + * [EMAIL PROTECTED] #BaseReflectionJavaField(String fieldName, JavaType declaringClass)}. + * <p> + * Note, this implementation is not connected to a JavaModelFactory, thus + * it can only support predefined types as field types. + * @see PredefinedType + * @author Michael Bouschen + * @since JDO 1.1 + */ +public class BaseReflectionJavaField + extends AbstractJavaField +{ + /** The wrapped java.lang.reflect.Field instance. */ + private Field field; + + /** The type of the field. */ + protected JavaType type; + + /** I18N support */ + private final static I18NHelper msg = + I18NHelper.getInstance(BaseReflectionJavaField.class); + + /** + * Constructor taking a reflection field representation. The specifie + * field must not be <code>null</code>. + * @param field the java.lang.reflect.Field instance + * @param declaringClass the JavaType of the declaring class or interface. + */ + protected BaseReflectionJavaField(Field field, JavaType declaringClass) + { + super((field == null) ? null : field.getName(), declaringClass); + if (field == null) + throw new ModelFatalException(msg.msg( + "ERR_InvalidNullFieldInstance", "BaseReflectionJavaField.<init>")); //NOI18N + this.field = field; + } + + /** + * Constructor taking the field name. This constructor allows lazy + * initialization of the field reference. + * @param fieldName the name of the field. + * @param declaringClass the JavaType of the declaring class or interface. + */ + protected BaseReflectionJavaField(String fieldName, JavaType declaringClass) + { + super(fieldName, declaringClass); + } + + /** + * Returns the Java language modifiers for the field represented by + * this JavaField, as an integer. The java.lang.reflect.Modifier class + * should be used to decode the modifiers. + * @return the Java language modifiers for this JavaField + * @see java.lang.reflect.Modifier + */ + public int getModifiers() + { + ensureInitializedField(); + return field.getModifiers(); + } + + /** + * Returns the JavaType representation of the field type. + * @return field type + */ + public JavaType getType() + { + if (type == null) { + ensureInitializedField(); + String typeName = field.getType().getName(); + // Note, this only checks for predefined types! + type = PredefinedType.getPredefinedType(typeName); + } + return type; + } + + // ===== Methods not defined in JavaField ===== + + /** + * Returns the java.lang.reflect.Field that is wrapped by this + * JavaField. + * @return the java.lang.reflect.Field instance. + */ + protected Field getField() + { + ensureInitializedField(); + return this.field; + } + + /** + * Helper method to retrieve the java.lang.reflect.Field for this + * JavaField. + * @param clazz the Class instance of the declaring class or interface + * @param fieldName the field name + */ + public static Field getDeclaredFieldPrivileged(final Class clazz, + final String fieldName) + { + if ((clazz == null) || (fieldName == null)) + return null; + + return (Field) AccessController.doPrivileged( + new PrivilegedAction() { + public Object run () { + try { + return clazz.getDeclaredField(fieldName); + } + catch (SecurityException ex) { + throw new ModelFatalException( + msg.msg("EXC_CannotGetDeclaredField", //NOI18N + clazz.getName()), ex); + } + catch (NoSuchFieldException ex) { + return null; // do nothing, just return null + } + catch (LinkageError ex) { + throw new ModelFatalException(msg.msg( + "EXC_ClassLoadingError", clazz.getName(), //NOI18N + ex.toString())); + } + } + } + ); + } + + // ===== Internal helper methods ===== + + /** + * This method makes sure the reflection field is set. + */ + protected void ensureInitializedField() + { + if (this.field == null) { + this.field = getDeclaredFieldPrivileged( + ((BaseReflectionJavaType)getDeclaringClass()).getJavaClass(), + getName()); + if (field == null) { + throw new ModelFatalException(msg.msg( + "ERR_MissingFieldInstance", //NOI18N + "BaseReflectionJavaField.ensureInitializedField", getName())); //NOI18N + } + } + } + +} Added: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaType.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaType.java?view=auto&rev=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaType.java (added) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/BaseReflectionJavaType.java Wed Apr 13 02:11:13 2005 @@ -0,0 +1,170 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jdo.impl.model.java; + +import java.lang.reflect.Field; + +import org.apache.jdo.model.ModelFatalException; +import org.apache.jdo.model.java.JavaField; +import org.apache.jdo.model.java.JavaType; +import org.apache.jdo.util.I18NHelper; + + + +/** + * This class provides a basic JavaType implementation using a reflection + * Class instance. + * <p> + * Note, BaseReflectionJavaType must not be used for array types, since it inherits + * the default implemention of methods isArray and getArrayComponentType + * from its superclass AbstractJavaType. + * + * @author Michael Bouschen + * @since JDO 1.1 + */ +public class BaseReflectionJavaType + extends AbstractJavaType +{ + /** The java.lang.Class instance for this BaseReflectionJavaType. */ + protected Class clazz; + + /** The superclass JavaType. */ + protected JavaType superclass; + + /** I18N support */ + private static I18NHelper msg = + I18NHelper.getInstance(BaseReflectionJavaType.class); + + /** + * Constructor. The specified java.lang.Class instance must not be + * <code>null</code>. The + * @param clazz the Class instance representing the type + * @param superclass JavaType instance representing the superclass. + */ + public BaseReflectionJavaType(Class clazz, JavaType superclass) + { + if (clazz == null) + throw new ModelFatalException(msg.msg( + "ERR_InvalidNullClassInstance", "BaseReflectionJavaType.<init>")); //NOI18N + this.clazz = clazz; + this.superclass = superclass; + } + + /** + * Determines if this JavaType object represents an interface type. + * @return <code>true</code> if this object represents an interface type; + * <code>false</code> otherwise. + */ + public boolean isInterface() + { + return clazz.isInterface(); + } + + /** + * Returns true if this JavaType is compatible with the specified + * JavaType. + * @param javaType the type this JavaType is checked with. + * @return <code>true</code> if this is compatible with the specified + * type; <code>false</code> otherwise. + */ + public boolean isCompatibleWith(JavaType javaType) + { + if (javaType == null) + return false; + + if (javaType instanceof BaseReflectionJavaType) { + BaseReflectionJavaType otherType = (BaseReflectionJavaType)javaType; + return otherType.getJavaClass().isAssignableFrom(clazz); + } + + return false; + } + + /** + * Returns the name of the type. If this type represents a class or + * interface, the name is fully qualified. + * @return type name + */ + public String getName() + { + return clazz.getName(); + } + + /** + * Returns the Java language modifiers for the field represented by + * this JavaType, as an integer. The java.lang.reflect.Modifier class + * should be used to decode the modifiers. + * @return the Java language modifiers for this JavaType + */ + public int getModifiers() + { + return clazz.getModifiers(); + } + + /** + * Returns the JavaType representing the superclass of the entity + * represented by this JavaType. If this JavaType represents either the + * Object class, an interface, a primitive type, or <code>void</code>, + * then <code>null</code> is returned. If this object represents an + * array class then the JavaType instance representing the Object class + * is returned. + * @return the superclass of the class represented by this JavaType. + */ + public JavaType getSuperclass() + { + return superclass; + } + + /** + * Returns a JavaField instance that reflects the field with the + * specified name of the class or interface represented by this + * JavaType instance. The method returns <code>null</code>, if the + * class or interface (or one of its superclasses) does not have a + * field with that name. + * @param fieldName the name of the field + * @return the JavaField instance for the specified field in this class + * or <code>null</code> if there is no such field. + */ + public JavaField getJavaField(String fieldName) + { + Field field = + BaseReflectionJavaField.getDeclaredFieldPrivileged(clazz, fieldName); + if (field != null) { + return new BaseReflectionJavaField(field, this); + } + + // check superclass, if available and other than Object + JavaType superclass = getSuperclass(); + if ((superclass != null) && (superclass != PredefinedType.objectType)) { + return superclass.getJavaField(fieldName); + } + + return null; + } + + // ===== Methods not defined in JavaType ===== + + /** + * Returns the java.lang.Class instance wrapped by this JavaType. + * @return the Class instance for this JavaType. + */ + public Class getJavaClass() + { + return clazz; + } + +} Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/JavaModel-Impl.jpg URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/JavaModel-Impl.jpg?view=diff&r1=161167&r2=161168 ============================================================================== Binary files - no diff available. Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/PredefinedType.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/PredefinedType.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/PredefinedType.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/PredefinedType.java Wed Apr 13 02:11:13 2005 @@ -50,7 +50,7 @@ * @since JDO 1.0.1 */ public class PredefinedType - extends ReflectionJavaType + extends BaseReflectionJavaType { /** Map of all predefined types. */ private static final Map predefinedTypes = new HashMap(); Added: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaField.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaField.java?view=auto&rev=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaField.java (added) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaField.java Wed Apr 13 02:11:13 2005 @@ -0,0 +1,130 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jdo.impl.model.java.reflection; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.lang.reflect.Field; + +import org.apache.jdo.impl.model.java.BaseReflectionJavaField; +import org.apache.jdo.model.ModelFatalException; +import org.apache.jdo.model.java.JavaField; +import org.apache.jdo.model.java.JavaType; +import org.apache.jdo.model.jdo.JDOField; +import org.apache.jdo.util.I18NHelper; + +/** + * A reflection based JavaField implementation used at runtime. + * The implementation takes <code>java.lang.reflect.Field</code> instances + * to get Java related metadata about fields. + * + * @author Michael Bouschen + * @since JDO 1.1 + */ +public class ReflectionJavaField + extends BaseReflectionJavaField +{ + /** The corresponding JDO metadata. */ + protected JDOField jdoField; + + /** I18N support */ + private final static I18NHelper msg = + I18NHelper.getInstance("org.apache.jdo.impl.model.java.Bundle"); //NOI18N + + /** + * Constructor for fields w/o JDO metadata. + * @param field the reflection field representation. + * @param declaringClass the JavaType of the class that declares the field. + */ + public ReflectionJavaField(Field field, JavaType declaringClass) + { + super(field, declaringClass); + this.type = getJavaTypeInternal(field.getType()); + } + + /** + * Constructor for fields having JDO metadata. The constructor takes + * the field type from the JDO metadata. + * @param jdoField the JDO field metadata. + * @param declaringClass the JavaType of the class that declares the field. + */ + public ReflectionJavaField(JDOField jdoField, JavaType declaringClass) + { + this(jdoField, null, declaringClass); + } + + /** + * Constructor for fields having JDO metadata. + * @param jdoField the JDO field metadata. + * @param type the field type. + * @param declaringClass the JavaType of the class that declares the field. + */ + public ReflectionJavaField(JDOField jdoField, JavaType type, JavaType declaringClass) + { + super((jdoField == null) ? null : jdoField.getName(), declaringClass); + if (jdoField == null) + throw new ModelFatalException(msg.msg( + "ERR_InvalidNullFieldInstance", //NOI18N + "ReflectionJavaField.<init>")); //NOI18N + this.jdoField = jdoField; + this.type = type; + } + + /** + * Returns the JavaType representation of the field type. + * @return field type + */ + public JavaType getType() + { + if (type == null) { + type = getJavaTypeInternal(getField().getType()); + } + return type; + } + + /** + * Returns the JDOField instance if this JavaField represents a + * managed field of a persistence capable class. The method returns + * <code>null</code>, if this JavaField does not represent a managed + * field. + * <p> + * The method throws a [EMAIL PROTECTED] org.apache.jdo.model.ModelFatalException}, + * if there is a problem accessing the JDO meta data for this JavaField. + * @return the JDOField instance if this JavaField represents a managed + * field; <code>null</code> otherwise. + */ + public JDOField getJDOField() + { + return jdoField; + } + + // ===== Methods not defined in JavaField ===== + + /** + * Returns a JavaType instance for the specified Class object. + * This method provides a hook such that ReflectionJavaField subclasses can + * implement their own mapping of Class objects to JavaType instances. + */ + protected JavaType getJavaTypeInternal(Class clazz) + { + return ((ReflectionJavaType)getDeclaringClass()).getJavaTypeInternal(clazz); + } + + + +} + Added: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaModel.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaModel.java?view=auto&rev=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaModel.java (added) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaModel.java Wed Apr 13 02:11:13 2005 @@ -0,0 +1,182 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jdo.impl.model.java.reflection; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.io.InputStream; + +import org.apache.jdo.impl.model.java.AbstractJavaModel; +import org.apache.jdo.model.ModelFatalException; +import org.apache.jdo.model.java.JavaType; +import org.apache.jdo.model.jdo.JDOModel; +import org.apache.jdo.util.I18NHelper; + +/** + * A reflection based JavaModel implementation used at runtime. + * The implementation takes <code>java.lang.Class</code> and + * <code>java.lang.reflect.Field</code> instances to get Java related + * metadata about types and fields. + * <p> + * The ReflectionJavaModel implementation will use this ClassLoader to lookup + * any type by name. This makes sure that the type name is unique. + * + * @author Michael Bouschen + * @since JDO 1.1 + */ +public abstract class ReflectionJavaModel + extends AbstractJavaModel +{ + /** The ClassLoader instance used as key to cache this JavaModel. */ + private final ClassLoader classLoader; + + /** Flag passed to the Class.forName call. */ + private final boolean initialize; + + /** I18N support */ + private final static I18NHelper msg = + I18NHelper.getInstance("org.apache.jdo.impl.model.java.Bundle"); //NOI18N + + /** Constructor taking the ClassLoader. */ + public ReflectionJavaModel(ClassLoader classLoader) + { + this(classLoader, true); + } + + /** */ + protected ReflectionJavaModel(ClassLoader classLoader, boolean initialize) + { + super(); + this.classLoader = classLoader; + this.initialize = initialize; + } + + /** + * The method returns the JavaType instance for the specified type + * name. A type name is unique within one JavaModel instance. The + * method returns <code>null</code> if this model instance does not + * know a type with the specified name. + * <p> + * Note, this method calls Class.forName with the wrapped ClassLoader, + * if it cannot find a JavaType with the specified name in the cache. + * @param name the name of the type + * @return a JavaType instance for the specified name or + * <code>null</code> if not present in this model instance. + */ + public JavaType getJavaType(String name) + { + synchronized (types) { + JavaType javaType = (JavaType)types.get(name); + if (javaType == null) { + try { + // Note, if name denotes a pc class that has not been + // loaded, Class.forName will load the class which + // calls RegisterClassListener.registerClass. + // This will create a new JavaType entry in the cache. + javaType = getJavaType(Class.forName(name, initialize, + classLoader)); + } + catch (ClassNotFoundException ex) { + // cannot find class => return null + } + catch (LinkageError ex) { + throw new ModelFatalException(msg.msg( + "EXC_ClassLoadingError", name, ex.toString())); //NOI18N + } + } + return javaType; + } + } + + /** + * The method returns the JavaType instance for the type name of the + * specified class object. This is a convenience method for + * <code>getJavaType(clazz.getName())</code>. The major difference + * between this method and getJavaType taking a type name is that this + * method is supposed to return a non-<code>null<code> value. The + * specified class object describes an existing type. + * <p> + * Note, this implementation does not call the overloaded getJavaType + * method taking a String, because this would retrieve the Class + * instance for the specified type again. Instead, it checks the cache + * directly. If not available it creates a new ReflectionJavaType using + * the specified class instance. + * @param clazz the Class instance representing the type + * @return a JavaType instance for the name of the specified class + * object or <code>null</code> if not present in this model instance. + */ + public JavaType getJavaType(Class clazz) + { + String name = clazz.getName(); + synchronized (types) { + JavaType javaType = (JavaType)types.get(name); + if (javaType == null) { + javaType = createJavaType(clazz); + types.put(name, javaType); + } + return javaType; + } + } + + /** + * Finds a resource with a given name. A resource is some data that can + * be accessed by class code in a way that is independent of the + * location of the code. The name of a resource is a "/"-separated path + * name that identifies the resource. The method method opens the + * resource for reading and returns an InputStream. It returns + * <code>null</code> if no resource with this name is found or if the + * caller doesn't have adequate privileges to get the resource. + * <p> + * This implementation delegates the request to the wrapped + * ClassLoader. + * @param resourceName the resource name + * @return an input stream for reading the resource, or <code>null</code> + * if the resource could not be found or if the caller doesn't have + * adequate privileges to get the resource. + */ + public InputStream getInputStreamForResource(final String resourceName) + { + return (InputStream) AccessController.doPrivileged( + new PrivilegedAction () { + public Object run () { + return classLoader.getResourceAsStream(resourceName); + } + } + ); + } + + // ===== Methods not defined in JavaModel ===== + + /** + * Returns the ClassLoader wrapped by this ReflectionJavaModel instance. + * @return the ClassLoader + */ + public ClassLoader getClassLoader() + { + return classLoader; + } + + /** + * Creates a new JavaType instance for the specified Class object. + * This method provides a hook such that ReflectionJavaModel subclasses + * can create instances of a different JavaType implementation. + * @param clazz the Class instance representing the type + * @return a new JavaType instance + */ + protected abstract JavaType createJavaType(Class clazz); + +} Added: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaType.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaType.java?view=auto&rev=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaType.java (added) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/reflection/ReflectionJavaType.java Wed Apr 13 02:11:13 2005 @@ -0,0 +1,259 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jdo.impl.model.java.reflection; + +import java.util.Map; +import java.util.HashMap; +import java.security.AccessController; +import java.security.PrivilegedAction; + +import java.lang.reflect.Field; + +import org.apache.jdo.impl.model.java.PredefinedType; +import org.apache.jdo.impl.model.java.BaseReflectionJavaField; +import org.apache.jdo.impl.model.java.BaseReflectionJavaType; +import org.apache.jdo.model.ModelFatalException; +import org.apache.jdo.model.java.JavaField; +import org.apache.jdo.model.java.JavaModel; +import org.apache.jdo.model.java.JavaModelFactory; +import org.apache.jdo.model.java.JavaType; +import org.apache.jdo.model.jdo.JDOClass; +import org.apache.jdo.model.jdo.JDOField; +import org.apache.jdo.model.jdo.JDOModel; +import org.apache.jdo.util.I18NHelper; + +/** +/** + * A reflection based JavaType implementation used at runtime. + * The implementation takes <code>java.lang.Class</code> and + * <code>java.lang.reflect.Field</code> instances to get Java related + * metadata about types and fields. + * + * @author Michael Bouschen + * @since JDO 1.1 + */ +public abstract class ReflectionJavaType + extends BaseReflectionJavaType +{ + /** The JDOModel instance to lookup JDO metadata. */ + private JDOModel jdoModel; + + /** Flag indicating whether the superclass is checked already. */ + private boolean superclassUnchecked = true; + + /** Flag indicating whether the JDOClass info is retrieved already. */ + private boolean jdoClassUnchecked = true; + + /** The JDO metadata, if this type represents a pc class. */ + private JDOClass jdoClass; + + /** Map of JavaField instances, key is the field name. */ + private Map javaFields = new HashMap(); + + /** I18N support */ + private final static I18NHelper msg = + I18NHelper.getInstance("org.apache.jdo.impl.model.java.Bundle"); //NOI18N + + /** Constructor. */ + public ReflectionJavaType(Class clazz, JDOModel jdoModel) + { + // Pass null as the superclass to the super call. This allows lazy + // evaluation of the superclass (see getSuperclass implementation). + super(clazz, null); + this.jdoModel = jdoModel; + } + + /** + * Determines if this JavaType object represents an array type. + * @return <code>true</code> if this object represents an array type; + * <code>false</code> otherwise. + */ + public boolean isArray() + { + return clazz.isArray(); + } + + /** + * Returns <code>true</code> if this JavaType represents a persistence + * capable class. + * <p> + * A [EMAIL PROTECTED] org.apache.jdo.model.ModelFatalException} indicates a + * problem accessing the JDO meta data for this JavaType. + * @return <code>true</code> if this JavaType represents a persistence + * capable class; <code>false</code> otherwise. + * @exception ModelFatalException if there is a problem accessing the + * JDO metadata + */ + public boolean isPersistenceCapable() + throws ModelFatalException + { + return (getJDOClass() != null); + } + + /** + * Returns the JavaType representing the superclass of the entity + * represented by this JavaType. If this JavaType represents either the + * Object class, an interface, a primitive type, or <code>void</code>, + * then <code>null</code> is returned. If this object represents an + * array class then the JavaType instance representing the Object class + * is returned. + * @return the superclass of the class represented by this JavaType. + */ + public synchronized JavaType getSuperclass() + { + if (superclassUnchecked) { + superclassUnchecked = false; + superclass = getJavaTypeInternal(clazz.getSuperclass()); + } + return superclass; + } + + /** + * Returns the JDOClass instance if this JavaType represents a + * persistence capable class. The method returns <code>null</code>, + * if this JavaType does not represent a persistence capable class. + * <p> + * A [EMAIL PROTECTED] org.apache.jdo.model.ModelFatalException} indicates a + * problem accessing the JDO meta data for this JavaType. + * @return the JDOClass instance if this JavaType represents a + * persistence capable class; <code>null</code> otherwise. + * @exception ModelFatalException if there is a problem accessing the + * JDO metadata + */ + public synchronized JDOClass getJDOClass() + throws ModelFatalException + { + if (jdoClassUnchecked) { + jdoClassUnchecked = false; + jdoClass = jdoModel.getJDOClass(getName()); + } + return jdoClass; + } + + /** + * Returns the JavaType representing the component type of an array. + * If this JavaType does not represent an array type this method + * returns <code>null</code>. + * @return the JavaType representing the component type of this + * JavaType if this class is an array; <code>null</code> otherwise. + */ + public JavaType getArrayComponentType() + { + JavaType componentType = null; + if (isArray()) { + Class componentClass = clazz.getComponentType(); + if (componentClass != null) + componentType = getJavaTypeInternal(componentClass); + } + return componentType; + } + + /** + * Returns a JavaField instance that reflects the field with the + * specified name of the class or interface represented by this + * JavaType instance. The method returns <code>null</code>, if the + * class or interface (or one of its superclasses) does not have a + * field with that name. + * @param fieldName the name of the field + * @return the JavaField instance for the specified field in this class + * or <code>null</code> if there is no such field. + */ + public JavaField getJavaField(String fieldName) + { + JavaField javaField = getDeclaredJavaField(fieldName); + if (javaField == null) { + // check superclass + JavaType superclass = getSuperclass(); + if ((superclass != null) && + (superclass != PredefinedType.objectType)) { + javaField = superclass.getJavaField(fieldName); + } + } + return javaField; + } + + // ===== Methods not defined in JavaType ===== + + /** + * RegisterClassListener calls this method to create a ReflectionJavaField + * instance when processing the enhancer generated metadata. + * @param jdoField the JDO field metadata + * @param type the type of the field + * @return the ReflectionJavaField representation + */ + public JavaField createJavaField(JDOField jdoField, JavaType type) + { + String name = jdoField.getName(); + synchronized(javaFields) { + JavaField javaField = (JavaField)javaFields.get(name); + if (javaField != null) { + throw new ModelFatalException(msg.msg( + "ERR_MultipleJavaField", //NOI18N + "ReflectionJavaType.createJavaField", name, getName())); //NOI18N + } + javaField = new ReflectionJavaField(jdoField, type, this); + javaFields.put(name, javaField); + return javaField; + } + } + + /** + * Returns a JavaField instance that reflects the declared field with + * the specified name of the class or interface represented by this + * JavaType instance. The method returns <code>null</code>, if the + * class or interface does not declared a field with that name. It does + * not check whether one of its superclasses declared such a field. + * @param fieldName the name of the field + * @return the JavaField instance for the specified field in this class + */ + public JavaField getDeclaredJavaField(String fieldName) + { + synchronized (javaFields) { + JavaField javaField = (JavaField)javaFields.get(fieldName); + if (javaField == null) { + JDOClass jdoClass = getJDOClass(); + if (jdoClass != null) { + // pc class => look for JDOField first + JDOField jdoField = jdoClass.getDeclaredField(fieldName); + if (jdoField != null) { + javaField = new ReflectionJavaField(jdoField, this); + javaFields.put(fieldName, javaField); + } + } + + // if no field info check reflection + if (javaField == null) { + Field field = ReflectionJavaField.getDeclaredFieldPrivileged( + clazz, fieldName); + if (field != null) { + javaField = new ReflectionJavaField(field, this); + javaFields.put(fieldName, javaField); + } + } + } + return javaField; + } + } + + /** + * Returns a JavaType instance for the specified Class object. + * This method provides a hook such that ReflectionJavaType subclasses can + * implement their own mapping of Class objects to JavaType instances. + */ + protected abstract JavaType getJavaTypeInternal(Class clazz); + +} Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModel.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModel.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModel.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModel.java Wed Apr 13 02:11:13 2005 @@ -20,7 +20,7 @@ import java.security.PrivilegedAction; import java.io.InputStream; -import org.apache.jdo.impl.model.java.AbstractJavaModel; +import org.apache.jdo.impl.model.java.reflection.ReflectionJavaModel; import org.apache.jdo.model.ModelFatalException; import org.apache.jdo.model.java.JavaType; import org.apache.jdo.model.jdo.JDOModel; @@ -40,135 +40,18 @@ * @since JDO 1.0.1 */ public class RuntimeJavaModel - extends AbstractJavaModel + extends ReflectionJavaModel { - /** The ClassLoader instance used as key to cache this JavaModel. */ - private final ClassLoader classLoader; - - /** Flag passed to the Class.forName call. */ - private final boolean initialize; - - /** I18N support */ - private final static I18NHelper msg = - I18NHelper.getInstance("org.apache.jdo.impl.model.java.Bundle"); //NOI18N - /** Constructor taking the ClassLoader. */ public RuntimeJavaModel(ClassLoader classLoader) { - this(classLoader, true); + super(classLoader, true); } /** */ protected RuntimeJavaModel(ClassLoader classLoader, boolean initialize) { - super(); - this.classLoader = classLoader; - this.initialize = initialize; - } - - /** - * The method returns the JavaType instance for the specified type - * name. A type name is unique within one JavaModel instance. The - * method returns <code>null</code> if this model instance does not - * know a type with the specified name. - * <p> - * Note, this method calls Class.forName with the wrapped ClassLoader, - * if it cannot find a JavaType with the specified name in the cache. - * @param name the name of the type - * @return a JavaType instance for the specified name or - * <code>null</code> if not present in this model instance. - */ - public JavaType getJavaType(String name) - { - synchronized (types) { - JavaType javaType = (JavaType)types.get(name); - if (javaType == null) { - try { - // Note, if name denotes a pc class that has not been - // loaded, Class.forName will load the class which - // calls RegisterClassListener.registerClass. - // This will create a new JavaType entry in the cache. - javaType = getJavaType(Class.forName(name, initialize, - classLoader)); - } - catch (ClassNotFoundException ex) { - // cannot find class => return null - } - catch (LinkageError ex) { - throw new ModelFatalException(msg.msg( - "EXC_ClassLoadingError", name, ex.toString())); //NOI18N - } - } - return javaType; - } - } - - /** - * The method returns the JavaType instance for the type name of the - * specified class object. This is a convenience method for - * <code>getJavaType(clazz.getName())</code>. The major difference - * between this method and getJavaType taking a type name is that this - * method is supposed to return a non-<code>null<code> value. The - * specified class object describes an existing type. - * <p> - * Note, this implementation does not call the overloaded getJavaType - * method taking a String, because this would retrieve the Class - * instance for the specified type again. Instead, it checks the cache - * directly. If not available it creates a new RuntimeJavaType using - * the specified class instance. - * @param clazz the Class instance representing the type - * @return a JavaType instance for the name of the specified class - * object or <code>null</code> if not present in this model instance. - */ - public JavaType getJavaType(Class clazz) - { - String name = clazz.getName(); - synchronized (types) { - JavaType javaType = (JavaType)types.get(name); - if (javaType == null) { - javaType = createJavaType(clazz); - types.put(name, javaType); - } - return javaType; - } - } - - /** - * Finds a resource with a given name. A resource is some data that can - * be accessed by class code in a way that is independent of the - * location of the code. The name of a resource is a "/"-separated path - * name that identifies the resource. The method method opens the - * resource for reading and returns an InputStream. It returns - * <code>null</code> if no resource with this name is found or if the - * caller doesn't have adequate privileges to get the resource. - * <p> - * This implementation delegates the request to the wrapped - * ClassLoader. - * @param resourceName the resource name - * @return an input stream for reading the resource, or <code>null</code> - * if the resource could not be found or if the caller doesn't have - * adequate privileges to get the resource. - */ - public InputStream getInputStreamForResource(final String resourceName) - { - return (InputStream) AccessController.doPrivileged( - new PrivilegedAction () { - public Object run () { - return classLoader.getResourceAsStream(resourceName); - } - } - ); - } - - // ===== Methods not defined in JavaModel ===== - - /** - * Returns the ClassLoader wrapped by this RuntimeJavaModel instance. - * @return the ClassLoader - */ - public ClassLoader getClassLoader() - { - return classLoader; + super(classLoader, initialize); } /** Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModelFactory.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModelFactory.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModelFactory.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaModelFactory.java Wed Apr 13 02:11:13 2005 @@ -30,7 +30,7 @@ import org.apache.jdo.model.java.JavaType; import org.apache.jdo.model.jdo.JDOModelFactory; import org.apache.jdo.impl.model.java.AbstractJavaModelFactory; -import org.apache.jdo.impl.model.java.ReflectionJavaType; +import org.apache.jdo.impl.model.java.BaseReflectionJavaType; import org.apache.jdo.impl.model.jdo.caching.JDOModelFactoryImplCaching; import org.apache.jdo.util.I18NHelper; @@ -255,7 +255,7 @@ return null; try { - return ((ReflectionJavaType)javaType).getJavaClass(); + return ((BaseReflectionJavaType)javaType).getJavaClass(); } catch (ClassCastException ex) { throw new ModelFatalException(msg.msg( Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaType.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaType.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaType.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/java/runtime/RuntimeJavaType.java Wed Apr 13 02:11:13 2005 @@ -16,17 +16,10 @@ package org.apache.jdo.impl.model.java.runtime; -import java.util.Map; -import java.util.HashMap; import java.security.AccessController; import java.security.PrivilegedAction; -import java.lang.reflect.Field; - -import org.apache.jdo.impl.model.java.PredefinedType; -import org.apache.jdo.impl.model.java.ReflectionJavaField; -import org.apache.jdo.impl.model.java.ReflectionJavaType; -import org.apache.jdo.model.ModelFatalException; +import org.apache.jdo.impl.model.java.reflection.ReflectionJavaType; import org.apache.jdo.model.java.JavaField; import org.apache.jdo.model.java.JavaModel; import org.apache.jdo.model.java.JavaModelFactory; @@ -51,21 +44,6 @@ public class RuntimeJavaType extends ReflectionJavaType { - /** The JDOModel instance to lookup JDO metadata. */ - private JDOModel jdoModel; - - /** Flag indicating whether the superclass is checked already. */ - private boolean superclassUnchecked = true; - - /** Flag indicating whether the JDOClass info is retrieved already. */ - private boolean jdoClassUnchecked = true; - - /** The JDO metadata, if this type represents a pc class. */ - private JDOClass jdoClass; - - /** Map of JavaField instances, key is the field name. */ - private Map javaFields = new HashMap(); - /** JavaModelFactory */ private static final RuntimeJavaModelFactory javaModelFactory = (RuntimeJavaModelFactory) AccessController.doPrivileged( @@ -76,189 +54,10 @@ } ); - /** I18N support */ - private final static I18NHelper msg = - I18NHelper.getInstance("org.apache.jdo.impl.model.java.Bundle"); //NOI18N - /** Constructor. */ public RuntimeJavaType(Class clazz, JDOModel jdoModel) { - // Pass null as the superclass to the super call. This allows lazy - // evaluation of the superclass (see getSuperclass implementation). - super(clazz, null); - this.jdoModel = jdoModel; - } - - /** - * Determines if this JavaType object represents an array type. - * @return <code>true</code> if this object represents an array type; - * <code>false</code> otherwise. - */ - public boolean isArray() - { - return clazz.isArray(); - } - - /** - * Returns <code>true</code> if this JavaType represents a persistence - * capable class. - * <p> - * A [EMAIL PROTECTED] org.apache.jdo.model.ModelFatalException} indicates a - * problem accessing the JDO meta data for this JavaType. - * @return <code>true</code> if this JavaType represents a persistence - * capable class; <code>false</code> otherwise. - * @exception ModelFatalException if there is a problem accessing the - * JDO metadata - */ - public boolean isPersistenceCapable() - throws ModelFatalException - { - return (getJDOClass() != null); - } - - /** - * Returns the JavaType representing the superclass of the entity - * represented by this JavaType. If this JavaType represents either the - * Object class, an interface, a primitive type, or <code>void</code>, - * then <code>null</code> is returned. If this object represents an - * array class then the JavaType instance representing the Object class - * is returned. - * @return the superclass of the class represented by this JavaType. - */ - public synchronized JavaType getSuperclass() - { - if (superclassUnchecked) { - superclassUnchecked = false; - superclass = getJavaTypeInternal(clazz.getSuperclass()); - } - return superclass; - } - - /** - * Returns the JDOClass instance if this JavaType represents a - * persistence capable class. The method returns <code>null</code>, - * if this JavaType does not represent a persistence capable class. - * <p> - * A [EMAIL PROTECTED] org.apache.jdo.model.ModelFatalException} indicates a - * problem accessing the JDO meta data for this JavaType. - * @return the JDOClass instance if this JavaType represents a - * persistence capable class; <code>null</code> otherwise. - * @exception ModelFatalException if there is a problem accessing the - * JDO metadata - */ - public synchronized JDOClass getJDOClass() - throws ModelFatalException - { - if (jdoClassUnchecked) { - jdoClassUnchecked = false; - jdoClass = jdoModel.getJDOClass(getName()); - } - return jdoClass; - } - - /** - * Returns the JavaType representing the component type of an array. - * If this JavaType does not represent an array type this method - * returns <code>null</code>. - * @return the JavaType representing the component type of this - * JavaType if this class is an array; <code>null</code> otherwise. - */ - public JavaType getArrayComponentType() - { - JavaType componentType = null; - if (isArray()) { - Class componentClass = clazz.getComponentType(); - if (componentClass != null) - componentType = getJavaTypeInternal(componentClass); - } - return componentType; - } - - /** - * Returns a JavaField instance that reflects the field with the - * specified name of the class or interface represented by this - * JavaType instance. The method returns <code>null</code>, if the - * class or interface (or one of its superclasses) does not have a - * field with that name. - * @param fieldName the name of the field - * @return the JavaField instance for the specified field in this class - * or <code>null</code> if there is no such field. - */ - public JavaField getJavaField(String fieldName) - { - JavaField javaField = getDeclaredJavaField(fieldName); - if (javaField == null) { - // check superclass - JavaType superclass = getSuperclass(); - if ((superclass != null) && - (superclass != PredefinedType.objectType)) { - javaField = superclass.getJavaField(fieldName); - } - } - return javaField; - } - - // ===== Methods not defined in JavaType ===== - - /** - * RegisterClassListener calls this method to create a RuntimeJavaField - * instance when processing the enhancer generated metadata. - * @param jdoField the JDO field metadata - * @param type the type of the field - * @return the RuntimeJavaField representation - */ - public JavaField createJavaField(JDOField jdoField, JavaType type) - { - String name = jdoField.getName(); - synchronized(javaFields) { - JavaField javaField = (JavaField)javaFields.get(name); - if (javaField != null) { - throw new ModelFatalException(msg.msg( - "ERR_MultipleJavaField", //NOI18N - "RuntimeJavaType.createJavaField", name, getName())); //NOI18N - } - javaField = new RuntimeJavaField(jdoField, type, this); - javaFields.put(name, javaField); - return javaField; - } - } - - /** - * Returns a JavaField instance that reflects the declared field with - * the specified name of the class or interface represented by this - * JavaType instance. The method returns <code>null</code>, if the - * class or interface does not declared a field with that name. It does - * not check whether one of its superclasses declared such a field. - * @param fieldName the name of the field - * @return the JavaField instance for the specified field in this class - */ - public JavaField getDeclaredJavaField(String fieldName) - { - synchronized (javaFields) { - JavaField javaField = (JavaField)javaFields.get(fieldName); - if (javaField == null) { - JDOClass jdoClass = getJDOClass(); - if (jdoClass != null) { - // pc class => look for JDOField first - JDOField jdoField = jdoClass.getDeclaredField(fieldName); - if (jdoField != null) { - javaField = new RuntimeJavaField(jdoField, this); - javaFields.put(fieldName, javaField); - } - } - - // if no field info check reflection - if (javaField == null) { - Field field = ReflectionJavaField.getDeclaredFieldPrivileged( - clazz, fieldName); - if (field != null) { - javaField = new RuntimeJavaField(field, this); - javaFields.put(fieldName, javaField); - } - } - } - return javaField; - } + super(clazz, jdoModel); } /** Modified: incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/jdo/xml/JDOParser.java URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/jdo/xml/JDOParser.java?view=diff&r1=161167&r2=161168 ============================================================================== --- incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/jdo/xml/JDOParser.java (original) +++ incubator/jdo/trunk/ri11/src/java/org/apache/jdo/impl/model/jdo/xml/JDOParser.java Wed Apr 13 02:11:13 2005 @@ -34,9 +34,6 @@ import org.xml.sax.*; import org.xml.sax.helpers.*; -import javax.jdo.JDOFatalInternalException; - - /** * The class reads XML documents according to specified DTD and * translates all related events into JDOHandler events. @@ -301,7 +298,7 @@ } ); if (stream == null) { - throw new JDOFatalInternalException( + throw new RuntimeException( msg.msg("EXC_MissingJDODTD", //NOI18N publicId, systemId)); }