Skip to content

Commit

Permalink
Improving IsOrderFrequencyInUse for: Add missing CRUD methods for Order
Browse files Browse the repository at this point in the history
Frequency - TRUNK-4188
  • Loading branch information
dkayiwa committed Mar 3, 2014
1 parent bdb9eda commit 518d699
Showing 1 changed file with 11 additions and 20 deletions.
Expand Up @@ -13,7 +13,6 @@
*/
package org.openmrs.api.db.hibernate;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
Expand All @@ -33,7 +32,6 @@
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,7 +43,6 @@
import org.openmrs.Patient;
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;
Expand Down Expand Up @@ -366,33 +363,27 @@ public boolean isOrderFrequencyInUse(OrderFrequency orderFrequency) {

Map<String, ClassMetadata> metadata = sessionFactory.getAllClassMetadata();
for (Iterator<ClassMetadata> i = metadata.values().iterator(); i.hasNext();) {
Class<?> entityClass = ((EntityPersister) i.next()).getClassMetadata().getMappedClass(EntityMode.POJO);
if (Order.class.getName().equals(entityClass.getName())) {
ClassMetadata classMetadata = i.next();
Class<?> entityClass = classMetadata.getMappedClass(EntityMode.POJO);
if (Order.class.equals(entityClass)) {
continue; //ignore the org.openmrs.Order class itself
}

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

try {
Class<?> cls = Context.loadClass(entityClass.getName());

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;
}
String[] names = classMetadata.getPropertyNames();
for (String name : names) {

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

I have used this several times and it works, am not sure what you might be doing wrongly, when i add the line below in the for.. each statement, it shows the exact field types i expect in the Order class:
System.out.println("Property:"+name+" Type:"+classMetadata.getPropertyType(name).getReturnedClass());

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

I get this:
Property:dose Type:class java.lang.Double
Property:doseUnits Type:class org.openmrs.Concept
Property:frequency Type:class org.openmrs.OrderFrequency
............
......
and so on

if (classMetadata.getPropertyType(name).getName().equals(OrderFrequency.class.getName())) {

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

It is not good to check class equality by comparing class name, just check the equality of class objects, you can fetch the class object for the field from the Type

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa Mar 3, 2014

Author Member

That is what i had wanted to do. But the classMetadata.getPropertyType(name).getClass() did not return the class i wanted. Do you know how to? :)

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

There is a method on the Type instance that returns the class object, i think it is getReturnedClass()

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa via email Mar 3, 2014

Author Member

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

Really? When you call classMetadata.getPropertyType(name).getReturnedClass() you don't get back the field's actual type?

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa via email Mar 3, 2014

Author Member

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

Do you want to share screens on hangout?

This comment has been minimized.

Copy link
@wluyima

wluyima Mar 3, 2014

Member

The tests pass for me when i change to:
if (OrderFrequency.class.equals(classMetadata.getPropertyType(name).getReturnedClass())) {

This comment has been minimized.

Copy link
@dkayiwa

dkayiwa via email Mar 3, 2014

Author Member
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);
criteria.add(Restrictions.eq(name, 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: " + entityClass.getName(), ex);
}
}

return false;
Expand Down

0 comments on commit 518d699

Please sign in to comment.