package com.ctp.cdi.query.util;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import org.jboss.solder.properties.Property;
import org.jboss.solder.properties.query.AnnotatedPropertyCriteria;
import org.jboss.solder.properties.query.NamedPropertyCriteria;
import org.jboss.solder.properties.query.PropertyCriteria;
import org.jboss.solder.properties.query.PropertyQueries;
import org.jboss.solder.properties.query.PropertyQuery;
import com.ctp.cdi.query.meta.NonEntityException;
import com.ctp.cdi.query.meta.unit.PersistenceUnits;
import com.ctp.cdi.query.meta.verifier.EntityVerifier;
public final class EntityUtils {
private EntityUtils() {
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Class<? extends Serializable> primaryKeyClass(Class<?> entityClass) {
if (entityClass.isAnnotationPresent(IdClass.class)) {
return entityClass.getAnnotation(IdClass.class).value(); // Serializablity isn't required, could cause problems
}
Class clazz = PersistenceUnits.instance().primaryKeyIdClass(entityClass);
if (clazz != null) {
return clazz;
}
Property<Serializable> property = primaryKey(entityClass);
return property.getJavaClass();
}
public static Object primaryKeyValue(Object entity) {
Property<Serializable> property = primaryKey(entity.getClass());
return property.getValue(entity);
}
public static String entityName(Class<?> entityClass) {
String result = null;
if (entityClass.isAnnotationPresent(Entity.class)) {
result = entityClass.getAnnotation(Entity.class).name();
} else {
result = PersistenceUnits.instance().entityName(entityClass);
}
return (result != null && !"".equals(result)) ? result : entityClass.getSimpleName();
}
public static boolean isEntityClass(Class<?> entityClass) {
return new EntityVerifier().verify(entityClass);
}
private static Property<Serializable> primaryKey(Class<?> entityClass) {
for (PropertyCriteria c : criteriaList(entityClass)) {
PropertyQuery<Serializable> query = PropertyQueries.<Serializable>createQuery(entityClass)
.addCriteria(c);
if (query.getFirstResult() != null) {
return query.getFirstResult();
}
}
throw new IllegalStateException("Class " + entityClass + " has no id defined");
}
private static void assertIsEntity(Object entity) {
if (entity == null) {
throw new IllegalArgumentException("Provided object is null");
}
if (!isEntityClass(entity.getClass())) {
throw new NonEntityException("Provided object is not an @Entity");
}
}
private static List<PropertyCriteria> criteriaList(Class<?> entityClass) {
List<PropertyCriteria> criteria = new LinkedList<PropertyCriteria>();
criteria.add(new AnnotatedPropertyCriteria(Id.class));
criteria.add(new AnnotatedPropertyCriteria(EmbeddedId.class));
String fromMappingFiles = PersistenceUnits.instance().primaryKeyField(entityClass);
if (fromMappingFiles != null) {
criteria.add(new NamedPropertyCriteria(fromMappingFiles));
}
return criteria;
}
}