diff --git a/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_4_5_Checker.java b/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_4_5_Checker.java index ab3081d822517e8d5e09c17813cb8a7dd6d6733d..a76c42ac99ddbafe1b626b65afdfe793d8744a53 100644 --- a/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_4_5_Checker.java +++ b/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_4_5_Checker.java @@ -1,39 +1,40 @@ /* * Copyright 2020 ETSI - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, + * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors - * may be used to endorse or promote products derived from this software without + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package fr.emse.gitlab.saref.checkers; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileWriter; import java.io.IOException; +import java.net.SocketTimeoutException; import java.util.ArrayList; -import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; +import fr.emse.gitlab.saref.managers.ThemisManager; import org.apache.jena.rdf.model.Model; import org.semanticweb.owl.explanation.api.Explanation; import org.semanticweb.owl.explanation.api.ExplanationGenerator; @@ -48,18 +49,21 @@ import org.semanticweb.owlapi.profiles.violations.UseOfUnknownDatatype; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.managers.OntologyManager; -import fr.emse.gitlab.saref.managers.OopsManager; import fr.emse.gitlab.saref.managers.RepositoryManager; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; +import org.semanticweb.owlapi.reasoner.TimeOutException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; /** * Checks TS 103 673 Clause 9.4.5: OWL Profile, Consistency, and Satisfiability * of Classes - * + * */ public class Clause_9_4_5_Checker extends AbstractClauseChecker { @@ -121,7 +125,7 @@ public class Clause_9_4_5_Checker extends AbstractClauseChecker { try { checkOops(); } catch (Exception ex) { - logWarning(getMessage(MESSAGE.oopsError), ex); + logWarning(getMessage(MESSAGE.oopsError), ex); } } @@ -139,6 +143,7 @@ public class Clause_9_4_5_Checker extends AbstractClauseChecker { + "<OutputFormat>RDF/XML</OutputFormat>" + "</OOPSRequest>"; + Object[] arrayData = new Object[0]; try { @@ -152,45 +157,94 @@ public class Clause_9_4_5_Checker extends AbstractClauseChecker { Request request = new Request.Builder().url("http://oops.linkeddata.es/rest").method("POST", body) .addHeader("Content-Type", "application/xml").build(); - Response response = httpClient.newCall(request).execute(); - if (response.code() != 200) { - throw new SAREFPipelineException("response", "Unexpected response code " + response.code()); + Response response; + + try{ + response = httpClient.newCall(request).execute(); } - - String result = response.body().string(); + catch (SocketTimeoutException e){ - String[] results = result.split("\\n"); + httpClient = new OkHttpClient().newBuilder().readTimeout(10, TimeUnit.SECONDS).build(); - List<String> pureData = new ArrayList<String>(); - for (int i = 0; i < results.length; i++) { - pureData.add(results[i]); + try{ + response = httpClient.newCall(request).execute(); + } + catch (SocketTimeoutException f){ + httpClient = new OkHttpClient().newBuilder().readTimeout(20, TimeUnit.SECONDS).build(); + response = httpClient.newCall(request).execute(); + } } - arrayData = pureData.toArray(); // response into array - - } catch (IOException | SAREFPipelineException e) { - logWarning(getMessage(MESSAGE.oopsError), e); - } - int count = OopsManager.counter(arrayData); + if (response.code() != 200) { + throw new SAREFPipelineException("response", "Unexpected response code " + response.code()); + } - ArrayList<ArrayList<String>> result = OopsManager.getData(arrayData); + String result = response.body().string(); - int s = 0; + Document doc = ThemisManager.convertStringToXMLDocument(result); + + NodeList nodeList = doc.getElementsByTagName("rdf:Description"); + + ArrayList<String> oopsErrors = new ArrayList<String>(); + for (int temp = 0; temp < nodeList.getLength(); temp++){ + org.w3c.dom.Node node = nodeList.item(temp); + if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { + Element element = (Element) node; + if (((Element) node).getElementsByTagName("oops:hasCode").item(0) != null) { + if (((Element) node).getElementsByTagName("oops:hasName").item(0) != null) { + String code = element.getElementsByTagName("oops:hasCode").item(0).getTextContent(); + String name = element.getElementsByTagName("oops:hasName").item(0).getTextContent(); + String description = element.getElementsByTagName("oops:hasDescription").item(0).getTextContent(); + String affected = ""; + NodeList affectedElements = element.getElementsByTagName("oops:hasAffectedElement"); + if (affectedElements != null) { + for (int k = 0; k < affectedElements.getLength(); k++) { + if (k == 0) { + affected += "\"" + affectedElements.item(k).getTextContent() + "\""; + } else { + affected += " ; \"" + affectedElements.item(k).getTextContent() + "\""; + } + } + } + + + String oopsError = String.format("Code: %s, Name: %s, Description: %s, Affected Elements: %s", code, name, description, affected); + oopsErrors.add(oopsError); + } + else{ + String code = element.getElementsByTagName("oops:hasCode").item(0).getTextContent(); + String description = element.getElementsByTagName("oops:hasDescription").item(0).getTextContent(); + String affected = ""; + NodeList affectedElements = element.getElementsByTagName("oops:hasAffectedElement"); + if (affectedElements != null) { + for (int k = 0; k < affectedElements.getLength(); k++) { + if (k == 0) { + affected += "\"" + affectedElements.item(k).getTextContent() + "\""; + } else { + affected += " ; \"" + affectedElements.item(k).getTextContent() + "\""; + } + } + } + + + String oopsError = String.format("Code: %s, Description: %s, Affected Elements: %s", code, description, affected); + oopsErrors.add(oopsError); + } + } + } + } + if (!oopsErrors.isEmpty()) { + String data = oopsErrors.stream().map(e -> e.toString()) + .collect(Collectors.joining("\n- ", "\n\n- ", "\n\n")); + logWarning(getMessage(MESSAGE.oops, data)); - ArrayList<String> results = new ArrayList<String>(); + } - while (s < count) { - String data = result.get(0).get(s).concat("-") + result.get(1).get(s).concat(".") + result.get(2).get(s) + "Affected Elements: " + result.get(3).get(s); - results.add(data); - s++; - } - String printData = results.stream().map(e -> e.toString()) - .collect(Collectors.joining("\n- ", "\n\n- ", "\n\n")); - if (count != 0) { - logWarning(getMessage(MESSAGE.oops, printData)); + } catch (IOException | SAREFPipelineException e) { + logWarning(getMessage(MESSAGE.oopsError), e); } } diff --git a/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_5_Checker.java b/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_5_Checker.java index fa8edd678f0f94e39a2d49a1cf6076c7cbd76853..545cdecb56dd32c050528a14d62ce6a04cb99290 100644 --- a/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_5_Checker.java +++ b/src/main/java/fr/emse/gitlab/saref/checkers/Clause_9_5_Checker.java @@ -1,26 +1,26 @@ /* * Copyright 2020 ETSI - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, + * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors - * may be used to endorse or promote products derived from this software without + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ package fr.emse.gitlab.saref.checkers; @@ -101,14 +101,14 @@ public class Clause_9_5_Checker extends AbstractClauseChecker { return; } readTests(); // generates the RDF model for the tests - + try { callThemis(); // uses the RDF model for the tests and sends it to ThemisOWL profile, consistency, lack of pitfalls and class satisfiability testsRDFaGenerator(); // this generates the html file with rdfa embedded. } catch (Exception ex) { - logWarning(getMessage(MESSAGE.themis), ex); + logWarning(getMessage(MESSAGE.themis), ex); } - + } catch (IOException ex) { logError(getMessage(MESSAGE.ioexception)); } diff --git a/src/main/java/fr/emse/gitlab/saref/managers/OopsManager.java b/src/main/java/fr/emse/gitlab/saref/managers/OopsManager.java deleted file mode 100644 index ecc076e21079f554ba1a479d80fe01243ea12cdd..0000000000000000000000000000000000000000 --- a/src/main/java/fr/emse/gitlab/saref/managers/OopsManager.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2020 ETSI - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of its contributors - * may be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package fr.emse.gitlab.saref.managers; - -import java.util.ArrayList; - -public class OopsManager { - - public static ArrayList<ArrayList<String>> getData(Object[] data) { - ArrayList<String> getID = new ArrayList<String>(); - ArrayList<String> getName = new ArrayList<String>(); - ArrayList<String> getInfo = new ArrayList<String>(); - ArrayList<String> affectedElements = new ArrayList<String>(); - - ArrayList<ArrayList<String>> elements = new ArrayList<ArrayList<String>>(); - elements.add(getID); - elements.add(getName); - elements.add(getInfo); - elements.add(affectedElements); - - String affected = ""; - - for (int i = 0; i < data.length; i++) { - String data2 = data[i].toString().replaceAll(" ", ""); - - - if (data2.startsWith("<oops:hasCode")) { - String[] data3 = data2.split("(<|>)"); - getID.add(data3[2]); - elements.set(0, getID); - } else if (data2.startsWith("<oops:hasName")) { - String[] data3 = data2.split("(<|>)"); - getName.add(data3[2]); - elements.set(1, getName); - } else if (data2.startsWith("<oops:hasDescription")) { - String[] data3 = data2.split("(<|>)"); - getInfo.add(data3[2]); - elements.set(2, getInfo); - } - if (i>0 && i < data.length-1) { - String prove = data[i - 1].toString().replaceAll(" ", ""); - String prove2 = data[i + 1].toString().replaceAll(" ", ""); - - if (data2.startsWith("<oops:hasAffectedElement")) { - if (!prove.startsWith("<oops:hasAffectedElement")) { - String[] data3 = data2.split("(<|>)"); - affected += data3[2]; - } - else if (!prove2.startsWith("<oops:hasAffectedElement")){ - String[] data3 = data2.split("(<|>)"); - affected += ", " + data3[2]; - affectedElements.add(affected); - elements.set(3, affectedElements); - affected = ""; - } - else{ - String[] data3 = data2.split("(<|>)"); - affected += ", " + data3[2]; - } - } - - } - - } - - return elements; - } - - public static int counter(Object[] data) { - int counter = 0; - for (int i = 0; i < data.length; i++) { - String data2 = data[i].toString().replaceAll(" ", ""); - if (data2.startsWith("<oops:hasCode")) { - counter++; - } - } - return counter; - } - -}