From e7577a54d6bd4aeb4930b28ab871a5afa8a03980 Mon Sep 17 00:00:00 2001 From: langens-jonathan Date: Sat, 3 Sep 2016 21:55:13 +0200 Subject: [PATCH] fixed dockerfile sh*t --- Dockerfile | 8 +++++-- context.xml | 19 +++++++++++++++++ .../query_pre_processor/Scopes/Scope.java | 10 ++++----- .../query_pre_processor/Scopes/ScopeNode.java | 9 ++++---- .../query/SPARQLService.java | 20 ++++++++++++++++++ .../web/RootController.java | 16 ++++++++------ target/SCOPES-ENDPOINT-1.0-SNAPSHOT.war | Bin 20217067 -> 20216993 bytes 7 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 context.xml diff --git a/Dockerfile b/Dockerfile index 525088a..57e6f0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,9 @@ -FROM tomcat +FROM tomcat:9.0.0.M9-jre8-alpine -COPY target/SCOPES-ENDPOINT-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/scopes.war +RUN rm -rf /usr/local/tomcat/webapps/ROOT + +COPY context.xml /usr/local/tomcat/conf/context.xml + +COPY target/SCOPES-ENDPOINT-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 diff --git a/context.xml b/context.xml new file mode 100644 index 0000000..f57b43f --- /dev/null +++ b/context.xml @@ -0,0 +1,19 @@ + + + + diff --git a/src/main/java/scopes_service/query_pre_processor/Scopes/Scope.java b/src/main/java/scopes_service/query_pre_processor/Scopes/Scope.java index e1eecea..76811a1 100644 --- a/src/main/java/scopes_service/query_pre_processor/Scopes/Scope.java +++ b/src/main/java/scopes_service/query_pre_processor/Scopes/Scope.java @@ -44,7 +44,7 @@ public String calculateGraphToQuery() // clear the instance graph String clearQuery = "WITH <" + instanceGraph + ">\nDELETE\n{\n ?s ?p ?o .\n}\nWHERE\n{\n ?s ?p ?o .\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", clearQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), clearQuery); } catch (IOException e) { e.printStackTrace(); } @@ -75,7 +75,7 @@ public String calculateGraphToQuery() String pullInInsertsQuery = "INSERT\n{\n GRAPH <" + instanceGraph + ">\n {\n ?s ?p ?o .\n }\n}"; pullInInsertsQuery += "WHERE\n{\n GRAPH <" + name + "/instance>\n {\n ?s ?p ?o.\n }\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", pullInInsertsQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), pullInInsertsQuery); } catch (IOException e) { e.printStackTrace(); } @@ -87,7 +87,7 @@ public String calculateGraphToQuery() String pullInDeletesQuery = "DELETE\n{\n GRAPH <" + instanceGraph + ">\n {\n ?s ?p ?o .\n }\n}"; pullInDeletesQuery += "WHERE\n{\n GRAPH <" + name + "/delete>\n {\n ?s ?p ?o.\n }\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", pullInDeletesQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), pullInDeletesQuery); } catch (IOException e) { e.printStackTrace(); } @@ -99,7 +99,7 @@ public String calculateGraphToQuery() clearMetaInfoQuery += "?uuid ?gname .\n}"; clearMetaInfoQuery += "WHERE\n{\n?user \"" + this.name + "\" .\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", clearMetaInfoQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), clearMetaInfoQuery); } catch (IOException e) { e.printStackTrace(); } @@ -110,7 +110,7 @@ public String calculateGraphToQuery() setMetaInfoQuery += " \"" + instanceGraph + "\".\n}"; setMetaInfoQuery += "WHERE\n{\n?user \"" + this.name + "\" .\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", setMetaInfoQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), setMetaInfoQuery); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/scopes_service/query_pre_processor/Scopes/ScopeNode.java b/src/main/java/scopes_service/query_pre_processor/Scopes/ScopeNode.java index 151b56f..49c02ca 100644 --- a/src/main/java/scopes_service/query_pre_processor/Scopes/ScopeNode.java +++ b/src/main/java/scopes_service/query_pre_processor/Scopes/ScopeNode.java @@ -1,5 +1,6 @@ package scopes_service.query_pre_processor.Scopes; +import org.openrdf.model.vocabulary.SP; import scopes_service.query_pre_processor.query.SPARQLService; import java.io.IOException; @@ -84,7 +85,7 @@ public String calculateScopes() // clear the instance graph String clearQuery = "WITH <" + instanceGraph + ">\nDELETE\n{\n ?s ?p ?o .\n}\nWHERE\n{\n ?s ?p ?o .\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", clearQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), clearQuery); } catch (IOException e) { e.printStackTrace(); } @@ -96,7 +97,7 @@ public String calculateScopes() String pullInChildGraphQuery = "INSERT\n{\n GRAPH <" + instanceGraph + ">\n {\n ?s ?p ?o .\n }\n}"; pullInChildGraphQuery += "WHERE\n{\n GRAPH <" + childgraphname + ">\n {\n ?s ?p ?o.\n }\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", pullInChildGraphQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), pullInChildGraphQuery); } catch (IOException e) { e.printStackTrace(); } @@ -106,7 +107,7 @@ public String calculateScopes() String pullInInsertsQuery = "INSERT\n{\n GRAPH <" + instanceGraph + ">\n {\n ?s ?p ?o .\n }\n}"; pullInInsertsQuery += "WHERE\n{\n GRAPH <" + getInsertName(this.getUUID()) + ">\n {\n ?s ?p ?o.\n }\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", pullInInsertsQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), pullInInsertsQuery); } catch (IOException e) { e.printStackTrace(); } @@ -115,7 +116,7 @@ public String calculateScopes() String pullInDeletesQuery = "DELETE\n{\n GRAPH <" + instanceGraph + ">\n {\n ?s ?p ?o .\n }\n}"; pullInDeletesQuery += "WHERE\n{\n GRAPH <" + getDeleteName(this.getUUID()) + ">\n {\n ?s ?p ?o.\n }\n}"; try { - SPARQLService.getInstance().postSPARQLResponse("http://localhost:8890/sparql", pullInDeletesQuery); + SPARQLService.getInstance().postSPARQLResponse(SPARQLService.getLocalURL(), pullInDeletesQuery); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/scopes_service/query_pre_processor/query/SPARQLService.java b/src/main/java/scopes_service/query_pre_processor/query/SPARQLService.java index 715804c..81e32d0 100644 --- a/src/main/java/scopes_service/query_pre_processor/query/SPARQLService.java +++ b/src/main/java/scopes_service/query_pre_processor/query/SPARQLService.java @@ -7,6 +7,7 @@ import org.openrdf.query.Update; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryConnection; +import org.openrdf.repository.manager.SystemRepository; import virtuoso.sesame4.driver.VirtuosoRepository; import java.io.BufferedReader; @@ -193,6 +194,10 @@ protected void deleteQuery(String query) @SuppressWarnings("unchecked") public List getTriplesViaGet(String url) throws MalformedURLException, IOException { + if(url == null) + url = SPARQLService.getLocalURL(); + + URL u = new URL(url); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); @@ -265,6 +270,10 @@ public List getTriplesViaGet(String url) throws MalformedURLException, I @SuppressWarnings("unchecked") public String getSPARQLResponse(String url) throws MalformedURLException, IOException { + if(url == null) + url = SPARQLService.getLocalURL(); + + URL u = new URL(url); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); @@ -294,6 +303,9 @@ public String getSPARQLResponse(String url) throws MalformedURLException, IOExce @SuppressWarnings("unchecked") public String postSPARQLResponse(String url, String query) throws MalformedURLException, IOException { + if(url == null) + url = SPARQLService.getLocalURL(); + URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); @@ -335,4 +347,12 @@ public static SPARQLService getInstance() } return SPARQLService.instance; } + + public static String getLocalURL() + { + if(System.getenv("SPARQLENDPOINT") != null && !System.getenv("SPARQLENDPOINT").isEmpty()) + return System.getenv("SPARQLENDPOINT"); + else + return "http://localhost/sparql"; + } } \ No newline at end of file diff --git a/src/main/java/scopes_service/query_pre_processor/web/RootController.java b/src/main/java/scopes_service/query_pre_processor/web/RootController.java index cfccc96..bdfa844 100644 --- a/src/main/java/scopes_service/query_pre_processor/web/RootController.java +++ b/src/main/java/scopes_service/query_pre_processor/web/RootController.java @@ -35,6 +35,8 @@ public class RootController { private String userUUID = "JONATHANUUID"; + private String localSPARQLURL = "http://localhost:8890/sparql"; + /** * initializes the callback service with 2 call back sets (allDifferences and effectiveDifferences) */ @@ -43,12 +45,14 @@ public void init() { this.callBackService.addCallBackSet("allDifferences"); this.callBackService.addCallBackSet("effectiveDifferences"); + if(System.getenv("SPARQLENDPOINT") != null && !System.getenv("SPARQLENDPOINT").isEmpty()) + this.localSPARQLURL = System.getenv("SPARQLENDPOINT"); } - @RequestMapping(value="/setUser?") + @RequestMapping(value="/ping") public ResponseEntity ping(HttpServletRequest request, HttpServletResponse response, @RequestBody(required = false) String body) { - return new ResponseEntity("pong", HttpStatus.OK); + return new ResponseEntity(System.getenv("SPARQLENDPOINT"), HttpStatus.OK); } @RequestMapping(value = "/sparql") @@ -87,7 +91,7 @@ public ResponseEntity preProcessQuery(HttpServletRequest request, HttpSe cb.printStackTrace(); }*/ } - String url = "http://localhost:8890/sparql"; + String url = this.localSPARQLURL; String userUUID = this.userUUID; @@ -134,7 +138,7 @@ private String getGraphName(String userUUID) askGraphInstanceName += "?instanceuri ?instance .\n}"; try { - String jsonString = this.queryService.sparqlService.getSPARQLResponse("http://localhost:8890/sparql?query=" + URLEncoder.encode(askGraphInstanceName, "UTF-8")); + String jsonString = this.queryService.sparqlService.getSPARQLResponse(this.localSPARQLURL + "?query=" + URLEncoder.encode(askGraphInstanceName, "UTF-8")); String instanceName = ""; ObjectMapper mapper = new ObjectMapper(); @@ -176,7 +180,7 @@ private Scope buildScopeForUser(String userUUID) Scope scope = new Scope(userUUID); try { - String jsonString = this.queryService.sparqlService.getSPARQLResponse("http://localhost:8890/sparql?query=" + URLEncoder.encode(getNodeInfo, "UTF-8")); + String jsonString = this.queryService.sparqlService.getSPARQLResponse(this.localSPARQLURL + "?query=" + URLEncoder.encode(getNodeInfo, "UTF-8")); ObjectMapper mapper = new ObjectMapper(); Map jsonMap = mapper.readValue(jsonString, Map.class); Map nodeMap = new HashMap(); @@ -212,7 +216,7 @@ private Scope buildScopeForUser(String userUUID) String getNodeParent = "WITH SELECT ?parent WHERE { "; getNodeParent += "<" + node + "> ?parent .\n}"; - String jsonStringP = this.queryService.sparqlService.getSPARQLResponse("http://localhost:8890/sparql?query=" + URLEncoder.encode(getNodeParent, "UTF-8")); + String jsonStringP = this.queryService.sparqlService.getSPARQLResponse(this.localSPARQLURL + "?query=" + URLEncoder.encode(getNodeParent, "UTF-8")); ObjectMapper mapperP = new ObjectMapper(); Map jsonMapP = mapperP.readValue(jsonStringP, Map.class); diff --git a/target/SCOPES-ENDPOINT-1.0-SNAPSHOT.war b/target/SCOPES-ENDPOINT-1.0-SNAPSHOT.war index c293b2f6ad702ce3741672b3c84d5ded189bbf5d..61b478792da97e32a3e5cb6690c7d4f8b7e05ed0 100644 GIT binary patch delta 13988 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