package org.redcross.openmapkit.odkcollect; import android.os.Environment; import com.spatialdev.osm.OSMUtil; import com.spatialdev.osm.model.OSMElement; import com.spatialdev.osm.model.OSMXmlWriter; import org.redcross.openmapkit.ExternalStorage; import org.redcross.openmapkit.MapActivity; import org.redcross.openmapkit.odkcollect.tag.ODKTag; import org.redcross.openmapkit.odkcollect.tag.ODKTagItem; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; /** * Created by Nicholas Hallahan on 2/9/15. * nhallahan@spatialdev.com * * * */ public class ODKCollectData { public static final String APP_NAME = "OpenMapKit Android"; private String formId; private String formFileName; private String instanceId; private String instanceDir; private String previousOSMEditFileName; private LinkedHashMap<String, ODKTag> requiredTags; private List<File> editedOSM = new ArrayList<>(); private String editedXml; private String checksum; private String appVersion; public ODKCollectData ( String formId, String formFileName, String instanceId, String instanceDir, String previousOSMEditFileName, LinkedHashMap<String, ODKTag> requiredTags ) { this.formId = formId; this.formFileName = formFileName; this.instanceId = instanceId; this.instanceDir = instanceDir; this.previousOSMEditFileName = previousOSMEditFileName; this.requiredTags = requiredTags; this.appVersion = MapActivity.getVersion(); findEditedOSMForForm(formFileName); } private void findEditedOSMForForm(String formFileName) { if (formFileName == null) { return; } String instances = new File(instanceDir).getParent(); File[] instancesDirs = new File(instances).listFiles(); for (int i = 0; i < instancesDirs.length; ++i) { File dir = instancesDirs[i]; if (!dir.isDirectory()) { continue; } // check if the instance dir is for the form we are dealing with // it is 0 if the form file name is the first substring of the dirname if (dir.getName().indexOf(formFileName) != 0) { continue; } String[] files = dir.list(); for (int j = 0; j < files.length; ++j) { String fname = files[j]; if (fname.lastIndexOf(".osm") > -1) { File osmFile = new File(dir, fname); editedOSM.add(osmFile); } } } } public List<File> getEditedOSM() { return editedOSM; } public String getFormId() { return formId; } public String getFormFileName() { return formFileName; } public String getInstanceId() { return instanceId; } public String getInstanceDir() { return instanceDir; } public Collection<ODKTag> getRequiredTags() { return requiredTags.values(); } /** * Returns the ODK defined label for a OSM tag key if exists * * * * @param key * @return */ public String getTagKeyLabel(String key) { ODKTag tag = requiredTags.get(key); if (tag != null) { return tag.getLabel(); } return null; } /** * Returns the ODK defined label for an OSM tag value if exists * * * * @param key * @param value * @return */ public String getTagValueLabel(String key, String value) { ODKTag tag = requiredTags.get(key); if (tag != null) { ODKTagItem item = tag.getItem(value); return item.getLabel(); } return null; } public void consumeOSMElement(OSMElement el, String osmUserName) throws IOException { checksum = el.checksum(); editedXml = OSMXmlWriter.elementToString(el, osmUserName, APP_NAME + " " + appVersion); } public void deleteOldOSMEdit() { if (previousOSMEditFileName == null) { return; } String path = instanceDir + '/' + previousOSMEditFileName; File f = new File(path); if (f.exists()) { f.delete(); } } public void writeXmlToOdkCollectInstanceDir() throws IOException { if ( ! isODKCollectInstanceDirectoryAvailable() ) { throw new IOException("The ODK Collect Instance Directory cannot be accessed!"); } File f = new File( getOSMFileFullPath() ); f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); OutputStreamWriter writer = new OutputStreamWriter(fos); writer.append(editedXml); writer.close(); fos.close(); } public String getOSMFileName() { return checksum + ".osm"; } public String getOSMFileFullPath() { return instanceDir + "/" + getOSMFileName(); } private boolean isODKCollectInstanceDirectoryAvailable() { if ( ! ExternalStorage.isWritable() ) { return false; } File dir = new File(instanceDir); if (dir.exists()) { return true; } return false; } }