Remove warning from enhancing impl generated classes and optimize

class / interface interaction


git-svn-id: https://svn.apache.org/repos/asf/incubator/openjpa/trunk@446904 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stephen Kim 2006-09-16 17:39:57 +00:00
parent d746a3fd7c
commit 05865aef89
3 changed files with 69 additions and 3 deletions

View File

@ -1904,7 +1904,7 @@ public class PCEnhancer {
method.makeProtected();
access = "protected";
}
if (_log.isWarnEnabled())
if (!_meta.getDescribedType().isInterface() && _log.isWarnEnabled())
_log.warn(_loc.get("enhance-adddefaultconst", type, access));
}
}

View File

@ -142,6 +142,7 @@ public class ClassMetaData
private Boolean _embedded = null;
private Boolean _interface = null;
private Class _impl = null;
private List _interfaces = null;
private Map _ifaceMap = new HashMap();
private int _identity = ID_UNKNOWN;
private int _idStrategy = ValueStrategies.NONE;
@ -697,6 +698,38 @@ public class ClassMetaData
_impl = impl;
}
/**
* Return all explicitly declared interfaces this class implements.
*/
public Class[] getDeclaredInterfaces() {
if (_interfaces == null)
return _repos.EMPTY_CLASSES;
return (Class[]) _interfaces.toArray(new Class[_interfaces.size()]);
}
/**
* Explicitly declare the given interface among the ones this
* class implements.
*/
public void addDeclaredInterface(Class iface) {
if (_interfaces == null)
_interfaces = new ArrayList();
if (!iface.isInterface())
throw new MetaDataException(_loc.get("declare-non-interface",
this, iface));
_interfaces.add(iface);
}
/**
* Remove the given interface from the declared list.
*/
public boolean removeDeclaredInterface(Class iface) {
if (_interfaces == null)
return false;
return _interfaces.remove(iface);
}
/**
* Alias properties from the given interface during queries to
* the local field.
@ -728,6 +761,18 @@ public class ClassMetaData
}
}
/**
* Return all aliases property named for the given interface.
*/
public String[] getInterfaceAliasedProperties(Class iface) {
synchronized (_ifaceMap) {
Map fields = (Map) _ifaceMap.get(iface);
if (fields == null)
return new String[0];
return (String[]) fields.keySet().toArray(new String[0]);
}
}
/**
* Return the number of fields that use impl or intermediate data, in
* order to create a compacted array for storage of said data.
@ -1610,6 +1655,13 @@ public class ClassMetaData
// resolve lifecycle metadata now to prevent lazy threading problems
_lifeMeta.resolve();
// record implements in the repository
if (_interfaces != null) {
for (Iterator it = _interfaces.iterator(); it.hasNext();) {
_repos.addDeclaredInterfaceImpl(this, (Class) it.next());
}
}
// resolve fetch groups
if (_fgMap != null)
for (Iterator itr = _fgMap.values().iterator(); itr.hasNext();)

View File

@ -865,9 +865,23 @@ public class MetaDataRepository
/**
* Add the given metadata as declared interface implementation.
*/
public void addDeclaredInterfaceImpl(ClassMetaData meta, Class iface) {
void addDeclaredInterfaceImpl(ClassMetaData meta, Class iface) {
synchronized (_impls) {
addToCollection(_impls, iface, meta.getDescribedType(), false);
boolean supDec = false;
Collection vals = (Collection) _impls.get(iface);
// check to see if the superclass already declares to avoid dups
if (vals != null) {
ClassMetaData sup = meta.getPCSuperclassMetaData();
while (vals != null && sup != null && !supDec) {
supDec = vals.contains(sup.getDescribedType());
sup = sup.getPCSuperclassMetaData();
}
if (supDec)
return;
}
addToCollection(_impls, iface, meta.getDescribedType(), true);
}
}