package org.cagrid.mms.service; import static org.junit.Assert.assertNotNull; import gov.nih.nci.cagrid.metadata.common.SemanticMetadata; import gov.nih.nci.cagrid.metadata.common.UMLAttribute; import gov.nih.nci.cagrid.metadata.common.UMLClass.UmlAttributeCollection; import gov.nih.nci.cagrid.metadata.dataservice.DomainModel; import gov.nih.nci.cagrid.metadata.dataservice.DomainModel.ExposedUMLClassCollection; import gov.nih.nci.cagrid.metadata.dataservice.ObjectFactory; import gov.nih.nci.cagrid.metadata.dataservice.UMLClass; import java.io.OutputStreamWriter; import java.util.Arrays; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import org.cagrid.mms.model.UMLProjectIdentifer; import org.cagrid.mms.test.SpringTestApplicationContextConstants; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class ServiceDomainModelGenerationTestCase{ public MMS mms; @Before public void onSetup() { ApplicationContext ctx = new FileSystemXmlApplicationContext(SpringTestApplicationContextConstants.MMS_BASE_LOCATION); mms = (MMS)ctx.getBean("mms"); assertNotNull(this.mms); } @Test public void test() { try { long start = System.currentTimeMillis(); UMLProjectIdentifer project = new UMLProjectIdentifer(); project.setIdentifier("caCORE 3.2"); project.setVersion("3.2"); System.out.println("Creating domain model for project: " + project.getIdentifier() + " (version:" + project.getVersion() + ")"); DomainModel domainModel = null; try { domainModel = mms .generateDomainModelForPackages( project, (List<String>) Arrays .asList(new String[] { "gov.nih.nci.cabio.domain" })); } catch (InvalidUMLProjectIndentifier e) { e.printStackTrace(); } // UNCOMMENT FOR: a specific set of classes // String classNames[] = new String[]{Gene.class.getName(), // Taxon.class.getName()}; // DomainModel domainModel = // mms.generateDomainModelForClasses(project, classNames); //// UNCOMMENT FOR: a specific set of classes, with excluded //// associations // String classNames[] = new String[]{Gene.class.getName(), // Chromosome.class.getName(), Taxon.class.getName(), // Tissue.class.getName()}; // UMLAssociationExclude exclude1 = new // UMLAssociationExclude(Chromosome.class.getName(), "chromosome", // Gene.class.getName(), "geneCollection"); // UMLAssociationExclude exclude2 = new // UMLAssociationExclude(Tissue.class.getName(), "*", "*", "*"); // UMLAssociationExclude associationExcludes[] = new // UMLAssociationExclude[]{exclude1, exclude2}; // DomainModel domainModel = // mms.generateDomainModelForClassesWithExcludes(project, // classNames, // associationExcludes); // work around for people getting the "illegal character" problem // for smart quotes replaceIllegalCharacters(domainModel); OutputStreamWriter writer = new OutputStreamWriter(System.out); JAXBContext jaxbContext = JAXBContext.newInstance(domainModel .getClass()); JAXBElement<DomainModel> el = new ObjectFactory() .createDomainModel(domainModel); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); // output pretty printed jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(el, writer); writer.close(); double duration = (System.currentTimeMillis() - start) / 1000.0; System.out.println("Domain Model generation took:" + duration + " seconds."); } catch (Exception ex) { ex.printStackTrace(); } } /** * @param domainModel */ private static void replaceIllegalCharacters(DomainModel domainModel) { StringBuilder sb = new StringBuilder(); char[] badChars = { 0x18, 0x19 }; ExposedUMLClassCollection classColl = domainModel .getExposedUMLClassCollection(); UMLClass[] classes = (UMLClass[]) classColl.getUMLClass().toArray( new UMLClass[0]); for (UMLClass klass : classes) { String classDesc = klass.getDescription(); if (classDesc != null) { for (char element : badChars) { if (classDesc.indexOf(element) > -1) { sb.append("Class description " + klass.getClassName() + " contains bad character: " + classDesc + "\n"); classDesc = classDesc.replace(element, ' '); } } klass.setDescription(classDesc); } UmlAttributeCollection attColl = klass.getUmlAttributeCollection(); UMLAttribute[] atts = (UMLAttribute[]) attColl.getUMLAttribute() .toArray(new UMLAttribute[0]); for (UMLAttribute att : atts) { String desc = att.getDescription(); if (desc != null) { for (char element : badChars) { if (desc.indexOf(element) > -1) { sb.append("Attribute description " + klass.getClassName() + "." + att.getName() + " contains bad character: " + desc + "\n"); desc = desc.replace(element, ' '); } } att.setDescription(desc); } att.getSemanticMetadata().addAll( Arrays.asList((fixSemanticMetadata(sb, klass.getClassName() + "." + att.getName(), (SemanticMetadata[]) att.getSemanticMetadata() .toArray(new SemanticMetadata[0]), badChars)))); } klass.getSemanticMetadata() .addAll(Arrays.asList(fixSemanticMetadata(sb, klass .getClassName(), (SemanticMetadata[]) klass.getSemanticMetadata() .toArray(new SemanticMetadata[0]), badChars))); } if (sb.length() > 0) { System.out .println("\n\n\n========== CHARACTER PROBLEMS WITH MODEL =========="); System.out.println(sb.toString()); } else { System.out.println("No illegal characters found in model"); } } private static SemanticMetadata[] fixSemanticMetadata(StringBuilder sb, String name, SemanticMetadata[] semMetColl, char[] badChars) { for (SemanticMetadata element : semMetColl) { String desc = element.getConceptDefinition(); if (desc != null) { for (char element2 : badChars) { if (desc.indexOf(element2) > -1) { sb.append("SemanticMetadata " + name + " contains bad character: " + desc + "\n"); desc = desc.replace(element2, ' '); } } element.setConceptDefinition(desc); } } return semMetColl; } }