Skip to content

Commit

Permalink
Using sessionFactory.getAllClassMetadata() for: Add missing CRUD
Browse files Browse the repository at this point in the history
methods for Order Frequency - TRUNK-4188
  • Loading branch information
dkayiwa committed Feb 28, 2014
1 parent a81faa1 commit f75f426
Showing 1 changed file with 18 additions and 17 deletions.
Expand Up @@ -16,20 +16,24 @@
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.EntityMode;
import org.hibernate.LockOptions;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.transform.DistinctRootEntityResultTransformer;
import org.openmrs.CareSetting;
import org.openmrs.Concept;
Expand All @@ -45,9 +49,6 @@
import org.openmrs.api.db.DAOException;
import org.openmrs.api.db.OrderDAO;
import org.openmrs.util.OpenmrsConstants;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;

/**
* This class should not be used directly. This is just a common implementation of the OrderDAO that
Expand Down Expand Up @@ -363,19 +364,19 @@ public void purgeOrderFrequency(OrderFrequency orderFrequency) {
@Override
public boolean isOrderFrequencyInUse(OrderFrequency orderFrequency) {

//check for all classes that subclass Order
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(Order.class));

// scan in org.openmrs
Set<BeanDefinition> components = provider.findCandidateComponents("org/openmrs");
for (BeanDefinition component : components) {
Map<String, ClassMetadata> metadata = sessionFactory.getAllClassMetadata();
for (Iterator<ClassMetadata> i = metadata.values().iterator(); i.hasNext();) {
Class<?> entityClass = ((EntityPersister) i.next()).getClassMetadata().getMappedClass(EntityMode.POJO);

This comment has been minimized.

Copy link
@wluyima

wluyima Feb 28, 2014

Member

Why are you casting this, you can call getMappedClass on the ClassMetadata object, so this line can be just:
Class<?> entityClass = i.next().getMappedClass(EntityMode.POJO);

if (Order.class.getName().equals(entityClass.getName())) {

This comment has been minimized.

Copy link
@wluyima

wluyima Feb 28, 2014

Member

Why not compare the class objects, class names can be the equal but when the class objects differ, this is true if they were loaded by different classloaders

continue; //ignore the org.openmrs.Order class itself
}

if (!Order.class.isAssignableFrom(entityClass)) {
continue; //not a sub class of Order
}

try {
if (Order.class.getName().equals(component.getBeanClassName())) {
continue; //ignore the org.openmrs.Order class itself
}

Class<?> cls = Context.loadClass(component.getBeanClassName());
Class<?> cls = Context.loadClass(entityClass.getName());

This comment has been minimized.

Copy link
@wluyima

wluyima Feb 28, 2014

Member

Why are you loading the same class you already have?:)
The reason as to why you used ClassMetadata from hibernate is because you don't have to use reflection to get the property names and types, these can be fetched from the ClassMetadata by calling getPropertyNames and getPropertyTypes, this will also guarantee that you only get back persistentc(non-transient) properties unlike if you used reflection


Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
Expand All @@ -390,7 +391,7 @@ public boolean isOrderFrequencyInUse(OrderFrequency orderFrequency) {
}
}
catch (ClassNotFoundException ex) {
log.error("Failed to check whether order frequency is in use for: " + component.getBeanClassName(), ex);
log.error("Failed to check whether order frequency is in use for: " + entityClass.getName(), ex);
}
}

Expand Down

0 comments on commit f75f426

Please sign in to comment.