package com.ctp.cdi.query.meta.unit; import java.io.Serializable; import org.jboss.solder.properties.query.NamedPropertyCriteria; import org.jboss.solder.properties.query.PropertyQueries; import org.jboss.solder.properties.query.PropertyQuery; abstract class PersistentClassDescriptor { final String name; final Class<?> entityClass; final Class<? extends Serializable> idClass; final String id; private PersistentClassDescriptor parent; PersistentClassDescriptor(String name, String packageName, String className, String idClass, String id) { Class<?> clazz = entityClass(className, packageName); this.name = name; this.entityClass = clazz; this.idClass = idClass(clazz, idClass, packageName, id); this.id = id; } public Class<? extends Serializable> getIdClass() { return idClass; } public String getId() { return id; } public String getName() { return name; } public Class<?> getEntityClass() { return entityClass; } String className(Class<?> clazz) { return clazz == null ? null : clazz.getSimpleName(); } private Class<?> entityClass(String entityClass, String packageName) { try { String clazzName = buildClassName(entityClass, packageName); return Class.forName(clazzName); } catch (ClassNotFoundException e) { throw new IllegalArgumentException("Can't create class " + buildClassName(entityClass, packageName), e); } } @SuppressWarnings("unchecked") private Class<? extends Serializable> idClass(Class<?> entity, String idClass, String packageName, String id) { try { return (Class<? extends Serializable>) (idClass != null ? Class.forName(buildClassName(idClass, packageName)) : lookupIdClass(entity, id)); } catch (ClassNotFoundException e) { throw new IllegalArgumentException("Failed to get ID class", e); } } private Class<?> lookupIdClass(Class<?> entity, String id) { if (entity == null || id == null) { return null; } PropertyQuery<Serializable> query = PropertyQueries.<Serializable>createQuery(entity) .addCriteria(new NamedPropertyCriteria(id)); return query.getFirstResult().getJavaClass(); } private String buildClassName(String clazzName, String packageName) { if (clazzName == null && packageName == null) { return null; } return (packageName != null && !isClassNameQualified(clazzName)) ? packageName + "." + clazzName : clazzName; } private boolean isClassNameQualified(String name) { return name.contains("."); } public PersistentClassDescriptor getParent() { return parent; } public void setParent(PersistentClassDescriptor parent) { this.parent = parent; } }