├── .classpath ├── .gitignore ├── .project ├── LICENSE ├── README.md ├── qskos-fix ├── pom.xml └── src │ ├── main │ ├── java │ │ └── fr │ │ │ └── sparna │ │ │ └── rdf │ │ │ └── skos │ │ │ └── testtool │ │ │ └── fix │ │ │ ├── FixPolicy.java │ │ │ ├── FixPolicyRegistry.java │ │ │ ├── FixProposal.java │ │ │ ├── IssueFixer.java │ │ │ └── ValuelessAssociativeRelationsFixPolicy1.java │ └── resources │ │ └── services │ │ └── fr.sparna.rdf.skos.testtool.fix.FixPolicy │ └── test │ ├── java │ └── fr │ │ └── sparna │ │ └── rdf │ │ └── skos │ │ └── testtool │ │ └── fix │ │ └── ValuelessAssociativeRelationsFixTest.java │ └── resources │ └── redundantAssociativeRelations.rdf └── skos-testing-tool ├── pom.xml └── src ├── main ├── java │ └── fr │ │ └── sparna │ │ ├── rdf │ │ └── skos │ │ │ └── testtool │ │ │ ├── ApplicationData.java │ │ │ ├── ExecuteQSkos.java │ │ │ ├── GenerateReportFile.java │ │ │ ├── HomeDisplay.java │ │ │ ├── IssueConverter.java │ │ │ ├── IssueDescription.java │ │ │ ├── IssueResultDisplay.java │ │ │ ├── LangFilter.java │ │ │ ├── ReportDisplay.java │ │ │ ├── SessionData.java │ │ │ ├── SkosTestToolController.java │ │ │ ├── TestToolConfig.java │ │ │ └── api │ │ │ ├── ApiController.java │ │ │ ├── DQVReport.java │ │ │ └── RdfMessageConverter.java │ │ └── web │ │ └── BaseURL.java ├── resources │ ├── fr │ │ └── sparna │ │ │ └── rdf │ │ │ └── skos │ │ │ └── testtool │ │ │ └── properties │ │ │ ├── Bundle_en.properties │ │ │ └── Bundle_fr.properties │ ├── log4j.dtd │ ├── log4j.xml │ └── skos.rdf └── webapp │ ├── WEB-INF │ ├── jsp │ │ ├── footer.jsp │ │ ├── header.jsp │ │ ├── home.jsp │ │ ├── result.jsp │ │ └── wait.jsp │ ├── rules.xml │ ├── spring-dispatcher-servlet.xml │ └── web.xml │ ├── logs │ ├── report.txt │ └── validator.log │ ├── theme-paper │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-table-expandable.css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ ├── bootstrap.min.css.lumen │ │ │ ├── bootstrap.min.css.map │ │ │ └── bootstrap.min.css.original │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ ├── images │ │ │ └── arrows.png │ │ └── js │ │ │ ├── bootstrap-table-expandable.js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ └── npm.js │ ├── css │ │ ├── jquery-ui.min.css │ │ ├── jquery-ui.structure.min.css │ │ ├── jquery-ui.theme.min.css │ │ ├── media.css │ │ ├── print-preview.css │ │ ├── print.css │ │ └── style.css │ ├── images │ │ ├── icon-close.png │ │ ├── icon-print.png │ │ └── sparna.jpeg │ ├── jasny-bootstrap │ │ ├── css │ │ │ ├── jasny-bootstrap.css │ │ │ ├── jasny-bootstrap.css.map │ │ │ └── jasny-bootstrap.min.css │ │ └── js │ │ │ ├── jasny-bootstrap.js │ │ │ └── jasny-bootstrap.min.js │ └── js │ │ ├── jquery-1.11.3.js │ │ ├── jquery-ui.min.js │ │ └── jquery.print-preview.js │ └── welcomefile.jsp └── test └── java └── fr └── sparna └── rdf └── skos └── testtool └── test └── ValidateSkosFileTest.java /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | /target/* 3 | /target/** 4 | .settings 5 | .classpath 6 | .project -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | skos-validator 4 | SKOS validator. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse. 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.wst.common.project.facet.core.builder 15 | 16 | 17 | 18 | 19 | org.eclipse.wst.validation.validationbuilder 20 | 21 | 22 | 23 | 24 | 25 | org.eclipse.wst.common.project.facet.core.nature 26 | org.eclipse.jdt.core.javanature 27 | org.eclipse.wst.common.modulecore.ModuleCoreNature 28 | org.eclipse.jem.workbench.JavaEMFNature 29 | 30 | 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SKOS Testing Tool 2 | 3 | The SKOS testing tool is live at **https://skos-play.sparna.fr/skos-testing-tool/** 4 | 5 | The SKOS testing tool is a web frontend for [qSKOS](https://github.com/cmader/qSKOS). It allows to assess the quality of SKOS or SKOS-XL vocabularies, by submitting a file to be validated or by validating a SKOS file published at a given URL. 6 | 7 | ### Linking directly to a report from a SKOS file URL 8 | 9 | - You can create a direct link to the validation report of an online SKOS URL : 10 | 11 | http://labs.sparna.fr/skos-testing-tool/test?url={url_of_the_SKOS_file} 12 | 13 | - uses the default rule-set 14 | 15 | - returns the result in a format according to the Accept header preference (Accept: text/html, text/plain, application/rdf+xml, text/turtle) 16 | 17 | - returns the result in a language according to the Accept-Language header preference (fr or en) 18 | 19 | e.g. http://labs.sparna.fr/skos-testing-tool/test?url=http://publications.europa.eu/mdr/resource/authority/continent/skos/continents-skos.rdf 20 | 21 | - To customise the ruleset, use the "rules" parameter : 22 | 23 | - use the value "default" for the defautl rule-set (all the rules enabled by default in the application); this excludes rules that take a long time to execute, and rules that are usually not needed; 24 | 25 | - otherwise, use a comma-separated list of rule ids, e.g. "el,ilc,ml"; 26 | 27 | - use the value "all" to check all the rules in the application; 28 | 29 | e.g. [https://skos-play.sparna.fr/skos-testing-tool/test?url=http://publications.europa.eu/mdr/resource/authority/continent/skos/continents-skos.rdf&rules=ml,mri,ncl,oc](https://skos-play.sparna.fr/skos-testing-tool/test?url=http://publications.europa.eu/mdr/resource/authority/continent/skos/continents-skos.rdf&rules=ml,mri,ncl,oc) 30 | 31 | - To customise the output report format, use either the "Accept" header, or the "format" URL parameter; if present, the "format" URL parameter takes precedence; it can take the following value 32 | 33 | - "html" for the HTML report format ("text/html" in the Accept header) 34 | 35 | - "txt" for the text report format ("text/plain" in the Accept header); 36 | 37 | - "rdf" for the RDF [DQV](https://www.w3.org/TR/vocab-dqv/) report format in RDF/XML ("application/rdf+xml" in the Accept header); 38 | 39 | - "ttl" for the RDF [DQV](https://www.w3.org/TR/vocab-dqv/) report format in Turtle ("text/turtle" in the Accept header); 40 | 41 | e.g. http://labs.sparna.fr/skos-testing-tool/test?url=http://publications.europa.eu/mdr/resource/authority/continent/skos/continents-skos.rdf&format=ttl 42 | 43 | - To customise the output report language, use either the "Accept-language" header or the "lang" URL parameter; if present, the "lang" URL parameter takes precedence; they can take the following valuee : 44 | 45 | - fr; 46 | 47 | - en; 48 | 49 | - "en" is assumed for any other value; 50 | 51 | e.g. http://labs.sparna.fr/skos-testing-tool/test?url=http://publications.europa.eu/mdr/resource/authority/continent/skos/continents-skos.rdf&lang=fr 52 | 53 | ### Contribution guidelines ### 54 | 55 | * If you spot a problem or need a specific feature, please file an issue here. 56 | 57 | ### Who are you ? ### 58 | 59 | * [qSKOS](https://github.com/cmader/qSKOS) is developped by Christian Mader. 60 | * The SKOS testing tool is developped by [Sparna](http://www.sparna.fr). 61 | 62 | ### Other 63 | 64 | A [similar service](http://qskos.poolparty.biz) (although not as cool as this one :-) ) is operated by [PoolParty](https://www.poolparty.biz/). 65 | -------------------------------------------------------------------------------- /qskos-fix/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | fr.sparna.skos-testing-tool 7 | qskos-fix 8 | 0.8.1 9 | jar 10 | 11 | qskos-fix 12 | An extension for qSKOS to extend the issues with proposed fixes. 13 | 14 | 15 | 16 | 17 | org.apache.maven.plugins 18 | maven-compiler-plugin 19 | 3.6.1 20 | 21 | 1.8 22 | 1.8 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | junit 33 | junit 34 | 4.7 35 | test 36 | 37 | 38 | 39 | 40 | org.slf4j 41 | slf4j-api 42 | 1.7.5 43 | 44 | 45 | org.slf4j 46 | slf4j-simple 47 | 1.7.5 48 | 49 | 50 | org.slf4j 51 | slf4j-log4j12 52 | 1.7.5 53 | 54 | 55 | 56 | 57 | at.ac.univie.mminf 58 | qSKOS 59 | 2.0.2 60 | 61 | 62 | 63 | org.jgrapht 64 | jgrapht-jdk1.5 65 | 0.7.3 66 | 67 | 68 | 69 | org.eclipse.rdf4j 70 | rdf4j-runtime 71 | ${rdf4j.version} 72 | 73 | 74 | 75 | 76 | 77 | 2.2.2 78 | 79 | 80 | -------------------------------------------------------------------------------- /qskos-fix/src/main/java/fr/sparna/rdf/skos/testtool/fix/FixPolicy.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.fix; 2 | 3 | import org.eclipse.rdf4j.repository.RepositoryConnection; 4 | 5 | import at.ac.univie.mminf.qskos4j.issues.Issue; 6 | import at.ac.univie.mminf.qskos4j.result.Result; 7 | 8 | /** 9 | * A Fix policy for an issue result. 10 | * 11 | * @author thomas.francart@sparna.fr 12 | * 13 | * @param The type of result this fix can be computed on; 14 | */ 15 | public abstract class FixPolicy>> { 16 | 17 | protected Class>> applicableForIssue; 18 | 19 | public FixPolicy(Class>> applicableForIssue) { 20 | this.applicableForIssue = applicableForIssue; 21 | } 22 | 23 | public boolean applicableFor(Class>> issueClass) { 24 | return issueClass.equals(this.applicableForIssue); 25 | } 26 | 27 | /** 28 | * Computes and returns a fix proposal for the given issue result 29 | * @param issueResult 30 | * @return 31 | */ 32 | public abstract FixProposal getFixProposal(T issue, RepositoryConnection connection); 33 | 34 | } 35 | -------------------------------------------------------------------------------- /qskos-fix/src/main/java/fr/sparna/rdf/skos/testtool/fix/FixPolicyRegistry.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.fix; 2 | 3 | import org.eclipse.rdf4j.common.lang.service.ServiceRegistry; 4 | 5 | public class FixPolicyRegistry extends ServiceRegistry { 6 | 7 | /** 8 | * Internal helper class to avoid continuous synchronized checking. 9 | */ 10 | private static class FixPolicyRegistryHolder { 11 | public static final FixPolicyRegistry instance = new FixPolicyRegistry(); 12 | } 13 | 14 | /** 15 | * Gets the default SailRegistry. 16 | * 17 | * @return The default registry. 18 | */ 19 | public static FixPolicyRegistry getInstance() { 20 | return FixPolicyRegistryHolder.instance; 21 | } 22 | 23 | public FixPolicyRegistry() { 24 | super(FixPolicy.class); 25 | } 26 | 27 | @Override 28 | protected Class getKey(FixPolicy policy) { 29 | return policy.getClass(); 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /qskos-fix/src/main/java/fr/sparna/rdf/skos/testtool/fix/FixProposal.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.fix; 2 | 3 | import org.eclipse.rdf4j.model.Model; 4 | import org.eclipse.rdf4j.model.Statement; 5 | import org.eclipse.rdf4j.model.impl.LinkedHashModel; 6 | import org.eclipse.rdf4j.repository.RepositoryConnection; 7 | import org.eclipse.rdf4j.rio.helpers.StatementCollector; 8 | 9 | /** 10 | * A proposal for fixing an Issue in the data, consisting of a set of triples to add, and a set of triples to delete. 11 | * @author thomas.francart@sparna.fr 12 | */ 13 | public class FixProposal { 14 | 15 | protected Model addedStatements = new LinkedHashModel(); 16 | protected Model deletedStatements = new LinkedHashModel(); 17 | 18 | /** 19 | * Helper method to gather the statements to be added in this fix proposal 20 | * @param c 21 | */ 22 | public void collectAddedStatements(StatementCollector c) { 23 | if(this.addedStatements != null) { 24 | this.addedStatements = new LinkedHashModel(); 25 | } 26 | this.addedStatements.addAll(c.getStatements()); 27 | } 28 | 29 | /** 30 | * Helper method to gather the statements to be deleted in this fix proposal, by making sure each collected statement 31 | * actually exists in the repository (to avoid suggesting statements to be deleted that actually don't exist) 32 | * @param c 33 | * @param connection 34 | */ 35 | public void collectDeletedStatements(StatementCollector c, RepositoryConnection connection) { 36 | if(this.deletedStatements == null) { 37 | this.deletedStatements = new LinkedHashModel(); 38 | } 39 | this.deletedStatements.addAll(c.getStatements()); 40 | // keep only the statements that are actually present in the Repository 41 | this.deletedStatements.removeIf((Statement s) -> !connection.hasStatement(s, false)); 42 | } 43 | 44 | public void setAddedStatements(Model addedStatements) { 45 | this.addedStatements = addedStatements; 46 | } 47 | 48 | public void setDeletedStatements(Model deletedStatements) { 49 | this.deletedStatements = deletedStatements; 50 | } 51 | 52 | public Model getAddedStatements() { 53 | return addedStatements; 54 | } 55 | 56 | public Model getDeletedStatements() { 57 | return deletedStatements; 58 | } 59 | 60 | public String printDiff() { 61 | StringBuffer buffer = new StringBuffer(); 62 | if(this.addedStatements != null) { 63 | this.addedStatements.stream().forEach((Statement s) -> 64 | buffer.append("+ "+s+" \n") 65 | ); 66 | } 67 | if(this.deletedStatements != null) { 68 | this.deletedStatements.stream().forEach((Statement s) -> 69 | buffer.append("- "+s+" \n") 70 | ); 71 | } 72 | return buffer.toString(); 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /qskos-fix/src/main/java/fr/sparna/rdf/skos/testtool/fix/IssueFixer.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.fix; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.eclipse.rdf4j.repository.RepositoryConnection; 7 | 8 | import at.ac.univie.mminf.qskos4j.issues.Issue; 9 | import at.ac.univie.mminf.qskos4j.result.Result; 10 | 11 | public class IssueFixer { 12 | 13 | public List fix(Issue issue, RepositoryConnection connection) { 14 | List proposals = new ArrayList(); 15 | List>>> policies = getApplicableFixPolicies(issue); 16 | // no associated policy = no fix proposals 17 | for (FixPolicy>> aPolicy : policies) { 18 | FixProposal aProposal = aPolicy.getFixProposal(issue, connection); 19 | proposals.add(aProposal); 20 | } 21 | return proposals; 22 | } 23 | 24 | public static List>>> getApplicableFixPolicies(Issue> issue) { 25 | List>>> policies = new ArrayList>>>(); 26 | for (FixPolicy fixPolicy : FixPolicyRegistry.getInstance().getAll()) { 27 | if(fixPolicy.applicableFor(issue.getClass())) { 28 | policies.add(fixPolicy); 29 | } 30 | } 31 | return policies; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /qskos-fix/src/main/java/fr/sparna/rdf/skos/testtool/fix/ValuelessAssociativeRelationsFixPolicy1.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.fix; 2 | 3 | import org.eclipse.rdf4j.query.GraphQuery; 4 | import org.eclipse.rdf4j.query.QueryLanguage; 5 | import org.eclipse.rdf4j.repository.RepositoryConnection; 6 | import org.eclipse.rdf4j.rio.helpers.StatementCollector; 7 | 8 | import at.ac.univie.mminf.qskos4j.issues.relations.ValuelessAssociativeRelations; 9 | import at.ac.univie.mminf.qskos4j.util.vocab.SparqlPrefix; 10 | 11 | /** 12 | * A fix for Valueless Associative Relations. 13 | * Deletes the extra skos:related or skos:relatedMatch in the data. 14 | * 15 | * @author thomas.francart@sparna.fr 16 | * 17 | */ 18 | public class ValuelessAssociativeRelationsFixPolicy1 extends FixPolicy { 19 | 20 | public ValuelessAssociativeRelationsFixPolicy1() { 21 | super(new ValuelessAssociativeRelations().getClass()); 22 | } 23 | 24 | @Override 25 | public FixProposal getFixProposal(ValuelessAssociativeRelations issue, RepositoryConnection connection) { 26 | FixProposal fp = new FixProposal(); 27 | 28 | GraphQuery query = connection.prepareGraphQuery(QueryLanguage.SPARQL, getStatementsToBeDeletedQuery()); 29 | StatementCollector c = new StatementCollector(); 30 | // for each result in the issue result, delete the extra skos:related or relatedMatch link 31 | issue.getResult().getData().stream().forEach(tuple -> { 32 | query.clearBindings(); 33 | query.setBinding("c1", tuple.getFirst()); 34 | query.setBinding("c2", tuple.getSecond()); 35 | query.evaluate(c); 36 | }); 37 | // save the statements to be deleted, by making sure each statement actually exists in the repository 38 | fp.collectDeletedStatements(c, connection); 39 | 40 | return fp; 41 | } 42 | 43 | private String getStatementsToBeDeletedQuery() { 44 | return SparqlPrefix.SKOS + 45 | "CONSTRUCT { ?c1 skos:related ?c2 . ?c1 skos:relatedMatch ?c2 . }"+ 46 | "WHERE {" + 47 | "?c1 skos:related|skos:relatedMatch ?c2 " + 48 | "}"; 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /qskos-fix/src/main/resources/services/fr.sparna.rdf.skos.testtool.fix.FixPolicy: -------------------------------------------------------------------------------- 1 | fr.sparna.rdf.skos.testtool.fix.ValuelessAssociativeRelationsFixPolicy1 -------------------------------------------------------------------------------- /qskos-fix/src/test/java/fr/sparna/rdf/skos/testtool/fix/ValuelessAssociativeRelationsFixTest.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.fix; 2 | 3 | import java.io.IOException; 4 | 5 | import org.eclipse.rdf4j.RDF4JException; 6 | import org.eclipse.rdf4j.repository.RepositoryConnection; 7 | import org.junit.Before; 8 | import org.junit.Test; 9 | 10 | import at.ac.univie.mminf.qskos4j.issues.relations.ValuelessAssociativeRelations; 11 | import at.ac.univie.mminf.qskos4j.util.vocab.RepositoryBuilder; 12 | import junit.framework.Assert; 13 | 14 | public class ValuelessAssociativeRelationsFixTest { 15 | 16 | private ValuelessAssociativeRelations valuelessAssociativeRelations; 17 | 18 | @Before 19 | public void setUp() throws RDF4JException, IOException { 20 | valuelessAssociativeRelations = new ValuelessAssociativeRelations(); 21 | valuelessAssociativeRelations.setRepositoryConnection(new RepositoryBuilder().setUpFromTestResource("redundantAssociativeRelations.rdf").getConnection()); 22 | } 23 | 24 | @Test 25 | public void testRedundantAssociativeRelationsCount() throws RDF4JException, IOException { 26 | FixPolicy policy = new ValuelessAssociativeRelationsFixPolicy1(); 27 | RepositoryConnection connection = new RepositoryBuilder().setUpFromTestResource("redundantAssociativeRelations.rdf").getConnection(); 28 | FixProposal fixProposal = policy.getFixProposal(valuelessAssociativeRelations, connection); 29 | System.out.println(fixProposal.printDiff()); 30 | Assert.assertEquals(6, fixProposal.getDeletedStatements().size()); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /qskos-fix/src/test/resources/redundantAssociativeRelations.rdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | some label 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /skos-testing-tool/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 4.0.0 5 | 6 | fr.sparna.skos-testing-tool 7 | skos-testing-tool 8 | 0.8.1 9 | war 10 | 11 | skos-testing-tool 12 | SKOS testing tool 13 | 14 | 15 | 16 | 17 | org.apache.maven.plugins 18 | maven-compiler-plugin 19 | 3.6.1 20 | 21 | 1.8 22 | 1.8 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | org.apache.httpcomponents 32 | httpclient 33 | 35 | 4.5.2 36 | jar 37 | compile 38 | 39 | 40 | commons-logging 41 | commons-logging 42 | 43 | 44 | 45 | 46 | commons-codec 47 | commons-codec 48 | 20041127.091804 49 | 50 | 51 | commons-fileupload 52 | commons-fileupload 53 | 1.3 54 | 55 | 56 | 57 | 58 | junit 59 | junit 60 | 4.7 61 | test 62 | 63 | 64 | 65 | 66 | javaee 67 | javaee-api 68 | 5 69 | provided 70 | 71 | 72 | 73 | javax.servlet 74 | jstl 75 | 1.2 76 | 77 | 78 | 79 | 80 | org.slf4j 81 | slf4j-api 82 | 1.7.5 83 | 84 | 85 | org.slf4j 86 | slf4j-simple 87 | 1.7.5 88 | 89 | 90 | org.slf4j 91 | slf4j-log4j12 92 | 1.7.5 93 | 94 | 95 | 96 | 97 | org.springframework 98 | spring-webmvc 99 | 4.3.5.RELEASE 100 | 101 | 102 | 103 | 104 | at.ac.univie.mminf 105 | qSKOS 106 | 2.0.2 107 | 108 | 109 | 110 | org.jgrapht 111 | jgrapht-jdk1.5 112 | 0.7.3 113 | 114 | 115 | 116 | org.eclipse.rdf4j 117 | rdf4j-runtime 118 | ${rdf4j.version} 119 | 120 | 123 | 124 | 125 | 126 | 2.2.2 127 | 128 | 129 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/ApplicationData.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.util.Comparator; 4 | import java.util.List; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | 8 | 9 | public class ApplicationData { 10 | 11 | protected List issueDescriptions; 12 | 13 | public ApplicationData() { 14 | super(); 15 | } 16 | 17 | public List getIssueDescriptions() { 18 | return issueDescriptions; 19 | } 20 | 21 | @Autowired 22 | public void setIssueDescriptions(List descList) { 23 | // trier la liste sur le code 24 | descList.sort(new Comparator() { 25 | 26 | @Override 27 | public int compare(IssueDescription id1, IssueDescription id2) { 28 | return id1.getId().compareTo(id2.getId()); 29 | } 30 | 31 | }); 32 | this.issueDescriptions = descList; 33 | } 34 | 35 | /** 36 | * Finds an IssueDescription based on its id 37 | * @param id 38 | * @return 39 | */ 40 | public IssueDescription findIssueDescriptionById(String id) { 41 | for (IssueDescription aDesc : this.issueDescriptions) { 42 | if(aDesc.id.equals(id)) { 43 | return aDesc; 44 | } 45 | } 46 | return null; 47 | } 48 | 49 | public TestToolConfig getValidatorConfig() { 50 | return TestToolConfig.getInstance(); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/ExecuteQSkos.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.Collection; 8 | import java.util.Iterator; 9 | 10 | import org.eclipse.rdf4j.RDF4JException; 11 | import org.eclipse.rdf4j.model.ValueFactory; 12 | import org.eclipse.rdf4j.model.vocabulary.RDF; 13 | import org.eclipse.rdf4j.query.QueryLanguage; 14 | import org.eclipse.rdf4j.query.Update; 15 | import org.eclipse.rdf4j.repository.Repository; 16 | import org.eclipse.rdf4j.repository.RepositoryConnection; 17 | import org.eclipse.rdf4j.repository.sail.SailRepository; 18 | import org.eclipse.rdf4j.rio.RDFFormat; 19 | import org.eclipse.rdf4j.rio.Rio; 20 | import org.eclipse.rdf4j.sail.inferencer.fc.ForwardChainingRDFSInferencer; 21 | import org.eclipse.rdf4j.sail.memory.MemoryStore; 22 | import org.slf4j.Logger; 23 | import org.slf4j.LoggerFactory; 24 | 25 | import at.ac.univie.mminf.qskos4j.QSkos; 26 | import at.ac.univie.mminf.qskos4j.issues.Issue; 27 | import at.ac.univie.mminf.qskos4j.util.IssueDescriptor.IssueType; 28 | import at.ac.univie.mminf.qskos4j.util.vocab.SkosOntology; 29 | 30 | 31 | 32 | public class ExecuteQSkos { 33 | private final Logger logger = LoggerFactory.getLogger(ExecuteQSkos.class); 34 | 35 | protected String rules; 36 | 37 | protected Integer rulesNumber; 38 | 39 | private ValueFactory factory = null; 40 | 41 | protected RepositoryConnection qskosRepositoryConnection; 42 | 43 | //protected long collectionNumber; 44 | 45 | public ExecuteQSkos(String rules) { 46 | super(); 47 | this.rules = rules; 48 | } 49 | 50 | 51 | /** 52 | * Validate a File 53 | * @param f 54 | * @return 55 | * @throws RDF4JException 56 | * @throws IOException 57 | */ 58 | @SuppressWarnings("rawtypes") 59 | public Collection validate(File f) throws IOException { 60 | try(FileInputStream fis = new FileInputStream(f)) { 61 | RDFFormat format = Rio.getParserFormatForFileName(f.getName()).orElse(RDFFormat.RDFXML); 62 | return validate(fis, format); 63 | } 64 | } 65 | 66 | /** 67 | * Validate an InputStream 68 | * 69 | * @param input 70 | * @param format 71 | * @return 72 | * @throws RDF4JException 73 | * @throws IOException 74 | */ 75 | @SuppressWarnings("rawtypes") 76 | public Collection validate(InputStream input, RDFFormat format) throws IOException { 77 | 78 | // load RDF in a Repository 79 | Repository r = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore())); 80 | r.initialize(); 81 | factory=r.getValueFactory(); 82 | // load some data in the repository 83 | try(RepositoryConnection c = r.getConnection();) { 84 | 85 | logger.info("Loading data in the repository..."); 86 | c.add( 87 | input, 88 | RDF.NAMESPACE, 89 | format 90 | ); 91 | 92 | logger.info("Loading SKOS ontology..."); 93 | 94 | InputStream skosInputStream = this.getClass().getClassLoader().getResourceAsStream("skos.rdf"); 95 | c.add( 96 | skosInputStream, 97 | SkosOntology.SKOS_BASE_IRI, 98 | RDFFormat.RDFXML, 99 | factory.createIRI(SkosOntology.SKOS_ONTO_IRI)); 100 | 101 | logger.info("Infer SKOS-XL..."); 102 | //prendre en compte les libellés skos-xl 103 | String update1 = "PREFIX skos:" 104 | +"PREFIX skosxl:" 105 | + "INSERT { ?x skos:prefLabel ?y} " 106 | + "WHERE {?x skosxl:prefLabel/skosxl:literalForm ?y}"; 107 | 108 | Update u1=c.prepareUpdate(QueryLanguage.SPARQL, update1); 109 | 110 | u1.execute(); 111 | 112 | String update2 = "PREFIX skos:" 113 | +"PREFIX skosxl:" 114 | + "INSERT { ?x skos:altLabel ?y} " 115 | + "WHERE {?x skosxl:altLabel/skosxl:literalForm ?y}"; 116 | 117 | Update u2=c.prepareUpdate(QueryLanguage.SPARQL, update2); 118 | u2.execute(); 119 | 120 | logger.info("Run qSKOS..."); 121 | return runQSkos(c); 122 | 123 | } 124 | } 125 | 126 | @SuppressWarnings("rawtypes") 127 | private Collection runQSkos(RepositoryConnection c) throws IOException { 128 | 129 | // instantiation 130 | QSkos qskos = new QSkos(); 131 | this.qskosRepositoryConnection=c; 132 | qskos.setRepositoryConnection(c); 133 | 134 | //cs(allconceptscheme), cc(all collection), ac(find all concepts) 135 | Collection issues = qskos.getIssues(rules+",cs,cc,ac"); 136 | 137 | int issueNumber = 0; 138 | Iterator issueIt = issues.iterator(); 139 | while (issueIt.hasNext()) { 140 | Issue issue = issueIt.next(); 141 | issueNumber++; 142 | if(issue.getIssueDescriptor().getType()==IssueType.ANALYTICAL){ 143 | 144 | } 145 | logger.info("Processing issue " + issueNumber + " of " + issues.size() + " (" + issue.getIssueDescriptor().getName() + ")"); 146 | issue.getResult(); 147 | } 148 | this.rulesNumber=issueNumber; 149 | //this.collectionNumber=getCollectionNumber(c); 150 | logger.info("Validation complete!"); 151 | return issues; 152 | } 153 | 154 | public String getRules() { 155 | return rules; 156 | } 157 | 158 | public Integer getRulesNumber() { 159 | return rulesNumber; 160 | } 161 | 162 | 163 | public RepositoryConnection getQskosRepositoryConnection() { 164 | return qskosRepositoryConnection; 165 | } 166 | 167 | 168 | public void setQskosRepositoryConnection(RepositoryConnection qskosRepositoryConnection) { 169 | this.qskosRepositoryConnection = qskosRepositoryConnection; 170 | } 171 | 172 | 173 | } 174 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/GenerateReportFile.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.io.BufferedWriter; 4 | import java.io.File; 5 | import java.io.FileOutputStream; 6 | import java.io.FileWriter; 7 | import java.io.IOException; 8 | import java.io.OutputStream; 9 | import java.io.OutputStreamWriter; 10 | import java.net.URI; 11 | import java.net.URL; 12 | import java.nio.charset.Charset; 13 | import java.text.SimpleDateFormat; 14 | import java.util.Collection; 15 | import java.util.Date; 16 | import java.util.Iterator; 17 | 18 | import javax.servlet.http.HttpServletResponse; 19 | 20 | 21 | 22 | import at.ac.univie.mminf.qskos4j.issues.Issue; 23 | import at.ac.univie.mminf.qskos4j.result.Result; 24 | import at.ac.univie.mminf.qskos4j.util.IssueDescriptor.IssueType; 25 | 26 | public class GenerateReportFile { 27 | 28 | protected Collection issues; 29 | 30 | protected String lang; 31 | 32 | protected ReportDisplay data; 33 | 34 | public GenerateReportFile(Collection issues, String lang,ReportDisplay data) { 35 | super(); 36 | this.issues = issues; 37 | this.lang = lang; 38 | this.data=data; 39 | } 40 | 41 | private String createReportSummary() throws IOException { 42 | StringBuffer summary = new StringBuffer(); 43 | String issuedDate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); 44 | summary.append("********"+data.getFileName()+" "+issuedDate+"*************\n\n\n"); 45 | summary.append("url : "+data.getUrlconvert()); 46 | summary.append("\n"); 47 | summary.append("\n"); 48 | for (Issue issue : issues) { 49 | // skip statistical issues 50 | if(issue.getIssueDescriptor().getType() == IssueType.ANALYTICAL) { 51 | IssueDescription desc = TestToolConfig.getInstance().getApplicationData().findIssueDescriptionById(issue.getIssueDescriptor().getId()); 52 | summary.append(desc.getLabelByLang(lang) + ": " + prepareOccurrenceText(issue) + "\n"); 53 | } 54 | } 55 | 56 | summary.append("\n"); 57 | return summary.toString(); 58 | } 59 | 60 | private String prepareOccurrenceText(Issue issue) { 61 | String occurrenceText = ""; 62 | if (issue.getResult().isProblematic()) { 63 | occurrenceText = "FAIL"; 64 | try { 65 | String occurrenceCount = Long.toString(issue.getResult().occurrenceCount()); 66 | occurrenceText += " (" +occurrenceCount+ ")"; 67 | } 68 | catch (UnsupportedOperationException e) { 69 | // ignore this 70 | } 71 | } 72 | else { 73 | occurrenceText = "OK"; 74 | } 75 | 76 | return occurrenceText; 77 | } 78 | 79 | private void writeReportBody(BufferedWriter reportWriter) 80 | throws IOException 81 | { 82 | reportWriter.write("* Detailed coverage of each Quality Issue:\n\n"); 83 | Iterator issueIt = issues.iterator(); 84 | while (issueIt.hasNext()) { 85 | Issue issue = issueIt.next(); 86 | 87 | writeTextReport(issue, reportWriter); 88 | 89 | if (issueIt.hasNext()) { 90 | reportWriter.newLine(); 91 | } 92 | 93 | 94 | } 95 | } 96 | 97 | private void writeTextReport(Issue issue, BufferedWriter writer) 98 | throws IOException 99 | { 100 | writer.write(createIssueHeader(issue)); 101 | writer.newLine(); 102 | issue.getResult().generateReport(writer, Result.ReportFormat.TXT, Result.ReportStyle.SHORT); 103 | 104 | writer.newLine(); 105 | issue.getResult().generateReport(writer, Result.ReportFormat.TXT, Result.ReportStyle.EXTENSIVE); 106 | 107 | writer.newLine(); 108 | writer.flush(); 109 | } 110 | 111 | public void outputIssuesReport(OutputStream stream) 112 | throws IOException { 113 | BufferedWriter reportWriter = new BufferedWriter(new OutputStreamWriter(stream, "UTF-8")); 114 | 115 | String reportSummary = createReportSummary(); 116 | reportWriter.write(reportSummary); 117 | writeReportBody(reportWriter); 118 | 119 | reportWriter.close(); 120 | } 121 | 122 | private String createIssueHeader(Issue issue) { 123 | 124 | IssueDescription desc = TestToolConfig.getInstance().getApplicationData().findIssueDescriptionById(issue.getIssueDescriptor().getId()); 125 | 126 | String header = "--- " +desc.getLabelByLang(lang); 127 | URL weblink = issue.getIssueDescriptor().getWeblink(); 128 | header += "\nDescription: " +desc.getDescriptionByLang(lang); 129 | 130 | if (weblink != null) { 131 | header += "\ninformations: " +weblink.toString(); 132 | } 133 | return header; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/HomeDisplay.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | /** 4 | * Data used to display the home page 5 | * @author thomas 6 | * 7 | */ 8 | public class HomeDisplay { 9 | 10 | public static final String KEY = HomeDisplay.class.getCanonicalName(); 11 | 12 | protected String msg; 13 | 14 | public String getMsg() { 15 | return msg; 16 | } 17 | 18 | public void setMsg(String msg) { 19 | this.msg = msg; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/IssueConverter.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.io.IOException; 4 | import java.util.ArrayList; 5 | import java.util.Collection; 6 | import java.util.List; 7 | 8 | import org.eclipse.rdf4j.model.IRI; 9 | import org.eclipse.rdf4j.model.Literal; 10 | import org.eclipse.rdf4j.model.Statement; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | 14 | import at.ac.univie.mminf.qskos4j.issues.Issue; 15 | import at.ac.univie.mminf.qskos4j.issues.labels.util.EmptyLabelsResult; 16 | import at.ac.univie.mminf.qskos4j.issues.labels.util.LabelConflict; 17 | import at.ac.univie.mminf.qskos4j.issues.language.IncompleteLangCovResult; 18 | import at.ac.univie.mminf.qskos4j.issues.language.OmittedOrInvalidLanguageTagsResult; 19 | import at.ac.univie.mminf.qskos4j.issues.language.util.NoCommonLanguagesResult; 20 | import at.ac.univie.mminf.qskos4j.issues.relations.UnidirectionallyRelatedConceptsResult; 21 | import at.ac.univie.mminf.qskos4j.result.CollectionResult; 22 | import at.ac.univie.mminf.qskos4j.util.IssueDescriptor.IssueType; 23 | import at.ac.univie.mminf.qskos4j.util.Pair; 24 | import fr.sparna.rdf.skos.testtool.IssueDescription.IssueLevel; 25 | 26 | public class IssueConverter { 27 | private final Logger logger = LoggerFactory.getLogger(IssueConverter.class); 28 | 29 | protected List resultList = new ArrayList(); 30 | // language used to generate the report 31 | protected String lang; 32 | 33 | protected Integer rulesFail; 34 | 35 | protected Long allconcepts; 36 | 37 | protected Long allconceptscheme; 38 | 39 | protected Long allcollection; 40 | 41 | public IssueConverter(String lang) { 42 | super(); 43 | this.lang = lang; 44 | } 45 | 46 | 47 | public Integer getRulesFail() { 48 | return rulesFail; 49 | } 50 | 51 | public Long getAllconcepts() { 52 | return allconcepts; 53 | } 54 | 55 | public Long getAllconceptscheme() { 56 | return allconceptscheme; 57 | } 58 | 59 | public Long getAllcollection() { 60 | return allcollection; 61 | } 62 | 63 | @SuppressWarnings({ "rawtypes", "deprecation" }) 64 | public List createReport(Collection issues) throws IOException { 65 | 66 | int occurrenceCountFail = 0; 67 | // for each issue... 68 | for (Issue issue : issues) { 69 | 70 | 71 | if(issue.getIssueDescriptor().getType()==IssueType.ANALYTICAL){ 72 | IssueDescription desc = TestToolConfig.getInstance().getApplicationData().findIssueDescriptionById(issue.getIssueDescriptor().getId()); 73 | IssueResultDisplay error=new IssueResultDisplay(); 74 | error.setId(issue.getIssueDescriptor().getId()); 75 | 76 | String stateText = ""; 77 | String occurrenceaccount = ""; 78 | if (issue.getResult().isProblematic()) { 79 | stateText = "FAIL"; 80 | if(desc.getLevel() == IssueLevel.WARNING) { 81 | stateText = "WARNING"; 82 | } 83 | error.setSuccess(false); 84 | occurrenceCountFail++; 85 | try{ 86 | occurrenceaccount = Long.toString(issue.getResult().occurrenceCount()); 87 | stateText += " (" +occurrenceaccount+ ")"; 88 | }catch (UnsupportedOperationException e) { 89 | // ignore this 90 | } 91 | error.setNumber(occurrenceaccount); 92 | 93 | } else { 94 | stateText = "OK"; 95 | error.setSuccess(true); 96 | } 97 | error.setState(stateText); 98 | 99 | // find issue's description in user language 100 | 101 | error.setDescription(desc.getDescriptionByLang(lang)); 102 | error.setRuleName(desc.getLabelByLang(lang)); 103 | error.setLevel(desc.getLevel()); 104 | 105 | // TODO : store also in IssueDescription 106 | if(issue.getIssueDescriptor().getWeblink()==null){ 107 | error.setWeblink(""); 108 | }else{ 109 | error.setWeblink(issue.getIssueDescriptor().getWeblink().toString()); 110 | } 111 | 112 | // store messages only if problematic 113 | // some Issues like "Common Languages" return the correct languages even if there is no issue, and we don't want to display it in this case 114 | 115 | if(issue.getResult().isProblematic()) { 116 | List messages=new ArrayList(); 117 | 118 | /*-----------Incomplete language coverage----------*/ 119 | if(issue.getResult() instanceof IncompleteLangCovResult){ 120 | IncompleteLangCovResult res=(IncompleteLangCovResult) issue.getResult(); 121 | res.getData().entrySet().stream().forEach(entry->{ 122 | StringBuffer buffer = new StringBuffer(); 123 | buffer.append(""+entry.getKey().toString()+" : "); 124 | entry.getValue().stream().forEach(string -> buffer.append(string+ " ")); 125 | buffer.append("\n"); 126 | messages.add(buffer.toString()); 127 | }); 128 | } 129 | /*-----------------Unidirectional related concept----*/ 130 | else if(issue.getResult() instanceof UnidirectionallyRelatedConceptsResult){ 131 | UnidirectionallyRelatedConceptsResult res=(UnidirectionallyRelatedConceptsResult) issue.getResult(); 132 | res.getData().entrySet().stream().forEach(entry->{ 133 | StringBuffer buffer = new StringBuffer(); 134 | entry.getKey().getElements().stream().forEach(aResource -> { 135 | buffer.append(""+aResource.toString()+""); 136 | buffer.append(", "); 137 | }); 138 | buffer.delete(buffer.length()-2, buffer.length()); 139 | buffer.append(" : "); 140 | buffer.append(entry.getValue()); 141 | buffer.append("\n"); 142 | messages.add(buffer.toString()); 143 | }); 144 | } 145 | /*-------------------Omitted or Invalid Language Tags------------*/ 146 | else if(issue.getResult() instanceof OmittedOrInvalidLanguageTagsResult){ 147 | OmittedOrInvalidLanguageTagsResult res=(OmittedOrInvalidLanguageTagsResult) issue.getResult(); 148 | res.getData().entrySet().stream().forEach(entry->{ 149 | StringBuffer buffer = new StringBuffer(); 150 | buffer.append(""+entry.getKey().toString()+" : "); 151 | entry.getValue().stream().forEach(aLiteral -> { 152 | buffer.append(aLiteral.toString()+", "); 153 | }); 154 | buffer.delete(buffer.length()-2, buffer.length()); 155 | messages.add(buffer.toString()); 156 | }); 157 | } 158 | /*-------------------Empty labels--------------------------------*/ 159 | else if(issue.getResult() instanceof EmptyLabelsResult){ 160 | EmptyLabelsResult res=(EmptyLabelsResult) issue.getResult(); 161 | res.getData().entrySet().stream().forEach(entry->{ 162 | StringBuffer buffer = new StringBuffer(); 163 | buffer.append(""+entry.getKey().toString()+" : "); 164 | entry.getValue().stream().forEach(aLabelType -> { 165 | buffer.append(aLabelType.toString()+", "); 166 | }); 167 | buffer.delete(buffer.length()-2, buffer.length()); 168 | messages.add(buffer.toString()); 169 | }); 170 | } 171 | else if(issue.getResult() instanceof NoCommonLanguagesResult) { 172 | NoCommonLanguagesResult res=(NoCommonLanguagesResult) issue.getResult(); 173 | res.getData().stream().forEach(aString->{ 174 | messages.add(aString); 175 | }); 176 | } 177 | /*--------------------Collection Result-------------------------*/ 178 | else if(issue.getResult() instanceof CollectionResult) { 179 | CollectionResult collectionResult = (CollectionResult)issue.getResult(); 180 | Collection collection = (Collection)collectionResult.getData(); 181 | 182 | collection.forEach(item-> { 183 | 184 | if(item instanceof IRI) { 185 | messages.add(""+item.toString()+""); 186 | } else if(item instanceof LabelConflict) { 187 | 188 | LabelConflict aConflict = (LabelConflict)item; 189 | StringBuffer buffer = new StringBuffer(); 190 | // le literal dupliqué 191 | Literal l = aConflict.getConflicts().iterator().next().getLiteral(); 192 | buffer.append(l+" : "); 193 | aConflict.getConflicts().stream().forEach(aLabeledConcept -> { 194 | buffer.append(""+aLabeledConcept.getConcept().toString()+""+" ("+aLabeledConcept.getLabelType().getUsualPrefixedDisplayUri()+")"+", "); 195 | }); 196 | buffer.delete(buffer.length()-2, buffer.length()); 197 | messages.add(buffer.toString()); 198 | 199 | } else if (item instanceof Collection) { 200 | // collections inside a collection, case of "disconnected concept clusters" 201 | StringBuffer buffer = new StringBuffer(); 202 | buffer.append("Cluster : "); 203 | Collection c = (Collection)item; 204 | c.stream().forEach(elmt -> { 205 | if(elmt instanceof IRI) { 206 | buffer.append(""+elmt.toString()+""); 207 | } else { 208 | buffer.append(elmt.toString()); 209 | } 210 | buffer.append(", "); 211 | }); 212 | buffer.delete(buffer.length()-2, buffer.length()); 213 | messages.add(buffer.toString()); 214 | } else if (item instanceof Pair) { 215 | // hr hierarchical redundancy 216 | Pair p = (Pair)item; 217 | if(p.getFirst() instanceof IRI) { 218 | StringBuffer buffer = new StringBuffer(); 219 | buffer.append("[ "); 220 | buffer.append(""+p.getFirst().toString()+""); 221 | buffer.append(" - "); 222 | buffer.append(""+p.getSecond().toString()+""); 223 | buffer.append(" ]"); 224 | messages.add(buffer.toString()); 225 | } else { 226 | messages.add(p.toString()); 227 | } 228 | } else if (item instanceof Statement) { 229 | // mrl - mapping relation misuse 230 | Statement s = (Statement)item; 231 | StringBuffer buffer = new StringBuffer(); 232 | buffer.append("<"); 233 | buffer.append(""+s.getSubject()+""); 234 | buffer.append("> <"); 235 | buffer.append(""+s.getPredicate()+""); 236 | buffer.append("> <"); 237 | buffer.append(""+s.getObject()+""); 238 | buffer.append(">"); 239 | messages.add(buffer.toString()); 240 | } 241 | else { 242 | System.out.println(item.getClass().getName()); 243 | messages.add(item.toString()); 244 | } 245 | 246 | } 247 | ); 248 | } else { 249 | System.out.println("Unknown result type "+issue.getResult().getClass().getName()); 250 | } 251 | 252 | error.setErrorList(messages); 253 | } 254 | resultList.add(error); 255 | }else{ 256 | //allcollection 257 | if(issue.getIssueDescriptor().getId().equals("cc")){ 258 | this.allcollection=issue.getResult().occurrenceCount(); 259 | } 260 | //all concepts 261 | if(issue.getIssueDescriptor().getId().equals("ac")){ 262 | this.allconcepts=issue.getResult().occurrenceCount(); 263 | } 264 | //all conceptschemes 265 | if(issue.getIssueDescriptor().getId().equals("cs")){ 266 | this.allconceptscheme=issue.getResult().occurrenceCount(); 267 | } 268 | } 269 | } 270 | this.rulesFail=occurrenceCountFail; 271 | return resultList; 272 | } 273 | } -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/IssueDescription.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * A multilingual issue description, with multilingual descriptions and labels 7 | */ 8 | public class IssueDescription { 9 | 10 | public enum IssueLevel { 11 | INFO, 12 | WARNING, 13 | DANGER 14 | } 15 | 16 | protected String id; 17 | protected Map description; 18 | protected Map lbconcept; 19 | protected String link; 20 | protected boolean checked; 21 | protected IssueLevel level = IssueLevel.DANGER; 22 | 23 | public IssueDescription( 24 | String id, 25 | Map description, 26 | Map lbconcept, 27 | String link, 28 | boolean checked 29 | ) { 30 | super(); 31 | this.description = description; 32 | this.id = id; 33 | this.lbconcept=lbconcept; 34 | this.link=link; 35 | this.checked=checked; 36 | } 37 | 38 | public String getDescriptionByLang(String lang) { 39 | return description.get(lang); 40 | } 41 | 42 | public String getLabelByLang(String lang) { 43 | return lbconcept.get(lang); 44 | } 45 | 46 | public Map getDescription() { 47 | return description; 48 | } 49 | 50 | public String getId() { 51 | return id; 52 | } 53 | 54 | public Map getLbconcept() { 55 | return lbconcept; 56 | } 57 | 58 | public String getLink() { 59 | return link; 60 | } 61 | 62 | public boolean isChecked() { 63 | return checked; 64 | } 65 | 66 | public void setChecked(boolean checked) { 67 | this.checked = checked; 68 | } 69 | 70 | public void setLink(String link) { 71 | this.link = link; 72 | } 73 | 74 | public IssueLevel getLevel() { 75 | return level; 76 | } 77 | 78 | public void setLevel(IssueLevel level) { 79 | this.level = level; 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/IssueResultDisplay.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.util.List; 4 | 5 | import fr.sparna.rdf.skos.testtool.IssueDescription.IssueLevel; 6 | 7 | public class IssueResultDisplay { 8 | 9 | protected String ruleName; 10 | 11 | protected String state; 12 | 13 | protected String id; 14 | 15 | protected String description; 16 | 17 | protected String weblink; 18 | 19 | protected String number; 20 | 21 | protected List errorList; 22 | 23 | protected boolean success; 24 | 25 | protected IssueLevel level; 26 | 27 | public String getCssClass() { 28 | if(success) { 29 | return "success"; 30 | } else { 31 | switch (level) { 32 | case DANGER: 33 | return "danger"; 34 | case INFO: 35 | return "info"; 36 | case WARNING: 37 | return "warning"; 38 | default: 39 | return "danger"; 40 | } 41 | } 42 | } 43 | 44 | public String getNumber() { 45 | return number; 46 | } 47 | public void setNumber(String number) { 48 | this.number = number; 49 | } 50 | public String getId() { 51 | return id; 52 | } 53 | public void setId(String id) { 54 | this.id = id; 55 | } 56 | public String getDescription() { 57 | return description; 58 | } 59 | public void setDescription(String description) { 60 | this.description = description; 61 | } 62 | public String getWeblink() { 63 | return weblink; 64 | } 65 | public void setWeblink(String weblink) { 66 | this.weblink = weblink; 67 | } 68 | public String getRuleName() { 69 | return ruleName; 70 | } 71 | public void setRuleName(String ruleName) { 72 | this.ruleName = ruleName; 73 | } 74 | public List getErrorList() { 75 | return errorList; 76 | } 77 | public void setErrorList(List errorList) { 78 | this.errorList = errorList; 79 | } 80 | public String getState() { 81 | return state; 82 | } 83 | public void setState(String state) { 84 | this.state = state; 85 | } 86 | public boolean isSuccess() { 87 | return success; 88 | } 89 | public void setSuccess(boolean success) { 90 | this.success = success; 91 | } 92 | public IssueLevel getLevel() { 93 | return level; 94 | } 95 | public void setLevel(IssueLevel level) { 96 | this.level = level; 97 | } 98 | 99 | } 100 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/LangFilter.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.Filter; 6 | import javax.servlet.FilterChain; 7 | import javax.servlet.FilterConfig; 8 | import javax.servlet.ServletException; 9 | import javax.servlet.ServletRequest; 10 | import javax.servlet.ServletResponse; 11 | import javax.servlet.http.HttpServletRequest; 12 | 13 | import org.slf4j.Logger; 14 | import org.slf4j.LoggerFactory; 15 | 16 | public class LangFilter implements Filter { 17 | 18 | private Logger log = LoggerFactory.getLogger(this.getClass().getName()); 19 | 20 | @Override 21 | public void init(FilterConfig arg0) throws ServletException { 22 | 23 | } 24 | 25 | @Override 26 | public void destroy() { 27 | 28 | } 29 | 30 | @Override 31 | public void doFilter( 32 | ServletRequest request, 33 | ServletResponse response, 34 | FilterChain chain) 35 | throws IOException, ServletException { 36 | // Check type request. 37 | if (request instanceof HttpServletRequest) { 38 | // Cast back to HttpServletRequest. 39 | HttpServletRequest httpRequest = (HttpServletRequest) request; 40 | 41 | // Parse HttpServletRequest. 42 | HttpServletRequest parsedRequest = filterRequest(httpRequest); 43 | 44 | // Continue with filter chain. 45 | chain.doFilter(parsedRequest, response); 46 | } else { 47 | // Not a HttpServletRequest. 48 | chain.doFilter(request, response); 49 | } 50 | 51 | } 52 | 53 | private HttpServletRequest filterRequest(HttpServletRequest request) { 54 | 55 | SessionData sessionData = SessionData.get(request.getSession()); 56 | 57 | // si on n'a pas de session... 58 | if(sessionData == null) { 59 | // on en créé une et on la stocke 60 | sessionData = new SessionData(); 61 | sessionData.store(request.getSession()); 62 | 63 | // on détermine la langue : 64 | String langToSet; 65 | // on prend le parametre de lang si il y en a un... 66 | if(request.getParameter("lang") != null) { 67 | log.debug("Detected 'lang' param. Will set a new user locale."); 68 | langToSet = request.getParameter("lang"); 69 | } else { 70 | // sinon on prend la langue par défaut du navigateur 71 | String userLanguage = request.getLocale().getLanguage(); 72 | if(userLanguage.startsWith("fr")) { 73 | langToSet = "fr"; 74 | } else { 75 | langToSet = "en"; 76 | } 77 | } 78 | sessionData.setUserLocale(langToSet); 79 | 80 | } else { 81 | // si on a une session et que le parametre est renvoyé, 82 | // alors on l'enregistre dans la session 83 | if(request.getParameter("lang") != null) { 84 | log.debug("Detected 'lang' param. Will set a new user locale."); 85 | sessionData.setUserLocale(request.getParameter("lang")); 86 | } 87 | } 88 | 89 | return request; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/ReportDisplay.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.text.DecimalFormat; 4 | import java.text.NumberFormat; 5 | import java.util.List; 6 | 7 | /** 8 | * Data used to display the report result page 9 | * @author thomas 10 | * 11 | */ 12 | public class ReportDisplay { 13 | 14 | 15 | protected List errorList; 16 | 17 | protected List choiceList; 18 | 19 | protected Integer rulesNumber; 20 | 21 | protected Integer rulesFail; 22 | 23 | protected Double executionTime; 24 | 25 | protected Long allconcepts; 26 | 27 | protected Long allconceptschemes; 28 | 29 | protected Long allcollections; 30 | 31 | protected String fileName; 32 | 33 | protected String issueDate; 34 | 35 | protected String urlconvert; 36 | 37 | public static final String KEY = ReportDisplay.class.getCanonicalName(); 38 | 39 | 40 | public List getChoiceList() { 41 | return choiceList; 42 | } 43 | 44 | public void setChoiceList(List choiceList) { 45 | this.choiceList = choiceList; 46 | } 47 | 48 | public List getErrorList() { 49 | return errorList; 50 | } 51 | 52 | public void setErrorList(List errorList) { 53 | this.errorList = errorList; 54 | } 55 | 56 | public Integer getRulesNumber() { 57 | return rulesNumber; 58 | } 59 | 60 | public void setRulesNumber(Integer ruleNumber) { 61 | this.rulesNumber = ruleNumber; 62 | } 63 | 64 | public Integer getRulesFail() { 65 | return rulesFail; 66 | } 67 | 68 | public void setRulesFail(Integer rulesFail) { 69 | this.rulesFail = rulesFail; 70 | } 71 | 72 | public Double getExecutionTime() { 73 | return executionTime; 74 | } 75 | 76 | public String getExecutionTimeString() { 77 | NumberFormat formatter = new DecimalFormat("#0.00"); 78 | return formatter.format(this.getExecutionTime()); 79 | } 80 | 81 | public void setExecutionTime(Double executionTime) { 82 | this.executionTime = executionTime; 83 | } 84 | 85 | public Long getAllconcepts() { 86 | return allconcepts; 87 | } 88 | 89 | public void setAllconcepts(Long allconcepts) { 90 | this.allconcepts = allconcepts; 91 | } 92 | 93 | public Long getAllconceptschemes() { 94 | return allconceptschemes; 95 | } 96 | 97 | public void setAllconceptschemes(Long allconceptscheme) { 98 | this.allconceptschemes = allconceptscheme; 99 | } 100 | 101 | public Long getAllcollections() { 102 | return allcollections; 103 | } 104 | 105 | public void setAllcollections(Long allcollection) { 106 | this.allcollections = allcollection; 107 | } 108 | 109 | public String getFileName() { 110 | return fileName; 111 | } 112 | 113 | public void setFileName(String filename) { 114 | this.fileName = filename; 115 | } 116 | 117 | public String getIssueDate() { 118 | return issueDate; 119 | } 120 | 121 | public void setIssueDate(String issuedate) { 122 | this.issueDate = issuedate; 123 | } 124 | 125 | public String getUrlconvert() { 126 | return urlconvert; 127 | } 128 | 129 | public void setUrlconvert(String urlconvert) { 130 | this.urlconvert = urlconvert; 131 | } 132 | 133 | 134 | 135 | 136 | } 137 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/SessionData.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import javax.servlet.http.HttpSession; 4 | 5 | /** 6 | * Data stored in the user session 7 | * @author thomas 8 | * 9 | */ 10 | public class SessionData { 11 | 12 | protected String userLocale; 13 | 14 | public String getUserLocale() { 15 | return userLocale; 16 | } 17 | 18 | public void setUserLocale(String userLocale) { 19 | this.userLocale = userLocale; 20 | } 21 | 22 | public static SessionData get(HttpSession session) { 23 | return (SessionData)session.getAttribute(SessionData.class.getName()); 24 | } 25 | 26 | public static SessionData retrieve(HttpSession session) { 27 | SessionData data = (SessionData)session.getAttribute(SessionData.class.getName()); 28 | if(data == null) { 29 | data = new SessionData(); 30 | data.store(session); 31 | } 32 | return data; 33 | } 34 | 35 | public void store(HttpSession session) { 36 | session.setAttribute(SessionData.class.getName(), this); 37 | } 38 | 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/SkosTestToolController.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import java.io.BufferedInputStream; 4 | import java.io.DataInputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.net.HttpURLConnection; 8 | import java.net.MalformedURLException; 9 | import java.net.URL; 10 | import java.net.URLConnection; 11 | import java.text.SimpleDateFormat; 12 | import java.util.Arrays; 13 | import java.util.Collection; 14 | import java.util.Date; 15 | import java.util.UUID; 16 | import javax.servlet.http.HttpServletRequest; 17 | import javax.servlet.http.HttpServletResponse; 18 | import org.eclipse.rdf4j.RDF4JException; 19 | import org.eclipse.rdf4j.model.Model; 20 | import org.eclipse.rdf4j.model.ValueFactory; 21 | import org.eclipse.rdf4j.model.impl.LinkedHashModel; 22 | import org.eclipse.rdf4j.model.impl.SimpleValueFactory; 23 | import org.eclipse.rdf4j.repository.RepositoryException; 24 | import org.eclipse.rdf4j.rio.RDFFormat; 25 | import org.eclipse.rdf4j.rio.Rio; 26 | import org.slf4j.Logger; 27 | import org.slf4j.LoggerFactory; 28 | import org.springframework.stereotype.Controller; 29 | import org.springframework.web.bind.annotation.RequestMapping; 30 | import org.springframework.web.bind.annotation.RequestParam; 31 | import org.springframework.web.multipart.MultipartFile; 32 | import org.springframework.web.servlet.ModelAndView; 33 | 34 | import at.ac.univie.mminf.qskos4j.issues.Issue; 35 | import at.ac.univie.mminf.qskos4j.util.IssueDescriptor.IssueType; 36 | import fr.sparna.rdf.skos.testtool.api.DQVReport; 37 | 38 | @Controller 39 | public class SkosTestToolController { 40 | 41 | private final Logger logger = LoggerFactory.getLogger(SkosTestToolController.class); 42 | 43 | private enum SOURCE_TYPE { 44 | FILE, 45 | URL 46 | } 47 | private enum REPORT_TYPE { 48 | HTML, 49 | TXT, 50 | RDF, 51 | TTL 52 | } 53 | /** 54 | * 55 | * @param lang 56 | * @param request 57 | * @return 58 | * @throws IOException 59 | */ 60 | @RequestMapping(value = "home") 61 | public ModelAndView upload( 62 | @RequestParam(value="lang", required=false) String lang, 63 | HttpServletRequest request 64 | ) throws IOException{ 65 | HomeDisplay data = new HomeDisplay(); 66 | return new ModelAndView("home", HomeDisplay.KEY, data); 67 | } 68 | 69 | /** 70 | * 71 | * @param file 72 | * @param choice 73 | * @param lang 74 | * @param request 75 | * @return 76 | * @throws RepositoryException 77 | * @throws MalformedURLException 78 | */ 79 | @RequestMapping(value = {"result"}) 80 | public ModelAndView uploadResult( 81 | //source : utl ou html 82 | @RequestParam(value="source", required=true) String sourceString, 83 | //url fichier 84 | @RequestParam(value="url", required=false) String url, 85 | //soumission fichier via formulaire 86 | @RequestParam(value="file", required=false) MultipartFile file, 87 | //règles séparées par des virgules 88 | @RequestParam(value="rules", required=true) String choice, 89 | //type de rapport : html ou text 90 | @RequestParam(value="report", required=true) String report, 91 | HttpServletRequest request, 92 | HttpServletResponse response 93 | ) throws RepositoryException, MalformedURLException { 94 | 95 | logger.info("validate : "+"source="+sourceString+",url="+url+",choice="+choice+",report="+report); 96 | 97 | long start = System.currentTimeMillis(); 98 | URL baseURL = new URL("http://"+request.getServerName()+((request.getServerPort() != 80)?":"+request.getServerPort():"")+request.getContextPath()); 99 | //récupérer la session 100 | SessionData sessionData=SessionData.retrieve(request.getSession()); 101 | 102 | ReportDisplay data = new ReportDisplay(); 103 | 104 | data.setChoiceList(Arrays.asList(choice.split(","))); 105 | 106 | ExecuteQSkos skos=new ExecuteQSkos(choice); 107 | 108 | Collection qSkosResult = null; 109 | 110 | String lang=sessionData.getUserLocale(); 111 | 112 | Model m = new LinkedHashModel(); 113 | ValueFactory factory= SimpleValueFactory.getInstance(); 114 | 115 | try { 116 | switch(SOURCE_TYPE.valueOf(sourceString.toUpperCase())) { 117 | 118 | case FILE : { 119 | qSkosResult = skos.validate(file.getInputStream(), Rio.getWriterFormatForFileName(file.getOriginalFilename()).orElse(RDFFormat.RDFXML)); 120 | data.setFileName(file.getOriginalFilename()); 121 | break; 122 | } 123 | 124 | case URL: { 125 | String urlconvert=baseURL.toString()+"/test?url="+url+"&rules="+choice+"&format="+report; 126 | data.setUrlconvert(urlconvert); 127 | if(url.isEmpty()){ 128 | return doError(request,"url empty (vide)"); 129 | } 130 | try { 131 | URL dataUrl = new URL(url); 132 | HttpURLConnection connection = (HttpURLConnection)dataUrl.openConnection(); 133 | // still add a "*; q=.2" to make sure we don't miss anything 134 | // in the worst case we will get an HTMl representation and the parsing will fail with an error message for the user 135 | connection.setRequestProperty("Accept", "application/rdf+xml, text/turtle, application/trig, *; q=.2"); 136 | try(InputStream in = new DataInputStream(new BufferedInputStream(connection.getInputStream()))) { 137 | qSkosResult = skos.validate(in, Rio.getWriterFormatForFileName(url).orElse(RDFFormat.RDFXML)); 138 | } 139 | data.setFileName(url); 140 | 141 | } catch (Exception e) { 142 | e.printStackTrace(); 143 | return doError(request, e.getMessage()); 144 | } 145 | } 146 | 147 | } 148 | 149 | 150 | switch(REPORT_TYPE.valueOf(report.toUpperCase())){ 151 | 152 | case TXT: { 153 | //générer le rapport 154 | GenerateReportFile reportfile=new GenerateReportFile(qSkosResult,sessionData.getUserLocale(),data); 155 | response.setContentType("text/plain; charset=utf-8"); 156 | reportfile.outputIssuesReport(response.getOutputStream()); 157 | break; 158 | } 159 | 160 | case HTML : 161 | default : { 162 | doResult(skos.getRulesNumber(),lang,qSkosResult,data); 163 | //fin des tâches 164 | double timeMilli = new Long(System.currentTimeMillis()-start).doubleValue(); 165 | //récupérer le temps d'éxécution des tâches 166 | data.setExecutionTime(timeMilli/1000d); 167 | return new ModelAndView("result", ReportDisplay.KEY, data); 168 | 169 | } 170 | 171 | case RDF:{ 172 | //generate rdf file with qdv 173 | DQVReport dqv=new DQVReport(data.getFileName(),lang,m,factory); 174 | response.setContentType("application/rdf+xml"); 175 | Rio.write(dqv.dqvout(qSkosResult),response.getOutputStream(), RDFFormat.RDFXML); 176 | break; 177 | } 178 | 179 | case TTL:{ 180 | //generate ttl file with qdv 181 | DQVReport dqv=new DQVReport(data.getFileName(),lang,m,factory); 182 | response.setContentType("text/turtle"); 183 | Rio.write(dqv.dqvout(qSkosResult),response.getOutputStream(), RDFFormat.TURTLE); 184 | break; 185 | } 186 | 187 | } 188 | }catch (Exception e) { 189 | e.printStackTrace(); 190 | return doError(request,e.getMessage()); 191 | } 192 | return null; 193 | } 194 | 195 | /** 196 | * 197 | * @param request 198 | * @param message 199 | * @return 200 | */ 201 | protected ModelAndView doError( 202 | HttpServletRequest request, 203 | String message 204 | ) { 205 | HomeDisplay data = new HomeDisplay(); 206 | data.setMsg(message); 207 | return new ModelAndView("home", HomeDisplay.KEY, data); 208 | } 209 | 210 | /** 211 | * 212 | * @param nbrules 213 | * @param lang 214 | * @param qSkosResult 215 | * @param data 216 | * @throws IOException 217 | */ 218 | 219 | private void doResult( 220 | Integer nbrules, 221 | String lang, 222 | Collection qSkosResult, 223 | ReportDisplay data 224 | ) throws IOException { 225 | //récupérer le nombre total des règles à vérifier 226 | data.setRulesNumber(nbrules-3); 227 | //récupérer le resultat de la vérification des règles 228 | IssueConverter process = new IssueConverter(lang); 229 | data.setErrorList(process.createReport(qSkosResult)); 230 | //récupérer les règles non vérifiées 231 | data.setRulesFail(process.getRulesFail()); 232 | //récupérer le nombre de collection, concept et conceptscheme 233 | data.setAllcollections(process.getAllcollection()); 234 | data.setAllconcepts(process.getAllconcepts()); 235 | data.setAllconceptschemes(process.getAllconceptscheme()); 236 | String issuedDate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); 237 | data.setIssueDate(issuedDate); 238 | } 239 | 240 | 241 | 242 | } -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/TestToolConfig.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | 7 | public class TestToolConfig { 8 | 9 | private Logger log = LoggerFactory.getLogger(this.getClass().getName()); 10 | 11 | // singleton instance 12 | private static TestToolConfig instance; 13 | 14 | @Autowired 15 | protected ApplicationData applicationData; 16 | 17 | 18 | /** 19 | * Singleton private constructor 20 | */ 21 | private TestToolConfig() { 22 | } 23 | 24 | /** 25 | * Singleton Access 26 | */ 27 | public static TestToolConfig getInstance() { 28 | if(instance == null) { 29 | instance = new TestToolConfig(); 30 | } 31 | return instance; 32 | } 33 | 34 | public ApplicationData getApplicationData() { 35 | return applicationData; 36 | } 37 | 38 | public void setApplicationData(ApplicationData applicationData) { 39 | this.applicationData = applicationData; 40 | } 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/api/ApiController.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.api; 2 | 3 | import java.io.BufferedInputStream; 4 | import java.io.DataInputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.io.UnsupportedEncodingException; 8 | import java.net.URL; 9 | import java.text.SimpleDateFormat; 10 | import java.util.ArrayList; 11 | import java.util.Collection; 12 | import java.util.Date; 13 | import java.util.List; 14 | 15 | import javax.servlet.http.HttpServletRequest; 16 | import javax.servlet.http.HttpServletResponse; 17 | 18 | import org.eclipse.rdf4j.model.Model; 19 | import org.eclipse.rdf4j.model.ValueFactory; 20 | import org.eclipse.rdf4j.model.impl.LinkedHashModel; 21 | import org.eclipse.rdf4j.model.impl.SimpleValueFactory; 22 | import org.eclipse.rdf4j.repository.RepositoryException; 23 | import org.eclipse.rdf4j.rio.RDFFormat; 24 | import org.eclipse.rdf4j.rio.Rio; 25 | import org.slf4j.Logger; 26 | import org.slf4j.LoggerFactory; 27 | import org.springframework.stereotype.Controller; 28 | import org.springframework.web.bind.annotation.RequestHeader; 29 | import org.springframework.web.bind.annotation.RequestMapping; 30 | import org.springframework.web.bind.annotation.RequestParam; 31 | import org.springframework.web.bind.annotation.ResponseBody; 32 | import org.springframework.web.servlet.ModelAndView; 33 | 34 | import at.ac.univie.mminf.qskos4j.issues.Issue; 35 | import fr.sparna.rdf.skos.testtool.ExecuteQSkos; 36 | import fr.sparna.rdf.skos.testtool.GenerateReportFile; 37 | import fr.sparna.rdf.skos.testtool.IssueConverter; 38 | import fr.sparna.rdf.skos.testtool.IssueDescription; 39 | import fr.sparna.rdf.skos.testtool.ReportDisplay; 40 | import fr.sparna.rdf.skos.testtool.SkosTestToolController; 41 | import fr.sparna.rdf.skos.testtool.TestToolConfig; 42 | import fr.sparna.web.BaseURL; 43 | 44 | @Controller 45 | public class ApiController { 46 | 47 | private final Logger logger = LoggerFactory.getLogger(SkosTestToolController.class); 48 | 49 | @RequestMapping( 50 | value = {"test"}, 51 | produces={"text/html", "text/plain"} 52 | ) 53 | public ModelAndView testInHtml( 54 | //url fichier 55 | @RequestParam(value="url", required=true) String url, 56 | //règles séparées par des virgules 57 | @RequestParam(value="rules", required=false) String rules, 58 | //language (fr or en) du fichier url à valider en get 59 | @RequestParam(value="lang", required=false) String lang, 60 | // format de retour 61 | @RequestParam(value="format", required=false) String format, 62 | // Entête language 63 | @RequestHeader(name="Accept-Language") String headerlang, 64 | // Entête text/html vs. text/plain 65 | @RequestHeader(name="Accept") String accept, 66 | HttpServletRequest request, 67 | HttpServletResponse response 68 | ) throws RepositoryException, IOException { 69 | logger.info("test in text/html or text/plain : "+"url="+url+",rules="+rules+",lang="+lang); 70 | 71 | long start = System.currentTimeMillis(); 72 | ReportDisplay data = new ReportDisplay(); 73 | Listissuelist=TestToolConfig.getInstance().getApplicationData().getIssueDescriptions(); 74 | 75 | Listlist=new ArrayList(); 76 | String r=""; 77 | 78 | //default rules 79 | if(rules == null || rules.equals("default")){ 80 | for (IssueDescription element : issuelist) { 81 | if(element.isChecked()){ 82 | list.add(element.getId()); 83 | r=r+element.getId()+","; 84 | } 85 | } 86 | rules=r; 87 | //all rules 88 | } else if(rules.equals("all")) { 89 | for (IssueDescription element : issuelist) { 90 | list.add(element.getId()); 91 | r=r+element.getId()+","; 92 | } 93 | rules=r; 94 | } 95 | rules=rules.substring(0, rules.lastIndexOf(",")); 96 | data.setChoiceList(list); 97 | ExecuteQSkos skos=new ExecuteQSkos(rules); 98 | Collection qSkosResult = null; 99 | 100 | // if unspecified lang, take the one in the header 101 | if(lang==null){ 102 | lang=headerlang; 103 | } 104 | 105 | if(lang.startsWith("fr")){ 106 | lang="fr"; 107 | } else { 108 | lang="en"; 109 | } 110 | 111 | if(format==null){ 112 | format=accept; 113 | } 114 | String urlconvert= BaseURL.buildBaseURL(request).toString()+"/test?url="+url+"&rules="+rules+"&format="+format; 115 | data.setUrlconvert(urlconvert); 116 | try { 117 | URL dataUrl = new URL(url); 118 | InputStream in = new DataInputStream(new BufferedInputStream(dataUrl.openStream())); 119 | qSkosResult = skos.validate(in, Rio.getWriterFormatForFileName(url).orElse(RDFFormat.RDFXML)); 120 | data.setFileName(url); 121 | 122 | if(format.equals("txt")||format.equals("text/plain")){ 123 | //générer le rapport text 124 | GenerateReportFile reportfile=new GenerateReportFile(qSkosResult,lang,data); 125 | response.setContentType("text/plain; charset=utf-8"); 126 | reportfile.outputIssuesReport(response.getOutputStream()); 127 | }else{ 128 | //générer le rapport html 129 | doResult(skos.getRulesNumber(),lang,qSkosResult,data); 130 | //fin des tâches 131 | double timeMilli = new Long(System.currentTimeMillis()-start).doubleValue(); 132 | //récupérer le temps d'éxécution des tâches 133 | data.setExecutionTime(timeMilli/1000d); 134 | return new ModelAndView("result", ReportDisplay.KEY, data); 135 | } 136 | 137 | }catch (Exception e) { 138 | e.printStackTrace(); 139 | } 140 | return null; 141 | } 142 | 143 | @RequestMapping( 144 | value = {"test"}, 145 | produces={"application/rdf+xml", "text/turtle"} 146 | ) 147 | // @ResponseBody est nécessaire si on veut que l'objet retourné soit sérialisé par un 148 | // MessageConverter. Sinon c'est une view qui sera recherchée par Spring. 149 | @ResponseBody 150 | public Model testInRdf( 151 | //url fichier 152 | @RequestParam(value="url", required=true) String url, 153 | //règles séparées par des virgules 154 | @RequestParam(value="rules", required=false) String rules, 155 | //language (fr or en) du fichier url à valider en get 156 | @RequestParam(value="lang", required=false) String lang, 157 | HttpServletRequest request, 158 | HttpServletResponse response 159 | ) throws RepositoryException, UnsupportedEncodingException, IOException { 160 | logger.info("test in application/rdf+xml or text/turtle : "+"url="+url+",rules="+rules+",lang="+lang); 161 | Model m = new LinkedHashModel(); 162 | ValueFactory factory= SimpleValueFactory.getInstance(); 163 | Listissuelist=TestToolConfig.getInstance().getApplicationData().getIssueDescriptions(); 164 | Listlist=new ArrayList(); 165 | 166 | String r=""; 167 | //default rules 168 | if(rules==null || rules.equals("default")){ 169 | for (IssueDescription element : issuelist) { 170 | if(element.isChecked()){ 171 | list.add(element.getId()); 172 | r=r+element.getId()+","; 173 | } 174 | } 175 | rules=r; 176 | 177 | }else if(rules.equals("all")){ 178 | //all rules 179 | for (IssueDescription element : issuelist) { 180 | list.add(element.getId()); 181 | r=r+element.getId()+","; 182 | } 183 | rules=r; 184 | } 185 | //remove the last coma 186 | rules=rules.substring(0, rules.lastIndexOf(",")); 187 | //execute qskos 188 | ExecuteQSkos skos=new ExecuteQSkos(rules); 189 | URL dataUrl = new URL(url); 190 | InputStream in = new DataInputStream(new BufferedInputStream(dataUrl.openStream())); 191 | Collection qSkosResult = skos.validate(in, Rio.getWriterFormatForFileName(url).orElse(RDFFormat.RDFXML)); 192 | //generate rdf file with qdv 193 | DQVReport dqv=new DQVReport(url,lang,m,factory); 194 | return dqv.dqvout(qSkosResult); 195 | } 196 | 197 | /** 198 | * 199 | * @param nbrules 200 | * @param lang 201 | * @param qSkosResult 202 | * @param data 203 | * @throws IOException 204 | */ 205 | 206 | private void doResult( 207 | Integer nbrules, 208 | String lang, 209 | Collection qSkosResult, 210 | ReportDisplay data 211 | ) throws IOException { 212 | //récupérer le nombre total des règles à vérifier 213 | data.setRulesNumber(nbrules-3); 214 | //récupérer le resultat de la vérification des règles 215 | IssueConverter process = new IssueConverter(lang); 216 | data.setErrorList(process.createReport(qSkosResult)); 217 | //récupérer les règles non vérifiées 218 | data.setRulesFail(process.getRulesFail()); 219 | //récupérer le nombre de collection, concept et conceptscheme 220 | data.setAllcollections(process.getAllcollection()); 221 | data.setAllconcepts(process.getAllconcepts()); 222 | data.setAllconceptschemes(process.getAllconceptscheme()); 223 | String issuedDate = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); 224 | data.setIssueDate(issuedDate); 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/api/DQVReport.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.api; 2 | 3 | import java.io.IOException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.ArrayList; 6 | import java.util.Collection; 7 | import java.util.Date; 8 | import java.util.List; 9 | import java.util.UUID; 10 | 11 | import org.eclipse.rdf4j.RDF4JException; 12 | import org.eclipse.rdf4j.model.IRI; 13 | import org.eclipse.rdf4j.model.Literal; 14 | import org.eclipse.rdf4j.model.Model; 15 | import org.eclipse.rdf4j.model.Value; 16 | import org.eclipse.rdf4j.model.ValueFactory; 17 | import org.eclipse.rdf4j.model.impl.SimpleValueFactory; 18 | import org.eclipse.rdf4j.model.vocabulary.RDFS; 19 | import org.eclipse.rdf4j.model.vocabulary.XMLSchema; 20 | import at.ac.univie.mminf.qskos4j.issues.Issue; 21 | import at.ac.univie.mminf.qskos4j.issues.labels.util.EmptyLabelsResult; 22 | import at.ac.univie.mminf.qskos4j.issues.language.IncompleteLangCovResult; 23 | import at.ac.univie.mminf.qskos4j.issues.language.OmittedOrInvalidLanguageTagsResult; 24 | import at.ac.univie.mminf.qskos4j.issues.relations.UnidirectionallyRelatedConceptsResult; 25 | import at.ac.univie.mminf.qskos4j.result.CollectionResult; 26 | import at.ac.univie.mminf.qskos4j.util.IssueDescriptor.IssueType; 27 | import fr.sparna.rdf.skos.testtool.IssueDescription; 28 | import fr.sparna.rdf.skos.testtool.ReportDisplay; 29 | import fr.sparna.rdf.skos.testtool.TestToolConfig; 30 | 31 | /** 32 | * Generate the qdv report 33 | * @author clarvie 34 | * 35 | */ 36 | public class DQVReport { 37 | 38 | protected String computedOn; 39 | 40 | protected String lang; 41 | 42 | protected Model model; 43 | 44 | protected ValueFactory f; 45 | 46 | SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 47 | Date date = new Date(); 48 | String dates = dateFormat.format(date); 49 | String key = UUID.randomUUID().toString(); 50 | 51 | public DQVReport(String computedOn, String lang, Model model,ValueFactory f) { 52 | super(); 53 | this.computedOn = computedOn; 54 | this.lang=lang; 55 | this.model=model; 56 | this.f=f; 57 | } 58 | 59 | public Model dqvout(Collection qSkosResult) throws IOException{ 60 | 61 | for (Issue issue : qSkosResult) { 62 | if(issue.getIssueDescriptor().getType()==IssueType.ANALYTICAL){ 63 | writeDQVReport(issue); 64 | } 65 | } 66 | return this.model; 67 | } 68 | 69 | /** 70 | * 71 | * @param issue 72 | * @throws IOException 73 | * @throws RDF4JException 74 | */ 75 | private void writeDQVReport(Issue issue) 76 | throws IOException, RDF4JException 77 | { 78 | 79 | 80 | IssueDescription desc = TestToolConfig.getInstance().getApplicationData().findIssueDescriptionById(issue.getIssueDescriptor().getId()); 81 | String ndqv= "http://www.w3.org/ns/dqv#"; 82 | String nex="http://w3id.org/quality/qskos/"; 83 | 84 | IRI ptype= f.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"); 85 | IRI pcomputedOn = f.createIRI(ndqv+"computedOn"); 86 | IRI pdate = f.createIRI("http://purl.org/dc/terms/date"); 87 | IRI pvalue = f.createIRI(ndqv+"value"); 88 | IRI pisMeasurementOf = f.createIRI(ndqv+"isMeasurementOf"); 89 | 90 | IRI measure= f.createIRI(nex+issue.getIssueDescriptor().getName().replace(" ", "")+"#"+key); 91 | model.add(measure, ptype, f.createIRI(ndqv+"QualityMeasurement")); 92 | 93 | if (this.computedOn.startsWith("http://") || this.computedOn.startsWith("https://"))model.add(measure, pcomputedOn,f.createIRI(this.computedOn)); 94 | else { 95 | Value datasetPath = f.createLiteral(this.computedOn, XMLSchema.STRING); 96 | model.add(measure, pcomputedOn,datasetPath); 97 | } 98 | 99 | Value ldate = f.createLiteral(dates, XMLSchema.DATETIME); 100 | model.add(measure, pdate, ldate); 101 | int i = new Integer(0); 102 | String res ; 103 | Value lval; 104 | StringBuffer buffer = new StringBuffer(); 105 | try { 106 | long r = issue.getResult().occurrenceCount(); 107 | if (issue.getResult().isProblematic()){ 108 | res = Long.toString(issue.getResult().occurrenceCount()); 109 | IRI dataProperty= f.createIRI("http://purl.org/dc/terms/relation"); 110 | 111 | for(IRI st : getAlldata(issue)){ 112 | model.add(measure, dataProperty,st); 113 | } 114 | } 115 | else 116 | res = "0"; 117 | lval = f.createLiteral( res , XMLSchema.INTEGER); 118 | }catch (java.lang.UnsupportedOperationException e) { 119 | // in case the issue is not associated with a list of elements having the problem the methods occurenceCount is not defined. That happen with the issue "No Common Languages:" 120 | // then we encode the result as a boolean, plus a annotation explaining . 121 | if (issue.getResult().isProblematic()) lval = f.createLiteral( "true" , XMLSchema.BOOLEAN); 122 | else lval = f.createLiteral( "false" , XMLSchema.BOOLEAN); 123 | } 124 | model.add(measure, pvalue, lval); 125 | 126 | IRI uriDimension= f.createIRI(nex+"numOf"+issue.getIssueDescriptor().getName().replace(" ", "")); 127 | model.add(measure, pisMeasurementOf, uriDimension); 128 | 129 | Literal uriName= f.createLiteral("rule "+desc.getId()+" checked on "+computedOn+" at date "+dates); 130 | model.add(measure, RDFS.LABEL, uriName); 131 | 132 | 133 | } 134 | /** 135 | * 136 | * @param issue 137 | * @return 138 | */ 139 | public List getAlldata(Issue issue){ 140 | List messages=new ArrayList(); 141 | 142 | 143 | if(issue.getResult() instanceof CollectionResult) { 144 | CollectionResult collectionResult = (CollectionResult)issue.getResult(); 145 | Collection collection = (Collection)collectionResult.getData(); 146 | 147 | collection.forEach(item-> { 148 | 149 | if(item instanceof IRI) { 150 | messages.add((IRI)item); 151 | } else if (item instanceof Collection) { 152 | // collections inside a collection, case of "disconnected concept clusters" 153 | Collection c = (Collection)item; 154 | c.stream().forEach(elmt -> { 155 | if(elmt instanceof IRI) { 156 | messages.add((IRI)elmt); 157 | } 158 | }); 159 | } 160 | }); 161 | } 162 | if(issue.getResult() instanceof OmittedOrInvalidLanguageTagsResult){ 163 | OmittedOrInvalidLanguageTagsResult res=(OmittedOrInvalidLanguageTagsResult) issue.getResult(); 164 | res.getData().entrySet().stream().forEach(entry->{ 165 | StringBuffer buffer = new StringBuffer(); 166 | messages.add((IRI)entry.getKey()); 167 | }); 168 | } 169 | /*-------------------Empty labels--------------------------------*/ 170 | else if(issue.getResult() instanceof EmptyLabelsResult){ 171 | EmptyLabelsResult res=(EmptyLabelsResult) issue.getResult(); 172 | res.getData().entrySet().stream().forEach(entry->{ 173 | messages.add((IRI)entry.getKey()); 174 | }); 175 | } 176 | if(issue.getResult() instanceof IncompleteLangCovResult){ 177 | IncompleteLangCovResult res=(IncompleteLangCovResult) issue.getResult(); 178 | res.getData().entrySet().stream().forEach(entry->{ 179 | messages.add((IRI)entry.getKey()); 180 | }); 181 | 182 | }else if(issue.getResult() instanceof UnidirectionallyRelatedConceptsResult){ 183 | UnidirectionallyRelatedConceptsResult res=(UnidirectionallyRelatedConceptsResult) issue.getResult(); 184 | res.getData().entrySet().stream().forEach(entry->{ 185 | entry.getKey().getElements().stream().forEach(aResource ->{ 186 | messages.add((IRI)aResource); 187 | }); 188 | }); 189 | } 190 | return messages; 191 | } 192 | 193 | } 194 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/rdf/skos/testtool/api/RdfMessageConverter.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.rdf.skos.testtool.api; 2 | 3 | import java.io.IOException; 4 | 5 | import org.eclipse.rdf4j.model.IRI; 6 | import org.eclipse.rdf4j.model.Literal; 7 | import org.eclipse.rdf4j.model.Model; 8 | import org.eclipse.rdf4j.model.Statement; 9 | import org.eclipse.rdf4j.model.ValueFactory; 10 | import org.eclipse.rdf4j.model.impl.LinkedHashModel; 11 | import org.eclipse.rdf4j.model.impl.SimpleValueFactory; 12 | import org.eclipse.rdf4j.model.vocabulary.SKOS; 13 | import org.eclipse.rdf4j.rio.RDFFormat; 14 | import org.eclipse.rdf4j.rio.Rio; 15 | import org.slf4j.Logger; 16 | import org.slf4j.LoggerFactory; 17 | import org.springframework.http.HttpInputMessage; 18 | import org.springframework.http.HttpOutputMessage; 19 | import org.springframework.http.converter.AbstractHttpMessageConverter; 20 | import org.springframework.http.converter.HttpMessageNotReadableException; 21 | import org.springframework.http.converter.HttpMessageNotWritableException; 22 | 23 | import at.ac.univie.mminf.qskos4j.util.vocab.SkosOntology; 24 | 25 | public class RdfMessageConverter extends AbstractHttpMessageConverter{ 26 | 27 | protected Logger log = LoggerFactory.getLogger(this.getClass().getName()); 28 | 29 | protected RDFFormat rdfFormat; 30 | 31 | public RdfMessageConverter(String mimeType) { 32 | super(); 33 | this.rdfFormat = Rio.getWriterFormatForMIMEType(mimeType).orElse(RDFFormat.RDFXML); 34 | log.debug("Built RdfMessageConverter with contentType "+this.rdfFormat.getDefaultMIMEType()); 35 | } 36 | 37 | @Override 38 | protected Model readInternal(Class c, HttpInputMessage in) 39 | throws IOException, HttpMessageNotReadableException { 40 | 41 | Model m = new LinkedHashModel(); 42 | 43 | return m; 44 | } 45 | 46 | @Override 47 | protected boolean supports(Class c) { 48 | return true; 49 | } 50 | 51 | @Override 52 | protected void writeInternal(Model m, HttpOutputMessage out) throws IOException, HttpMessageNotWritableException { 53 | log.info("RdfMessageConverter called"); 54 | Rio.write(m, out.getBody(), this.rdfFormat); 55 | } 56 | 57 | } 58 | 59 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/java/fr/sparna/web/BaseURL.java: -------------------------------------------------------------------------------- 1 | package fr.sparna.web; 2 | 3 | import java.net.MalformedURLException; 4 | import java.net.URL; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | 8 | public class BaseURL { 9 | 10 | public static URL buildBaseURL(HttpServletRequest request) { 11 | try { 12 | return new URL("http://"+request.getServerName()+((request.getServerPort() != 80)?":"+request.getServerPort():"")+request.getContextPath()); 13 | } catch (MalformedURLException e) { 14 | e.printStackTrace(); 15 | return null; 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/resources/fr/sparna/rdf/skos/testtool/properties/Bundle_en.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/resources/fr/sparna/rdf/skos/testtool/properties/Bundle_en.properties -------------------------------------------------------------------------------- /skos-testing-tool/src/main/resources/fr/sparna/rdf/skos/testtool/properties/Bundle_fr.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/resources/fr/sparna/rdf/skos/testtool/properties/Bundle_fr.properties -------------------------------------------------------------------------------- /skos-testing-tool/src/main/resources/log4j.dtd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 28 | 29 | 30 | 31 | 32 | 33 | 37 | 38 | 39 | 40 | 41 | 42 | 46 | 47 | 48 | 51 | 52 | 53 | 56 | 57 | 58 | 59 | 60 | 61 | 64 | 65 | 66 | 67 | 68 | 71 | 72 | 73 | 77 | 78 | 79 | 80 | 81 | 85 | 86 | 87 | 88 | 92 | 93 | 94 | 95 | 96 | 97 | 102 | 103 | 104 | 105 | 106 | 110 | 111 | 112 | 113 | 115 | 116 | 117 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 136 | 137 | 138 | 139 | 141 | 142 | 143 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/resources/log4j.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/jsp/footer.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> 2 | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 3 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 |  |  12 |   13 | 14 |
15 |
16 |
-------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/jsp/header.jsp: -------------------------------------------------------------------------------- 1 | 2 | <%@ page language="java" contentType="text/html; charset=UTF-8" 3 | pageEncoding="UTF-8"%> 4 | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 5 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 7 | 8 | 9 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/jsp/home.jsp: -------------------------------------------------------------------------------- 1 | 2 | <%@ page language="java" contentType="text/html; charset=UTF-8" 3 | pageEncoding="UTF-8"%> 4 | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 5 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 7 | 8 | 9 | 11 | 13 | 14 | 15 | 17 | 18 | 19 | 20 | 21 | 22 | <fmt:message key="menu.brand"/> 23 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 54 | 68 | 69 | 70 | 71 | Fork me on GitHub 76 | 77 | 78 | 79 |
80 | 81 | 82 |
83 | ${data.msg} 84 |
85 |
86 | 87 |

88 | 89 |
92 | 93 |
94 |

95 | 96 |
97 |
98 | 100 |
101 |
103 | 104 | 105 | 107 | 108 |
109 | 110 | 111 |
112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 |
122 | 123 |
124 |
125 | 126 |
127 | 128 |
129 |
130 | 131 | 133 | 134 | 137 |
138 | 139 | 140 |
141 |
142 | 143 |
144 |
145 | 146 |
147 | 154 |
155 |
156 |
157 | 158 |
159 | 162 |
163 |
164 |
165 | 166 | 167 | 168 |
169 |
170 | 178 |
179 |
180 | 181 |
${rule.id}
182 |
183 |
184 | 185 | checked> 188 | 189 | 190 | 191 | 192 | 193 | 194 | ${label.value} 195 | 196 | 197 | 198 | 199 | 200 | 201 | ${label.value} 202 | 203 | 204 | 205 | 206 | 207 | 208 |
209 | 211 | 212 | 213 | 214 | ${desc.value} 215 | 216 | 217 | 218 | 219 | 220 | 221 | ${desc.value} 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 275 |
276 |
277 |
278 |
279 |
280 | 281 | 282 | 283 |
284 |
285 | 286 | 287 |
288 | 289 |
290 | 291 | 292 | 293 | 298 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/jsp/result.jsp: -------------------------------------------------------------------------------- 1 | 2 | <%@ page language="java" contentType="text/html; charset=UTF-8" 3 | pageEncoding="UTF-8"%> 4 | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 5 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 7 | 9 | 11 | 12 | 14 | 15 | 16 | 17 | <fmt:message key="menu.brand"/> : ${data.fileName} 18 | 19 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 32 | 34 | 43 | 44 | 45 | 46 | 56 |
57 |
58 |
59 | 60 | 61 | 62 | 63 |   64 |
${filevalidated}
65 | 66 |
67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |

${value}

80 |

${validate}

81 |

82 | 83 | 84 |  |  85 |   86 | 87 |

88 |
89 |
90 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 122 | 123 | 124 | 125 | 126 | 127 |
${error.id} - ${error.ruleName}${error.description}
${error.state}
109 |
110 | 111 | ${list} 112 |
113 |
114 |
115 | 121 |
128 |
129 |
130 | 131 | 140 | 141 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/jsp/wait.jsp: -------------------------------------------------------------------------------- 1 | 2 | <%@ page language="java" contentType="text/html; charset=UTF-8" 3 | pageEncoding="UTF-8"%> 4 | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 5 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 6 | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Validator 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Skos file validator
29 |
30 |
31 |
32 | 33 |
34 | 35 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | validator 5 | 6 | 7 | langFilter 8 | fr.sparna.rdf.skos.testtool.LangFilter 9 | 10 | 11 | langFilter 12 | /* 13 | 14 | 15 | spring-dispatcher 16 | org.springframework.web.servlet.DispatcherServlet 17 | 1 18 | 19 | 20 | spring-dispatcher 21 | / 22 | 23 | 24 | welcomefile.jsp 25 | 26 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/logs/report.txt: -------------------------------------------------------------------------------- 1 | *********************************** 2 | Orphan Concepts: FAIL (1) 3 | Empty Labels: FAIL (1) 4 | Undocumented Concepts: FAIL (19) 5 | Incomplete Language Coverage: FAIL (9) 6 | Omitted or Invalid Language Tags: OK 7 | Overlapping Labels: FAIL (1) 8 | Missing Out-Link: FAIL (20) 9 | Missing Labels: FAIL (10) 10 | Disconnected Concept Clusters: FAIL (9) 11 | Hierarchical Redundancy: OK 12 | Ambiguous Notation References: OK 13 | Reflexively Related Concepts: OK 14 | Solely Transitively Related Concepts: OK 15 | Unidirectionally Related Concepts: FAIL (10) 16 | Valueless Associative Relations: OK 17 | Mapping Relations Misuse: OK 18 | Relation Clashes: OK 19 | Undefined SKOS Resources: OK 20 | HTTP URI Scheme Violation: OK 21 | Top Concepts Having Broader Concepts: OK 22 | Omitted Top Concepts: FAIL (1) 23 | Disjoint Labels Violation: OK 24 | No Common Languages: OK 25 | Inconsistent Preferred Labels: OK 26 | Unprintable Characters in Labels: OK 27 | 28 | * Detailed coverage of each Quality Issue: 29 | 30 | --- Orphan Concepts 31 | Description: Finds all orphan concepts, i.e. those not having semantic relationships to other concepts. 32 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#orphan-concepts 33 | count: 1 34 | http://irstea.fr/thesaurus/6618 35 | 36 | --- Empty Labels 37 | Description: Finds empty labels or labels containing only whitespaces. 38 | count: 1 39 | 40 | http://irstea.fr/thesaurus/9556: [LABEL, PREF_LABEL] 41 | 42 | 43 | --- Undocumented Concepts 44 | Description: Finds concepts that don't use any SKOS documentation properties. 45 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#undocumented-concepts 46 | count: 19 47 | http://irstea.fr/thesaurus/9394 48 | http://irstea.fr/thesaurus/1700 49 | http://irstea.fr/thesaurus/9281 50 | http://irstea.fr/thesaurus/9387 51 | http://irstea.fr/thesaurus/6581 52 | http://irstea.fr/thesaurus/1058 53 | http://irstea.fr/thesaurus/4482 54 | http://irstea.fr/thesaurus/4672 55 | http://irstea.fr/thesaurus/9267 56 | http://irstea.fr/thesaurus/9355 57 | http://irstea.fr/thesaurus/6612 58 | http://irstea.fr/thesaurus/7005 59 | http://irstea.fr/thesaurus/9337 60 | http://irstea.fr/thesaurus/6868 61 | http://irstea.fr/thesaurus/6869 62 | http://irstea.fr/thesaurus/10729 63 | http://irstea.fr/thesaurus/6613 64 | http://irstea.fr/thesaurus/5306 65 | http://irstea.fr/thesaurus/6618 66 | 67 | --- Incomplete Language Coverage 68 | Description: Finds concepts lacking description in languages that are present for other concepts. 69 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#incomplete-language-coverage 70 | count: 9 71 | concept: 'http://irstea.fr/thesaurus/6612', not covered languages: [de, en, es] 72 | concept: 'http://irstea.fr/thesaurus/7005', not covered languages: [de, en, es] 73 | concept: 'http://irstea.fr/thesaurus/6869', not covered languages: [de, en, es] 74 | concept: 'http://irstea.fr/thesaurus/10729', not covered languages: [de, en, es] 75 | concept: 'http://irstea.fr/thesaurus/6613', not covered languages: [de, en, es] 76 | concept: 'http://irstea.fr/thesaurus/1700', not covered languages: [de, en, es] 77 | concept: 'http://irstea.fr/thesaurus/5306', not covered languages: [de, en, es] 78 | concept: 'http://irstea.fr/thesaurus/1058', not covered languages: [de, en, es] 79 | concept: 'http://irstea.fr/thesaurus/4672', not covered languages: [de, en, es] 80 | 81 | --- Omitted or Invalid Language Tags 82 | Description: Finds omitted or invalid language tags of text literals. 83 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#omitted-or-invalid-language-tags 84 | count: 0 85 | 86 | 87 | --- Overlapping Labels 88 | Description: Finds concepts with similar (identical) labels. 89 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#overlapping-labels 90 | count: 1 91 | [http://irstea.fr/thesaurus/6612 ("VAPEUR"@fr, PREF_LABEL), http://irstea.fr/thesaurus/6613 ("VAPEUR"@fr, PREF_LABEL)] 92 | 93 | --- Missing Out-Link 94 | Description: Finds concepts that are not linked to other vocabularies on the Web. 95 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#missing-out-links 96 | count: 20 97 | http://irstea.fr/thesaurus/9394 98 | http://irstea.fr/thesaurus/1700 99 | http://irstea.fr/thesaurus/9281 100 | http://irstea.fr/thesaurus/9387 101 | http://irstea.fr/thesaurus/6581 102 | http://irstea.fr/thesaurus/1058 103 | http://irstea.fr/thesaurus/9556 104 | http://irstea.fr/thesaurus/4482 105 | http://irstea.fr/thesaurus/4672 106 | http://irstea.fr/thesaurus/9267 107 | http://irstea.fr/thesaurus/9355 108 | http://irstea.fr/thesaurus/6612 109 | http://irstea.fr/thesaurus/7005 110 | http://irstea.fr/thesaurus/9337 111 | http://irstea.fr/thesaurus/6868 112 | http://irstea.fr/thesaurus/6869 113 | http://irstea.fr/thesaurus/10729 114 | http://irstea.fr/thesaurus/6613 115 | http://irstea.fr/thesaurus/5306 116 | http://irstea.fr/thesaurus/6618 117 | 118 | --- Missing Labels 119 | Description: Finds concepts and conceptSchemes with missing labels. 120 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#missing-labels 121 | count: 10 122 | http://irstea.fr/thesaurus/9394 123 | http://irstea.fr/thesaurus/9281 124 | http://irstea.fr/thesaurus/9387 125 | http://irstea.fr/thesaurus/6581 126 | http://irstea.fr/thesaurus/4482 127 | http://irstea.fr/thesaurus/9267 128 | http://irstea.fr/thesaurus/9355 129 | http://irstea.fr/thesaurus/9337 130 | http://irstea.fr/thesaurus/6868 131 | http://irstea.fr/thesaurus/6618 132 | 133 | --- Disconnected Concept Clusters 134 | Description: Finds sets of concepts that are isolated from the rest of the vocabulary. 135 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#disconnected-concept-clusters 136 | count: 9 137 | Cluster 1, size: 2 138 | Cluster 2, size: 3 139 | Cluster 3, size: 2 140 | Cluster 4, size: 2 141 | Cluster 5, size: 2 142 | Cluster 6, size: 2 143 | Cluster 7, size: 2 144 | Cluster 8, size: 2 145 | Cluster 9, size: 2 146 | Cluster 1, size: 2 147 | http://irstea.fr/thesaurus/1058 148 | http://irstea.fr/thesaurus/9267 149 | Cluster 2, size: 3 150 | http://irstea.fr/thesaurus/1700 151 | http://irstea.fr/thesaurus/9281 152 | http://irstea.fr/thesaurus/9556 153 | Cluster 3, size: 2 154 | http://irstea.fr/thesaurus/5306 155 | http://irstea.fr/thesaurus/9355 156 | Cluster 4, size: 2 157 | http://irstea.fr/thesaurus/6868 158 | http://irstea.fr/thesaurus/6869 159 | Cluster 5, size: 2 160 | http://irstea.fr/thesaurus/4482 161 | http://irstea.fr/thesaurus/4672 162 | Cluster 6, size: 2 163 | http://irstea.fr/thesaurus/9337 164 | http://irstea.fr/thesaurus/10729 165 | Cluster 7, size: 2 166 | http://irstea.fr/thesaurus/7005 167 | http://irstea.fr/thesaurus/9394 168 | Cluster 8, size: 2 169 | http://irstea.fr/thesaurus/6612 170 | http://irstea.fr/thesaurus/9387 171 | Cluster 9, size: 2 172 | http://irstea.fr/thesaurus/6613 173 | http://irstea.fr/thesaurus/6581 174 | 175 | --- Hierarchical Redundancy 176 | Description: Finds broader/narrower relations over multiple hierarchy levels. 177 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#hierarchical-redundancy 178 | count: 0 179 | 180 | 181 | --- Ambiguous Notation References 182 | Description: Finds concepts with multiple or identical notations within the same concept scheme. 183 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#Ambiguous_Notation_References 184 | count: 0 185 | 186 | 187 | --- Reflexively Related Concepts 188 | Description: Finds concepts that are related to themselves. 189 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Reflexive_Relations 190 | count: 0 191 | 192 | 193 | --- Solely Transitively Related Concepts 194 | Description: Concepts only related by skos:broaderTransitive or skos:narrowerTransitive. 195 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#solely-transitively-related-concepts 196 | count: 0 197 | 198 | 199 | --- Unidirectionally Related Concepts 200 | Description: Concepts not including reciprocal relations 201 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#unidirectionally-related-concepts 202 | count: 10 203 | concepts: (http://irstea.fr/thesaurus/7005, http://irstea.fr/thesaurus/9394), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 204 | concepts: (http://irstea.fr/thesaurus/1058, http://irstea.fr/thesaurus/9267), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 205 | concepts: (http://irstea.fr/thesaurus/10729, http://irstea.fr/thesaurus/9337), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 206 | concepts: (http://irstea.fr/thesaurus/9556, http://irstea.fr/thesaurus/9281), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 207 | concepts: (http://irstea.fr/thesaurus/5306, http://irstea.fr/thesaurus/9355), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 208 | concepts: (http://irstea.fr/thesaurus/6869, http://irstea.fr/thesaurus/6868), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 209 | concepts: (http://irstea.fr/thesaurus/4672, http://irstea.fr/thesaurus/4482), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 210 | concepts: (http://irstea.fr/thesaurus/6613, http://irstea.fr/thesaurus/6581), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 211 | concepts: (http://irstea.fr/thesaurus/6612, http://irstea.fr/thesaurus/9387), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 212 | concepts: (http://irstea.fr/thesaurus/1700, http://irstea.fr/thesaurus/9281), related by: 'skos:broaderTransitive/skos:narrowerTransitive' 213 | 214 | 215 | --- Valueless Associative Relations 216 | Description: Finds sibling concept pairs that are also connected by an associative relation. 217 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#valueless-associative-relations 218 | count: 0 219 | 220 | 221 | --- Mapping Relations Misuse 222 | Description: Finds concepts within the same concept scheme that are related by a mapping relation. 223 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#mapping-relations-misuse 224 | count: 0 225 | 226 | 227 | --- Relation Clashes 228 | Description: Covers condition S27 from the SKOS reference document (Associative vs. Hierarchical Relation Clashes). 229 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#relation-clashes 230 | count: 0 231 | 232 | 233 | --- Undefined SKOS Resources 234 | Description: Finds 'invented' new terms within the SKOS namespace or deprecated properties. 235 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#undefined-skos-resources 236 | count: 0 237 | 238 | 239 | --- HTTP URI Scheme Violation 240 | Description: Finds triple subjects that are no HTTP URIs. 241 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#http-uri-scheme-violation 242 | count: 0 243 | 244 | 245 | --- Top Concepts Having Broader Concepts 246 | Description: Finds top concepts internal to the vocabulary hierarchy tree. 247 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#top-concepts-having-broader-concepts 248 | count: 0 249 | 250 | 251 | --- Omitted Top Concepts 252 | Description: Finds skos:ConceptSchemes that don't have top concepts defined. 253 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#omitted-top-concepts 254 | count: 1 255 | http://irstea.fr/thesaurus/scheme 256 | 257 | --- Disjoint Labels Violation 258 | Description: Finds resources with identical entries for different label types. 259 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#disjoint-labels-violation 260 | count: 0 261 | 262 | 263 | 264 | --- No Common Languages 265 | Description: Checks for common languages in all concept literals. 266 | At least one common language for text literals of all concepts has been found 267 | Common language(s) for all concepts: [fr] 268 | 269 | --- Inconsistent Preferred Labels 270 | Description: Finds resources with more then one prefLabel per language. 271 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#inconsistent-preferred-labels 272 | count: 0 273 | 274 | 275 | 276 | --- Unprintable Characters in Labels 277 | Description: Finds concepts having labels that contain unprintable characters. 278 | Detailed information: https://github.com/cmader/qSKOS/wiki/Quality-Issues#unprintable-characters-in-labels 279 | count: 0 280 | 281 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/css/bootstrap-table-expandable.css: -------------------------------------------------------------------------------- 1 | table.table-expandable > tbody > tr:nth-child(odd) { 2 | cursor: pointer; 3 | } 4 | 5 | table.table-expandable.table-hover > tbody > tr:nth-child(even):hover td { 6 | background-color: white; 7 | } 8 | 9 | table.table-expandable > tbody > tr div.table-expandable-arrow { 10 | background:transparent url(../images/arrows.png) no-repeat scroll 0px -16px; width:16px; height:16px; display:block; 11 | } 12 | 13 | table.table-expandable > tbody > tr div.table-expandable-arrow.up { 14 | background-position:0px 0px; 15 | } -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/images/arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/bootstrap/images/arrows.png -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/js/bootstrap-table-expandable.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $(function () { 3 | $('.table-expandable').each(function () { 4 | /* var table = $(this); 5 | table.children('tbody').children('tr').filter(':odd').hide(); 6 | var element = $(this); 7 | 8 | table.children('tbody').children('tr').filter(':even').click(function () { 9 | var element = $(this); 10 | element.next('tr').toggle('slow'); 11 | element.find(".table-expandable-arrow").toggleClass("up"); 12 | }); 13 | table.children('tbody').children('tr').filter(':even').each(function () { 14 | var element = $(this); 15 | element.append('
'); 16 | });*/ 17 | }); 18 | }); 19 | })(jQuery); -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/css/jquery-ui.structure.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.12.1 - 2016-11-06 2 | * http://jqueryui.com 3 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px} -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/css/jquery-ui.theme.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.12.1 - 2016-11-06 2 | * http://jqueryui.com 3 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 4 | 5 | .ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/css/media.css: -------------------------------------------------------------------------------- 1 | @media only print{ 2 | 3 | html, body { 4 | float:left; 5 | } 6 | 7 | @page { 8 | size: A4; 9 | margin: 0mm; 10 | } 11 | 12 | 13 | html { 14 | width: 1200px; 15 | margin-left:-555px; 16 | } 17 | 18 | 19 | body { 20 | line-height: 1em; 21 | word-spacing:1px; 22 | letter-spacing:0.2px; 23 | font: 14px "Times New Roman", Times, serif; 24 | background:white; 25 | color:black; 26 | width: 100%; 27 | } 28 | 29 | .table-outer:FIRST-CHILD{ 30 | height:unset; 31 | overflow:visible; 32 | } 33 | 34 | /* avoid page-breaks inside a listingContainer*/ 35 | .listingContainer{ 36 | page-break-inside: avoid; 37 | } 38 | 39 | h1 { 40 | font: 28px "Times New Roman", Times, serif; 41 | } 42 | 43 | h2 { 44 | font: 24px "Times New Roman", Times, serif; 45 | } 46 | 47 | h3 { 48 | font: 20px "Times New Roman", Times, serif; 49 | } 50 | 51 | /* Improve colour contrast of links */ 52 | a:link, a:visited { 53 | color: #781351 54 | } 55 | 56 | /* URL */ 57 | a:link, a:visited { 58 | background: transparent; 59 | color:#333; 60 | text-decoration:none; 61 | } 62 | 63 | a[href]:after { 64 | content: "" !important; 65 | } 66 | 67 | a[href^="http://"] { 68 | color:#000; 69 | } 70 | 71 | #header { 72 | height:75px; 73 | font-size: 24pt; 74 | color:black 75 | } 76 | .table-outer:after{ 77 | height:unset; 78 | overflow:visible; 79 | } 80 | 81 | 82 | } -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/css/print-preview.css: -------------------------------------------------------------------------------- 1 | #print-modal { 2 | background: #FFF; 3 | position: absolute; 4 | left: 50%; 5 | margin: 0 0 0 -465px; 6 | padding: 0 68px; 7 | width: 994px; 8 | box-shadow: 0 0 20px #000; 9 | -moz-box-shadow: 0 0 20px #000; 10 | -webkit-box-shadow: 0 0 10px #000; 11 | } 12 | 13 | #print-modal-content { 14 | margin: 68px 0; 15 | border: none; 16 | height: 100%; 17 | overflow: hidden; 18 | width: 100%; 19 | } 20 | 21 | #print-modal-controls { 22 | border: 1px solid #ccc; 23 | border-radius: 8px; 24 | -webkit-border-radius: 8px; 25 | -moz-border-radius: 8px; 26 | top: 15px; 27 | left: 50%; 28 | margin: 0 0 0 -81px; 29 | position: fixed; 30 | padding: 5px 0; 31 | background: rgba(250, 250, 250, 0.75); 32 | } 33 | #print-modal-controls a { 34 | color: #FFF; 35 | display: block; 36 | float: left; 37 | height: 32px; 38 | text-decoration: none; 39 | text-indent: -999em; 40 | width: 80px; 41 | } 42 | 43 | #print-modal-controls a:hover { 44 | opacity: 0.75; 45 | } 46 | 47 | #print-modal-controls a.print { 48 | background: url(../images/icon-print.png) no-repeat 50% 50%; 49 | } 50 | #print-modal-controls a.close { 51 | background: url(../images/icon-close.png) no-repeat 50% 50%; 52 | } 53 | 54 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/css/print.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Example Print Preview site 3 | * 4 | * print.css 5 | * author: Tim Connell 6 | */ 7 | 8 | /* -- Hide screen specific elements -- */ 9 | .hidden-print { 10 | display: none; 11 | } 12 | 13 | @page { 14 | size: A4; 15 | margin: 0; 16 | margin-top:50px; 17 | } 18 | 19 | 20 | /* -- Typography -- */ 21 | p, table, ul, ol, dl, blockquote, pre, code, form { 22 | margin: 0 0 1em; 23 | } 24 | 25 | 26 | .table-outer:FIRST-CHILD{ 27 | height:unset; 28 | overflow:visible; 29 | } 30 | 31 | 32 | a:link:after, 33 | a:visited:after { 34 | content: ""; 35 | font-size: 80%; 36 | text-decoration: none; 37 | } 38 | 39 | 40 | /* -- Accommodate JS driven elements --*/ 41 | #feature > div { 42 | border: none; 43 | overflow: visible; 44 | height: auto; 45 | } 46 | 47 | /* -- Footer -- */ 48 | #footer { 49 | border-top: 1px solid #cecece; 50 | font-size: 0.83em; 51 | margin: 2em 0 0; 52 | padding: 1em 0 0; 53 | } 54 | #file{ 55 | margin:auto; 56 | width:50%; 57 | border:1px solid #ebebe0; 58 | margin-top:20px; 59 | background-color:white; 60 | } 61 | .jumbotron{ 62 | width:50%; 63 | margin:auto; 64 | margin-top:50px; 65 | margin-bottom:50px; 66 | text-align:center; 67 | } 68 | #myAccordion{ 69 | width:50%; 70 | margin:auto; 71 | } 72 | #TITLE{ 73 | text-align:center; 74 | 75 | margin:auto; 76 | 77 | } 78 | 79 | 80 | 81 | 82 | body { 83 | line-height: 1em; 84 | word-spacing:1px; 85 | letter-spacing:0.2px; 86 | font: 14px "Times New Roman", Times, serif; 87 | background:white; 88 | color:black; 89 | 90 | } 91 | 92 | footer{ 93 | margin:auto; 94 | text-align:center; 95 | } 96 | #print{ 97 | margin:auto; 98 | text-align:center; 99 | } 100 | 101 | #table, #exe{ 102 | 103 | margin: auto; 104 | margin-top:15px; 105 | } 106 | #content{ 107 | border:1px solid #ebebe0; 108 | background-color:white; 109 | } 110 | #box{ 111 | 112 | margin-left:20px; 113 | text-align:left; 114 | } 115 | .danger{ 116 | 117 | border: 1px solid transparent; 118 | background-color: #f7c5c5; 119 | border-color: #e2b5b5; 120 | 121 | } 122 | .success{ 123 | 124 | border: 1px solid transparent; 125 | background-color: #d9eace; 126 | border-color: #c0d1b5; 127 | } 128 | 129 | /* avoid page-breaks inside a listingContainer*/ 130 | .listingContainer{ 131 | page-break-inside: avoid; 132 | } 133 | 134 | h1 { 135 | font: 28px "Times New Roman", Times, serif; 136 | } 137 | 138 | h2 { 139 | font: 24px "Times New Roman", Times, serif; 140 | } 141 | 142 | h3 { 143 | font: 20px "Times New Roman", Times, serif; 144 | } 145 | 146 | footer{ 147 | margin:auto; 148 | text-align:center; 149 | } 150 | #print{ 151 | margin:auto; 152 | text-align:center; 153 | } 154 | .table-outer { 155 | height:100px; 156 | overflow:hidden; 157 | } 158 | 159 | .table-outer.open { 160 | height:unset; 161 | overflow:visible; 162 | } 163 | .navigation {position:fixed;} 164 | 165 | #log{ 166 | background-color:white; 167 | width:80%; 168 | margin:auto; 169 | } 170 | 171 | #result-container { 172 | width:auto; 173 | margin-left:auto; 174 | } -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/css/style.css: -------------------------------------------------------------------------------- 1 | .homelang{ 2 | padding-right:50px; 3 | } 4 | 5 | 6 | /* larger control labels */ 7 | .control-label { 8 | font-weight: bold; 9 | font-size: 1.1em; 10 | } 11 | 12 | footer{ 13 | margin:auto; 14 | text-align:center; 15 | } 16 | 17 | 18 | #exe,#table{ 19 | margin: auto; 20 | margin-top:10px; 21 | } 22 | #content{ 23 | border:1px solid #ebebe0; 24 | background-color:white; 25 | } 26 | #box{ 27 | 28 | margin-left:20px; 29 | text-align:left; 30 | } 31 | 32 | .input-group-addon:not(.btn) { 33 | background-color: #f5f5f5; 34 | } 35 | 36 | 37 | /** Page de résultat **/ 38 | 39 | 40 | /* avoid page-breaks inside a listingContainer*/ 41 | .listingContainer{ 42 | page-break-inside: avoid; 43 | } 44 | 45 | 46 | #print{ 47 | margin:auto; 48 | text-align:center; 49 | } 50 | 51 | .table-outer { 52 | height:100px; 53 | overflow:hidden; 54 | } 55 | 56 | .table-outer.open { 57 | height:unset; 58 | overflow:visible; 59 | } 60 | 61 | .navigation { 62 | position:fixed; 63 | width:24%; 64 | padding-right:4%; 65 | } 66 | 67 | #result-container { 68 | width:76%; 69 | margin-left:24%; 70 | } 71 | 72 | .navigation .list-group-item { 73 | padding: 3px 15px; 74 | } 75 | 76 | #log{ 77 | background-color:white; 78 | width:80%; 79 | margin:auto; 80 | } 81 | -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/images/icon-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/images/icon-close.png -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/images/icon-print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/images/icon-print.png -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/images/sparna.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparna-git/skos-testing-tool/46667ad506eda7dfe5645c0533501c6cba157e4f/skos-testing-tool/src/main/webapp/theme-paper/images/sparna.jpeg -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/jasny-bootstrap/css/jasny-bootstrap.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Jasny Bootstrap v3.1.3 (http://jasny.github.io/bootstrap) 3 | * Copyright 2012-2014 Arnold Daniels 4 | * Licensed under Apache-2.0 (https://github.com/jasny/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .container-smooth{max-width:1170px}@media (min-width:1px){.container-smooth{width:auto}}.btn-labeled{padding-top:0;padding-bottom:0}.btn-label{position:relative;background:0 0;background:rgba(0,0,0,.15);display:inline-block;padding:6px 12px;left:-12px;border-radius:3px 0 0 3px}.btn-label.btn-label-right{left:auto;right:-12px;border-radius:0 3px 3px 0}.btn-lg .btn-label{padding:10px 16px;left:-16px;border-radius:5px 0 0 5px}.btn-lg .btn-label.btn-label-right{left:auto;right:-16px;border-radius:0 5px 5px 0}.btn-sm .btn-label{padding:5px 10px;left:-10px;border-radius:2px 0 0 2px}.btn-sm .btn-label.btn-label-right{left:auto;right:-10px;border-radius:0 2px 2px 0}.btn-xs .btn-label{padding:1px 5px;left:-5px;border-radius:2px 0 0 2px}.btn-xs .btn-label.btn-label-right{left:auto;right:-5px;border-radius:0 2px 2px 0}.nav-tabs-bottom{border-bottom:0;border-top:1px solid #ddd}.nav-tabs-bottom>li{margin-bottom:0;margin-top:-1px}.nav-tabs-bottom>li>a{border-radius:0 0 4px 4px}.nav-tabs-bottom>li>a:hover,.nav-tabs-bottom>li>a:focus,.nav-tabs-bottom>li.active>a,.nav-tabs-bottom>li.active>a:hover,.nav-tabs-bottom>li.active>a:focus{border:1px solid #ddd;border-top-color:transparent}.nav-tabs-left{border-bottom:0;border-right:1px solid #ddd}.nav-tabs-left>li{margin-bottom:0;margin-right:-1px;float:none}.nav-tabs-left>li>a{border-radius:4px 0 0 4px;margin-right:0;margin-bottom:2px}.nav-tabs-left>li>a:hover,.nav-tabs-left>li>a:focus,.nav-tabs-left>li.active>a,.nav-tabs-left>li.active>a:hover,.nav-tabs-left>li.active>a:focus{border:1px solid #ddd;border-right-color:transparent}.row>.nav-tabs-left{padding-right:0;padding-left:15px;margin-right:-1px;position:relative;z-index:1}.row>.nav-tabs-left+.tab-content{border-left:1px solid #ddd}.nav-tabs-right{border-bottom:0;border-left:1px solid #ddd}.nav-tabs-right>li{margin-bottom:0;margin-left:-1px;float:none}.nav-tabs-right>li>a{border-radius:0 4px 4px 0;margin-left:0;margin-bottom:2px}.nav-tabs-right>li>a:hover,.nav-tabs-right>li>a:focus,.nav-tabs-right>li.active>a,.nav-tabs-right>li.active>a:hover,.nav-tabs-right>li.active>a:focus{border:1px solid #ddd;border-left-color:transparent}.row>.nav-tabs-right{padding-left:0;padding-right:15px}.navmenu,.navbar-offcanvas{width:300px;height:auto;border-width:1px;border-style:solid;border-radius:4px}.navmenu-fixed-left,.navmenu-fixed-right,.navbar-offcanvas{position:fixed;z-index:1030;top:0;bottom:0;overflow-y:auto;border-radius:0}.navmenu-fixed-left,.navbar-offcanvas.navmenu-fixed-left{left:0;right:auto;border-width:0 1px 0 0}.navmenu-fixed-right,.navbar-offcanvas{left:auto;right:0;border-width:0 0 0 1px}.navmenu-nav{margin-bottom:10px}.navmenu-nav.dropdown-menu{position:static;margin:0;padding-top:0;float:none;border:none;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.navbar-offcanvas .navbar-nav{margin:0}@media (min-width:768px){.navbar-offcanvas{width:auto;border-top:0;box-shadow:none}.navbar-offcanvas.offcanvas{position:static;display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-offcanvas .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-offcanvas .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-offcanvas .navmenu-brand{display:none}}.navmenu-brand{display:block;font-size:18px;line-height:20px;padding:10px 15px;margin:10px 0}.navmenu-brand:hover,.navmenu-brand:focus{text-decoration:none}.navmenu-default,.navbar-default .navbar-offcanvas{background-color:#f8f8f8;border-color:#e7e7e7}.navmenu-default .navmenu-brand,.navbar-default .navbar-offcanvas .navmenu-brand{color:#777}.navmenu-default .navmenu-brand:hover,.navbar-default .navbar-offcanvas .navmenu-brand:hover,.navmenu-default .navmenu-brand:focus,.navbar-default .navbar-offcanvas .navmenu-brand:focus{color:#5e5e5e;background-color:transparent}.navmenu-default .navmenu-text,.navbar-default .navbar-offcanvas .navmenu-text{color:#777}.navmenu-default .navmenu-nav>.dropdown>a:hover .caret,.navbar-default .navbar-offcanvas .navmenu-nav>.dropdown>a:hover .caret,.navmenu-default .navmenu-nav>.dropdown>a:focus .caret,.navbar-default .navbar-offcanvas .navmenu-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navmenu-default .navmenu-nav>.open>a,.navbar-default .navbar-offcanvas .navmenu-nav>.open>a,.navmenu-default .navmenu-nav>.open>a:hover,.navbar-default .navbar-offcanvas .navmenu-nav>.open>a:hover,.navmenu-default .navmenu-nav>.open>a:focus,.navbar-default .navbar-offcanvas .navmenu-nav>.open>a:focus{background-color:#e7e7e7;color:#555}.navmenu-default .navmenu-nav>.open>a .caret,.navbar-default .navbar-offcanvas .navmenu-nav>.open>a .caret,.navmenu-default .navmenu-nav>.open>a:hover .caret,.navbar-default .navbar-offcanvas .navmenu-nav>.open>a:hover .caret,.navmenu-default .navmenu-nav>.open>a:focus .caret,.navbar-default .navbar-offcanvas .navmenu-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navmenu-default .navmenu-nav>.dropdown>a .caret,.navbar-default .navbar-offcanvas .navmenu-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}.navmenu-default .navmenu-nav.dropdown-menu,.navbar-default .navbar-offcanvas .navmenu-nav.dropdown-menu{background-color:#e7e7e7}.navmenu-default .navmenu-nav.dropdown-menu>.divider,.navbar-default .navbar-offcanvas .navmenu-nav.dropdown-menu>.divider{background-color:#f8f8f8}.navmenu-default .navmenu-nav.dropdown-menu>.active>a,.navbar-default .navbar-offcanvas .navmenu-nav.dropdown-menu>.active>a,.navmenu-default .navmenu-nav.dropdown-menu>.active>a:hover,.navbar-default .navbar-offcanvas .navmenu-nav.dropdown-menu>.active>a:hover,.navmenu-default .navmenu-nav.dropdown-menu>.active>a:focus,.navbar-default .navbar-offcanvas .navmenu-nav.dropdown-menu>.active>a:focus{background-color:#d7d7d7}.navmenu-default .navmenu-nav>li>a,.navbar-default .navbar-offcanvas .navmenu-nav>li>a{color:#777}.navmenu-default .navmenu-nav>li>a:hover,.navbar-default .navbar-offcanvas .navmenu-nav>li>a:hover,.navmenu-default .navmenu-nav>li>a:focus,.navbar-default .navbar-offcanvas .navmenu-nav>li>a:focus{color:#333;background-color:transparent}.navmenu-default .navmenu-nav>.active>a,.navbar-default .navbar-offcanvas .navmenu-nav>.active>a,.navmenu-default .navmenu-nav>.active>a:hover,.navbar-default .navbar-offcanvas .navmenu-nav>.active>a:hover,.navmenu-default .navmenu-nav>.active>a:focus,.navbar-default .navbar-offcanvas .navmenu-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navmenu-default .navmenu-nav>.disabled>a,.navbar-default .navbar-offcanvas .navmenu-nav>.disabled>a,.navmenu-default .navmenu-nav>.disabled>a:hover,.navbar-default .navbar-offcanvas .navmenu-nav>.disabled>a:hover,.navmenu-default .navmenu-nav>.disabled>a:focus,.navbar-default .navbar-offcanvas .navmenu-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navmenu-inverse,.navbar-inverse .navbar-offcanvas{background-color:#222;border-color:#080808}.navmenu-inverse .navmenu-brand,.navbar-inverse .navbar-offcanvas .navmenu-brand{color:#999}.navmenu-inverse .navmenu-brand:hover,.navbar-inverse .navbar-offcanvas .navmenu-brand:hover,.navmenu-inverse .navmenu-brand:focus,.navbar-inverse .navbar-offcanvas .navmenu-brand:focus{color:#fff;background-color:transparent}.navmenu-inverse .navmenu-text,.navbar-inverse .navbar-offcanvas .navmenu-text{color:#999}.navmenu-inverse .navmenu-nav>.dropdown>a:hover .caret,.navbar-inverse .navbar-offcanvas .navmenu-nav>.dropdown>a:hover .caret,.navmenu-inverse .navmenu-nav>.dropdown>a:focus .caret,.navbar-inverse .navbar-offcanvas .navmenu-nav>.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navmenu-inverse .navmenu-nav>.open>a,.navbar-inverse .navbar-offcanvas .navmenu-nav>.open>a,.navmenu-inverse .navmenu-nav>.open>a:hover,.navbar-inverse .navbar-offcanvas .navmenu-nav>.open>a:hover,.navmenu-inverse .navmenu-nav>.open>a:focus,.navbar-inverse .navbar-offcanvas .navmenu-nav>.open>a:focus{background-color:#080808;color:#fff}.navmenu-inverse .navmenu-nav>.open>a .caret,.navbar-inverse .navbar-offcanvas .navmenu-nav>.open>a .caret,.navmenu-inverse .navmenu-nav>.open>a:hover .caret,.navbar-inverse .navbar-offcanvas .navmenu-nav>.open>a:hover .caret,.navmenu-inverse .navmenu-nav>.open>a:focus .caret,.navbar-inverse .navbar-offcanvas .navmenu-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navmenu-inverse .navmenu-nav>.dropdown>a .caret,.navbar-inverse .navbar-offcanvas .navmenu-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navmenu-inverse .navmenu-nav.dropdown-menu,.navbar-inverse .navbar-offcanvas .navmenu-nav.dropdown-menu{background-color:#080808}.navmenu-inverse .navmenu-nav.dropdown-menu>.divider,.navbar-inverse .navbar-offcanvas .navmenu-nav.dropdown-menu>.divider{background-color:#222}.navmenu-inverse .navmenu-nav.dropdown-menu>.active>a,.navbar-inverse .navbar-offcanvas .navmenu-nav.dropdown-menu>.active>a,.navmenu-inverse .navmenu-nav.dropdown-menu>.active>a:hover,.navbar-inverse .navbar-offcanvas .navmenu-nav.dropdown-menu>.active>a:hover,.navmenu-inverse .navmenu-nav.dropdown-menu>.active>a:focus,.navbar-inverse .navbar-offcanvas .navmenu-nav.dropdown-menu>.active>a:focus{background-color:#000}.navmenu-inverse .navmenu-nav>li>a,.navbar-inverse .navbar-offcanvas .navmenu-nav>li>a{color:#999}.navmenu-inverse .navmenu-nav>li>a:hover,.navbar-inverse .navbar-offcanvas .navmenu-nav>li>a:hover,.navmenu-inverse .navmenu-nav>li>a:focus,.navbar-inverse .navbar-offcanvas .navmenu-nav>li>a:focus{color:#fff;background-color:transparent}.navmenu-inverse .navmenu-nav>.active>a,.navbar-inverse .navbar-offcanvas .navmenu-nav>.active>a,.navmenu-inverse .navmenu-nav>.active>a:hover,.navbar-inverse .navbar-offcanvas .navmenu-nav>.active>a:hover,.navmenu-inverse .navmenu-nav>.active>a:focus,.navbar-inverse .navbar-offcanvas .navmenu-nav>.active>a:focus{color:#fff;background-color:#080808}.navmenu-inverse .navmenu-nav>.disabled>a,.navbar-inverse .navbar-offcanvas .navmenu-nav>.disabled>a,.navmenu-inverse .navmenu-nav>.disabled>a:hover,.navbar-inverse .navbar-offcanvas .navmenu-nav>.disabled>a:hover,.navmenu-inverse .navmenu-nav>.disabled>a:focus,.navbar-inverse .navbar-offcanvas .navmenu-nav>.disabled>a:focus{color:#444;background-color:transparent}.alert-fixed-top,.alert-fixed-bottom{position:fixed;width:100%;z-index:1035;border-radius:0;margin:0;left:0}@media (min-width:992px){.alert-fixed-top,.alert-fixed-bottom{width:992px;left:50%;margin-left:-496px}}.alert-fixed-top{top:0;border-width:0 0 1px}@media (min-width:992px){.alert-fixed-top{border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-width:0 1px 1px}}.alert-fixed-bottom{bottom:0;border-width:1px 0 0}@media (min-width:992px){.alert-fixed-bottom{border-top-right-radius:4px;border-top-left-radius:4px;border-width:1px 1px 0}}.offcanvas{display:none}.offcanvas.in{display:block}@media (max-width:767px){.offcanvas-xs{display:none}.offcanvas-xs.in{display:block}}@media (max-width:991px){.offcanvas-sm{display:none}.offcanvas-sm.in{display:block}}@media (max-width:1199px){.offcanvas-md{display:none}.offcanvas-md.in{display:block}}.offcanvas-lg{display:none}.offcanvas-lg.in{display:block}.canvas-sliding{-webkit-transition:top .35s,left .35s,bottom .35s,right .35s;transition:top .35s,left .35s,bottom .35s,right .35s}.offcanvas-clone{height:0!important;width:0!important;overflow:hidden!important;border:none!important;margin:0!important;padding:0!important;position:absolute!important;top:auto!important;left:auto!important;bottom:0!important;right:0!important;opacity:0!important}.table.rowlink td:not(.rowlink-skip),.table .rowlink td:not(.rowlink-skip){cursor:pointer}.table.rowlink td:not(.rowlink-skip) a,.table .rowlink td:not(.rowlink-skip) a{color:inherit;font:inherit;text-decoration:inherit}.table-hover.rowlink tr:hover td,.table-hover .rowlink tr:hover td{background-color:#cfcfcf}.btn-file{overflow:hidden;position:relative;vertical-align:middle}.btn-file>input{position:absolute;top:0;right:0;margin:0;opacity:0;filter:alpha(opacity=0);font-size:23px;height:100%;width:100%;direction:ltr;cursor:pointer}.fileinput{margin-bottom:9px;display:inline-block}.fileinput .form-control{padding-top:7px;padding-bottom:5px;display:inline-block;margin-bottom:0;vertical-align:middle;cursor:text}.fileinput .thumbnail{overflow:hidden;display:inline-block;margin-bottom:5px;vertical-align:middle;text-align:center}.fileinput .thumbnail>img{max-height:100%}.fileinput .btn{vertical-align:middle}.fileinput-exists .fileinput-new,.fileinput-new .fileinput-exists{display:none}.fileinput-inline .fileinput-controls{display:inline}.fileinput-filename{vertical-align:middle;display:inline-block;overflow:hidden}.form-control .fileinput-filename{vertical-align:bottom}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new.input-group .btn-file,.fileinput-new .input-group .btn-file{border-radius:0 4px 4px 0}.fileinput-new.input-group .btn-file.btn-xs,.fileinput-new .input-group .btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new .input-group .btn-file.btn-sm{border-radius:0 3px 3px 0}.fileinput-new.input-group .btn-file.btn-lg,.fileinput-new .input-group .btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput .fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput .thumbnail{border-color:#faebcc}.form-group.has-error .fileinput .fileinput-preview{color:#a94442}.form-group.has-error .fileinput .thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput .fileinput-preview{color:#3c763d}.form-group.has-success .fileinput .thumbnail{border-color:#d6e9c6}.input-group-addon:not(:first-child){border-left:0} -------------------------------------------------------------------------------- /skos-testing-tool/src/main/webapp/theme-paper/js/jquery.print-preview.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Print Previw Plugin v1.0.1 3 | * 4 | * Copyright 2011, Tim Connell 5 | * Licensed under the GPL Version 2 license 6 | * http://www.gnu.org/licenses/gpl-2.0.html 7 | * 8 | * Date: Wed Jan 25 00:00:00 2012 -000 9 | */ 10 | 11 | (function($) { 12 | 13 | // Initialization 14 | $.fn.printPreview = function() { 15 | this.each(function() { 16 | $(this).bind('click', function(e) { 17 | e.preventDefault(); 18 | if (!$('#print-modal').length) { 19 | $.printPreview.loadPrintPreview(); 20 | } 21 | }); 22 | }); 23 | return this; 24 | }; 25 | 26 | // Private functions 27 | var mask, size, print_modal, print_controls; 28 | $.printPreview = { 29 | loadPrintPreview: function() { 30 | // Declare DOM objects 31 | print_modal = $(''); 32 | print_controls = $('