Skip to content

Commit

Permalink
Generically checking for all order frequencies which are in use for: Add
Browse files Browse the repository at this point in the history
missing CRUD methods for Order Frequency - TRUNK-4188
  • Loading branch information
dkayiwa committed Feb 27, 2014
1 parent 4144b0d commit a2bdd70
Showing 1 changed file with 37 additions and 14 deletions.
Expand Up @@ -13,10 +13,12 @@
*/
package org.openmrs.api.db.hibernate;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
Expand All @@ -31,19 +33,21 @@
import org.hibernate.transform.DistinctRootEntityResultTransformer;
import org.openmrs.CareSetting;
import org.openmrs.Concept;
import org.openmrs.DrugOrder;
import org.openmrs.Encounter;
import org.openmrs.GlobalProperty;
import org.openmrs.Order;
import org.openmrs.Order.Action;
import org.openmrs.OrderFrequency;
import org.openmrs.Patient;
import org.openmrs.TestOrder;
import org.openmrs.User;
import org.openmrs.api.APIException;
import org.openmrs.api.context.Context;
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 @@ -358,18 +362,37 @@ public void purgeOrderFrequency(OrderFrequency orderFrequency) {
*/
@Override
public boolean isOrderFrequencyInUse(OrderFrequency orderFrequency) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(DrugOrder.class);
criteria.add(Restrictions.eq("frequency", orderFrequency));
criteria.setMaxResults(1);
if (criteria.list().size() > 0) {
return true;
}

criteria = sessionFactory.getCurrentSession().createCriteria(TestOrder.class);
criteria.add(Restrictions.eq("frequency", orderFrequency));
criteria.setMaxResults(1);
if (criteria.list().size() > 0) {
return true;

//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");

This comment has been minimized.

Copy link
@wluyima

wluyima Feb 27, 2014

Member

As Darius suggested, this is easier and more reliable to do via hibernate, since it will give you only the persistent classes and their persistent fields types i.e use sessionFactory.getAllClassMetadata, and check for subclasses of Order

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa Feb 28, 2014

Author Member

Committed at: f75f426

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

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

Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
if (field.getType().equals(OrderFrequency.class)) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(cls);
criteria.add(Restrictions.eq(field.getName(), orderFrequency));
criteria.setMaxResults(1);
if (criteria.list().size() > 0) {
return true;
}
}
}
}
catch (ClassNotFoundException ex) {
log.error("Failed to check whether order frequency is in use for: " + component.getBeanClassName(), ex);
}
}

return false;
Expand Down

0 comments on commit a2bdd70

Please sign in to comment.