import gov.nih.nci.cadsr.umlproject.domain.Project;
import gov.nih.nci.cagrid.metadata.MetadataUtils;
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.UMLClass;
import gov.nih.nci.system.applicationservice.ApplicationService;
import gov.nih.nci.system.client.ApplicationServiceProvider;
import java.io.FileWriter;
import java.io.Writer;
import java.util.Arrays;
import org.cagrid.mms.service.impl.cadsr.DomainModelBuilder;
public class DomainModelGenerationExample {
public static void main(String[] args) {
try {
ApplicationService appService = ApplicationServiceProvider
.getApplicationServiceFromUrl("http://cadsrapi.nci.nih.gov/cadsrapi40/");
DomainModelBuilder builder = new DomainModelBuilder(appService);
Project project = new Project();
project.setVersion("3.2");
project.setShortName("caCORE 3.2");
System.out.println("Creating domain model for project: " + project.getShortName() + " (version:"
+ project.getVersion() + ")");
long start = System.currentTimeMillis();
// UNCOMMENT FOR: Whole project
// DomainModel domainModel = builder.createDomainModel(project);
// UNCOMMENT FOR: a single package
DomainModel domainModel = builder.createDomainModelForPackages(project,
new String[]{"gov.nih.nci.cabio.domain"});
// UNCOMMENT FOR: a specific set of classes
// String classNames[] = new String[]{Gene.class.getName(),
// Taxon.class.getName()};
// DomainModel domainModel =
// builder.createDomainModelForClasses(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 =
// builder.createDomainModelForClassesWithExcludes(project,
// classNames,
// associationExcludes);
// work around for people getting the "illegal character" problem
// for smart quotes
replaceIllegalCharacters(domainModel);
Writer writer = new FileWriter(project.getShortName().replace(" ", "_") + "-" + project.getVersion()
+ "_DomainModel.xml");
MetadataUtils.serializeDomainModel(domainModel, 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();
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();
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(), badChars))));
}
klass.getSemanticMetadata().addAll(Arrays.asList((fixSemanticMetadata(sb, klass.getClassName(), (SemanticMetadata[])klass.getSemanticMetadata().toArray(),
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;
}
}