You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/04/25 11:11:12 UTC
svn commit: r768498 - in /openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/meta/
openjpa-kernel/src/test/java/org/apache/openjpa/meta/
openjpa-persistence-jdbc/src/test/java/org/apac...
Author: ppoddar
Date: Sat Apr 25 09:11:11 2009
New Revision: 768498
URL: http://svn.apache.org/viewvc?rev=768498&view=rev
Log:
OPENJPA-926,OPENJPA-1050: handling corner cases of access type. moving uniformaly to access code. adding type parameters.
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ObjectIdStateManager.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueMetaDataImpl.java
openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestAccessCode.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/AbstractUnenhancedClassTest.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/FullName.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataSerializer.java
openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ObjectIdStateManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ObjectIdStateManager.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ObjectIdStateManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ObjectIdStateManager.java Sat Apr 25 09:11:11 2009
@@ -30,6 +30,7 @@
import org.apache.openjpa.enhance.StateManager;
import org.apache.openjpa.enhance.Reflection;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
+import org.apache.openjpa.meta.AccessCode;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.meta.JavaTypes;
@@ -698,8 +699,7 @@
val = Reflection.get(_oid, (Field) fmd.getBackingMember());
else if (fmd.getBackingMember() instanceof Method)
val = Reflection.get(_oid, (Method) fmd.getBackingMember());
- else if (fmd.getDefiningMetaData().getAccessType()
- == ClassMetaData.ACCESS_FIELD)
+ else if (AccessCode.isField(fmd.getDefiningMetaData().getAccessType()))
val = Reflection.get(_oid, Reflection.findField(_oid.getClass(),
fmd.getName(), true));
else
@@ -733,11 +733,10 @@
FieldMetaData fmd = getMetaData().getField(field);
if (fmd.getBackingMember() instanceof Field)
Reflection.set(_oid, (Field) fmd.getBackingMember(), val);
- else if (fmd.getDefiningMetaData().getAccessType()
- == ClassMetaData.ACCESS_FIELD) {
+ else if (AccessCode.isField(fmd.getDefiningMetaData().getAccessType()))
Reflection.set(_oid, Reflection.findField(_oid.getClass(),
fmd.getName(), true), val);
- } else
+ else
Reflection.set(_oid, Reflection.findSetter(_oid.getClass(),
fmd.getName(), fmd.getDeclaredType(), true), val);
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractMetaDataDefaults.java Sat Apr 25 09:11:11 2009
@@ -51,7 +51,7 @@
private static final Localizer _loc = Localizer.forPackage
(AbstractMetaDataDefaults.class);
- private int _access = ClassMetaData.ACCESS_FIELD;
+ private int _access = AccessCode.FIELD;
private int _identity = ClassMetaData.ID_UNKNOWN;
private boolean _ignore = true;
private boolean _interface = true;
@@ -180,7 +180,7 @@
for (int i = 0; i < fieldNames.length; i ++) {
String property = fieldNames[i];
member = getMemberByProperty(meta, property);
- if (member == null) // transient
+ if (member == null) // transient or indeterminable access
continue;
fmd = meta.addDeclaredField(property, fieldTypes[i]);
fmd.backingMember(member);
@@ -331,29 +331,32 @@
public Member getBackingMember(FieldMetaData fmd) {
if (fmd == null)
return null;
- try {
- //### note that we might not have access to declaring metadata yet
- //### (this could be used during parse), so we have to settle for
- //### defining. could cause problems if maps a superclass field
- //### where the superclass uses a different access type
- if (fmd.getBackingMember() == null) {
- if ((fmd.getDefiningMetaData().getAccessType() &
- ClassMetaData.ACCESS_FIELD) == ClassMetaData.ACCESS_FIELD)
- return AccessController.doPrivileged(
- J2DoPrivHelper.getDeclaredFieldAction(
- fmd.getDeclaringType(), fmd.getName()));
- return Reflection.findGetter(fmd.getDeclaringType(),
- fmd.getName(), true);
- } else {
- return fmd.getBackingMember();
- }
- } catch (OpenJPAException ke) {
- throw ke;
- } catch (Exception e) {
- if (e instanceof PrivilegedActionException)
- e = ((PrivilegedActionException) e).getException();
- throw new InternalException(e);
- }
+ if (fmd.getBackingMember() != null)
+ return fmd.getBackingMember();
+ return getMemberByProperty(fmd.getDeclaringMetaData(), fmd.getName());
+// try {
+// //### note that we might not have access to declaring metadata yet
+// //### (this could be used during parse), so we have to settle for
+// //### defining. could cause problems if maps a superclass field
+// //### where the superclass uses a different access type
+// if (fmd.getBackingMember() == null) {
+// if ((fmd.getDefiningMetaData().getAccessType() &
+// ClassMetaData.ACCESS_FIELD) == ClassMetaData.ACCESS_FIELD)
+// return AccessController.doPrivileged(
+// J2DoPrivHelper.getDeclaredFieldAction(
+// fmd.getDeclaringType(), fmd.getName()));
+// return Reflection.findGetter(fmd.getDeclaringType(),
+// fmd.getName(), true);
+// } else {
+// return fmd.getBackingMember();
+// }
+// } catch (OpenJPAException ke) {
+// throw ke;
+// } catch (Exception e) {
+// if (e instanceof PrivilegedActionException)
+// e = ((PrivilegedActionException) e).getException();
+// throw new InternalException(e);
+// }
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/AccessCode.java Sat Apr 25 09:11:11 2009
@@ -26,8 +26,10 @@
* The bits designate following aspects of access style being used at class
* level:<br>
*
- * <LI>Bit position 0 (UNKNOWN): always 0. All bits as zero represent
- * that no access style has been set.
+ * <LI>Bit position 0 (UNKNOWN): generally 0. All bits as zero represent
+ * that no access style has been set. 1 denotes that the
+ * class has no property at all and its access can not be
+ * determined.
* <LI>Bit position 1 (FIELD): Field based access is default
* <LI>Bit position 2 (PROPERTY): Property based access is default
* <LI>Bit position 3 (EXPLICIT): whether explicit or implicit
@@ -66,6 +68,7 @@
*/
public class AccessCode {
public static int UNKNOWN = 0;
+ public static int EMPTY = 1;
public static int FIELD = 2 << 0;
public static int PROPERTY = 2 << 1;
public static int EXPLICIT = 2 << 2;
@@ -75,11 +78,13 @@
* Affirms if the given code is valid.
*/
public static boolean isValidClassCode(int code) {
- return code%2 == 0 // code must be even
+ if (code == EMPTY)
+ return true;
+ return (code%2 == 0 || code == EMPTY)
&& code >= UNKNOWN
&& code <= (MIXED|EXPLICIT|PROPERTY)
&& !(isProperty(code) && isField(code)) // both 1 & 2 can not be set
- && (isProperty(code) || isField(code) || !isSet(code))
+ && (isProperty(code) || isField(code) || isUnknown(code))
&& ((isMixed(code) && isExplicit(code)) || !isMixed(code));
}
@@ -88,7 +93,7 @@
&& code >= UNKNOWN
&& code <= (EXPLICIT|PROPERTY)
&& !(isProperty(code) && isField(code))
- && (isProperty(code) || isField(code) || !isSet(code));
+ && (isProperty(code) || isField(code) || isUnknown(code));
}
/**
@@ -111,8 +116,40 @@
return (code & FIELD) != 0;
}
- public static boolean isSet(int code) {
- return code != UNKNOWN;
+ public static boolean isUnknown(int code) {
+ return code == UNKNOWN;
+ }
+
+ public static boolean isEmpty(int code) {
+ return code == EMPTY;
+ }
+
+ public static boolean isField(ClassMetaData meta) {
+ return isField(meta.getAccessType());
+ }
+
+ public static boolean isProperty(ClassMetaData meta) {
+ return isProperty(meta.getAccessType());
+ }
+
+ public static boolean isUnknown(ClassMetaData meta) {
+ return isUnknown(meta.getAccessType());
+ }
+
+ public static boolean isEmpty(ClassMetaData meta) {
+ return isEmpty(meta.getAccessType());
+ }
+
+ public static boolean isField(FieldMetaData meta) {
+ return isField(meta.getAccessType());
+ }
+
+ public static boolean isProperty(FieldMetaData meta) {
+ return isProperty(meta.getAccessType());
+ }
+
+ public static boolean isUnknown(FieldMetaData meta) {
+ return isUnknown(meta.getAccessType());
}
/**
@@ -120,7 +157,7 @@
* access style.
*/
public static boolean isCompatibleSuper(int subCode, int superCode) {
- if (!isSet(superCode))
+ if (isEmpty(superCode))
return true;
if (isValidClassCode(subCode) && isValidClassCode(superCode)) {
if (isExplicit(subCode))
@@ -139,8 +176,8 @@
*/
public static int mergeFieldCode(int cCode, int fCode) {
if (isValidClassCode(cCode) && isValidFieldCode(fCode)) {
- if (!isSet(cCode)) {
- if (!isSet(fCode))
+ if (isUnknown(cCode)) {
+ if (isUnknown(fCode))
return UNKNOWN;
return isProperty(fCode) ? PROPERTY : FIELD;
}
@@ -181,6 +218,8 @@
return "invalid code " + code;
if (code == UNKNOWN)
return "unknown access";
+ if (code == EMPTY)
+ return "empty access";
return (isMixed(code) ? "mixed " : "")
+ (isExplicit(code) ? "explicit " : "implicit ")
+ (isField(code) ? "field" : "property")
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java Sat Apr 25 09:11:11 2009
@@ -175,7 +175,7 @@
new HashMap<Class<?>,Map<String,String>>();
private int _identity = ID_UNKNOWN;
private int _idStrategy = ValueStrategies.NONE;
- private int _accessType = ACCESS_UNKNOWN;
+ private int _accessType = AccessCode.UNKNOWN;
private boolean _replicated = false;
private String _seqName = DEFAULT_STRING;
@@ -677,13 +677,13 @@
* Sets the access type.
*/
public void setAccessType(int type) {
- if (type == _accessType || type == ACCESS_UNKNOWN)
+ if (type == _accessType || type == AccessCode.UNKNOWN)
return;
if (!AccessCode.isValidClassCode(type)) {
throw new IllegalArgumentException(_loc.get("access-type-invalid",
this, AccessCode.toString(type)).getMessage());
}
- if (_accessType != ACCESS_UNKNOWN) { // changing access type
+ if (_accessType != AccessCode.UNKNOWN) { // changing access type
_repos.getLog().warn(_loc.get("access-type-change",
this, AccessCode.toString(type),
AccessCode.toString(_accessType)).getMessage());
@@ -2087,7 +2087,7 @@
c = fmds[i].getObjectIdFieldType();
}
- if (fmds[i].getAccessType() == ACCESS_FIELD) {
+ if (AccessCode.isField(fmds[i].getAccessType())) {
f = Reflection.findField(oid, fmds[i].getName(), false);
if (f == null || !f.getType().isAssignableFrom(c))
throw new MetaDataException(_loc.get("invalid-id",
@@ -2123,8 +2123,8 @@
* same as that of this receiver.
*/
private void validateAccessType() {
- if (!AccessCode.isSet(_accessType)
- || AccessCode.isExplicit(_accessType))
+ if (AccessCode.isEmpty(_accessType)
+ || AccessCode.isExplicit(_accessType))
return;
ClassMetaData sup = getPCSuperclassMetaData();
while (sup != null && sup.isExplicitAccess())
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java Sat Apr 25 09:11:11 2009
@@ -72,6 +72,7 @@
*
* @author Abe White
*/
+@SuppressWarnings("serial")
public class FieldMetaData
extends Extensions
implements ValueMetaData, MetaDataContext, MetaDataModes, Commentable {
@@ -137,13 +138,13 @@
private final ValueMetaData _elem;
private final ClassMetaData _owner;
private final String _name;
- private Class _dec = null;
+ private Class<?> _dec = null;
private ClassMetaData _decMeta = null;
private String _fullName = null;
private String _embedFullName = null;
private int _resMode = MODE_NONE;
private String _mappedByIdValue = null;
- private int _access = ClassMetaData.ACCESS_UNKNOWN;
+ private int _access = AccessCode.UNKNOWN;
// load/store info
private String[] _comments = null;
@@ -154,7 +155,7 @@
////////////////////////////////////////////////////////////////////
// misc info
- private Class _proxyClass = null;
+ private Class<?> _proxyClass = null;
private Object _initializer = null;
private boolean _transient = false;
private boolean _primKey = false;
@@ -166,7 +167,7 @@
private int _pkIndex = -1;
private boolean _explicit = false;
private int _dfg = 0;
- private Set _fgSet = null;
+ private Set<String> _fgSet = null;
private String[] _fgs = null;
private String _lfg = null;
private Boolean _lrs = null;
@@ -220,7 +221,7 @@
* @param type the field type
* @param owner the owning class metadata
*/
- protected FieldMetaData(String name, Class type, ClassMetaData owner) {
+ protected FieldMetaData(String name, Class<?> type, ClassMetaData owner) {
_name = name;
_owner = owner;
_dec = null;
@@ -246,18 +247,18 @@
_backingMember = new MemberProvider(member);
- Class type;
- Class[] types;
+ Class<?> type;
+ Class<?>[] types;
if (member instanceof Field) {
Field f = (Field) member;
type = f.getType();
types = JavaVersions.getParameterizedTypes(f);
- setAccessType(ClassMetaData.ACCESS_FIELD);
+ setAccessType(AccessCode.FIELD);
} else {
Method meth = (Method) member;
type = meth.getReturnType();
types = JavaVersions.getParameterizedTypes(meth);
- setAccessType(ClassMetaData.ACCESS_PROPERTY);
+ setAccessType(AccessCode.PROPERTY);
}
setDeclaredType(type);
@@ -305,7 +306,7 @@
/**
* The declaring class.
*/
- public void setDeclaringType(Class cls) {
+ public void setDeclaringType(Class<?> cls) {
_dec = cls;
_decMeta = null;
_fullName = null;
@@ -397,7 +398,7 @@
* The type this field was initialized with, and therefore the
* type to use for proxies when loading data into this field.
*/
- public Class getProxyType() {
+ public Class<?> getProxyType() {
return (_proxyClass == null) ? getDeclaredType() : _proxyClass;
}
@@ -405,7 +406,7 @@
* The type this field was initialized with, and therefore the
* type to use for proxies when loading data into this field.
*/
- public void setProxyType(Class type) {
+ public void setProxyType(Class<?> type) {
_proxyClass = type;
}
@@ -568,7 +569,7 @@
* For a primary key field, return the type of the corresponding object id
* class field.
*/
- public Class getObjectIdFieldType() {
+ public Class<?> getObjectIdFieldType() {
ClassMetaData relmeta = getDeclaredTypeMetaData();
if (relmeta == null || getValue().isEmbedded())
return getDeclaredType();
@@ -640,8 +641,8 @@
private boolean isEnum() {
if (_enumField == null) {
- Class dt = getDeclaredType();
- _enumField = JavaVersions.isEnumeration(dt)
+ Class<?> decl = getDeclaredType();
+ _enumField = JavaVersions.isEnumeration(decl)
? Boolean.TRUE : Boolean.FALSE;
}
return _enumField.booleanValue();
@@ -649,8 +650,8 @@
private boolean isSerializable() {
if (_serializableField == null) {
- Class dt = getDeclaredType();
- if (Serializable.class.isAssignableFrom(dt))
+ Class<?> decl = getDeclaredType();
+ if (Serializable.class.isAssignableFrom(decl))
_serializableField = Boolean.TRUE;
else
_serializableField = Boolean.FALSE;
@@ -661,9 +662,9 @@
private boolean isLobArray() {
// check for byte[], Byte[], char[], Character[]
if (_lobField == null) {
- Class dt = getDeclaredType();
- if (dt == byte[].class || dt == Byte[].class ||
- dt == char[].class || dt == Character[].class)
+ Class<?> decl = getDeclaredType();
+ if (decl == byte[].class || decl == Byte[].class ||
+ decl == char[].class || decl == Character[].class)
_lobField = Boolean.TRUE;
else
_lobField = Boolean.FALSE;
@@ -767,7 +768,7 @@
if (_owner.getFetchGroup(fg) == null)
throw new MetaDataException(_loc.get("unknown-fg", fg, this));
if (in && _fgSet == null)
- _fgSet = new HashSet();
+ _fgSet = new HashSet<String>();
if ((in && _fgSet.add(fg))
|| (!in && _fgSet != null && _fgSet.remove(fg)))
_fgs = null;
@@ -922,7 +923,7 @@
break;
}
- Collection inverses = null;
+ Collection<FieldMetaData> inverses = null;
if (meta != null) {
// add mapped by and named inverse, if any
FieldMetaData field = getMappedByMetaData();
@@ -931,7 +932,7 @@
// inverses must be
if (field.getTypeCode() == JavaTypes.PC
|| field.getElement().getTypeCode() == JavaTypes.PC) {
- inverses = new ArrayList(3);
+ inverses = new ArrayList<FieldMetaData>(3);
inverses.add(field);
}
} else if (inv != null) {
@@ -939,13 +940,13 @@
if (field == null)
throw new MetaDataException(_loc.get("no-inverse",
this, inv));
- inverses = new ArrayList(3);
+ inverses = new ArrayList<FieldMetaData>(3);
inverses.add(field);
}
// scan rel type for fields that name this field as an inverse
FieldMetaData[] fields = meta.getFields();
- Class type = getDeclaringMetaData().getDescribedType();
+ Class<?> type = getDeclaringMetaData().getDescribedType();
for (int i = 0; i < fields.length; i++) {
// skip fields that aren't compatible with our owning class
switch (fields[i].getTypeCode()) {
@@ -969,7 +970,7 @@
if (_name.equals(fields[i].getMappedBy())
|| _name.equals(fields[i].getInverse())) {
if (inverses == null)
- inverses = new ArrayList(3);
+ inverses = new ArrayList<FieldMetaData>(3);
if (!inverses.contains(fields[i]))
inverses.add(fields[i]);
}
@@ -980,7 +981,7 @@
if (inverses == null)
_inverses = repos.EMPTY_FIELDS;
else
- _inverses = (FieldMetaData[]) inverses.toArray
+ _inverses = inverses.toArray
(repos.newFieldMetaDataArray(inverses.size()));
}
return _inverses;
@@ -1224,17 +1225,17 @@
return val;
// create a comparator for the elements of the value
- Comparator comp;
+ Comparator<?> comp;
if (orders.length == 1)
comp = orders[0].getComparator();
else {
- List comps = null;
- Comparator curComp;
+ List<Comparator<?>> comps = null;
+ Comparator<?> curComp;
for (int i = 0; i < orders.length; i++) {
curComp = orders[i].getComparator();
if (curComp != null) {
if (comps == null)
- comps = new ArrayList(orders.length);
+ comps = new ArrayList<Comparator<?>>(orders.length);
if (i != comps.size())
throw new MetaDataException(_loc.get
("mixed-inmem-ordering", this));
@@ -1584,8 +1585,8 @@
String methodName = Strings.getClassName(method);
String clsName = Strings.getPackageName(method);
- Class cls = null;
- Class owner = _owner.getDescribedType();
+ Class<?> cls = null;
+ Class<?> owner = _owner.getDescribedType();
if (clsName.length() == 0)
cls = getDeclaredType();
@@ -1597,14 +1598,14 @@
// find the named method
Method[] methods = cls.getMethods();
- Class[] params;
+ Class<?>[] params;
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals(methodName)) {
params = methods[i].getParameterTypes();
// static factory methods require one argument or one argument
- // plus a ctx; non-static methods require zero arguments or
- // just a ctx
+ // plus a context; non-static methods require zero arguments or
+ // just a context
if (Modifier.isStatic(methods[i].getModifiers())
&& (params.length == 1 || (params.length == 2
&& isStoreContextParameter(params[1]))))
@@ -1624,7 +1625,7 @@
* use the standard <code>isAssignableFrom</code> because of classloader
* oddness.
*/
- private static boolean isStoreContextParameter(Class type) {
+ private static boolean isStoreContextParameter(Class<?> type) {
return StoreContext.class.getName().equals(type.getName());
}
@@ -1717,7 +1718,7 @@
_owner.getDescribedType())
|| (validate & MetaDataRepository.VALIDATE_UNENHANCED) == 0)) {
validateLRS();
- if ((validate & repos.VALIDATE_RUNTIME) == 0)
+ if ((validate & MetaDataRepository.VALIDATE_RUNTIME) == 0)
validateSupportedType();
validateValue();
validateExtensionKeys();
@@ -1736,7 +1737,7 @@
if (getTypeCode() == JavaTypes.ARRAY)
throw new MetaDataException(_loc.get("bad-lrs-array", this));
- // can't use lrs for extranalized vals
+ // can't use lrs for externalized vals
if (getExternalizerMethod() != null)
throw new MetaDataException(_loc.get("bad-lrs-extern", this));
@@ -1752,12 +1753,12 @@
private void validateSupportedType() {
// log warnings about things we don't handle
OpenJPAConfiguration conf = getRepository().getConfiguration();
- Collection opts = conf.supportedOptions();
- Log log = conf.getLog(conf.LOG_METADATA);
+ Collection<String> opts = conf.supportedOptions();
+ Log log = conf.getLog(OpenJPAConfiguration.LOG_METADATA);
switch (getTypeCode()) {
case JavaTypes.PC:
- if (isEmbedded() &&
- !opts.contains(conf.OPTION_EMBEDDED_RELATION)) {
+ if (isEmbedded() && !opts.contains(
+ OpenJPAConfiguration.OPTION_EMBEDDED_RELATION)) {
setEmbedded(false);
if (log.isWarnEnabled())
log.warn(_loc.get("cant-embed", this));
@@ -1769,44 +1770,42 @@
}
break;
case JavaTypes.COLLECTION:
- if (!opts.contains(conf.OPTION_TYPE_COLLECTION))
+ if (!opts.contains(OpenJPAConfiguration.OPTION_TYPE_COLLECTION))
throw new UnsupportedException(
_loc.get("type-not-supported",
"Collection", this));
- if (_elem.isEmbeddedPC()
- && !opts.contains(conf.OPTION_EMBEDDED_COLLECTION_RELATION))
- {
+ if (_elem.isEmbeddedPC() && !opts.contains(
+ OpenJPAConfiguration.OPTION_EMBEDDED_COLLECTION_RELATION)){
_elem.setEmbedded(false);
if (log.isWarnEnabled())
log.warn(_loc.get("cant-embed-element", this));
}
break;
case JavaTypes.ARRAY:
- if (!opts.contains(conf.OPTION_TYPE_ARRAY))
+ if (!opts.contains(OpenJPAConfiguration.OPTION_TYPE_ARRAY))
throw new UnsupportedException(
_loc.get("type-not-supported",
"Array", this));
- if (_elem.isEmbeddedPC()
- && !opts.contains(conf.OPTION_EMBEDDED_COLLECTION_RELATION))
- {
+ if (_elem.isEmbeddedPC() && !opts.contains(
+ OpenJPAConfiguration.OPTION_EMBEDDED_COLLECTION_RELATION)) {
_elem.setEmbedded(false);
if (log.isWarnEnabled())
log.warn(_loc.get("cant-embed-element", this));
}
break;
case JavaTypes.MAP:
- if (!opts.contains(conf.OPTION_TYPE_MAP))
+ if (!opts.contains(OpenJPAConfiguration.OPTION_TYPE_MAP))
throw new UnsupportedException(
_loc.get("type-not-supported",
"Map", this));
- if (_elem.isEmbeddedPC()
- && !opts.contains(conf.OPTION_EMBEDDED_MAP_RELATION)) {
+ if (_elem.isEmbeddedPC() && !opts.contains(
+ OpenJPAConfiguration.OPTION_EMBEDDED_MAP_RELATION)) {
_elem.setEmbedded(false);
if (log.isWarnEnabled())
log.warn(_loc.get("cant-embed-element", this));
}
- if (_key.isEmbeddedPC()
- && !opts.contains(conf.OPTION_EMBEDDED_MAP_RELATION)) {
+ if (_key.isEmbeddedPC() && !opts.contains(
+ OpenJPAConfiguration.OPTION_EMBEDDED_MAP_RELATION)) {
_key.setEmbedded(false);
if (log.isWarnEnabled())
log.warn(_loc.get("cant-embed-key", this));
@@ -2056,23 +2055,19 @@
_val.setValueMappedBy(mapped);
}
- public FieldMetaData getValueMappedByMetaData ()
- {
+ public FieldMetaData getValueMappedByMetaData () {
return _val.getValueMappedByMetaData ();
}
- public Class getTypeOverride ()
- {
+ public Class<?> getTypeOverride () {
return _val.getTypeOverride ();
}
- public void setTypeOverride (Class type)
- {
+ public void setTypeOverride(Class type) {
_val.setTypeOverride (type);
}
- public void copy (ValueMetaData vmd)
- {
+ public void copy (ValueMetaData vmd) {
_val.copy (vmd);
}
@@ -2121,7 +2116,7 @@
public void readExternal(ObjectInput in)
throws IOException, ClassNotFoundException {
boolean isField = in.readBoolean();
- Class cls = (Class) in.readObject();
+ Class<?> cls = (Class<?>) in.readObject();
String memberName = (String) in.readObject();
try {
if (isField)
@@ -2129,7 +2124,7 @@
J2DoPrivHelper.getDeclaredFieldAction(
cls, memberName));
else {
- Class[] parameterTypes = (Class[]) in.readObject();
+ Class<?>[] parameterTypes = (Class[]) in.readObject();
_member = AccessController.doPrivileged(
J2DoPrivHelper.getDeclaredMethodAction(
cls, memberName, parameterTypes));
@@ -2187,11 +2182,10 @@
/**
* Gets the access type used by this field. If no access type is set for
- * this field then return the default access type used by the declaring
- * class.
+ * this field then return the access type used by the declaring class.
*/
public int getAccessType() {
- if (!AccessCode.isSet(_access)) {
+ if (AccessCode.isUnknown(_access)) {
int fCode = AccessCode.toFieldCode(getDeclaringMetaData()
.getAccessType());
return fCode;
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueMetaDataImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueMetaDataImpl.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueMetaDataImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ValueMetaDataImpl.java Sat Apr 25 09:11:11 2009
@@ -191,7 +191,7 @@
_embeddedMeta = repos.newEmbeddedClassMetaData(this);
_embeddedMeta.setDescribedType(_decType);
repos.getMetaDataFactory().getDefaults().populate(_embeddedMeta,
- ClassMetaData.ACCESS_UNKNOWN);
+ AccessCode.UNKNOWN);
setEmbedded(true);
return _embeddedMeta;
Modified: openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestAccessCode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestAccessCode.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestAccessCode.java (original)
+++ openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestAccessCode.java Sat Apr 25 09:11:11 2009
@@ -38,8 +38,8 @@
isValidClassCode(true, 28, MIXED | EXPLICIT | PROPERTY);
isValidClassCode(false, 30, MIXED | EXPLICIT | FIELD | PROPERTY);
- // All odd codes are invalid
- for (int i = 1; i < 32; i += 2)
+ // All odd codes other than 1 are invalid
+ for (int i = 3; i < 32; i += 2)
assertFalse("Not a valid Class Code: " + AccessCode.toString(i),
AccessCode.isValidClassCode(i));
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/AbstractUnenhancedClassTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/AbstractUnenhancedClassTest.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/AbstractUnenhancedClassTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/AbstractUnenhancedClassTest.java Sat Apr 25 09:11:11 2009
@@ -31,6 +31,7 @@
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.JPAFacadeHelper;
import org.apache.openjpa.kernel.OpenJPAStateManager;
+import org.apache.openjpa.meta.AccessCode;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.util.ImplHelper;
import org.apache.openjpa.event.AbstractLifecycleListener;
@@ -307,8 +308,8 @@
// we only expect lazy loading to work when we can redefine classes
// or when accessing a property-access record that OpenJPA created.
if (ClassRedefiner.canRedefineClasses()
- || (!userDefined && sm.getMetaData().getAccessType()
- != ClassMetaData.ACCESS_FIELD)) {
+ || (!userDefined
+ && AccessCode.isProperty(sm.getMetaData().getAccessType()))) {
assertFalse(sm.getLoaded()
.get(sm.getMetaData().getField("stringField").getIndex()));
@@ -359,8 +360,7 @@
// we only expect lazy loading to work when we can redefine classes
// or when accessing a property-access record that OpenJPA created.
if (ClassRedefiner.canRedefineClasses()
- || (sm.getMetaData().getAccessType() != ClassMetaData.ACCESS_FIELD))
- {
+ || AccessCode.isProperty(sm.getMetaData().getAccessType())) {
assertFalse(sm.getLoaded()
.get(sm.getMetaData().getField("lazyField").getIndex()));
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/FullName.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/FullName.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/FullName.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/maps/m2mmapex6/FullName.java Sat Apr 25 09:11:11 2009
@@ -18,9 +18,12 @@
*/
package org.apache.openjpa.persistence.jdbc.maps.m2mmapex6;
+import javax.persistence.Access;
+import javax.persistence.AccessType;
import javax.persistence.Embeddable;
@Embeddable
+@Access(AccessType.FIELD)
public class FullName {
String fName;
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence.xml Sat Apr 25 09:11:11 2009
@@ -110,6 +110,8 @@
<class>org.apache.openjpa.persistence.embed.EmbedXml</class>
<class>org.apache.openjpa.persistence.embed.CustomerXml</class>
<class>org.apache.openjpa.persistence.embed.OrderXml</class>
+ <class>org.apache.openjpa.persistence.embed.attrOverrides.AddressXml</class>
+ <class>org.apache.openjpa.persistence.embed.attrOverrides.ZipcodeXml</class>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)"/>
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java Sat Apr 25 09:11:11 2009
@@ -87,6 +87,7 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import java.util.Stack;
import java.util.TreeSet;
import javax.persistence.Basic;
@@ -146,6 +147,7 @@
import org.apache.openjpa.lib.meta.SourceTracker;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.AccessCode;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.DelegatingMetaDataFactory;
import org.apache.openjpa.meta.FieldMetaData;
@@ -247,7 +249,8 @@
private final Map<Package, Integer> _pkgs = new HashMap<Package, Integer>();
// the class we were invoked to parse
- protected Class _cls = null;
+ protected Class<?> _cls = null;
+ protected Stack<Class<?>> _stack = new Stack<Class<?>>();
private File _file = null;
/**
@@ -393,6 +396,7 @@
* Clear caches.
*/
public void clear() {
+ _stack.clear();
_cls = null;
_file = null;
_pkgs.clear();
@@ -406,12 +410,14 @@
_log.trace(_loc.get("parse-class", cls.getName()));
_cls = cls;
+ _stack.push(cls);
try {
parsePackageAnnotations();
ClassMetaData meta = parseClassAnnotations();
updateSourceMode(meta);
} finally {
- _cls = null;
+ _stack.pop();
+ _cls = _stack.isEmpty() ? null : _stack.peek();
_file = null;
}
}
@@ -540,9 +546,11 @@
if (meta == null)
return null;
- Entity entity = (Entity) _cls.getAnnotation(Entity.class);
+ Entity entity = _cls.getAnnotation(Entity.class);
+ MappedSuperclass mapped = _cls.getAnnotation(MappedSuperclass.class);
+ Embeddable embeddable = _cls.getAnnotation(Embeddable.class);
if (isMetaDataMode()) {
- meta.setAbstract(_cls.getAnnotation(MappedSuperclass.class) !=null);
+ meta.setAbstract(mapped != null);
// while the spec only provides for embedded exclusive, it doesn't
// seem hard to support otherwise
if (entity == null)
@@ -696,9 +704,9 @@
*/
private void parseAccess(ClassMetaData meta, Access access) {
if (access != null) {
- meta.setAccessType(ClassMetaData.ACCESS_EXPLICIT
+ meta.setAccessType(AccessCode.EXPLICIT
| (access.value() == AccessType.FIELD ?
- ClassMetaData.ACCESS_FIELD : ClassMetaData.ACCESS_PROPERTY));
+ AccessCode.FIELD : AccessCode.PROPERTY));
}
}
@@ -746,13 +754,13 @@
* other entity classes or mapped super classes in the entity hierarchy.
*/
private int getAccessCode(Class<?> cls) {
- int accessCode = ClassMetaData.ACCESS_UNKNOWN;
+ int accessCode = AccessCode.UNKNOWN;
Access access = AccessController.doPrivileged(
J2DoPrivHelper.getAnnotationAction(cls, Access.class));
if (access != null) {
- accessCode |= ClassMetaData.ACCESS_EXPLICIT |
+ accessCode |= AccessCode.EXPLICIT |
(access.value() == AccessType.FIELD ?
- ClassMetaData.ACCESS_FIELD : ClassMetaData.ACCESS_PROPERTY);
+ AccessCode.FIELD : AccessCode.PROPERTY);
}
return accessCode;
}
@@ -1839,9 +1847,9 @@
*/
private void parseAccess(FieldMetaData meta, Access access) {
if (access != null) {
- meta.setAccessType(ClassMetaData.ACCESS_EXPLICIT
+ meta.setAccessType(AccessCode.EXPLICIT
| (access.value() == AccessType.FIELD ?
- ClassMetaData.ACCESS_FIELD : ClassMetaData.ACCESS_PROPERTY));
+ AccessCode.FIELD : AccessCode.PROPERTY));
}
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Sat Apr 25 09:11:11 2009
@@ -478,8 +478,6 @@
if (mode != null && mode != LockModeType.NONE)
_broker.assertActiveTransaction();
- if (oid == null)
- return null;
processLockProperties(pushFetchPlan(), mode, properties);
try {
oid = _broker.newObjectId(cls, oid);
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java Sat Apr 25 09:11:11 2009
@@ -64,11 +64,14 @@
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.meta.JavaTypes;
+import org.apache.openjpa.meta.MetaDataRepository;
import org.apache.openjpa.meta.ValueMetaData;
import static javax.persistence.AccessType.FIELD;
import static javax.persistence.AccessType.PROPERTY;
import static org.apache.openjpa.persistence.PersistenceStrategy.*;
+
+import org.apache.openjpa.util.InternalException;
import org.apache.openjpa.util.MetaDataException;
import org.apache.openjpa.util.UserException;
import org.apache.openjpa.conf.OpenJPAConfiguration;
@@ -227,17 +230,28 @@
if ("PROPERTY".equals(type.toUpperCase()))
setDefaultAccessType(AccessCode.PROPERTY);
else if ("FIELD".equals(type.toUpperCase()))
- setDefaultAccessType(ClassMetaData.ACCESS_FIELD);
+ setDefaultAccessType(AccessCode.FIELD);
else
throw new IllegalArgumentException(_loc.get("access-invalid",
type).toString());
}
+ /**
+ * Populates the given class metadata. The access style determines which
+ * field and/or getter method will contribute as the persistent property
+ * of the given class. If the given access is unknown, then the access
+ * type is to be determined at first.
+ *
+ * @see #determineAccessType(ClassMetaData)
+ */
@Override
public void populate(ClassMetaData meta, int access) {
- if (!AccessCode.isSet(access)) {
+ if (AccessCode.isUnknown(access)) {
access = determineAccessType(meta);
}
+ if (AccessCode.isUnknown(access)) {
+ error(meta, _loc.get("access-unknown", meta));
+ }
super.populate(meta, access);
meta.setDetachable(true);
// do not call get*Fields as it will lock down the fields.
@@ -263,63 +277,100 @@
ClassMetaData getCachedSuperclassMetaData(ClassMetaData meta) {
if (meta == null)
return null;
- Class<?> sup = meta.getDescribedType().getSuperclass();
+ Class<?> cls = meta.getDescribedType();
+ Class<?> sup = cls.getSuperclass();
if (sup == null)
return null;
- return meta.getRepository().getCachedMetaData(sup);
+ MetaDataRepository repos = meta.getRepository();
+ ClassMetaData supMeta = repos.getCachedMetaData(sup);
+ if (supMeta == null)
+ supMeta = repos.getMetaData(sup, null, false);
+ return supMeta;
}
/**
* Recursive helper to determine access type based on annotation placement
* on members for the given class without an explicit access annotation.
+ *
+ * @return must return a not-unknown access code
*/
private int determineAccessType(ClassMetaData meta) {
if (meta == null)
return AccessCode.UNKNOWN;
if (meta.getDescribedType().isInterface()) // managed interfaces
return AccessCode.PROPERTY;
- if (AccessCode.isSet(meta.getAccessType()))
+ if (!AccessCode.isUnknown(meta))
return meta.getAccessType();
- int access = determineImplicitAccessType(meta.getDescribedType());
- if (AccessCode.isSet(access))
+ int access = determineExplicitAccessType(meta.getDescribedType());
+ if (!AccessCode.isUnknown(access))
+ return access;
+ access = determineImplicitAccessType(meta.getDescribedType());
+ if (!AccessCode.isUnknown(access))
return access;
ClassMetaData sup = getCachedSuperclassMetaData(meta);
while (sup != null && sup.isExplicitAccess())
sup = getCachedSuperclassMetaData(sup);
- if (sup != null && AccessCode.isSet(sup.getAccessType()))
+ if (sup != null && !AccessCode.isUnknown(sup))
return sup.getAccessType();
- return AccessCode.UNKNOWN;
+ return AccessCode.FIELD;
}
/**
* Determines the access type for the given class by placement of
- * annotations on field or getter method.
+ * annotations on field or getter method. Does not consult the
+ * super class.
+ *
+ * Annotation can be placed on either fields or getters but not on both.
+ * If no field or getter is annotated then UNKNOWN access code is returned.
*/
- private int determineImplicitAccessType(Class cls) {
+ private int determineImplicitAccessType(Class<?> cls) {
+ if (cls.isInterface()) // Managed interfaces
+ return AccessCode.PROPERTY;
Field[] allFields = AccessController.doPrivileged(J2DoPrivHelper.
getDeclaredFieldsAction(cls));
- List<Field> fields = filter(allFields, nonTransientFilter,
- annotatedFilter);
- Method[] publicMethods = AccessController.doPrivileged(
+ Method[] methods = AccessController.doPrivileged(
J2DoPrivHelper.getDeclaredMethodsAction(cls));
+ List<Field> fields = filter(allFields, nonTransientFilter);
+ List<Method> getters = filter(methods, getterFilter,
+ nonTransientFilter);
+ if (fields.isEmpty() && getters.isEmpty())
+ return AccessCode.EMPTY;
- List<Method> getters = filter(publicMethods, getterFilter,
- nonTransientFilter, annotatedFilter);
- List<Method> setters = filter(publicMethods, setterFilter);
+ fields = filter(fields, annotatedFilter);
+ getters = filter(getters, annotatedFilter);
+
+ List<Method> setters = filter(methods, setterFilter);
getters = matchGetterAndSetter(getters, setters);
+
+ boolean mixed = !fields.isEmpty() && !getters.isEmpty();
+ if (mixed)
+ throw new UserException(_loc.get("access-mixed",
+ cls, toFieldNames(fields), toMethodNames(getters)));
if (!fields.isEmpty()) {
- if (!getters.isEmpty())
- throw new UserException(getters.toString());
- return ClassMetaData.ACCESS_FIELD;
- } else if (!getters.isEmpty()) {
+ return AccessCode.FIELD;
+ }
+ if (!getters.isEmpty()) {
return AccessCode.PROPERTY;
}
return AccessCode.UNKNOWN;
}
/**
+ * Explicit access type, if any, is generally detected by the parser. This
+ * is only used for metadata of an embeddable type which is encountered
+ * as a field during some other owning entity.
+ *
+ * @see ValueMetaData#addEmbeddedMetaData()
+ */
+ private int determineExplicitAccessType(Class<?> cls) {
+ Access access = cls.getAnnotation(Access.class);
+ return access == null ? AccessCode.UNKNOWN : (access.value() ==
+ AccessType.FIELD ? AccessCode.FIELD : AccessCode.PROPERTY);
+ }
+
+ /**
* Matches the given getters with the given setters. Removes the getters
* that do not have a corresponding setter.
*/
@@ -356,8 +407,8 @@
*/
List<Field> getPersistentFields(ClassMetaData meta) {
boolean explicit = meta.isExplicitAccess();
- boolean unknown = !AccessCode.isSet(meta.getAccessType());
- boolean isField = AccessCode.isField(meta.getAccessType());
+ boolean unknown = AccessCode.isUnknown(meta);
+ boolean isField = AccessCode.isField(meta);
if (explicit || unknown || isField) {
Field[] fields = AccessController.doPrivileged(J2DoPrivHelper.
@@ -376,7 +427,7 @@
*/
List<Method> getPersistentMethods(ClassMetaData meta) {
boolean explicit = meta.isExplicitAccess();
- boolean unknown = !AccessCode.isSet(meta.getAccessType());
+ boolean unknown = AccessCode.isUnknown(meta.getAccessType());
boolean isProperty = AccessCode.isProperty(meta.getAccessType());
if (explicit || unknown || isProperty) {
@@ -413,7 +464,7 @@
boolean isEmpty = fields.isEmpty() && getters.isEmpty();
boolean explicit = meta.isExplicitAccess();
- boolean unknown = !AccessCode.isSet(meta.getAccessType());
+ boolean unknown = AccessCode.isUnknown(meta.getAccessType());
if (isEmpty) {
warn(meta, _loc.get("access-empty", meta));
@@ -435,7 +486,7 @@
meta.setAccessType(AccessCode.PROPERTY);
members.addAll(getters);
} else {
- meta.setAccessType(ClassMetaData.ACCESS_FIELD);
+ meta.setAccessType(AccessCode.FIELD);
members.addAll(fields);
}
}
@@ -450,6 +501,7 @@
Log log = meta.getRepository().getConfiguration()
.getLog(OpenJPAConfiguration.LOG_RUNTIME);
log.error(message.toString());
+ throw new UserException(message.toString());
}
void warn(ClassMetaData meta, Localizer.Message message) {
@@ -554,38 +606,39 @@
@Override
protected Member getMemberByProperty(ClassMetaData meta, String property) {
Class<?> cls = meta.getDescribedType();
- int classAccessCode = meta.getAccessType();
Field field = Reflection.findField(cls, property, false);;
Method getter = Reflection.findGetter(cls, property, false);
if (isAnnotated(field) && isAnnotated(getter))
throw new IllegalStateException(_loc.get("access-duplicate",
field, getter).toString());
- if (AccessCode.isField(classAccessCode)) {
+ if (AccessCode.isField(meta)) {
if (isAnnotatedAccess(getter, AccessType.PROPERTY)) {
meta.setAccessType(AccessCode.MIXED | meta.getAccessType());
return getter;
}
return field;
- } else if (AccessCode.isProperty(classAccessCode)) {
+ } else if (AccessCode.isProperty(meta)) {
if (isAnnotatedAccess(field, AccessType.FIELD)) {
meta.setAccessType(AccessCode.MIXED | meta.getAccessType());
return field;
}
return getter;
- } else if (!AccessCode.isSet(classAccessCode)) {
+ } else if (AccessCode.isUnknown(meta)) {
if (isAnnotated(field)) {
meta.setAccessType(AccessCode.FIELD);
return field;
- }
- if (isAnnotated(getter)) {
+ } else if (isAnnotated(getter)) {
meta.setAccessType(AccessCode.PROPERTY);
return getter;
+ } else {
+ warn(meta, _loc.get("access-none", meta, property));
+ throw new IllegalStateException(
+ _loc.get("access-none", meta, property).toString());
}
- throw new IllegalStateException("access-none " + property);
} else {
- throw new IllegalStateException(meta + " " +
- AccessCode.toString(classAccessCode));
+ throw new InternalException(meta + " " +
+ AccessCode.toString(meta.getAccessType()));
}
}
@@ -625,6 +678,23 @@
}
return result;
}
+
+ <T extends AnnotatedElement> List<T> filter(List<T> list,
+ InclusiveFilter... filters) {
+ List<T> result = new ArrayList<T>();
+ for (T e : list) {
+ boolean include = true;
+ for (InclusiveFilter f : filters) {
+ if (f != null && !f.includes(e)) {
+ include = false;
+ break;
+ }
+ }
+ if (include)
+ result.add(e);
+ }
+ return result;
+ }
/**
* Selects getter method. A getter method name starts with 'get', returns a
@@ -745,4 +815,12 @@
return meta.getRepository().getConfiguration()
.getLog(OpenJPAConfiguration.LOG_METADATA);
}
+
+ String toFieldNames(List<Field> fields) {
+ return fields.toString();
+ }
+
+ String toMethodNames(List<Method> methods) {
+ return methods.toString();
+ }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataFactory.java Sat Apr 25 09:11:11 2009
@@ -79,7 +79,7 @@
private AnnotationPersistenceMetaDataParser _annoParser = null;
private AnnotationPersistenceXMLMetaDataParser _annoXMLParser = null;
private XMLPersistenceMetaDataParser _xmlParser = null;
- private Map<URL, Set> _xml = null; // xml rsrc -> class names
+ private Map<URL, Set<String>> _xml = null; // xml rsrc -> class names
private Set<URL> _unparsed = null; // xml rsrc
private boolean _fieldOverride = true;
@@ -176,8 +176,8 @@
protected XMLPersistenceMetaDataSerializer newXMLSerializer() {
return new XMLPersistenceMetaDataSerializer(repos.getConfiguration());
}
-
- public void load(Class cls, int mode, ClassLoader envLoader) {
+
+ public void load(Class<?> cls, int mode, ClassLoader envLoader) {
if (mode == MODE_NONE)
return;
if (!strict && (mode & MODE_META) != 0)
@@ -237,7 +237,8 @@
/**
* Parse the given XML resource.
*/
- private void parseXML(URL xml, Class cls, int mode, ClassLoader envLoader) {
+ private void parseXML(URL xml, Class<?> cls, int mode,
+ ClassLoader envLoader) {
// spring needs to use the envLoader first for all class resolution,
// but we must still fall back on application loader
ClassLoader loader = repos.getConfiguration().
@@ -268,9 +269,9 @@
/**
* Locate the XML resource for the given class.
*/
- private URL findXML(Class cls) {
+ private URL findXML(Class<?> cls) {
if (_xml != null && cls != null)
- for (Map.Entry<URL, Set> entry : _xml.entrySet())
+ for (Map.Entry<URL, Set<String>> entry : _xml.entrySet())
if (entry.getValue().contains(cls.getName()))
return entry.getKey();
return null;
@@ -295,19 +296,19 @@
"map-persistent-type-names", rsrc, Arrays.asList(names)));
if (_xml == null)
- _xml = new HashMap<URL, Set>();
- _xml.put((URL) rsrc, new HashSet(Arrays.asList(names)));
+ _xml = new HashMap<URL, Set<String>>();
+ _xml.put((URL) rsrc, new HashSet<String>(Arrays.asList(names)));
if (_unparsed == null)
_unparsed = new HashSet<URL>();
_unparsed.add((URL) rsrc);
}
@Override
- public Class getQueryScope(String queryName, ClassLoader loader) {
+ public Class<?> getQueryScope(String queryName, ClassLoader loader) {
if (queryName == null)
return null;
- Collection classes = repos.loadPersistentTypes(false, loader);
- for (Class cls : (Collection<Class>) classes) {
+ Collection<Class<?>> classes = repos.loadPersistentTypes(false, loader);
+ for (Class<?> cls : classes) {
if ((AccessController.doPrivileged(J2DoPrivHelper
.isAnnotationPresentAction(cls, NamedQuery.class)))
.booleanValue() && hasNamedQuery
@@ -336,13 +337,13 @@
}
@Override
- public Class getResultSetMappingScope(String rsMappingName,
+ public Class<?> getResultSetMappingScope(String rsMappingName,
ClassLoader loader) {
if (rsMappingName == null)
return null;
- Collection classes = repos.loadPersistentTypes(false, loader);
- for (Class cls : (Collection<Class>) classes) {
+ Collection<Class<?>> classes = repos.loadPersistentTypes(false, loader);
+ for (Class<?> cls : classes) {
if ((AccessController.doPrivileged(J2DoPrivHelper
.isAnnotationPresentAction(cls, SqlResultSetMapping.class)))
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Sat Apr 25 09:11:11 2009
@@ -57,6 +57,7 @@
import org.apache.openjpa.lib.meta.XMLVersionParser;
import org.apache.openjpa.lib.util.J2DoPrivHelper;
import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.AccessCode;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.DelegatingMetaDataFactory;
import org.apache.openjpa.meta.FieldMetaData;
@@ -183,7 +184,7 @@
private Class _cls = null;
private int _fieldPos = 0;
private int _clsPos = 0;
- private int _access = ClassMetaData.ACCESS_UNKNOWN;
+ private int _access = AccessCode.UNKNOWN;
private PersistenceStrategy _strategy = null;
private Set<CascadeType> _cascades = null;
private Set<CascadeType> _pkgCascades = null;
@@ -494,7 +495,7 @@
_fieldPos = 0;
_clsPos = 0;
- _access = ClassMetaData.ACCESS_UNKNOWN;
+ _access = AccessCode.UNKNOWN;
_strategy = null;
_listener = null;
_callbacks = null;
@@ -845,13 +846,13 @@
// if we don't know the default access type, check to see if a
// superclass has already defined the access type
int defaultAccess = _access;
- if (defaultAccess == ClassMetaData.ACCESS_UNKNOWN) {
+ if (defaultAccess == AccessCode.UNKNOWN) {
ClassMetaData sup = repos.getCachedMetaData(_cls.getSuperclass());
if (sup != null)
defaultAccess = sup.getAccessType();
}
- int access = ClassMetaData.ACCESS_UNKNOWN;
+ int access = AccessCode.UNKNOWN;
if (meta == null) {
// add metadata for this type
access = toAccessType(attrs.getValue("access"), defaultAccess);
@@ -934,7 +935,7 @@
* Default access element.
*/
private void endAccess() {
- _access = toAccessType(currentText(), ClassMetaData.ACCESS_UNKNOWN);
+ _access = toAccessType(currentText(), AccessCode.UNKNOWN);
}
/**
@@ -945,8 +946,8 @@
if (StringUtils.isEmpty(str))
return def;
if ("PROPERTY".equals(str))
- return ClassMetaData.ACCESS_PROPERTY;
- return ClassMetaData.ACCESS_FIELD;
+ return AccessCode.PROPERTY;
+ return AccessCode.FIELD;
}
/**
@@ -1206,8 +1207,8 @@
Class type = null;
try {
if ((field != null &&
- field.getAccessType() == ClassMetaData.ACCESS_PROPERTY) ||
- (fldAccess == ClassMetaData.ACCESS_PROPERTY)) {
+ field.getAccessType() == AccessCode.PROPERTY) ||
+ (fldAccess == AccessCode.PROPERTY)) {
String cap = StringUtils.capitalize(name);
type = meta.getDescribedType();
try {
@@ -1287,9 +1288,9 @@
if (attrs != null) {
String access = attrs.getValue("access");
if ("PROPERTY".equals(access))
- return ClassMetaData.ACCESS_PROPERTY;
+ return AccessCode.PROPERTY;
if ("FIELD".equals(access))
- return ClassMetaData.ACCESS_FIELD;
+ return AccessCode.FIELD;
}
// Check access defined on field, if provided
if (field != null) {
@@ -1298,9 +1299,9 @@
// Otherwise, get the default access type of the declaring class
ClassMetaData meta = (ClassMetaData) currentElement();
if (meta != null) {
- return (meta.getAccessType() & ~ClassMetaData.ACCESS_EXPLICIT);
+ return AccessCode.toFieldCode(meta.getAccessType());
}
- return ClassMetaData.ACCESS_UNKNOWN;
+ return AccessCode.UNKNOWN;
}
/**
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataSerializer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataSerializer.java?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataSerializer.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataSerializer.java Sat Apr 25 09:11:11 2009
@@ -47,6 +47,8 @@
import org.apache.openjpa.meta.JavaTypes;
import org.apache.openjpa.meta.MetaDataInheritanceComparator;
import static org.apache.openjpa.meta.MetaDataModes.*;
+
+import org.apache.openjpa.meta.AccessCode;
import org.apache.openjpa.meta.MetaDataRepository;
import org.apache.openjpa.meta.Order;
import org.apache.openjpa.meta.QueryMetaData;
@@ -452,7 +454,7 @@
switch (type(meta)) {
case TYPE_META:
ClassMetaData cls = (ClassMetaData) meta;
- if (cls.getAccessType() == ClassMetaData.ACCESS_FIELD)
+ if (AccessCode.isField(cls.getAccessType()))
fieldAccess = true;
else
propertyAccess = true;
@@ -480,9 +482,9 @@
int def = getConfiguration().getMetaDataRepositoryInstance().
getMetaDataFactory().getDefaults().getDefaultAccessType();
String access = null;
- if (fieldAccess && def == ClassMetaData.ACCESS_PROPERTY)
+ if (fieldAccess && AccessCode.isProperty(def))
access = "FIELD";
- else if (propertyAccess && def == ClassMetaData.ACCESS_FIELD)
+ else if (propertyAccess && AccessCode.isField(def))
access = "PROPERTY";
if (access != null) {
startElement("access");
@@ -807,11 +809,11 @@
return;
int def = getConfiguration().getMetaDataRepositoryInstance().
getMetaDataFactory().getDefaults().getDefaultAccessType();
- if (meta.getAccessType() == ClassMetaData.ACCESS_FIELD
- && def == ClassMetaData.ACCESS_PROPERTY)
+ if (AccessCode.isField(meta.getAccessType())
+ && AccessCode.isProperty(def))
addAttribute("access", "FIELD");
- else if (meta.getAccessType() == ClassMetaData.ACCESS_PROPERTY
- && def == ClassMetaData.ACCESS_FIELD)
+ else if (AccessCode.isProperty(meta.getAccessType())
+ && AccessCode.isField(def))
addAttribute("access", "PROPERTY");
}
Modified: openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties?rev=768498&r1=768497&r2=768498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties (original)
+++ openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties Sat Apr 25 09:11:11 2009
@@ -16,6 +16,13 @@
# under the License.
access-empty: Found no persistent property in "{0}"
+access-mixed: Class "{0}" annotated fields "{1}" with FIELD access and \
+ methods "{2}" with PROPERTY access. As class "{0}" is not using an \
+ explicit access, it is not permitted to mix PROPERTY and FIELD access \
+ annotations.
+access-none: Property "{1}" in class "{0}" is not annotated an instance field \
+ or a getter method. It is not possible to determine its access type
+access-unknown: Access style for "{0}" can not be determined.
close-invoked: You have closed the EntityManager, though the persistence \
context will remain active until the current transaction commits.
no-managed-trans: There is no managed transaction in progress to sync this \