package ca.uhn.fhir.tinder.parser;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.maven.plugin.MojoFailureException;
import ca.uhn.fhir.model.api.annotation.DatatypeDef;
import ca.uhn.fhir.model.primitive.StringDt;
import ca.uhn.fhir.tinder.model.BaseElement;
import ca.uhn.fhir.tinder.model.BaseRootType;
import ca.uhn.fhir.tinder.model.Composite;
import com.google.common.collect.ImmutableSet;
import com.google.common.reflect.ClassPath;
import com.google.common.reflect.ClassPath.ClassInfo;
public class DatatypeGeneratorUsingSpreadsheet extends BaseStructureSpreadsheetParser {
@Override
protected void postProcess(BaseElement theTarget) throws MojoFailureException {
super.postProcess(theTarget);
/*
* Datatype values are all implied to be in the summary view for some reason. They have a column in the
* spreadsheet but it's never populated.
*/
theTarget.setSummary("Y");
}
public DatatypeGeneratorUsingSpreadsheet(String theVersion, String theBaseDir) {
super(theVersion, theBaseDir);
super.setFilenameSuffix("Dt");
}
@Override
protected String getTemplate() {
String template = super.getTemplate();
if (template != null) {
return template;
}
return "dstu".equals(getVersion()) ? "/vm/dt_composite_dstu.vm" : "/vm/dt_composite.vm";
}
@Override
protected Collection<InputStream> getInputStreams() {
ArrayList<InputStream> retVal = new ArrayList<InputStream>();
for (String next : getInputStreamNames()) {
retVal.add(getClass().getResourceAsStream(next));
}
return retVal;
}
@Override
public void writeAll(File theOutputDirectory, File theResourceOutputDirectory, String thePackageBase) throws MojoFailureException {
try {
ImmutableSet<ClassInfo> tlc = ClassPath.from(getClass().getClassLoader()).getTopLevelClasses(StringDt.class.getPackage().getName());
for (ClassInfo classInfo : tlc) {
DatatypeDef def = Class.forName(classInfo.getName()).getAnnotation(DatatypeDef.class);
if (def != null) {
if (classInfo.getName().contains("Bound") == false) {
getNameToDatatypeClass().put(def.name(), classInfo.getName());
}
}
}
} catch (IOException e) {
throw new MojoFailureException(e.getMessage(), e);
} catch (ClassNotFoundException e) {
throw new MojoFailureException(e.getMessage(), e);
}
try {
ImmutableSet<ClassInfo> tlc = ClassPath.from(getClass().getClassLoader()).getTopLevelClasses(thePackageBase + ".composite");
for (ClassInfo classInfo : tlc) {
DatatypeDef def = Class.forName(classInfo.getName()).getAnnotation(DatatypeDef.class);
if (def != null) {
if (classInfo.getName().contains("Bound") == false) {
getNameToDatatypeClass().put(def.name(), classInfo.getName());
}
}
}
} catch (IOException e) {
throw new MojoFailureException(e.getMessage(), e);
} catch (ClassNotFoundException e) {
throw new MojoFailureException(e.getMessage(), e);
}
super.writeAll(theOutputDirectory, theResourceOutputDirectory, thePackageBase);
}
@Override
protected BaseRootType createRootType() {
return new Composite();
}
@Override
protected List<String> getInputStreamNames() {
ArrayList<String> retVal = new ArrayList<String>();
String version = getVersion();
if (version.equals("dev")) {
version = "dstu2";
}
retVal.add(("/dt/" + version + "/address.xml"));
retVal.add(("/dt/" + version + "/attachment.xml"));
retVal.add(("/dt/" + version + "/codeableconcept.xml"));
retVal.add(("/dt/" + version + "/coding.xml"));
retVal.add(("/dt/" + version + "/humanname.xml"));
retVal.add(("/dt/" + version + "/identifier.xml"));
retVal.add(("/dt/" + version + "/period.xml"));
retVal.add(("/dt/" + version + "/ratio.xml"));
retVal.add(("/dt/" + version + "/quantity.xml"));
retVal.add(("/dt/" + version + "/range.xml"));
retVal.add(("/dt/" + version + "/sampleddata.xml"));
if ("dstu".equals(version)) {
retVal.add(("/dt/" + version + "/contact.xml"));
// retVal.add(("/dt/" + myVersion + "/resourcereference.xml"));
retVal.add(("/dt/" + version + "/schedule.xml"));
}
if (!version.equals("dstu")) {
retVal.add(("/dt/" + version + "/meta.xml"));
retVal.add(("/dt/" + version + "/annotation.xml"));
retVal.add(("/dt/" + version + "/attachment.xml"));
retVal.add(("/dt/" + version + "/contactpoint.xml"));
retVal.add(("/dt/" + version + "/elementdefinition.xml"));
retVal.add(("/dt/" + version + "/timing.xml"));
retVal.add(("/dt/" + version + "/signature.xml"));
}
return retVal;
}
}