From f1fa7b44ab5f03b62a0d356d95b9f339a4ea3a8a Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Fri, 25 Aug 2023 17:54:10 +0200 Subject: [PATCH] fix #610, fix #602, fix #605, Fix #544, Fix #612 --- doc/bestPractices/sections/checklist-en.html | 42 +++++- .../sections/introduction-en.html | 38 +++--- doc/configuration/config.properties | 6 +- doc/configuration/configuration_doc.md | 21 +-- doc/metadataGuide/guide.md | 46 ++++++- src/main/java/widoco/Configuration.java | 56 +++++++- src/main/java/widoco/Constants.java | 125 ++++++++++++------ src/main/java/widoco/CreateResources.java | 47 +++++-- src/main/java/widoco/gui/BiggerTextArea.java | 7 +- src/main/java/widoco/gui/EditProperty.java | 18 ++- src/main/java/widoco/gui/GuiStep1.java | 53 +++----- src/main/java/widoco/gui/GuiStep2.java | 88 +++++++++--- src/main/java/widoco/gui/GuiStep3.java | 41 +++--- src/main/resources/lode.zip | Bin 169247 -> 169488 bytes src/main/resources/lode/extraction.xsl | 62 ++++++++- src/main/resources/widoco/cs.properties | 2 +- src/main/resources/widoco/de.properties | 2 +- src/main/resources/widoco/en.properties | 2 +- src/main/resources/widoco/es.properties | 2 +- src/main/resources/widoco/fr.properties | 2 +- src/main/resources/widoco/it.properties | 2 +- src/main/resources/widoco/nl.properties | 2 +- src/main/resources/widoco/pt.properties | 2 +- 23 files changed, 494 insertions(+), 172 deletions(-) diff --git a/doc/bestPractices/sections/checklist-en.html b/doc/bestPractices/sections/checklist-en.html index e7cbef1..2bed613 100644 --- a/doc/bestPractices/sections/checklist-en.html +++ b/doc/bestPractices/sections/checklist-en.html @@ -124,8 +124,9 @@

