package org.cagrid.mms.service.impl.cadsr;
import gov.nih.nci.cadsr.domain.DataElement;
import gov.nih.nci.cadsr.umlproject.domain.AttributeTypeMetadata;
import gov.nih.nci.cadsr.umlproject.domain.Project;
import gov.nih.nci.cadsr.umlproject.domain.TypeEnumerationMetadata;
import gov.nih.nci.cadsr.umlproject.domain.UMLAttributeMetadata;
import gov.nih.nci.cadsr.umlproject.domain.UMLClassMetadata;
import gov.nih.nci.cagrid.metadata.common.Enumeration;
import gov.nih.nci.cagrid.metadata.common.UMLAttribute;
import gov.nih.nci.cagrid.metadata.common.UMLClass.UmlAttributeCollection;
import gov.nih.nci.cagrid.metadata.common.ValueDomain;
import gov.nih.nci.cagrid.metadata.dataservice.UMLClass;
import gov.nih.nci.system.applicationservice.ApplicationException;
import gov.nih.nci.system.applicationservice.ApplicationService;
import gov.nih.nci.system.query.hibernate.HQLCriteria;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author oster
*/
public class CaDSRUtils {
protected static Log LOG = LogFactory.getLog(CaDSRUtils.class.getName());
public static String getPackageName(UMLClassMetadata umlClass) {
String pkg = "";
String fqn = umlClass.getFullyQualifiedName();
int ind = fqn.lastIndexOf(".");
if (ind >= 0) {
pkg = fqn.substring(0, ind);
}
return pkg;
}
public static Project findCompleteProject(ApplicationService appService, Project prototype)
throws CaDSRGeneralException {
if (prototype == null) {
throw new CaDSRGeneralException("Null project not valid.");
}
// clear this out and refresh it (in case its stale)
prototype.setId(null);
List completeProjects = new ArrayList();
Iterator projectIter = null;
Project proj = null;
try {
projectIter = appService.search(Project.class, prototype).iterator();
} catch (Exception ex) {
throw new CaDSRGeneralException("Error retrieving complete project: " + ex.getMessage(), ex);
}
// should be ONLY ONE project from the caDSR
while (projectIter.hasNext()) {
completeProjects.add(projectIter.next());
}
if (completeProjects.size() == 1) {
proj = (Project) completeProjects.get(0);
} else if (completeProjects.size() == 0) {
throw new CaDSRGeneralException("No project found in caDSR");
} else {
throw new CaDSRGeneralException("More than one project (" + completeProjects.size()
+ ") found. Prototype project is ambiguous");
}
return proj;
}
public static gov.nih.nci.cagrid.metadata.common.UMLClass convertClassToUMLClass(ApplicationService appService,
String projectShortName, String projectVersion, UMLClassMetadata classMetadata) throws ApplicationException {
gov.nih.nci.cagrid.metadata.common.UMLClass converted = null;
if (classMetadata != null) {
converted = new gov.nih.nci.cagrid.metadata.common.UMLClass();
convertClass(appService, projectShortName, projectVersion, converted, classMetadata);
}
return converted;
}
private static void convertClass(ApplicationService appService, String projectShortName, String projectVersion,
gov.nih.nci.cagrid.metadata.common.UMLClass result, UMLClassMetadata classMetadata) throws ApplicationException {
if (classMetadata == null || result == null) {
return;
}
result.setClassName(classMetadata.getName());
result.setDescription(classMetadata.getDescription());
if (result.getDescription() == null) {
result.setDescription("");
}
result.setId(classMetadata.getId());
result.setPackageName(CaDSRUtils.getPackageName(classMetadata));
result.setProjectName(projectShortName);
result.setProjectVersion(projectVersion);
UMLAttribute[] attributes = createClassAttributes(appService, classMetadata);
UmlAttributeCollection attCol = new UmlAttributeCollection();
attCol.getUMLAttribute().addAll(Arrays.asList(attributes));
result.setUmlAttributeCollection(attCol);
gov.nih.nci.cagrid.metadata.common.SemanticMetadata[] smArray = semanticMetadataCollectionToArray(classMetadata
.getSemanticMetadataCollection());
result.getSemanticMetadata().addAll(Arrays.asList(smArray));
}
public static UMLClass convertClassToDataUMLClass(ApplicationService appService, String projectShortName,
String projectVersion, UMLClassMetadata classMetadata) throws ApplicationException {
UMLClass converted = null;
if (classMetadata != null) {
converted = new UMLClass();
converted.setAllowableAsTarget(true);
convertClass(appService, projectShortName, projectVersion, converted, classMetadata);
}
return converted;
}
public static UMLAttribute[] createClassAttributes(ApplicationService appService, UMLClassMetadata classMetadata)
throws ApplicationException {
long start = System.currentTimeMillis();
HQLCriteria criteria = new HQLCriteria(
"SELECT DISTINCT att, att.dataElement.valueDomain, att.attributeTypeMetadata, att.dataElement FROM UMLAttributeMetadata att "
+ "LEFT JOIN FETCH att.semanticMetadataCollection "
+ "WHERE att.UMLClassMetadata.id='"
+ classMetadata.getId() + "' ORDER BY att.name");
List rList = appService.query(criteria, UMLAttributeMetadata.class.getName());
Map attMap = new HashMap();
int ind = 0;
for (Iterator resultsIterator = rList.iterator(); resultsIterator.hasNext(); ind++) {
long attstart = System.currentTimeMillis();
Object[] result = (Object[]) resultsIterator.next();
UMLAttributeMetadata attMD = (UMLAttributeMetadata) result[0];
gov.nih.nci.cadsr.domain.ValueDomain vd = (gov.nih.nci.cadsr.domain.ValueDomain) result[1];
AttributeTypeMetadata attTypemd = (AttributeTypeMetadata) result[2];
DataElement de = (DataElement) result[3];
// filter out duplicate attributes (caCORE bug in the materialized
// view?)
if (attMap.containsKey(de.getPublicID())) {
continue;
}
// build the attribute
UMLAttribute converted = new UMLAttribute();
String description = attMD.getDescription();
if (description == null) {
description = "";
}
converted.setDescription(description);
converted.setName(attMD.getName());
if (de.getPublicID() != null) {
converted.setPublicID(de.getPublicID().longValue());
}
if (de.getVersion() != null) {
converted.setVersion(de.getVersion().floatValue());
}
converted.setDataTypeName(attTypemd.getValueDomainDataType());
// add a value domain
gov.nih.nci.cagrid.metadata.common.ValueDomain attVD = new gov.nih.nci.cagrid.metadata.common.ValueDomain();
attVD.setLongName(vd.getLongName());
attVD.setUnitOfMeasure(vd.getUOMName());
converted.setValueDomain(attVD);
// populate vd semantic md
attVD.getSemanticMetadata().addAll(Arrays.asList(semanticMetadataCollectionToArray(attTypemd.getSemanticMetadataCollection())));
// populate enumeration
ValueDomain.EnumerationCollection enumCollection = new ValueDomain.EnumerationCollection();
attVD.setEnumerationCollection(enumCollection);
HQLCriteria enumcriteria = new HQLCriteria("SELECT DISTINCT enum FROM TypeEnumerationMetadata enum "
+ "LEFT JOIN FETCH enum.semanticMetadataCollection "
+ "WHERE enum.id in (SELECT e.id FROM TypeEnumerationMetadata e, AttributeTypeMetadata t"
+ " WHERE t.typeEnumerationCollection.id=e.id AND t.id='" + attTypemd.getId() + "')");
List enumRList = appService.query(enumcriteria, AttributeTypeMetadata.class.getName());
Iterator typeEnumIter = enumRList.iterator();
Enumeration enumArr[] = new Enumeration[enumRList.size()];
int i = 0;
while (typeEnumIter.hasNext()) {
TypeEnumerationMetadata typeEnum = (TypeEnumerationMetadata) typeEnumIter.next();
Enumeration enumer = new Enumeration();
enumer.setPermissibleValue(typeEnum.getPermissibleValue());
enumer.setValueMeaning(typeEnum.getValueMeaning());
enumArr[i++] = enumer;
// populate enumeration semantic md
enumer.getSemanticMetadata().addAll(Arrays.asList(semanticMetadataCollectionToArray(typeEnum.getSemanticMetadataCollection())));
}
enumCollection.getEnumeration().addAll(Arrays.asList(enumArr));
// populate att semantic md
gov.nih.nci.cagrid.metadata.common.SemanticMetadata[] metadatas = semanticMetadataCollectionToArray(attMD
.getSemanticMetadataCollection());
converted.getSemanticMetadata().addAll(Arrays.asList(metadatas));
attMap.put(de.getPublicID(), converted);
LOG.debug("Converted attribute: " + attMD.getName() + " in " + (System.currentTimeMillis() - attstart)
/ 1000.0 + " seconds.");
}
UMLAttribute[] attArr = new UMLAttribute[attMap.size()];
attMap.values().toArray(attArr);
double duration = (System.currentTimeMillis() - start) / 1000.0;
LOG.info(classMetadata.getFullyQualifiedName() + " attribute conversion took " + duration + " seconds.");
return attArr;
}
public static gov.nih.nci.cagrid.metadata.common.SemanticMetadata[] semanticMetadataCollectionToArray(
Collection semanticMetadata) {
gov.nih.nci.cagrid.metadata.common.SemanticMetadata[] smArray = new gov.nih.nci.cagrid.metadata.common.SemanticMetadata[semanticMetadata
.size()];
Iterator iter = semanticMetadata.iterator();
int i = 0;
while (iter.hasNext()) {
gov.nih.nci.cadsr.umlproject.domain.SemanticMetadata sm = (gov.nih.nci.cadsr.umlproject.domain.SemanticMetadata) iter.next();
gov.nih.nci.cagrid.metadata.common.SemanticMetadata converted = new gov.nih.nci.cagrid.metadata.common.SemanticMetadata();
converted.setConceptCode(sm.getConceptCode());
converted.setConceptDefinition(sm.getConceptDefinition());
converted.setConceptName(sm.getConceptName());
converted.setOrder(sm.getOrder());
converted.setOrderLevel(sm.getOrderLevel());
smArray[i++] = converted;
}
return smArray;
}
}