From f16ba7e83885410d4f74b9a0ca415cdc420b505f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Apr 2023 17:58:25 +0000 Subject: [PATCH 1/3] Bump docker/metadata-action from 4.3.0 to 4.4.0 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4.3.0 to 4.4.0. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v4.3.0...v4.4.0) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e25152..cebc48f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: # https://github.com/docker/metadata-action (lower cases image name, etc.) - name: Extract Docker metadata id: meta - uses: docker/metadata-action@v4.3.0 + uses: docker/metadata-action@v4.4.0 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push From a8792384a6eef8a8b54512a59cd89cc6c4efe857 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Wed, 26 Apr 2023 16:30:01 +0200 Subject: [PATCH 2/3] Changed widoco version --- pom.xml | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 71fd8f3..bc8f283 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ es.oeg widoco jar - 1.4.17 + 1.4.19 Widoco @@ -131,35 +131,6 @@ 11 - - org.owasp - dependency-check-maven - 6.0.1 - - - - check - - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.2.0 - - - validate - - list - - - - - pom.lock - - - From c1fbdeb2a7d13da252f1c78b63d679eca1dfd582 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Thu, 1 Jun 2023 18:27:57 +0200 Subject: [PATCH 3/3] Fix #589 Fix #586 Fix #585 Fix #583 Fix #580 --- README.md | 6 +- pom.xml | 7 + src/main/java/oops/OOPSevaluation.java | 52 +++- src/main/java/widoco/Configuration.java | 19 +- src/main/java/widoco/Constants.java | 19 +- .../java/widoco/CreateOOPSEvalInThread.java | 2 +- src/main/java/widoco/CreateResources.java | 5 +- src/main/java/widoco/gui/GuiController.java | 27 ++ src/main/resources/lode.zip | Bin 168619 -> 168827 bytes src/main/resources/lode/cs.xml | 1 + src/main/resources/lode/de.xml | 1 + src/main/resources/lode/en.xml | 1 + src/main/resources/lode/es.xml | 1 + src/main/resources/lode/extraction.xsl | 27 ++ src/main/resources/lode/fr.xml | 1 + src/main/resources/lode/it.xml | 1 + src/main/resources/lode/nl.xml | 1 + src/main/resources/widoco/images/rdf.icon | Bin 0 -> 421 bytes src/test/java/oops/OOPSevaluationTest.java | 291 +++++++++++++++--- 19 files changed, 376 insertions(+), 86 deletions(-) create mode 100644 src/main/resources/widoco/images/rdf.icon diff --git a/README.md b/README.md index 920ebd9..76da114 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ WIDOCO helps you to publish and create an enriched and customized documentation **Author**: Daniel Garijo Verdejo (@dgarijo) -**Contributors**: María Poveda, Idafen Santana, Almudena Ruiz, Miguel Angel García, Oscar Corcho, Daniel Vila, Sergio Barrio, Martin Scharm, Maxime Lefrancois, Alfredo Serafini, @kartgk, Pat Mc Bennett, Christophe Camel, Jacobus Geluk, Martin Scharm, @rpietzsch, Jonathan Leitschuh, Jodi Schneider, Giacomo Lanza, Alejandra Gonzalez-Beltran, Mario Scrocca, Miguel Angel García, Flores Bakker, @JohnnyMoonlight and René Fritze. +**Contributors**: María Poveda, Idafen Santana, Almudena Ruiz, Miguel Angel García, Oscar Corcho, Daniel Vila, Sergio Barrio, Martin Scharm, Maxime Lefrancois, Alfredo Serafini, @kartgk, Pat Mc Bennett, Christophe Camel, Jacobus Geluk, Martin Scharm, @rpietzsch, Jonathan Leitschuh, Jodi Schneider, Giacomo Lanza, Alejandra Gonzalez-Beltran, Mario Scrocca, Miguel Angel García, Flores Bakker, @JohnnyMoonlight, René Fritze, @telecsur, Jan Vlug, Han Kruiger, Johannes Theissen-Lipp and Roberto Polli. **Citing WIDOCO**: If you used WIDOCO in your work, please cite the ISWC 2017 paper: https://iswc2017.semanticweb.org/paper-138 @@ -75,7 +75,7 @@ Examples of the features of WIDOCO can be seen on [the gallery](https://dgarijo. A tutorial explaining the main features of the GUI can be found [here](https://dgarijo.github.io/Widoco/doc/tutorial/) ## Metadata usage -To see how WIDOCO recognizes metadata annotations in your ontology to create the documentation files, see [the Widoco metadata documentation](doc/metadataGuide/guide.md). To learn which metadata properties we recommend adding to your ontology for producing a nice-looking documentation, have a look at our [best practices guide](https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html). +To see how WIDOCO recognizes metadata annotations in your ontology to create the documentation files, see [the Widoco metadata documentation](doc/metadataGuide/guide.md). To learn which metadata properties we recommend adding to your ontology for producing a nice-looking documentation, have a look at our [best practices guide](doc/bestPractices/index-en.html). ## How to use WIDOCO @@ -164,6 +164,8 @@ docker run -ti --rm \ `--help`: Shows a help message and exits. +`--version`: Shows the version of WIDOCO. + ## How can I make WIDOCO automatically recognize my vocabulary annotations? There are two alternative ways for making WIDOCO get your vocabulary metadata annotations and use them automatically to document the ontology. diff --git a/pom.xml b/pom.xml index bc8f283..6ef7be8 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,13 @@ + + org.apache.maven + maven-model + 3.9.0 + + + com.github.VisualDataWeb OWL2VOWL diff --git a/src/main/java/oops/OOPSevaluation.java b/src/main/java/oops/OOPSevaluation.java index b3aa2cc..fad0073 100644 --- a/src/main/java/oops/OOPSevaluation.java +++ b/src/main/java/oops/OOPSevaluation.java @@ -15,9 +15,7 @@ */ package oops; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; +import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; @@ -57,21 +55,26 @@ public class OOPSevaluation { public boolean error = false; private OWLOntology model = null; private int pitfallNumber; - - - public OOPSevaluation(String content) throws IOException { + + + /** + * Main constructor: given an ontology file, a request will be issue to the OOPS! server + * @param ontologyContent + * @throws IOException + */ + public OOPSevaluation(String ontologyContent) throws IOException { //always query by content pitfallNumber = 0; String request = "" + ""; request += ""; - if (content != null && !"".equals(content)) { - request += ""; + if (ontologyContent != null && !"".equals(ontologyContent)) { + request += ""; } request += "" + "" + "RDF/XML" + ""; String uri = Constants.OOPS_SERVICE_URL; URL url = new URL(uri); - System.out.println(request); + //System.out.println(request); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(Constants.OOPS_TIME_OUT); connection.setRequestMethod("POST"); @@ -82,19 +85,34 @@ public OOPSevaluation(String content) throws IOException { wr.write(request); wr.flush(); InputStream in = (InputStream) connection.getInputStream(); - try{ - OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); - model = manager.loadOntologyFromOntologyDocument(in); - OWLClass pitfall = model.getOWLOntologyManager().getOWLDataFactory().getOWLClass(Constants.OOPS_NS + "pitfall"); - this.pitfallNumber = EntitySearcher.getIndividuals(pitfall, model).collect(Collectors.toSet()).size(); - }catch(OWLOntologyCreationException e){ - logger.warn("Could not extract the number of pitfalls from response"); - } + initializeEvaluation(in); in.close(); wr.close(); connection.disconnect(); } + + /** + * Auxiliary constructor in case the response from OOPS! is downloaded elsewhere + * @param OOPSResponse + * @throws IOException + */ + public OOPSevaluation(InputStream OOPSResponse){ + initializeEvaluation(OOPSResponse); + } + + + private void initializeEvaluation(InputStream OOPSResponse){ + try{ + OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + model = manager.loadOntologyFromOntologyDocument(OOPSResponse); + OWLClass pitfall = model.getOWLOntologyManager().getOWLDataFactory().getOWLClass(Constants.OOPS_NS + "pitfall"); + this.pitfallNumber = EntitySearcher.getIndividuals(pitfall, model).collect(Collectors.toSet()).size(); + }catch(OWLOntologyCreationException e){ + logger.warn("Could not extract the number of pitfalls from response"); + } + + } /** diff --git a/src/main/java/widoco/Configuration.java b/src/main/java/widoco/Configuration.java index db50573..442943c 100644 --- a/src/main/java/widoco/Configuration.java +++ b/src/main/java/widoco/Configuration.java @@ -210,7 +210,7 @@ private void initializeOntology() { mainOntologyMetadata.setLicense(l); mainOntologyMetadata.setSerializations(new HashMap<>()); // add default serializations: rdf/xml, n3, turtle and json-ld - mainOntologyMetadata.addSerialization("RDF/XML", "ontology.rdf"); + mainOntologyMetadata.addSerialization("RDF/XML", "ontology.owl"); mainOntologyMetadata.addSerialization("TTL", "ontology.ttl"); mainOntologyMetadata.addSerialization("N-Triples", "ontology.nt"); mainOntologyMetadata.addSerialization("JSON-LD", "ontology.jsonld"); @@ -226,7 +226,6 @@ private void initializeOntology() { } private void loadPropertyFile(String path) throws IOException { - // try { try { initializeOntology(); // this forces the property file to be in UTF 8 instead of the ISO @@ -438,21 +437,21 @@ public void loadPropertiesFromOntology(OWLOntology o) { } // default citation if none is given if (mainOntologyMetadata.getCiteAs() == null || mainOntologyMetadata.getCiteAs().isEmpty()) { - String cite = ""; + StringBuilder cite = new StringBuilder(); for (Agent a : mainOntologyMetadata.getCreators()) { - cite += a.getName() + ", "; + cite.append(a.getName()).append(", "); } if (cite.length() > 1) { // remove the last "," - cite = cite.substring(0, cite.length() - 2); - cite += "."; + cite = new StringBuilder(cite.substring(0, cite.length() - 2)); + cite.append("."); } - cite += appendDetails(mainOntologyMetadata.getTitle(), " ", true); - cite += appendDetails(mainOntologyMetadata.getRevision(), " Revision: ", true); - cite += appendDetails(mainOntologyMetadata.getThisVersion(), " Retrieved from: ", false); + cite.append(appendDetails(mainOntologyMetadata.getTitle(), " ", true)); + cite.append(appendDetails(mainOntologyMetadata.getRevision(), " Revision: ", true)); + cite.append(appendDetails(mainOntologyMetadata.getThisVersion(), " Retrieved from: ", false)); - mainOntologyMetadata.setCiteAs(cite); + mainOntologyMetadata.setCiteAs(cite.toString()); } //load all namespaces in the ontology document. this.namespaceDeclarations = new HashMap<>(); diff --git a/src/main/java/widoco/Constants.java b/src/main/java/widoco/Constants.java index 7567010..5ad88c3 100644 --- a/src/main/java/widoco/Constants.java +++ b/src/main/java/widoco/Constants.java @@ -156,8 +156,8 @@ public class Constants { public static final String PROP_VCARD_EMAIL_OLD = NS_VCARD_OLD + "EMAIL"; public static final String PROP_FOAF_NAME = NS_FOAF + "name"; - public static final String PROP_FOAF_GIVEN_NAME = NS_FOAF + "givenName"; - public static final String PROP_FOAF_FAMILY_NAME = NS_FOAF + "familyName"; + public static final String PROP_FOAF_GIVEN_NAME = NS_FOAF + "givenname"; + public static final String PROP_FOAF_FAMILY_NAME = NS_FOAF + "family_name"; public static final String PROP_FOAF_MBOX = NS_FOAF + "mbox"; public static final String PROP_FOAF_HOME_PAGE = NS_FOAF + "homepage"; public static final String PROP_FOAF_IMAGE = NS_FOAF + "img"; @@ -651,15 +651,18 @@ public static String getIndexDocument(String resourcesFolderName, Configuration /* Style selection */ if (c.isUseW3CStyle()) { document += " " + " " + " " + " "; + + "/primer.css\" media=\"screen\" /> \n" + + " \n" + " \n" + " \n"; } else { - document += " " - + " "; + document += " \n" + + " \n"; } + // add a favicon (rdf logo) + document += ""; // add a title to the document if (c.getMainOntology().getTitle() != null && !"".equals(c.getMainOntology().getTitle())) diff --git a/src/main/java/widoco/CreateOOPSEvalInThread.java b/src/main/java/widoco/CreateOOPSEvalInThread.java index ffddf8e..261d35e 100644 --- a/src/main/java/widoco/CreateOOPSEvalInThread.java +++ b/src/main/java/widoco/CreateOOPSEvalInThread.java @@ -65,7 +65,7 @@ public void run() { if (!c.getMainOntology().isHashOntology()) { ontologyXMLPath += File.separator + "doc"; } - ontologyXMLPath += File.separator + "ontology.rdf"; + ontologyXMLPath += File.separator + "ontology.owl"; // read file String content = null; diff --git a/src/main/java/widoco/CreateResources.java b/src/main/java/widoco/CreateResources.java index e4da0ea..e996466 100644 --- a/src/main/java/widoco/CreateResources.java +++ b/src/main/java/widoco/CreateResources.java @@ -125,7 +125,7 @@ public static void generateDocumentation(String outFolder, Configuration c, File // serialize the model in different serializations. OWLOntologyManager om = c.getMainOntology().getOWLAPIOntologyManager(); OWLOntology o = c.getMainOntology().getOWLAPIModel(); - WidocoUtils.writeModel(om, o, new RDFXMLDocumentFormat(), folderOut + File.separator + "ontology.rdf"); + WidocoUtils.writeModel(om, o, new RDFXMLDocumentFormat(), folderOut + File.separator + "ontology.owl"); WidocoUtils.writeModel(om, o, new TurtleDocumentFormat(), folderOut + File.separator + "ontology.ttl"); WidocoUtils.writeModel(om, o, new NTriplesDocumentFormat(), folderOut + File.separator + "ontology.nt"); WidocoUtils.writeModel(om, o, new RDFJsonLDDocumentFormat(), folderOut + File.separator + "ontology.jsonld"); @@ -442,6 +442,9 @@ private static void createFolderStructure(String s, Configuration c, Properties new File(resources.getAbsolutePath() + File.separator + "jquery.js")); WidocoUtils.copyLocalResource("/lode/marked.min.js", new File(resources.getAbsolutePath() + File.separator + "marked.min.js")); + // icon + WidocoUtils.copyLocalResource("/widoco/images/rdf.icon", + new File(resources.getAbsolutePath() + File.separator + "rdf.icon")); // copy css if (c.isUseW3CStyle()) { WidocoUtils.copyLocalResource("/lode/lodeprimer.css", diff --git a/src/main/java/widoco/gui/GuiController.java b/src/main/java/widoco/gui/GuiController.java index 7319b26..8b9fe29 100644 --- a/src/main/java/widoco/gui/GuiController.java +++ b/src/main/java/widoco/gui/GuiController.java @@ -17,7 +17,9 @@ package widoco.gui; import java.awt.Desktop; +import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.util.Date; import java.util.Properties; @@ -35,6 +37,9 @@ import widoco.LoadOntologyInThread; import widoco.WidocoUtils; +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; + /** * * @author Daniel Garijo @@ -77,6 +82,23 @@ public GuiController() { public GuiController(String[] args) { logger.info("\n\n--WIzard for DOCumenting Ontologies (WIDOCO).\n https://w3id.org/widoco/\n"); + String version = ""; + try { + MavenXpp3Reader reader = new MavenXpp3Reader(); + Model model = reader.read(new FileReader("pom.xml")); + version = model.getVersion(); + } catch (Exception e) { + try{ + InputStream inputStream = GuiController.class.getResourceAsStream("/META-INF/maven/es.oeg/widoco/pom.xml"); + MavenXpp3Reader reader = new MavenXpp3Reader(); + Model model = reader.read(inputStream); + version = model.getVersion(); + }catch (Exception e2) { + logger.error("Could not read the project version from pom"); + } + + } + // get the arguments String outFolder = "myDocumentation" + (new Date().getTime()), ontology = "", rb = null, configOutFile = null; boolean isFromFile = false, oops = false, rewriteAll = false, getOntoMetadata = true, useW3Cstyle = true, @@ -176,6 +198,11 @@ public GuiController(String[] args) { case "--help": System.out.println(Constants.HELP_TEXT); return; + case "--version": + if (!version.isEmpty()) { + System.out.println("Version: "+version); + } + return; default: System.out.println("Command" + s + " not recognized."); System.out.println(Constants.HELP_TEXT); diff --git a/src/main/resources/lode.zip b/src/main/resources/lode.zip index be6aa22773a3eb7270e2c0ccfd42ef8baaacb558..59b37295b1ce34e7dd02b4834b3ed9f22d154374 100644 GIT binary patch delta 19105 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 delta 18700 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 diff --git a/src/main/resources/lode/cs.xml b/src/main/resources/lode/cs.xml index 0002045..4e3eda9 100644 --- a/src/main/resources/lode/cs.xml +++ b/src/main/resources/lode/cs.xml @@ -85,4 +85,5 @@ Je zastaralý domain includes range includes + uses rule diff --git a/src/main/resources/lode/de.xml b/src/main/resources/lode/de.xml index 30ded1c..c10cdd4 100644 --- a/src/main/resources/lode/de.xml +++ b/src/main/resources/lode/de.xml @@ -86,4 +86,5 @@ weiterentwicklet auf Basis von ähnliche Inhaltsmuster Szenarien + verwendet die Regel \ No newline at end of file diff --git a/src/main/resources/lode/en.xml b/src/main/resources/lode/en.xml index 9a41ea3..84bd8bd 100644 --- a/src/main/resources/lode/en.xml +++ b/src/main/resources/lode/en.xml @@ -85,4 +85,5 @@ Is deprecated domain includes range includes + uses rule \ No newline at end of file diff --git a/src/main/resources/lode/es.xml b/src/main/resources/lode/es.xml index 6cf658e..c749609 100644 --- a/src/main/resources/lode/es.xml +++ b/src/main/resources/lode/es.xml @@ -85,4 +85,5 @@ Depecreado el dominio incluye el rango incluye + utiliza regla \ No newline at end of file diff --git a/src/main/resources/lode/extraction.xsl b/src/main/resources/lode/extraction.xsl index 498f747..3ac4c2d 100644 --- a/src/main/resources/lode/extraction.xsl +++ b/src/main/resources/lode/extraction.xsl @@ -38,6 +38,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. xmlns:obo="http://purl.obolibrary.org/obo/" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:sw="http://www.w3.org/2003/06/sw-vocab-status/ns#" + xmlns:extra="https://w3id.org/extra#" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oxygenxml.com/ns/doc/xsl http://www.oxygenxml.com/ns/doc/xsl "> @@ -987,6 +988,7 @@ http://www.oxygenxml.com/ns/doc/xsl "> + @@ -2211,4 +2213,29 @@ http://www.oxygenxml.com/ns/doc/xsl "> + + + + +
+
+ +
+ +
+ + + + + + + + + + +
+
+
+
+
diff --git a/src/main/resources/lode/fr.xml b/src/main/resources/lode/fr.xml index ecdf1db..58403b7 100644 --- a/src/main/resources/lode/fr.xml +++ b/src/main/resources/lode/fr.xml @@ -86,4 +86,5 @@ Obsolète domaine comprend cible comprend + utilise la règle \ No newline at end of file diff --git a/src/main/resources/lode/it.xml b/src/main/resources/lode/it.xml index 7432b9b..ad80bc0 100644 --- a/src/main/resources/lode/it.xml +++ b/src/main/resources/lode/it.xml @@ -85,4 +85,5 @@ Deprecato dominio include codominio include + usa la regola diff --git a/src/main/resources/lode/nl.xml b/src/main/resources/lode/nl.xml index 9e0984f..bc8d96c 100644 --- a/src/main/resources/lode/nl.xml +++ b/src/main/resources/lode/nl.xml @@ -85,4 +85,5 @@ Is vervallen domein bevat bereik bevat + gebruikt regel \ No newline at end of file diff --git a/src/main/resources/widoco/images/rdf.icon b/src/main/resources/widoco/images/rdf.icon new file mode 100644 index 0000000000000000000000000000000000000000..d54310fe20cc6b76fb0aff73bb6d208449383a25 GIT binary patch literal 421 zcmV;W0b2e?Nk%w1VI2S<0K^{vg`>{#^!YhzuNqUMXN>BW*@J zA`Biv9dKI*F$G2>5f4KUX|yqk1!f2uS!02}lx7{JW5GSZW*L7;&$lB24u2k>F$6}2 z9|sD|ao{A8dL-W3NSo?M0}Lb=Tbc$83Fs{c7y=Ux8ZuC@K!AjS1ONaeKqcb9fGD~; zJU~-qN*OvvCfI!Gf5V9$CtYa?E2W PV+=hSSm&XEyAS|7t>CRw literal 0 HcmV?d00001 diff --git a/src/test/java/oops/OOPSevaluationTest.java b/src/test/java/oops/OOPSevaluationTest.java index 97acdc9..345010b 100644 --- a/src/test/java/oops/OOPSevaluationTest.java +++ b/src/test/java/oops/OOPSevaluationTest.java @@ -1,11 +1,22 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Copyright 2012-2022 Ontology Engineering Group, Universidad Politecnica de Madrid, Spain + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package oops; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import org.junit.Test; @@ -21,62 +32,248 @@ public OOPSevaluationTest() { } /** - * Test of printEvaluation method, of class OOPSevaluation. + * Test of printEvaluation method, from OOPSevaluation. The method copies the response from the server in case + * it's down */ - @Test //(Commented out because OOPS! WS seems to be down + @Test public void testPrintEvaluation() { + String aloResponse = " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 1\n" + + " Important\n" + + " The ontology lacks disjoint axioms between classes or between properties that should be defined as disjoint. This pitfall is related with the guidelines provided in [6], [2] and [7].\t\n" + + " Missing disjointness\n" + + " P10\n" + + " \n" + + " \n" + + " \n" + + " Minor\n" + + " http://idi.fundacionctic.org/cruzar/turismo#Alojamiento\n" + + " http://schema.org/LodgingBusiness\n" + + " http://geonames.org/ontology#Feature\n" + + " 3\n" + + " Ontology elements (classes, object properties and datatype properties) are created isolated, with no relation to the rest of the ontology.\t\n" + + " Creating unconnected ontology elements\n" + + " P04\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " http://geonames.org/ontology#featureClass\n" + + " http://geonames.org/ontology#featureCode\n" + + " http://purl.org/dc/terms/type\n" + + " http://vocab.linkeddata.es/datosabiertos/def/turismo/alojamiento#categoria\n" + + " \n" + + " \n" + + " \n" + + " 11\n" + + " http://geonames.org/ontology#featureClass\n" + + " http://www.w3.org/2004/02/skos/core#Concept\n" + + " P08\n" + + " Minor\n" + + " http://schema.org/Hostel\n" + + " http://schema.org/Motel\n" + + " http://schema.org/Hotel\n" + + " http://geonames.org/ontology#featureCode\n" + + " http://geonames.org/ontology#Feature\n" + + " This pitfall consists in creating an ontology element and failing to provide human readable annotations attached to it. Consequently, ontology elements lack annotation properties that label them (e.g. rdfs:label, lemon:LexicalEntry, skos:prefLabel or skos:altLabel) or that define them (e.g. rdfs:comment or dc:description). This pitfall is related to the guidelines provided in [5].\t\n" + + " http://idi.fundacionctic.org/cruzar/turismo#Alojamiento\n" + + " http://schema.org/LodgingBusiness\n" + + " http://schema.org/BedAndBreakfast\n" + + " http://purl.org/dc/terms/type\n" + + " Missing annotations\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " Minor\n" + + " \n" + + " 4\n" + + " This pitfall appears when any relationship (except for those that are defined as symmetric properties using owl:SymmetricProperty) does not have an inverse relationship (owl:inverseOf) defined within the ontology.\t\n" + + " Inverse relationships not explicitly declared\n" + + " P13\n" + + " \n" + + " \n" + + " \n" + + " P20\n" + + " http://vocab.linkeddata.es/datosabiertos/def/turismo/alojamiento#Albergue\n" + + " 4\n" + + " The contents of some annotation properties are swapped or misused. This pitfall might affect annotation properties related to natural language information (for example, annotations for naming such as rdfs:label or for providing descriptions such as rdfs:comment). Other types of annotation could also be affected as temporal, versioning information, among others.\t\n" + + " \n" + + " http://vocab.linkeddata.es/datosabiertos/def/turismo/alojamiento#Apartahotel\n" + + " Misusing ontology annotations\n" + + " http://vocab.linkeddata.es/datosabiertos/def/turismo/alojamiento#Hotel\n" + + " Minor\n" + + " http://vocab.linkeddata.es/datosabiertos/def/turismo/alojamiento#Hostal\n" + + " \n" + + " \n" + + " Important\n" + + " http://purl.org/dc/terms/type\n" + + " http://geonames.org/ontology#featureCode\n" + + " http://geonames.org/ontology#featureClass\n" + + " 3\n" + + " Object and/or datatype properties without domain or range (or none of them) are included in the ontology. \t\n" + + " Missing domain or range in properties\n" + + " P11\n" + + " \n" + + " \n" + + ""; try{ - System.out.println("printEvaluation with alo"); - String content = null; - BufferedReader br = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/alo.owl"))); - try { - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); - - while (line != null) { - sb.append(line); - sb.append(System.lineSeparator()); - line = br.readLine(); - } - content = sb.toString(); - } finally { - br.close(); - } // The ontology has 6 pitfalls - OOPSevaluation instance = new OOPSevaluation(content); - instance.printEvaluation(); - assertEquals(6, instance.getPitfallNumber()); - }catch(IOException e){ + OOPSevaluation instance = new OOPSevaluation(new ByteArrayInputStream(aloResponse.getBytes())); + //instance.printEvaluation(); + assertEquals(6, instance.getPitfallNumber()); + }catch(Exception e){ fail("Error in test "+e.getMessage()); } } - + + /** + * Test of printEvaluation method, from OOPSevaluation. The method copies the response from the server in case + * it's down + */ @Test public void testPrintEvaluation2() { + String oopsResponse = " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " http://purl.org/net/p-plan#isPrecededBy\n" + + " http://purl.org/net/p-plan#correspondsToVariable\n" + + " http://purl.org/net/p-plan#isDecomposedAsPlan\n" + + " http://purl.org/net/p-plan#isVariableOfPlan\n" + + " http://purl.org/net/p-plan#isSubPlanOfPlan\n" + + " http://purl.org/net/p-plan#isStepOfPlan\n" + + " http://purl.org/net/p-plan#correspondsToStep\n" + + " http://www.w3.org/ns/prov#wasDerivedFrom\n" + + " \n" + + " \n" + + " \n" + + " http://www.w3.org/ns/prov#wasGeneratedBy\n" + + " http://www.w3.org/ns/prov#used\n" + + " \n" + + " \n" + + " \n" + + " Minor\n" + + " \n" + + " \n" + + " 10\n" + + " This pitfall appears when any relationship (except for those that are defined as symmetric properties using owl:SymmetricProperty) does not have an inverse relationship (owl:inverseOf) defined within the ontology.\t\n" + + " Inverse relationships not explicitly declared\n" + + " P13\n" + + " \n" + + " \n" + + " \n" + + " 1\n" + + " Important\n" + + " The ontology lacks disjoint axioms between classes or between properties that should be defined as disjoint. This pitfall is related with the guidelines provided in [6], [2] and [7].\t\n" + + " Missing disjointness\n" + + " P10\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " Minor\n" + + " http://www.w3.org/ns/prov#wasDerivedFrom\n" + + " Missing annotations\n" + + " \n" + + " http://www.w3.org/ns/prov#Activity\n" + + " This pitfall consists in creating an ontology element and failing to provide human readable annotations attached to it. Consequently, ontology elements lack annotation properties that label them (e.g. rdfs:label, lemon:LexicalEntry, skos:prefLabel or skos:altLabel) or that define them (e.g. rdfs:comment or dc:description). This pitfall is related to the guidelines provided in [5].\t\n" + + " http://www.w3.org/ns/prov#Plan\n" + + " http://www.w3.org/ns/prov#Bundle\n" + + " http://www.w3.org/ns/prov#used\n" + + " 7\n" + + " http://www.w3.org/ns/prov#wasGeneratedBy\n" + + " http://www.w3.org/ns/prov#Entity\n" + + " P08\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " http://purl.org/net/p-plan#isSubPlanOfPlan\n" + + " http://www.w3.org/ns/prov#wasDerivedFrom\n" + + " 2\n" + + " The domain and range axioms are equal for each of the following object properties. Could they be symmetric or transitive?\n" + + " SUGGESTION: symmetric or transitive object properties.\n" + + " \n" + + " \n" + + ""; try{ - System.out.println("printEvaluation with p-plan"); - String content = null; - BufferedReader br = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/p-plan.owl"))); - try { - StringBuilder sb = new StringBuilder(); - String line = br.readLine(); - - while (line != null) { - sb.append(line); - sb.append(System.lineSeparator()); - line = br.readLine(); - } - content = sb.toString(); - } finally { - br.close(); - } - // The ontology has 6 pitfalls - OOPSevaluation instance = new OOPSevaluation(content); - instance.printEvaluation(); - assertEquals(3, instance.getPitfallNumber()); - }catch(IOException e){ + // The ontology has 3 pitfalls + OOPSevaluation instance = new OOPSevaluation(new ByteArrayInputStream(oopsResponse.getBytes())); + instance.printEvaluation(); + assertEquals(3, instance.getPitfallNumber()); + }catch(Exception e){ fail("Error in test "+e.getMessage()); } } + + /** + * Test of printEvaluation method, from OOPSEvaluation. Commented in case the server is down + */ +// @Test +// public void testPrintEvaluationWebServer() { +// try{ +// System.out.println("printEvaluation with p-plan"); +// String content = null; +// BufferedReader br = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/p-plan.owl"))); +// try { +// StringBuilder sb = new StringBuilder(); +// String line = br.readLine(); +// +// while (line != null) { +// sb.append(line); +// sb.append(System.lineSeparator()); +// line = br.readLine(); +// } +// content = sb.toString(); +// } finally { +// br.close(); +// } +// // The ontology has 6 pitfalls +// OOPSevaluation instance = new OOPSevaluation(content); +// instance.printEvaluation(); +// assertEquals(3, instance.getPitfallNumber()); +// }catch(Exception e){ +// fail("Error in test "+e.getMessage()); +// } +// } }