Status [OPTION -Note that the range of bibo:status is a "bibo:DocumentStatus" instance. Common status include: bibo:status/accepted, bibo:status/draft, bibo:status/published, bibo:status/rejected and bibo:status/peerReviewed. For more information, please see the bibo vocabulary. In MOD, the status is a string. +Note that the range of bibo:status is a "bibo:DocumentStatus" instance. Common status include: bibo:status/accepted, bibo:status/draft, bibo:status/published, bibo:status/rejected and bibo:status/peerReviewed. For more information, please see the bibo vocabulary. In MOD, status is a string. In schema.org, status may refer to a string or to a schema:DefinedTerm.
Example:
@@ -433,6 +434,45 @@ 
Example:
dct:publisher <http://www.oeg-upm.net/; .
+

Funder [OPTIONAL]

+

+Organizations (or persons) responsible for funding the vocabulary. Ontologies are often a product of funding organizations, and hence they should be acknowledged. +

+ + + +
Example:
+
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+<https://w3id.org/fr/def/core#> a owl:Ontology ;
+    foaf:funder <https://example.org/fundingOrganization> .
+
+ +

Funding [OPTIONAL]

+

+Projects or grants responsible for funding the vocabulary. Note that the range of this property is a schema:Grant. +

+ + + +
Example:
+
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix schema: <https://schema.org/> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+<https://w3id.org/fr/def/core#> a owl:Ontology ;
+    foaf:funding <https://example.org/fundingGrant> .
+
+

Vocabulary citation

Ontologies are considered software, and should be cited as such [Smith et al 2016]. However, researchers reusing the ontology may not refer to the correct citation associated to it. Adding metadata to help them would address this issue, granting you the appropriate credit for your work.

diff --git a/doc/bestPractices/sections/introduction-en.html b/doc/bestPractices/sections/introduction-en.html index 17b646a..9356599 100644 --- a/doc/bestPractices/sections/introduction-en.html +++ b/doc/bestPractices/sections/introduction-en.html @@ -53,51 +53,53 @@

Properties summary

Summary of RECOMMENDED properties for vocabularies Summary of OPTIONAL properties for vocabularies Summary of RECOMMENDED properties for classes and properties Summary of OPTIONAL properties for classes and properties diff --git a/doc/configuration/config.properties b/doc/configuration/config.properties index 07acd41..a152abc 100644 --- a/doc/configuration/config.properties +++ b/doc/configuration/config.properties @@ -15,8 +15,8 @@ contributorsInstitutionURI=https://isi.edu/;https://isi.edu/ description="A description of what the ontology does goes here" diagram="https://example.org/diagram.svg" DOI= -funder= -fundingGrant= +funders= +fundingGrants= incompatibleWith= issued= images=image1.png;image2.png @@ -45,4 +45,4 @@ extendedOntologyNames=test1; test2 extendedOntologyURIs=http://example.org/test1; http://example.org/test2 RDFXMLSerialization=ontology.xml TurtleSerialization=ontology.ttl -N3Serialization=ontology.nt +NTSerialization=ontology.nt diff --git a/doc/configuration/configuration_doc.md b/doc/configuration/configuration_doc.md index 1234ae9..86fb03d 100644 --- a/doc/configuration/configuration_doc.md +++ b/doc/configuration/configuration_doc.md @@ -21,21 +21,26 @@ contributorsInstitutionURI=https://isi.edu/;https://isi.edu/ description="A description of what the ontology does goes here" diagram="https://example.org/diagram.svg" DOI= -incompatibleWith="" -issued="" +funder= +fundingGrant= +incompatibleWith= +issued= +images=image1.png;image2.png licenseURI=http://creativecommons.org/licenses/by/2.0/ licenseName=CC-BY licenseIconURL=https://i.creativecommons.org/l/by/2.0/88x31.png logo="https://example.org/logo.svg" -ontologyName=The Cohort Ontology +ontologyName=Example ontologyPrefix=exo modified="15 April, 2023" ontologyNamespaceURI=https://w3id.org/example previousVersionURI=https://w3id.org/example/1.0.0 -publisher= -publisherURI= -publisherInstitution= -publisherInstitutionURI= +publisher=Ontology Engineering Group +publisherURI=https://oeg-upm.es +publisherInstitution=UPM +publisherInstitutionURI=https://www.upm.es +source=http://source1;http://source2 +seeAlso=http://firstResource ontologyTitle=The Example Ontology thisVersionURI=https://w3id.org/example/1.0.1 ontologyRevisionNumber=v1.0.0 @@ -50,7 +55,7 @@ extendedOntologyNames=test1; test2 extendedOntologyURIs=http://example.org/test1; http://example.org/test2 RDFXMLSerialization=URL of the file with RDF-XML serialization. E.g., http://my-onto/onto.owl TurtleSerialization=URL of the file with Turtle serialization. E.g., http://my-onto/onto..ttl; -N3Serialization=URL of the file with N3 serialization. E.g., http://my-onto/onto.n3 +NTSerialization=URL of the file with N3 serialization. E.g., http://my-onto/onto.n3 JSONLDSerialization=URL of the file with JSON-LD serialization. E.g., http://my-onto/onto.jsonld GoogleAnalyticsCode=UA-TestCodeGoesHere contextURI=JSON-LD context URI. diff --git a/doc/metadataGuide/guide.md b/doc/metadataGuide/guide.md index 957b115..e3a2099 100644 --- a/doc/metadataGuide/guide.md +++ b/doc/metadataGuide/guide.md @@ -30,6 +30,7 @@ In this document we illustrate how Widoco uses metadata in the final documentati |vann |[http://purl.org/vocab/vann/](http://purl.org/vocab/vann/) | |vcard |[http://www.w3.org/2006/vcard/ns#](http://www.w3.org/2006/vcard/ns#) | |wdrs |[http://www.w3.org/2007/05/powder-s#](http://www.w3.org/2007/05/powder-s#) | +|widoco |[https://w3id.org/widoco/vocab#](https://w3id.org/widoco/vocab#) | ## Metadata usage in WIDOCO @@ -51,6 +52,8 @@ The table below shows which ontology metadata annotations are recognized in WIDO |Diagram |[foaf:image], [foaf:depiction], [schema:image]|diagram |[Sec 3.8.2] **[OPTIONAL]**|[Text]|[ontology](#onto), [config]| |DOI |[bibo:doi] |DOI |[Sec 3.6.1] **[OPTIONAL]**|[Text]|[ontology](#onto), [config]| |Extended ontologies| [voaf:extends] |extendedOntologyNames, extendedOntologyURIs | [Sec 3.4.6] **[OPTIONAL]**|[URI]|[ontology](#onto), [config]| +|Funders (org, person) |[foaf:fundedBy] [schema:funder] |funders |[Sec 3.5.4] **[OPTIONAL]**|[Text] or [URI]|[ontology](#onto), [config]| +|Funding grants |[schema:funding] |fundingGrant |[Sec 3.5.5] **[OPTIONAL]**|[Text] or [URI]|[ontology](#onto), [config]| |Incompatible with|[owl:incompatibleWith] |incompatibleWith|[Sec 3.3.4] **[OPTIONAL]**|[URI] |[ontology](#onto), [config]| |Imported ontologies|[owl:imports] |importedOntologyNames, importedOntologyURIs|**[RECOMMENDED]** (good practice in ontology engineering) | [URI] | [ontology](#onto), [config]| |Issued date |[dct:issued], [schema:dateIssued]|issued |[Sec 3.4.4] **[OPTIONAL]**|[Text]|[ontology](#onto), [config]| @@ -63,7 +66,7 @@ The table below shows which ontology metadata annotations are recognized in WIDO |Previous version|[dce:replaces], [dct:replaces], [prov:wasRevisionOf], [pav:previousVersion], [owl:priorVersion]|previousVersionURI|[Sec 3.4.1] **[RECOMMENDED]**|[URI]|[ontology](#onto), [config]| |Publisher|[dct:publisher], [dce:publisher], [schema:publisher]|publisher, publisherURI, publisherInstitution, publisherInstitutionURI|[Sec 3.5.3] **[OPTIONAL]**|[Text] or [Organization] or [BNode]|[ontology](#onto), [config]| |Similar resources|[rdfs:seeAlso] | |[Sec 3.9] **[OPTIONAL]** |[Text] |[ontology](#onto), [config]| -|Status |[bibo:status] [mod:status] |status|[Sec 3.2.4] **[OPTIONAL]**|[Text] or [Status](#status)|[ontology](#onto), [config]| +|Status |[bibo:status] [mod:status] [schema:creativeWorkStatus] |status|[Sec 3.2.4] **[OPTIONAL]**|[Text] or [Status](#status)|[ontology](#onto), [config]| |Source|[dce:source], [dct:source], [prov:hadPrimarySource], [wdrs:describedBy]|source|[Sec 3.4.5] **[OPTIONAL]** |[URI] |[ontology](#onto), [config]| |Title |[dce:title], [dct:title], [schema:name] |ontologyTitle |[Sec 3.2.2] **[RECOMMENDED]**|[Text]|[ontology](#onto), [config]| |Version IRI |[owl:versionIRI] |thisVersionURI |[Sec 3.3.1] **[RECOMMENDED]**|[URI] |[ontology](#onto), [config]| @@ -73,6 +76,17 @@ The table below shows which ontology metadata annotations are recognized in WIDO **\*\*** Configuration properties do not support [URI](#uri)s or blank nodes. Hence, additional properties are needed (like authorsURI, contributorsURI) to annotate URIs in case they are needed. +### Custom annotations +We prioritize reusing metadata properties defined already. However, a small subset of `OPTIONAL` annotation properties (i.e., `introduction` and the URL to the different serializations) have been introduced by WIDOCO to customize parts of the documentation from the ontology itself: + +|Metadata category|Ontology annotation property*|`config.properties` field(s)**|Good practices document|Accepted property value|Example| +|-----------------|-----------------------------|------------------------------|-----------------------|-----------------------|-------| +|Introduction |[widoco:introduction] |introduction |N/A **[OPTIONAL]** |[Text]|[ontology](#onto), [config]| +|N-Triples serialization |[widoco:ntSerialization] |NTSerialization |N/A **[OPTIONAL]** |[URL] |[ontology](#onto), [config]| +|JSON-LD serialization |[widoco:jsonldSerialization] |JSONLDSerialization |N/A **[OPTIONAL]** |[URL] |[ontology](#onto), [config]| +|RDF-XML serialization |[widoco:rdfxmlSerialization] |RDFXMLSerialization |N/A **[OPTIONAL]** |[URL] |[ontology](#onto), [config]| +|Turtle serialization |[widoco:turtleSerialization] |TurtleSerialization |N/A **[OPTIONAL]** |[URL] |[ontology](#onto), [config]| + ### Term (classes, properties and data properties) annotations The table below summarizes all the metadata annotations recognized for ontology terms, in alphabetical order. Note that there are no `config.properties` annotations here, as these annotations are only read from the ontology file. @@ -103,7 +117,8 @@ The following `Turtle` code block shows sample annotations for each of the metad @prefix schema: . @prefix voaf: . @prefix vann: . -@prefix bibo: +@prefix widoco: . +@prefix bibo: . rdf:type owl:Ontology ; owl:versionIRI ; @@ -123,7 +138,12 @@ The following `Turtle` code block shows sample annotations for each of the metad voaf:extends ; owl:imports ; bibo:status ; + foaf:fundedBy ; + schema:funding ; + widoco:introduction "A paragraph with the introduction section of the documentation about your resource"@en ; + widoco:rdfxmlSerialization "https://example.org/serialization/ontology.xml"^^xsd:anyURI ; owl:versionInfo "1.0.1" . + #If content negotiation is enabled, the widoco:rdfxmlSerialization annotation may not be needed. ``` ### Annotating the ontology using entities: @@ -203,15 +223,18 @@ contributors=First contributor;Second contributor contributorsURI=http://example.org/contributor1;http://example.org/contributor2 contributorsInstitution=First contributor institution;Second contributor institution contributorsInstitutionURI=https://isi.edu/;https://isi.edu/ -description="A description of what the ontology does goes here" +description=A description of what the ontology does goes here diagram="https://example.org/diagram.svg" extendedOntologyNames=test1; test2 extendedOntologyURIs=http://example.org/test1; http://example.org/test2 DOI=https://dx.doi.org/SOME/DOI +funder=https://example.org/institution +funding=https://example.org/fundingGrant incompatibleWith=https://w3id.org/example/0.0.1 importedOntologyNames=Imported Ontology 1; Imported Ontology 2 importedOntologyURIs=http://example.org/test11; http://example.org/test22 -issued="" +introduction=A brief text for the introduction section may be written here. +issued= licenseURI=http://creativecommons.org/licenses/by/2.0/ licenseName=CC-BY licenseIconURL=https://i.creativecommons.org/l/by/2.0/88x31.png @@ -229,6 +252,10 @@ ontologyTitle=The Example Ontology thisVersionURI=https://w3id.org/example/1.0.1 ontologyRevisionNumber=v1.0.0 status=Ontology Specification Draft +RDFXMLSerialization=ontology.xml +TurtleSerialization=ontology.ttl +NTSerialization=ontology.nt +JSONLDSerialization=ontology.nt ``` ## Glossary (Back to table) @@ -274,6 +301,8 @@ status=Ontology Specification Draft [Sec 3.5.1]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#creators [Sec 3.5.2]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#contributors [Sec 3.5.3]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#publisher +[Sec 3.5.4]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#funder +[Sec 3.5.5]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#funding [Sec 3.6.1]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#doi [Sec 3.6.2]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#biblio [Sec 3.7]: https://dgarijo.github.io/Widoco/doc/bestPractices/index-en.html#lic @@ -324,6 +353,7 @@ status=Ontology Specification Draft [doap:translator]: http://usefulinc.com/ns/doap#translator [foaf:depiction]: http://xmlns.com/foaf/0.1/depiction [foaf:family_name]: http://xmlns.com/foaf/0.1/family_name +[foaf:fundedBy]: http://xmlns.com/foaf/0.1/fundedBy [foaf:givenname]: http://xmlns.com/foaf/0.1/givenname [foaf:homepage]: http://xmlns.com/foaf/0.1/homepage [foaf:image]: http://xmlns.com/foaf/0.1/image @@ -362,6 +392,7 @@ status=Ontology Specification Draft [schema:citation]: https://schema.org/citation [schema:contributor]: https://schema.org/contributor [schema:creator]: https://schema.org/creator +[schema:creativeWorkStatus]: https://schema.org/creativeWorkStatus [schema:dateCreated]: https://schema.org/dateCreated [schema:dateIssued]: https://schema.org/dateIssued [schema:dateModified]: https://schema.org/dateModified @@ -377,6 +408,8 @@ status=Ontology Specification Draft [schema:publisher]: https://schema.org/publisher [schema:schemaVersion]: https://schema.org/schemaVersion [schema:url]: https://schema.org/url +[schema:funder]: https://schema.org/funder +[schema:funding]: https://schema.org/funding [skos:definition]: http://www.w3.org/2004/02/skos/core#definition [skos:editorialNote]: http://www.w3.org/2004/02/skos/core#editorialNote [skos:example]: http://www.w3.org/2004/02/skos/core#example @@ -394,3 +427,8 @@ status=Ontology Specification Draft [vcard:hasURL]: http://www.w3.org/2006/vcard/ns#hasURL [voaf:extends]: http://purl.org/vocommons/voaf#extends [wdrs:describedBy]: http://www.w3.org/2007/05/powder-s#describedBy +[widoco:introduction]: https://w3id.org/widoco/vocab#introduction +[widoco:rdfxmlSerialization]: https://w3id.org/widoco/vocab#rdfxmlSerialization +[widoco:turtleSerialization]: https://w3id.org/widoco/vocab#turtleSerialization +[widoco:ntSerialization]: https://w3id.org/widoco/vocab#ntSerialization +[widoco:jsonldSerialization]: https://w3id.org/widoco/vocab#jsonldSerialization diff --git a/src/main/java/widoco/Configuration.java b/src/main/java/widoco/Configuration.java index 044a43a..a11982b 100644 --- a/src/main/java/widoco/Configuration.java +++ b/src/main/java/widoco/Configuration.java @@ -120,6 +120,7 @@ public class Configuration { private String rewriteBase;// rewrite base path for content negotiation (.htaccess) private boolean includeAllSectionsInOneDocument; //boolean to indicate all sections should be included in a single big HTML private HashMap namespaceDeclarations; //Namespace declarations to be included in the documentation. + private String introText;// in case there is an explicit annotation in the ontology /** * Variable to keep track of possible errors in the changelog. If there are @@ -181,6 +182,7 @@ public final void initializeConfig() { rewriteBase = "/"; contextURI = ""; includeAllSectionsInOneDocument = false; + introText = ""; initializeOntology(); } @@ -223,6 +225,8 @@ private void initializeOntology() { mainOntologyMetadata.setImages(new ArrayList<>()); mainOntologyMetadata.setSources(new ArrayList<>()); mainOntologyMetadata.setSeeAlso(new ArrayList<>()); + mainOntologyMetadata.setFunders(new ArrayList<>()); + mainOntologyMetadata.setFundingGrants(new ArrayList<>()); this.namespaceDeclarations = new HashMap<>(); } @@ -385,6 +389,20 @@ private void loadPropertyFile(String path) throws IOException { if (!"".equals(seeAlso)){ mainOntologyMetadata.setSeeAlso(new ArrayList(Arrays.asList(seeAlso.split(";")))); } + String funders = propertyFile.getProperty(Constants.FUNDERS, ""); + if (!"".equals(funders)){ + String [] fundersURI = funders.split(";"); + for (String s : fundersURI) { + Agent a = new Agent(); + a.setName(s); + a.setURL(s); + mainOntologyMetadata.getFunders().add(a); + } + } + String funding = propertyFile.getProperty(Constants.FUNDING, ""); + if (!"".equals(funding)){ + mainOntologyMetadata.setFundingGrants(new ArrayList(Arrays.asList(funding.split(";")))); + } } catch (IOException ex) { // Only a warning, as we can continue safely without a property file. @@ -620,6 +638,9 @@ private void completeOntologyMetadata(OWLAnnotation a, OWLOntology o) { case Constants.PROP_DCTERMS_PUBLISHER: case Constants.PROP_SCHEMA_PUBLISHER_HTTP: case Constants.PROP_SCHEMA_PUBLISHER_HTTPS: + case Constants.PROP_SCHEMA_FUNDER_HTTP: + case Constants.PROP_SCHEMA_FUNDER_HTTPS: + case Constants.PROP_FOAF_FUNDED_BY: try { Agent ag = new Agent(); if (a.getValue().isLiteral()) { @@ -661,6 +682,13 @@ private void completeOntologyMetadata(OWLAnnotation a, OWLOntology o) { case Constants.PROP_SCHEMA_CREATOR_HTTPS: mainOntologyMetadata.getCreators().add(ag); break; + case Constants.PROP_SCHEMA_FUNDER_HTTP: + case Constants.PROP_SCHEMA_FUNDER_HTTPS: + case Constants.PROP_FOAF_FUNDED_BY: + if(ag.getURL() == null || ag.getURL().isEmpty()) + ag.setURL(ag.getName()); + mainOntologyMetadata.getFunders().add(ag); + break; default: mainOntologyMetadata.setPublisher(ag); break; @@ -702,6 +730,8 @@ private void completeOntologyMetadata(OWLAnnotation a, OWLOntology o) { break; case Constants.PROP_BIBO_STATUS: case Constants.PROP_MOD_STATUS: + case Constants.PROP_SCHEMA_STATUS_HTTP: + case Constants.PROP_SCHEMA_STATUS_HTTPS: value = "Specification Draft"; try { //if an object property is used, all valid status have the form http://purl.org/ontology/bibo/status/ @@ -750,10 +780,27 @@ private void completeOntologyMetadata(OWLAnnotation a, OWLOntology o) { value = WidocoUtils.getValueAsLiteralOrURI(a.getValue()); mainOntologyMetadata.getSources().add(value); break; + case Constants.PROP_SCHEMA_FUNDING_HTTP: + case Constants.PROP_SCHEMA_FUNDING_HTTPS: + value = WidocoUtils.getValueAsLiteralOrURI(a.getValue()); + mainOntologyMetadata.getFundingGrants().add(value); + break; case Constants.PROP_RDFS_SEE_ALSO: value = WidocoUtils.getValueAsLiteralOrURI(a.getValue()); mainOntologyMetadata.getSeeAlso().add(value); break; + case Constants.PROP_WIDOCO_INTRODUCTION: + try { + valueLanguage = a.getValue().asLiteral().get().getLang(); + value = a.getValue().asLiteral().get().getLiteral(); + if (this.currentLanguage.equals(valueLanguage) + || (introText == null || "".equals(introText))) { + introText = value; + } + } catch (Exception e) { + logger.error("Error while introduction annotation. No literal provided"); + } + break; } } @@ -1335,6 +1382,11 @@ public void setIncludeAllSectionsInOneDocument(boolean includeAllSectionsInOneDo this.includeAllSectionsInOneDocument = includeAllSectionsInOneDocument; } - - + public String getIntroText() { + return introText; + } + + public void setIntroText(String introText) { + this.introText = introText; + } } diff --git a/src/main/java/widoco/Constants.java b/src/main/java/widoco/Constants.java index 95a6042..37d4503 100644 --- a/src/main/java/widoco/Constants.java +++ b/src/main/java/widoco/Constants.java @@ -18,11 +18,7 @@ import diff.CompareOntologies; import diff.OntologyDifferencesRenderer; import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Properties; +import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,6 +73,7 @@ public class Constants { public static final String NS_MOD = "https://w3id.org/mod#"; public static final String NS_VOAF = "http://purl.org/vocommons/voaf#"; public static final String NS_WDRS = "http://www.w3.org/2007/05/powder-s#"; + public static final String NS_WIDOCO = "https://w3id.org/widoco/vocab#"; public static final String PROP_RDFS_LABEL = NS_RDFS + "label"; public static final String PROP_RDFS_COMMENT = NS_RDFS + "comment"; @@ -103,6 +100,10 @@ public class Constants { public static final String PROP_SCHEMA_DATE_MODIFIED_HTTPS = NS_SCHEMA_HTTPS + "dateModified"; public static final String PROP_SCHEMA_PUBLISHER_HTTP = NS_SCHEMA_HTTP + "publisher"; public static final String PROP_SCHEMA_PUBLISHER_HTTPS = NS_SCHEMA_HTTPS + "publisher"; + public static final String PROP_SCHEMA_FUNDER_HTTP = NS_SCHEMA_HTTP + "funder"; + public static final String PROP_SCHEMA_FUNDER_HTTPS = NS_SCHEMA_HTTPS + "funder"; + public static final String PROP_SCHEMA_FUNDING_HTTP = NS_SCHEMA_HTTP + "funding"; + public static final String PROP_SCHEMA_FUNDING_HTTPS = NS_SCHEMA_HTTPS + "funding"; public static final String PROP_SCHEMA_SCHEMA_VERSION_HTTP = NS_SCHEMA_HTTP + "schemaVersion"; public static final String PROP_SCHEMA_SCHEMA_VERSION_HTTPS = NS_SCHEMA_HTTPS + "schemaVersion"; public static final String PROP_SCHEMA_GIVEN_NAME_HTTP = NS_SCHEMA_HTTP + "givenName"; @@ -121,6 +122,8 @@ public class Constants { public static final String PROP_SCHEMA_DATE_ISSUED_HTTPS = NS_SCHEMA_HTTPS + "dateIssued"; public static final String PROP_SCHEMA_LOGO_HTTP = NS_SCHEMA_HTTP + "logo"; public static final String PROP_SCHEMA_LOGO_HTTPS = NS_SCHEMA_HTTPS + "logo"; + public static final String PROP_SCHEMA_STATUS_HTTP = NS_SCHEMA_HTTP + "creativeWorkStatus"; + public static final String PROP_SCHEMA_STATUS_HTTPS = NS_SCHEMA_HTTPS + "creativeWorkStatus"; public static final String PROP_OWL_VERSION_INFO = NS_OWL + "versionInfo"; public static final String PROP_OWL_PRIOR_VERSION = NS_OWL + "priorVersion"; @@ -197,12 +200,18 @@ public class Constants { public static final String PROP_FOAF_LOGO = NS_FOAF + "logo"; public static final String PROP_FOAF_IMAGE = NS_FOAF + "img"; public static final String PROP_FOAF_DEPICTION = NS_FOAF + "depiction"; + public static final String PROP_FOAF_FUNDED_BY = NS_FOAF + "fundedBy"; + public static final String PROP_ORG_MEMBER_OF = NS_ORG + "memberOf"; public static final String PROP_MOD_ACRONYM = NS_MOD + "acronym"; public static final String PROP_MOD_STATUS = NS_MOD + "status"; public static final String PROP_VOAF_EXTENDS = NS_VOAF + "extends"; - public static final String PROP_WDRS_IS_DESCRIBED_BY = NS_WDRS + "describedBy"; + public static final String PROP_WIDOCO_INTRODUCTION = NS_WIDOCO + "introduction"; + public static final String PROP_WIDOCO_RDF_XML= NS_WIDOCO + "rdfxmlSerialization"; + public static final String PROP_WIDOCO_NT= NS_WIDOCO + "nTSerialization"; + public static final String PROP_WIDOCO_TURTLE = NS_WIDOCO + "turtleSerialization"; + public static final String PROP_WIDOCO_JSON_LD = NS_WIDOCO + "jsonldSerialization"; @@ -255,6 +264,8 @@ public class Constants { public static final String PUBLISHER_INSTITUTION_URI = "publisherInstitutionURI"; public static final String SEE_ALSO = "seeAlso"; public static final String SOURCE = "source"; + public static final String FUNDERS = "funders"; + public static final String FUNDING = "fundingGrants"; public static final String SERIALIZATION_N3 = "N3Serialization"; public static final String SERIALIZATION_JSON = "JSONLDSerialization"; public static final String SERIALIZATION_RDF = "RDFXMLSerialization"; @@ -271,6 +282,7 @@ public class Constants { // This way, if refactoring is needed we only have to change it here. public static final String LANG_ABSTRACT = "abstract"; public static final String LANG_ABSTRACT_PLACEHOLDER = "abstractPlaceHolder"; + public static final String LANG_INTRO_TITLE = "introTitle"; public static final String LANG_INTRO_PLACEHOLDER = "introPlaceHolder"; public static final String LANG_REFERENCES_PLACEHOLDER = "referencesPlaceHolder"; public static final String LANG_AUTHORS = AUTHORS; @@ -424,7 +436,15 @@ public static String getStatus(Configuration c) { } public static String getIntroductionSectionTitleAndPlaceHolder(Configuration c, Properties lang) { - String s = "

" + lang.getProperty(LANG_INTRO_PLACEHOLDER); + String s = "

"; + //check if the content of the intro was found in a metadata property + if (c.getIntroText() == null || c.getIntroText().isEmpty()){ + s+= lang.getProperty(LANG_INTRO_PLACEHOLDER); + }else{ + s+= lang.getProperty(LANG_INTRO_TITLE); + s+= ""+ c.getIntroText() + "\n"; + } + return s; } @@ -509,6 +529,12 @@ private static String getContributors(ArrayList contrib, Properties l) { return c + "\n"; } + private static String getFunders(ArrayList contrib, Properties l) { + String c = "
" + l.getProperty(LANG_FUNDER) + "
\n"; + c += getAgents(contrib); + return c + "\n"; + } + private static String getPublisher(Agent publisher, Properties l) { if ((publisher.getName() != null && !"".equals(publisher.getName())) || (publisher.getURL() != null && !"".equals(publisher.getURL()))) { @@ -579,31 +605,15 @@ public static String stripTrailingNamespaceChars(String namespace) { public static String getNameSpaceDeclaration(HashMap namesp, Configuration c, Properties lang) { String ns = "
\n" + "

" + lang.getProperty(LANG_NS) + lang.getProperty(LANG_NS_TEXT); - Iterator keys = namesp.keySet().iterator(); String nsPrefix = c.getMainOntology().getNamespacePrefix(); String nsURI = c.getMainOntology().getNamespaceURI(); - ns += "" + nsPrefix + "<" + nsURI + ">\n"; - - // Leave a gap after the main ontology namespace, just so it stands out more (since it's the - // most important namespace). - // No need for us to check 'if there are any more prefixes', as the code currently always - // includes more anyway (whether they're actually referenced in the ontology or not (e.g., - // 'rdf', 'xsd', etc.)). I don't think the code should be doing this, but that's a tidy-up - // for another day! - ns += "\n"; - - // Strip off any trailing namespace characters from our main ontology namespace URI so that - // we are comparing like-for-like when removing duplicates. - final String nsURIStripped = stripTrailingNamespaceChars(nsURI); - - while (keys.hasNext()) { - String key = keys.next(); - - // Only add the namespace if it's not equal to the main ontology one (already added). - String currValue = stripTrailingNamespaceChars(namesp.get(key)); - if (!currValue.equals(nsURIStripped)) { - ns += "" + key + "<" + currValue + ">\n"; - } + //order all ns alphabetically + if (!namesp.containsKey(nsPrefix)){ + namesp.put(nsPrefix,stripTrailingNamespaceChars(nsURI)); + } + TreeMap sortedMap = new TreeMap<>(namesp); + for (Map.Entry entry : sortedMap.entrySet()) { + ns += "" + entry.getKey() + "<" + entry.getValue() + ">\n"; } ns += "\n" + "\n" + "

\n" + "\n"; @@ -760,19 +770,44 @@ public static String getIndexDocument(String resourcesFolderName, Configuration + " };" + " $(function(){\n"; // the script for loading the table is called after loading everything else, // after the loadHash function - if (c.isIncludeAbstract()) - document += " $(\"#abstract\").load(\"sections/abstract-" + c.getCurrentLanguage() + ".html\"); \n"; - if (c.isIncludeIntroduction()) - document += " $(\"#introduction\").load(\"sections/introduction-" + c.getCurrentLanguage() - + ".html\"); \n"; - if (c.isIncludeOverview()) - document += " $(\"#overview\").load(\"sections/overview-" + c.getCurrentLanguage() + ".html\"); \n"; - if (c.isIncludeDescription()) - document += " $(\"#description\").load(\"sections/description-" + c.getCurrentLanguage() - + ".html\"); \n"; - if (c.isIncludeReferences()) - document += " $(\"#references\").load(\"sections/references-" + c.getCurrentLanguage() - + ".html\"); \n"; + if (c.isIncludeAbstract()) { + if(c.getAbstractPath()!=null && !c.getAbstractPath().isEmpty()){ + document += " $(\"#abstract\").load(\""+c.getAbstractPath()+"\"); \n"; + }else { + document += " $(\"#abstract\").load(\"sections/abstract-" + c.getCurrentLanguage() + ".html\"); \n"; + } + } + if (c.isIncludeIntroduction()){ + if(c.getIntroductionPath()!=null && !c.getIntroductionPath().isEmpty()){ + document += " $(\"#introduction\").load(\""+c.getIntroductionPath()+"\"); \n"; + }else { + document += " $(\"#introduction\").load(\"sections/introduction-" + c.getCurrentLanguage() + + ".html\"); \n"; + } + } + if (c.isIncludeOverview()){ + if(c.getOverviewPath()!=null && !c.getOverviewPath().isEmpty()){ + document += " $(\"#overview\").load(\""+c.getOverviewPath()+"\"); \n"; + }else { + document += " $(\"#overview\").load(\"sections/overview-" + c.getCurrentLanguage() + ".html\"); \n"; + } + } + if (c.isIncludeDescription()){ + if(c.getDescriptionPath()!=null && !c.getDescriptionPath().isEmpty()){ + document += " $(\"#description\").load(\""+c.getDescriptionPath()+"\"); \n"; + }else { + document += " $(\"#description\").load(\"sections/description-" + c.getCurrentLanguage() + + ".html\"); \n"; + } + } + if (c.isIncludeReferences()){ + if(c.getReferencesPath()!=null && !c.getReferencesPath().isEmpty()){ + document += " $(\"#references\").load(\""+c.getReferencesPath()+"\"); \n"; + }else { + document += " $(\"#references\").load(\"sections/references-" + c.getCurrentLanguage() + + ".html\"); \n"; + } + } if (c.isIncludeChangeLog()) { if (c.getMainOntology().getPreviousVersion() != null && !"".equals(c.getMainOntology().getPreviousVersion()) && c.isChangeLogSuccessfullyCreated()) { @@ -962,6 +997,10 @@ public static String getHeadSection(Configuration c, Properties l) { head += getURLs(c.getMainOntology().getSources(), l.getProperty(Constants.LANG_SOURCES)) + "\n"; if (!c.getMainOntology().getSeeAlso().isEmpty()) head += getURLs(c.getMainOntology().getSeeAlso(), l.getProperty(Constants.LANG_SEE_ALSO)) + "\n"; + if (!c.getMainOntology().getFunders().isEmpty()) + head += getFunders(c.getMainOntology().getFunders(), l) + "\n"; + if (!c.getMainOntology().getFundingGrants().isEmpty()) + head += getURLs(c.getMainOntology().getFundingGrants(), l.getProperty(Constants.LANG_FUNDING)) + "\n"; if (c.isDisplaySerializations()) { HashMap availableSerializations = c.getMainOntology().getSerializations(); diff --git a/src/main/java/widoco/CreateResources.java b/src/main/java/widoco/CreateResources.java index 04d2716..b7fa10a 100644 --- a/src/main/java/widoco/CreateResources.java +++ b/src/main/java/widoco/CreateResources.java @@ -386,19 +386,22 @@ public static void saveDocument(String path, String textToWrite, Configuration c Writer out = null; try { if (f.exists()) { - // JOptionPane.showMessageDialog(null, "You have overwritten the previous file. - // This message should be better prepared."); - if (!c.getOverWriteAll()) { - String[] options = new String[] { "Rewrite all", "Yes", "No" }; - int response = JOptionPane.showOptionDialog(null, - "The file " + f.getName() + " already exists. Do you want to overwrite it?", - "Existing File!", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, - options, options[0]); - // 0 -> yes to all. 1 -> Yes. 2-> No - if (response == 0) - c.setOverwriteAll(true); - if (response == 2) - return; // else we continue rewriting the file. + try { + if (!c.getOverWriteAll()) { + String[] options = new String[]{"Rewrite all", "Yes", "No"}; + int response = JOptionPane.showOptionDialog(null, + "The file " + f.getName() + " already exists. Do you want to overwrite it?", + "Existing File!", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, + options, options[0]); + // 0 -> yes to all. 1 -> Yes. 2-> No + if (response == 0) + c.setOverwriteAll(true); + if (response == 2) + return; // else we continue rewriting the file. + } + }catch (Exception e){ + logger.error("It looks like WIDOCO tried to save the documentation, but files already exist. Please " + + "try using the -rewriteAll option."); } } else { f.createNewFile(); @@ -634,7 +637,7 @@ public static void saveConfigFile(String path, Configuration conf) throws IOExce if (serializations.containsKey("JSON-LD")) { textProperties += Constants.SERIALIZATION_JSON + "=" + serializations.get("JSON-LD") + "\n"; } - String images = "", sources = "", seeAlso = ""; + String images = "", sources = "", seeAlso = "", funding = "", funder = ""; ArrayList imgs = conf.getMainOntology().getImages(); if (!imgs.isEmpty()){ for (int i = 0; i < imgs.size() - 1; i++) { @@ -659,6 +662,22 @@ public static void saveConfigFile(String path, Configuration conf) throws IOExce seeAlso += see.get(see.size() - 1) ; } textProperties += Constants.SEE_ALSO + "=" + seeAlso + "\n"; + ArrayList fund = conf.getMainOntology().getFundingGrants(); + if (!fund.isEmpty()){ + for (int i = 0; i < fund.size() - 1; i++) { + funding += fund.get(i) + ";"; + } + funding += fund.get(fund.size() - 1) ; + } + textProperties += Constants.FUNDING + "=" + funding + "\n"; + ArrayList funders = conf.getMainOntology().getFunders(); + if (!funders.isEmpty()){ + for (int i = 0; i < funders.size() - 1; i++) { + funding += funders.get(i).getName() + ";"; + } + funding += funders.get(fund.size() - 1).getName() ; //name is a URL in this case + } + textProperties += Constants.FUNDERS + "=" + funders + "\n"; // copy the result into the file Writer writer = null; try { diff --git a/src/main/java/widoco/gui/BiggerTextArea.java b/src/main/java/widoco/gui/BiggerTextArea.java index bb42429..f2eb351 100644 --- a/src/main/java/widoco/gui/BiggerTextArea.java +++ b/src/main/java/widoco/gui/BiggerTextArea.java @@ -8,7 +8,7 @@ * @author dgarijo */ public class BiggerTextArea extends javax.swing.JFrame { - public enum PropertyType{abs, description, citeAs}; + public enum PropertyType{abs, description, introduction, citeAs}; private final GuiStep2 step2Gui; private final Configuration c; @@ -45,6 +45,9 @@ public BiggerTextArea(GuiStep2 g, Configuration c, PropertyType type) { case description: this.setTitle("Complete description"); textArea.setText(c.getMainOntology().getDescription()); break; + case introduction: this.setTitle("Complete introduction"); + textArea.setText(c.getIntroText()); + break; case citeAs: this.setTitle("Complete citation"); textArea.setText(c.getMainOntology().getCiteAs()); break; @@ -134,6 +137,8 @@ private void buttonOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRS break; case description:this.c.getMainOntology().setDescription(textArea.getText()); break; + case introduction:this.c.setIntroText(textArea.getText()); + break; case citeAs:this.c.getMainOntology().setCiteAs(textArea.getText()); break; } diff --git a/src/main/java/widoco/gui/EditProperty.java b/src/main/java/widoco/gui/EditProperty.java index 2eaddcf..9e30ac1 100644 --- a/src/main/java/widoco/gui/EditProperty.java +++ b/src/main/java/widoco/gui/EditProperty.java @@ -2,7 +2,6 @@ import java.awt.Dimension; import java.util.ArrayList; -import java.util.Iterator; import javax.swing.JOptionPane; import javax.swing.table.DefaultTableModel; import widoco.Configuration; @@ -16,7 +15,8 @@ */ public class EditProperty extends javax.swing.JFrame { - public enum PropertyType{authors, contributors, publisher, extended, imported, license, image, source, seeAlso}; + public enum PropertyType{authors, contributors, funders, publisher, extended, imported, license, image, source, + seeAlso, funding}; private final GuiStep2 step2Gui; private final Configuration c; private final PropertyType type; @@ -56,6 +56,13 @@ public EditProperty(GuiStep2 g, Configuration c, PropertyType p) { createTable(new String[]{"Name","URI","email","Institution Name", "Institution URI"}); loadAgents(c.getMainOntology().getContributors()); break; + case funders: + this.setTitle("Editing Funders"); + this.addRowButton.setText("Add funder..."); + this.deleteRowButton.setText("Delete funder..."); + createTable(new String[]{"Name","URI","email","Institution Name", "Institution URI"}); + loadAgents(c.getMainOntology().getFunders()); + break; case publisher: this.setTitle("Editing Publisher"); createTable(new String[]{"Name","URI","email","Institution Name","Institution URI"}); @@ -100,6 +107,13 @@ public EditProperty(GuiStep2 g, Configuration c, PropertyType p) { createTable(new String[]{"Resource URL"}); loadResources(c.getMainOntology().getSeeAlso()); break; + case funding: + this.setTitle("Editing funding grants"); + this.addRowButton.setText("Add grant..."); + this.deleteRowButton.setText("Delete grant..."); + createTable(new String[]{"Grant URL"}); + loadResources(c.getMainOntology().getFundingGrants()); + break; case source: this.setTitle("Editing Sources"); this.addRowButton.setText("Add source..."); diff --git a/src/main/java/widoco/gui/GuiStep1.java b/src/main/java/widoco/gui/GuiStep1.java index 0a2bac5..b651712 100644 --- a/src/main/java/widoco/gui/GuiStep1.java +++ b/src/main/java/widoco/gui/GuiStep1.java @@ -21,18 +21,15 @@ */ package widoco.gui; -import java.awt.Dimension; -import java.awt.Image; +import java.awt.*; import java.io.File; import java.net.URL; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JOptionPane; -import javax.swing.filechooser.FileFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,6 +42,7 @@ public class GuiStep1 extends javax.swing.JFrame { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private GuiController g;// pointer to be able to save and go to the next state. private String folderPath; + private Dimension dim; /** * Creates new form WidocoGui2 @@ -70,7 +68,7 @@ private void initializeGUI() { buttonGroup.add(option1); buttonGroup.add(option2); buttonGroup.add(option3); - Dimension dim = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + dim = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); // Determine the new location of the window int w = this.getSize().width; @@ -205,7 +203,7 @@ public void keyTyped(java.awt.event.KeyEvent evt) { } }); - textDocPath.setEditable(false); + //textDocPath.setEditable(false); textDocPath.setHorizontalAlignment(javax.swing.JTextField.TRAILING); textDocPath.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -406,14 +404,14 @@ private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN JOptionPane.showMessageDialog(this, "The selected folder does not exist! Please select a folder"); return; } - // no need to check if the file is a foder, as we ensure this with the + // no need to check if the file is a folder, as we ensure this with the // "directories_only" property this.textDocPath.setText(folderPath + File.separator + this.textDocName.getText()); } - }// GEN-LAST:event_browseButtonActionPerformed + } private void textDocPathActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_textDocPathActionPerformed - // TODO add your handling code here: + }// GEN-LAST:event_textDocPathActionPerformed private void textDocNameKeyTyped(java.awt.event.KeyEvent evt) {// GEN-FIRST:event_textDocNameKeyTyped @@ -443,29 +441,20 @@ private void option2ItemStateChanged(java.awt.event.ItemEvent evt) {// GEN-FIRST private void option1ItemStateChanged(java.awt.event.ItemEvent evt) {// GEN-FIRST:event_option1ItemStateChanged if (option1.isSelected()) { - JFileChooser chooser = new JFileChooser(new File("").getAbsolutePath()); - chooser.setName("Select OWL File"); - // no need to create an additional class, as we will use this filter only here. - chooser.setFileFilter(new FileFilter() { - @Override - public boolean accept(File f) { - if (f.isDirectory()) { - return true; - } - return f.getName().endsWith(".owl") || f.getName().endsWith(".rdf") || f.getName().endsWith(".json") - || f.getName().endsWith(".jsonld") || f.getName().endsWith(".ttl"); - } - - @Override - public String getDescription() { - return null; - } - }); - // chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - int returnVal = chooser.showOpenDialog(this); - if (returnVal == JFileChooser.APPROVE_OPTION) { - logger.info("You chose to save this file: " + chooser.getSelectedFile().getName()); - this.textFieldPath.setText(chooser.getSelectedFile().getAbsolutePath()); + FileDialog selectFileDialog = new FileDialog(this, "Select OWL File", FileDialog.LOAD); + selectFileDialog.setFilenameFilter((dir, name) -> + name.endsWith(".owl") || name.endsWith(".rdf") || name.endsWith(".json") || + name.endsWith(".jsonld") || name.endsWith(".ttl") + ); + selectFileDialog.setVisible(true); + String directory = selectFileDialog.getDirectory(); + String file = selectFileDialog.getFile(); + if (directory != null && file != null) { + File selectedFile = new File(directory, file); + logger.info("You chose to save this file: " + selectedFile.getName()); + this.textFieldPath.setText(selectedFile.getAbsolutePath()); + } else { + logger.info("Selection canceled."); } } diff --git a/src/main/java/widoco/gui/GuiStep2.java b/src/main/java/widoco/gui/GuiStep2.java index 43f4df0..b30c135 100644 --- a/src/main/java/widoco/gui/GuiStep2.java +++ b/src/main/java/widoco/gui/GuiStep2.java @@ -21,10 +21,7 @@ */ package widoco.gui; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Image; -import java.awt.Toolkit; +import java.awt.*; import java.io.File; import java.io.IOException; import java.net.URI; @@ -125,6 +122,9 @@ public void mouseClicked(java.awt.event.MouseEvent evt) { case "ontology description": form = new BiggerTextArea(gAux, conf, BiggerTextArea.PropertyType.description); break; + case "ontology introduction": + form = new BiggerTextArea(gAux, conf, BiggerTextArea.PropertyType.introduction); + break; case "cite as": form = new BiggerTextArea(gAux, conf, BiggerTextArea.PropertyType.citeAs); break; @@ -134,6 +134,9 @@ public void mouseClicked(java.awt.event.MouseEvent evt) { case "contributors": form = new EditProperty(gAux, conf, EditProperty.PropertyType.contributors); break; + case "funders": + form = new EditProperty(gAux, conf, EditProperty.PropertyType.funders); + break; case "publisher": form = new EditProperty(gAux, conf, EditProperty.PropertyType.publisher); break; @@ -155,6 +158,9 @@ public void mouseClicked(java.awt.event.MouseEvent evt) { case "sources": form = new EditProperty(gAux, conf, EditProperty.PropertyType.source); break; + case "funding": + form = new EditProperty(gAux, conf, EditProperty.PropertyType.funding); + break; } if (form != null) { gAux.saveMetadata(); @@ -194,6 +200,8 @@ private void refreshTable() { StringBuilder images = new StringBuilder(); StringBuilder sources = new StringBuilder(); StringBuilder seeAlso = new StringBuilder(); + StringBuilder funders = new StringBuilder(); + StringBuilder funding = new StringBuilder(); for (Agent a : conf.getMainOntology().getCreators()) { if (a.getName() == null || a.getName().equals("")) { authors.append("creator; "); @@ -208,6 +216,13 @@ private void refreshTable() { contributors.append(a.getName()).append("; "); } } + for (Agent a : conf.getMainOntology().getFunders()) { + if (a.getName() == null || a.getName().equals("")) { + funders.append("funding; "); + } else { + funders.append(a.getName()).append("; "); + } + } for (Ontology a : conf.getMainOntology().getImportedOntologies()) { if (a.getName() == null || a.getName().equals("")) { imported.append("importedOnto; "); @@ -245,11 +260,17 @@ private void refreshTable() { seeAlso.append(see).append(";"); } } + for (String see: conf.getMainOntology().getFundingGrants()){ + if(!see.equals("")){ + funding.append(see).append(";"); + } + } tableProperties.setModel(new javax.swing.table.DefaultTableModel(new Object[][] { { "abstract", conf.getAbstractSection() }, { "ontology title", conf.getMainOntology().getTitle() }, { "ontology name", conf.getMainOntology().getName() }, { "ontology description", conf.getMainOntology().getDescription() }, + { "ontology introduction", conf.getIntroText() }, { "ontology prefix", conf.getMainOntology().getNamespacePrefix() }, { "ontology ns URI", conf.getMainOntology().getNamespaceURI() }, { "creation date", conf.getMainOntology().getCreationDate() }, @@ -260,6 +281,7 @@ private void refreshTable() { { "ontology revision", conf.getMainOntology().getRevision() }, { "authors", authors.toString()}, { "contributors", contributors.toString()}, + { "funders", funders.toString()}, { "publisher", publisher.toString() }, { "imported ontologies", imported.toString()}, { "extended ontologies", extended.toString()}, @@ -272,6 +294,7 @@ private void refreshTable() { { "images", images.toString()}, { "logo", conf.getMainOntology().getLogo() }, { "sources", sources.toString() }, + { "funding", funding.toString() }, { "see also", seeAlso.toString() } }, new String[] { "Property", "Value" }) { @@ -286,16 +309,19 @@ public Class getColumnClass(int columnIndex) { @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (getValueAt(rowIndex, 0).equals("abstract") + || getValueAt(rowIndex, 0).equals("ontology introduction") || getValueAt(rowIndex, 0).equals("ontology description") || getValueAt(rowIndex, 0).equals("cite as") || getValueAt(rowIndex, 0).equals("authors") || getValueAt(rowIndex, 0).equals("contributors") || getValueAt(rowIndex, 0).equals("publisher") + || getValueAt(rowIndex, 0).equals("funders") || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("extended") || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("license") || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("images") || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("see also") || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("source") + || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("funding") || ((String) getValueAt(rowIndex, 0)).toLowerCase().contains("imported")) { return false; } @@ -329,6 +355,8 @@ private void saveMetadata() { break; case "ontology description": conf.getMainOntology().setDescription(value); + case "ontology introduction": + conf.setIntroText(value); case "ontology prefix": conf.getMainOntology().setNamespacePrefix(value); break; @@ -458,6 +486,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { labelSteps.setText("Steps"); tableProperties.setModel(new javax.swing.table.DefaultTableModel( new Object[][] { { "abstract", "" }, { "ontology title", null }, { "ontology name", null }, + { "ontology description", null }, { "ontology introduction", null }, { "ontology prefix", null }, { "ontology ns URI", null }, { "creation date", null }, { "modified date", null }, { "this version URI", null }, { "latest version URI", null }, { "previous version URI", null }, { "ontology revision", null }, { "authors", null }, @@ -751,12 +780,23 @@ private void loadMetadataButtonActionPerformed(java.awt.event.ActionEvent evt) { this.useLicensiusWSCheckBox.setEnabled(false); this.loadMetadataFromOnto.setSelected(false); this.loadMetadataFromDefaultConfigFile.setSelected(false); - JFileChooser chooser = new JFileChooser(new File("").getAbsolutePath()); - int returnVal = chooser.showOpenDialog(this); - if (returnVal == JFileChooser.APPROVE_OPTION) { - // g.reloadConfiguration(chooser.getSelectedFile().getAbsolutePath()); - conf.reloadPropertyFile(chooser.getSelectedFile().getAbsolutePath()); +// JFileChooser chooser = new JFileChooser(new File("").getAbsolutePath()); +// int returnVal = chooser.showOpenDialog(this); +// if (returnVal == JFileChooser.APPROVE_OPTION) { +// // g.reloadConfiguration(chooser.getSelectedFile().getAbsolutePath()); +// conf.reloadPropertyFile(chooser.getSelectedFile().getAbsolutePath()); +// this.refreshPropertyTable(); +// } + FileDialog chooser = new FileDialog(this, "Select .properties file", FileDialog.LOAD); + chooser.setVisible(true); + String directory = chooser.getDirectory(); + String file = chooser.getFile(); + if (directory != null && file != null) { + File selectedFile = new File(directory, file); + conf.reloadPropertyFile(selectedFile.getAbsolutePath()); this.refreshPropertyTable(); + } else { + logger.info("Load canceled."); } }// GEN-LAST:event_loadMetadataButtonActionPerformed @@ -793,18 +833,34 @@ private void loadMetadataFromDefaultConfigFileActionPerformed(java.awt.event.Act private void saveMetadataButtonActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_saveMetadataButtonActionPerformed saveMetadata(); - // ideally the serialization of config woule have to be done in another class. - JFileChooser chooser = new JFileChooser(); - int returnVal = chooser.showSaveDialog(this); - if (returnVal == JFileChooser.APPROVE_OPTION) { - // create a file (if not exists already) - String path = chooser.getSelectedFile().getAbsolutePath(); +// JFileChooser chooser = new JFileChooser(); +// int returnVal = chooser.showSaveDialog(this); +// if (returnVal == JFileChooser.APPROVE_OPTION) { +// // create a file (if not exists already) +// String path = chooser.getSelectedFile().getAbsolutePath(); +// try { +// CreateResources.saveConfigFile(path, conf); +// JOptionPane.showMessageDialog(this, "Property file saved successfully"); +// } catch (IOException e) { +// JOptionPane.showMessageDialog(this, "Error while saving the property file "); +// } +// } + + FileDialog chooser = new FileDialog(this, "Select A file to save all ontology metadata", FileDialog.SAVE); + chooser.setVisible(true); + String directory = chooser.getDirectory(); + String file = chooser.getFile(); + if (directory != null && file != null) { + File selectedFile = new File(directory, file); + logger.info("You chose to save this file: " + selectedFile.getName()); try { - CreateResources.saveConfigFile(path, conf); + CreateResources.saveConfigFile(selectedFile.getAbsolutePath(), conf); JOptionPane.showMessageDialog(this, "Property file saved successfully"); } catch (IOException e) { JOptionPane.showMessageDialog(this, "Error while saving the property file "); } + } else { + logger.info("Selection canceled."); } }// GEN-LAST:event_saveMetadataButtonActionPerformed diff --git a/src/main/java/widoco/gui/GuiStep3.java b/src/main/java/widoco/gui/GuiStep3.java index 834bf0c..8c7ea11 100644 --- a/src/main/java/widoco/gui/GuiStep3.java +++ b/src/main/java/widoco/gui/GuiStep3.java @@ -21,10 +21,11 @@ */ package widoco.gui; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Image; -import java.awt.Toolkit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.*; +import java.io.File; import java.net.URI; import java.net.URISyntaxException; import javax.swing.ImageIcon; @@ -37,6 +38,7 @@ */ public class GuiStep3 extends javax.swing.JFrame { private final GuiController g; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); private String abstractPath; private String introductionPath; private String overviewPath; @@ -275,11 +277,11 @@ public void mouseExited(java.awt.event.MouseEvent evt) { checkBoxDisplaySerialization.setSelected(true); checkBoxDisplaySerialization.setText("Display ontology serializations"); - checkBoxDisplaySerialization.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - checkBoxDisplaySerializationActionPerformed(evt); - } - }); +// checkBoxDisplaySerialization.addActionListener(new java.awt.event.ActionListener() { +// public void actionPerformed(java.awt.event.ActionEvent evt) { +// checkBoxDisplaySerializationActionPerformed(evt); +// } +// }); buttonRewriteBase.setText("Set base path"); buttonRewriteBase.addActionListener(new java.awt.event.ActionListener() { @@ -580,9 +582,7 @@ private void abstractSectionButtonActionPerformed(java.awt.event.ActionEvent evt abstractPath = loadSection(); }//GEN-LAST:event_abstractSectionButtonActionPerformed - private void checkBoxDisplaySerializationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxDisplaySerializationActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_checkBoxDisplaySerializationActionPerformed + private void buttonRewriteBaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonRewriteBaseActionPerformed String newRewriteBase = JOptionPane.showInputDialog(this, "New rewrite base path for .htaccess",g.getConfig().getRewriteBase()); @@ -592,10 +592,19 @@ private void buttonRewriteBaseActionPerformed(java.awt.event.ActionEvent evt) {/ }//GEN-LAST:event_buttonRewriteBaseActionPerformed private String loadSection(){ - JFileChooser chooser = new JFileChooser(); - int returnVal = chooser.showSaveDialog(this); - if(returnVal == JFileChooser.APPROVE_OPTION) { - return chooser.getSelectedFile().getAbsolutePath(); +// JFileChooser chooser = new JFileChooser(); +// int returnVal = chooser.showSaveDialog(this); +// if(returnVal == JFileChooser.APPROVE_OPTION) { +// return chooser.getSelectedFile().getAbsolutePath(); +// } + FileDialog chooser = new FileDialog(this, "Select file to load", FileDialog.LOAD); + chooser.setVisible(true); + String directory = chooser.getDirectory(); + String file = chooser.getFile(); + if (directory != null && file != null) { + File selectedFile = new File(directory, file); + logger.info("Saving selection to "+selectedFile.getAbsolutePath()); + return selectedFile.getAbsolutePath(); } return null; } diff --git a/src/main/resources/lode.zip b/src/main/resources/lode.zip index b9c80911d64e655c73b3a15637932f2ea8d540c3..a812b0158a78a93c0041888004a18063506697b4 100644 GIT binary patch delta 12843 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
  • - + + + + + + + + + + + + + + + + + + +
  • @@ -637,11 +656,33 @@ http://www.oxygenxml.com/ns/doc/xsl "> + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + +

    @@ -2283,7 +2337,7 @@ http://www.oxygenxml.com/ns/doc/xsl ">

    - + @@ -2294,7 +2348,7 @@ http://www.oxygenxml.com/ns/doc/xsl ">
      - + diff --git a/src/main/resources/widoco/cs.properties b/src/main/resources/widoco/cs.properties index 1c4eaa5..f97fdca 100644 --- a/src/main/resources/widoco/cs.properties +++ b/src/main/resources/widoco/cs.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://vlozUriLicenceZde.example.org toc=Obsah ns=Deklarace jmenn\u00fdch prostor\u016f nsText=

    \n
    \n\n\n\n -introTitle=\u00davod +introTitle=\u00davod zp\u011bt k obsahu\n introPlaceHolder=\u00davod zp\u011bt k obsahu\n\nToto je m\u00edsto pro \u00davod. \u00davod by m\u011bl kr\u00e1tce popsat obsah ontologie, jej\u00ed motivaci, aktu\u00e1ln\u00ed stav a c\u00edle\n namespace=Deklarace jmenn\u00fdch prostor\u016f overviewTitle=P\u0159ehled diff --git a/src/main/resources/widoco/de.properties b/src/main/resources/widoco/de.properties index 81d9ac9..621d0e7 100644 --- a/src/main/resources/widoco/de.properties +++ b/src/main/resources/widoco/de.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://insertlicenseURIhere.example.org toc=Inhaltsverzeichnis ns=Namensräume nsText=\n
    \n
    Table 1: Jmenn\u00e9 prostory pou\u017eit\u00e9 v tomto dokumentut
    \n\n\n -introTitle=Einführung +introTitle=Einführung zurück zum Inhaltsverzeichnis\n introPlaceHolder=Einführung zurück zum Inhaltsverzeichnis\n\nDies ist ein Platzhalter für die Einführung. Die Einführung sollte in kurzer Form die Ontologie und ihren Anwendungszweck beschreiben, sowie Informationen über ihren Entwicklungsstand und Kontext enthalten.\n namespace=Deklaration der Namensräume overviewTitle=überblick diff --git a/src/main/resources/widoco/en.properties b/src/main/resources/widoco/en.properties index bb30747..b185f8e 100644 --- a/src/main/resources/widoco/en.properties +++ b/src/main/resources/widoco/en.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://insertlicenseURIhere.example.org toc=Table of contents ns=Namespace declarations nsText=\n
    \n
    Tabelle 1: Namensräume im Dokument
    \n\n\n -introTitle=Introduction +introTitle=Introduction back to ToC\n introPlaceHolder=Introduction back to ToC\n\nThis is a place holder text for the introduction. The introduction should briefly describe the ontology, its motivation, state of the art and goals.\n namespace=Namespace declarations overviewTitle=Overview diff --git a/src/main/resources/widoco/es.properties b/src/main/resources/widoco/es.properties index e066a42..d5a1e73 100644 --- a/src/main/resources/widoco/es.properties +++ b/src/main/resources/widoco/es.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://tituloLicenciaSeleccionado.example.org toc=Índice ns=Declaración de namespaces nsText=\n
    \n
    Table 1: Namespaces used in the document
    \n\n\n -introTitle=Introducción +introTitle=Introducción volver a índice\n introPlaceHolder=Introducción volver a índice\nEste párrafo debería hablar sobre la ontología, motivación estado del arte y objetivos\n namespace=Namespaces utlizados en el documento overviewTitle=Resumen diff --git a/src/main/resources/widoco/fr.properties b/src/main/resources/widoco/fr.properties index 97a552d..83d12a7 100644 --- a/src/main/resources/widoco/fr.properties +++ b/src/main/resources/widoco/fr.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://URIdelalicence.example.org toc=Sommaire ns=Espaces de noms déclarés nsText=\n
    \n
    Tabla 1: Namespaces utilizados en el documento
    \n\n\n -introTitle=Introduction +introTitle=Introduction retour au sommaire\n introPlaceHolder=Introduction retour au sommaire\n\nCeci est une introduction automatique. L'introduction doit décrire briè vement l'ontologie, motiver son développement, l'état de l'art, les objectifs.\n namespace=Déclarations d'espaces de noms overviewTitle=Aperçu diff --git a/src/main/resources/widoco/it.properties b/src/main/resources/widoco/it.properties index fd33483..5b064b4 100644 --- a/src/main/resources/widoco/it.properties +++ b/src/main/resources/widoco/it.properties @@ -23,7 +23,7 @@ licenseURLIfNull=http://insertlicenseURIhere.example.org toc=Table of contents ns=Lista dei namespace nsText=\n
    \n
    Table 1: Espaces de noms utilisés dans ce document
    \n\n\n -introTitle=Introduzione +introTitle=Introduzione torna alla ToC\n introPlaceHolder=Introduzione torna alla ToC\n\nQui va inserita l'introduzione. L'introduzione dovrebbe descrivere brevemente l'ontologia, le motivazioni, lo stato dell'arte, e gli obiettivi.\n namespace=Dichiarazione dei namespace overviewTitle=Overview diff --git a/src/main/resources/widoco/nl.properties b/src/main/resources/widoco/nl.properties index 6a4ab1a..ba2f10f 100644 --- a/src/main/resources/widoco/nl.properties +++ b/src/main/resources/widoco/nl.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://voeglicentieURIhiertoe.example.org toc=Inhoudsopgave ns=Naamruimtedefinities nsText=\n
    \n
    Tabella 1: Lista dei namespace usati nel documento
    \n\n\n -introTitle=Inleiding +introTitle=Inleiding terug naar Index\n introPlaceHolder=Inleiding terug naar Index\n\nDit is een tijdelijke tekst voor de inleiding. De inleiding moet kort de ontologie, de motivatie, de stand van de techniek en de doelen beschrijven.\n namespace=Naamruimtedefinities overviewTitle=Overzicht diff --git a/src/main/resources/widoco/pt.properties b/src/main/resources/widoco/pt.properties index 633f670..27e8aff 100644 --- a/src/main/resources/widoco/pt.properties +++ b/src/main/resources/widoco/pt.properties @@ -18,7 +18,7 @@ licenseURLIfNull=http://insertlicenseURIhere.example.org toc=Índice ns=Declarações de namespaces nsText=\n
    \n
    Table 1: Gebruikte naamruimten in dit document
    \n\n\n -introTitle=Introdução +introTitle=Introdução de volta a índice\n introPlaceHolder=Introdução de volta a índice\nIsso deve falar um pouco sobre sua ontologia, a sua motivação, soa e objetivos.\n namespace=Namespaces utilizados no documento overviewTitle=Visão geral
    Table 1: Namespaces utilizados no documento