package org.activityinfo.server.endpoint.odk.xform;
import com.google.common.collect.HashMultiset;
import org.activityinfo.io.xform.XFormReader;
import org.activityinfo.io.xform.form.XForm;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.form.FormField;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.model.type.FieldValue;
import org.activityinfo.server.endpoint.odk.XFormInstanceReader;
import org.codehaus.jackson.map.ObjectMapper;
import javax.xml.bind.JAXBContext;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import static java.lang.System.exit;
public class XFormInstanceImport {
public static void main(String[] args) {
final File form, instance;
if (args.length == 2) {
form = new File(args[0]);
instance = new File(args[1]);
} else {
System.err.println("Two command line arguments needed: an XML form definition and its JSON instance array");
exit(2);
return; // Honestly, this should not be necessary, but the compiler complains otherwise.
}
final XForm xform;
final XFormReader reader;
final FormClass formClass;
final XFormInstanceReader xFormInstanceReader;
final ArrayList<FormField> formFields;
try {
xform = (XForm) JAXBContext.newInstance(XForm.class).createUnmarshaller().unmarshal(form.toURI().toURL());
reader = new XFormReader(xform);
formClass = reader.build();
xFormInstanceReader = new XFormInstanceReader(new ObjectMapper().readValue(instance, LinkedHashMap[].class),
formClass);
} catch (Exception e) {
e.printStackTrace();
exit(1);
return; // Honestly, this should not be necessary, but the compiler complains otherwise.
}
formFields = new ArrayList<>(formClass.getFields());
Collections.sort(formFields, new Comparator<FormField>() {
@Override
public int compare(FormField o1, FormField o2) {
return o1.getCode().compareTo(o2.getCode());
}
});
FormInstance formInstances[] = xFormInstanceReader.build();
int total = 0;
System.out.printf("%d form instances were read.\n", formInstances.length);
for (FormInstance formInstance : formInstances) {
HashMultiset<Class<? extends FieldValue>> classes = HashMultiset.create();
for (FieldValue fieldValue : formInstance.getFieldValueMap().values()) {
classes.add(fieldValue.getClass());
}
for (Class<? extends FieldValue> fieldValueClass : classes.elementSet()) {
System.out.printf("%s occurs %d times, ", fieldValueClass.getSimpleName(), classes.count(fieldValueClass));
}
int size = classes.size();
total += size;
System.out.printf("for a total of %d field values in a single form instance.\n", size);
}
System.out.printf("A grand total of %d field values were read.\n", total);
}
}