|
I resolved this way public class DaoUtils { protected static final Log log = LogFactory.getLog(DaoUtils.class); private static final String GET_INITIALS = "get"; @SuppressWarnings("unchecked") public static Object getPersistentId(Object o) throws PersistenceException { Object objId = null; final String eMsg = "Error executing get<IdValue> method on persistent class."; String logMsg = "Persistent identity for object of type '?1' is accessible with method '?2'"; try { final AccessibleObject annotatedAccessibleObject = getAnnotatedAccessibleObject(o, Id.class, EmbeddedId.class); if (annotatedAccessibleObject != null) { Method getter = null; if (annotatedAccessibleObject instanceof Method) { getter = (Method) annotatedAccessibleObject; } else if (annotatedAccessibleObject instanceof Field) { getter = findGetter(o.getClass(), ((Field) annotatedAccessibleObject).getName()); } objId = getter.invoke(o); if (log.isDebugEnabled()) { logMsg = logMsg.replace("?1", o.getClass().getName()); logMsg = logMsg.replace("?2", getter.getName()); log.debug(logMsg); } } } catch (IllegalArgumentException e) { throw new PersistenceException(eMsg, e); } catch (IllegalAccessException e) { throw new PersistenceException(eMsg, e); } catch (InvocationTargetException e) { throw new PersistenceException(eMsg, e); } catch (SecurityException e) { throw new PersistenceException(eMsg, e); } catch (NoSuchMethodException e) { throw new PersistenceException("There is no getter method for " + o.getClass().getSimpleName() + " ID property", e); } return objId; } private static AccessibleObject getAnnotatedAccessibleObject(Object o, Class<? extends Annotation>... annotations) throws PersistenceException { final Set<AccessibleObject> members = new HashSet<AccessibleObject>(); members.addAll(Arrays.asList(o.getClass().getDeclaredMethods())); members.addAll(Arrays.asList(o.getClass().getDeclaredFields())); for (AccessibleObject member : members) { for (Class<? extends Annotation> annotation : annotations) if (member.isAnnotationPresent(annotation)) return member; } return null; } private static Method findGetter(Class type, String property) throws SecurityException, NoSuchMethodException { String methodName = GET_INITIALS + Character.toUpperCase(property.charAt(0)) + property.substring(1); try { return type.getMethod(methodName); } catch (SecurityException e) { throw e; } catch (NoSuchMethodException e) { throw e; } } } but I think that the last two methods shold be in ReflectionUtils.. what do you think? André Faria Matt Raible escreveu: Bryan wrote the code for this and he's on vacation this week. Do you |
public class DaoUtils {
protected static final Log log = LogFactory.getLog(DaoUtils.class);
private static final String GET_INITIALS = "get";
@SuppressWarnings("unchecked")
public static Object getPersistentId(Object o) throws
PersistenceException {
Object objId = null;
final String eMsg = "Error executing get<IdValue> method on
persistent class.";
String logMsg = "Persistent identity for object of type '?1' is
accessible with method '?2'";
try {
final AccessibleObject annotatedAccessibleObject =
getAnnotatedAccessibleObject(o, Id.class, EmbeddedId.class);
if (annotatedAccessibleObject != null) {
Method getter = null;
if (annotatedAccessibleObject instanceof
Method) {
getter = (Method)
annotatedAccessibleObject;
} else if (annotatedAccessibleObject instanceof
Field) {
getter = findGetter(o.getClass(),
((Field) annotatedAccessibleObject).getName());
}
objId = getter.invoke(o);
if (log.isDebugEnabled()) {
logMsg = logMsg.replace("?1",
o.getClass().getName());
logMsg = logMsg.replace("?2",
getter.getName());
log.debug(logMsg);
}
}
} catch (IllegalArgumentException e) {
throw new PersistenceException(eMsg, e);
} catch (IllegalAccessException e) {
throw new PersistenceException(eMsg, e);
} catch (InvocationTargetException e) {
throw new PersistenceException(eMsg, e);
} catch (SecurityException e) {
throw new PersistenceException(eMsg, e);
} catch (NoSuchMethodException e) {
throw new PersistenceException("There is no getter
method for " + o.getClass().getSimpleName() + " ID property", e);
}
return objId;
}
private static AccessibleObject getAnnotatedAccessibleObject(Object o,
Class<? extends Annotation>... annotations) throws PersistenceException {
final Set<AccessibleObject> members = new
HashSet<AccessibleObject>();
members.addAll(Arrays.asList(o.getClass().getDeclaredMethods()));
members.addAll(Arrays.asList(o.getClass().getDeclaredFields()));
for (AccessibleObject member : members) {
for (Class<? extends Annotation> annotation :
annotations)
if (member.isAnnotationPresent(annotation))
return member;
}
return null;
}
private static Method findGetter(Class type, String property) throws
SecurityException, NoSuchMethodException {
String methodName = GET_INITIALS +
Character.toUpperCase(property.charAt(0)) + property.substring(1);
try {
return type.getMethod(methodName);
} catch (SecurityException e) {
throw e;
} catch (NoSuchMethodException e) {
throw e;
}
}
}--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
