Skip to content

v0.2.53..v0.2.54 changeset GrailResource.java

Garret Voltz edited this page Mar 31, 2020 · 1 revision
diff --git a/hoot-services/src/main/java/hoot/services/controllers/grail/GrailResource.java b/hoot-services/src/main/java/hoot/services/controllers/grail/GrailResource.java
index 969387a..3d51ebd 100644
--- a/hoot-services/src/main/java/hoot/services/controllers/grail/GrailResource.java
+++ b/hoot-services/src/main/java/hoot/services/controllers/grail/GrailResource.java
@@ -51,8 +51,10 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -60,6 +62,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLSession;
 import javax.servlet.UnavailableException;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.BadRequestException;
@@ -82,6 +87,7 @@ import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.TransformerException;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.filefilter.IOFileFilter;
 import org.apache.commons.io.filefilter.RegexFileFilter;
 import org.apache.commons.io.filefilter.WildcardFileFilter;
@@ -413,6 +419,7 @@ public class GrailResource {
         json.put("jobid", jobId);
         String jobDir = reqParams.getParentId();
         File workDir = new File(CHANGESETS_FOLDER, jobDir);
+        params.setWorkDir(workDir);
 
         if (!workDir.exists()) {
             logger.error("ApplyChangeset: jobDir {} does not exist.", workDir.getAbsolutePath());
@@ -876,14 +883,29 @@ public class GrailResource {
         //remove cropfile
         workflow.add(getConnectedWaysApiCommand(jobId, connectedWaysParams));
 
-        // merge reference and ways osm files
-        GrailParams mergeOsmParams = new GrailParams(params);
-        File mergeFile = new File(params.getWorkDir(), "merge.osm");
-        mergeOsmParams.setOutput(mergeFile.getAbsolutePath());
-        workflow.add(grailCommandFactory.build(jobId, mergeOsmParams, "info", MergeOsmFilesCommand.class, this.getClass()));
+        // merge OOB connected ways osm files and add 'hoot:change:exclude:delete' tag to each
+        GrailParams mergeOobWaysParams = new GrailParams(params);
+        File mergeOobWaysFile = new File(params.getWorkDir(), "oobways.osm");
+        mergeOobWaysParams.setOutput(mergeOobWaysFile.getAbsolutePath());
+        // Map<String, String> opts = new HashMap<>();
+        // opts.put("convert.ops", "hoot::SetTagValueVisitor");
+        // opts.put("set.tag.value.visitor.element.criteria", "hoot::WayCriterion");
+        // opts.put("set.tag.value.visitor.keys", "hoot:change:exclude:delete");
+        // opts.put("set.tag.value.visitor.values", "yes");
+        // mergeOobWaysParams.setAdvancedOptions(opts);
+        mergeOobWaysParams.setInput1("\\d+\\.osm"); //this is the file filter
+        workflow.add(grailCommandFactory.build(jobId, mergeOobWaysParams, "info", MergeOsmFilesCommand.class, this.getClass()));
+
+        // merge OOB connected ways merge file and the reference osm file
+        GrailParams mergeRefParams = new GrailParams(params);
+        File mergeRefFile = new File(params.getWorkDir(), "merge.osm");
+        mergeRefParams.setInput1("(" + mergeOobWaysFile.getName() + "|" + referenceOSMFile.getName() + ")"); //this is the file filter
+        mergeRefParams.setOutput(mergeRefFile.getAbsolutePath());
+        workflow.add(grailCommandFactory.build(jobId, mergeRefParams, "info", MergeOsmFilesCommand.class, this.getClass()));
+
         // Write the data to the hoot db
         GrailParams pushParams = new GrailParams(params);
-        pushParams.setInput1(mergeFile.getAbsolutePath());
+        pushParams.setInput1(mergeRefFile.getAbsolutePath());
         ExternalCommand importRailsPort = grailCommandFactory.build(jobId, pushParams, "info", PushToDbCommand.class, this.getClass());
         workflow.add(importRailsPort);
 
@@ -909,15 +931,46 @@ public class GrailResource {
         }
     }
 
+    //Used for self-signed SSL certs
+    //still requires import of cert into server java keystore
+    //e.g. sudo keytool -import -alias <CertAlias> -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre/lib/security/cacerts -file /tmp/CertFile.der
+    public static InputStream getUrlInputStreamWithNullHostnameVerifier(String urlString) throws IOException {
+        InputStream inputStream = null;
+        URL url = new URL(urlString);
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+
+        if (url.getProtocol().equalsIgnoreCase("https")) {
+            ((HttpsURLConnection) conn).setHostnameVerifier(new HostnameVerifier() {
+                @Override
+                public boolean verify(String hostname, SSLSession sslSession) {
+                    return true;
+                }
+            });
+        }
+
+        try {
+            inputStream = conn.getInputStream();
+        } catch(IOException e) {
+            //read the error response body
+            String err = IOUtils.toString(conn.getErrorStream(), StandardCharsets.UTF_8);
+            logger.error(err);
+            throw new IOException(err);
+        }
+
+        return inputStream;
+    }
+
+
     // Get Capabilities from an OSM API Db
     private static APICapabilities getCapabilities(String capabilitiesUrl) {
         APICapabilities params = new APICapabilities();
 
         try {
+            InputStream inputStream = getUrlInputStreamWithNullHostnameVerifier(replaceSensitiveData(capabilitiesUrl));
+
             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
             DocumentBuilder db = dbf.newDocumentBuilder();
-            Document doc = db.parse(new URL(replaceSensitiveData(capabilitiesUrl)).openStream());
-
+            Document doc = db.parse(inputStream);
             doc.getDocumentElement().normalize();
 
             NodeList nl = doc.getElementsByTagName("api");
Clone this wiki locally