Loading pom.xml +5 −0 Original line number Original line Diff line number Diff line Loading @@ -200,6 +200,11 @@ <version>4.1</version> <version>4.1</version> </dependency> </dependency> <dependency> <groupId>org.apache.jena</groupId> <artifactId>jena-text</artifactId> <version>3.13.0</version> </dependency> </dependencies> </dependencies> <build> <build> Loading src/main/java/fr/emse/gitlab/saref/SAREFPipeline.java +16 −5 Original line number Original line Diff line number Diff line Loading @@ -36,11 +36,22 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Marshaller; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils; import org.apache.jena.query.Dataset; import org.apache.jena.query.QueryExecutionFactory; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.text.TextDatasetFactory; import org.apache.jena.query.text.TextIndexConfig; import org.apache.jena.query.text.TextIndexDB; import org.apache.jena.query.text.TextIndexLucene; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.expr.nodevalue.NodeValueString; import org.apache.log4j.Layout; import org.apache.log4j.Layout; import org.apache.log4j.PatternLayout; import org.apache.log4j.PatternLayout; import org.slf4j.Logger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory; import com.sun.javafx.geom.AreaOp.NZWindOp; import fr.emse.gitlab.saref.managers.DatasetManager; import fr.emse.gitlab.saref.managers.DatasetManager; import fr.emse.gitlab.saref.managers.OntologyManager; import fr.emse.gitlab.saref.managers.OntologyManager; import fr.emse.gitlab.saref.managers.SiteManager; import fr.emse.gitlab.saref.managers.SiteManager; Loading @@ -52,7 +63,7 @@ public class SAREFPipeline { private static final Logger LOG = LoggerFactory.getLogger(SAREFPipeline.class); private static final Logger LOG = LoggerFactory.getLogger(SAREFPipeline.class); private static final String NAME_TARGET = "target"; public static final String NAME_TARGET = "target"; private static final String NAME_LOG_FILE = "output.log"; private static final String NAME_LOG_FILE = "output.log"; public static enum Mode { public static enum Mode { Loading Loading @@ -120,9 +131,6 @@ public class SAREFPipeline { ontologyManager = new OntologyManager(this, logger); ontologyManager = new OntologyManager(this, logger); // datasetManager = new DatasetManager(this, logger); // datasetManager.emptyDataset(); siteManager = new SiteManager(this, logger); siteManager = new SiteManager(this, logger); siteManager.prepareSite(); siteManager.prepareSite(); Loading @@ -134,7 +142,10 @@ public class SAREFPipeline { sourcesManager.checkTerms(); sourcesManager.checkTerms(); sourcesManager.generateSite(); sourcesManager.generateSite(); sourcesManager.resetCheckout(); sourcesManager.resetCheckout(); if(mode == Mode.PORTAL) { datasetManager = new DatasetManager(this, logger); datasetManager.createDataset(); } } catch (IOException ex) { } catch (IOException ex) { LOG.warn("IOException:", ex); LOG.warn("IOException:", ex); } catch (SAREFPipelineException ex) { } catch (SAREFPipelineException ex) { Loading src/main/java/fr/emse/gitlab/saref/managers/DatasetManager.java +115 −129 Original line number Original line Diff line number Diff line Loading @@ -26,27 +26,53 @@ package fr.emse.gitlab.saref.managers; package fr.emse.gitlab.saref.managers; import java.io.File; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils; import org.apache.jena.graph.Node; import org.apache.jena.query.Dataset; import org.apache.jena.query.Dataset; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.text.EntityDefinition; import org.apache.jena.query.text.TextDatasetFactory; import org.apache.jena.query.text.TextIndex; import org.apache.jena.query.text.TextIndexConfig; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.Lang; import org.apache.jena.tdb.TDBFactory; import org.apache.jena.tdb.TDBFactory; import org.apache.jena.vocabulary.DCTerms; import org.apache.jena.vocabulary.OWL; import org.apache.jena.vocabulary.OWL2; import org.apache.jena.vocabulary.RDF; import org.apache.jena.vocabulary.RDFS; import org.apache.lucene.analysis.en.EnglishAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.store.SimpleFSDirectory; import org.slf4j.Logger; import org.slf4j.Logger; import fr.emse.gitlab.saref.SAREF; import fr.emse.gitlab.saref.SAREF; import fr.emse.gitlab.saref.SAREFErrorLogger; import fr.emse.gitlab.saref.SAREFErrorLogger; import fr.emse.gitlab.saref.SAREFPipeline; import fr.emse.gitlab.saref.SAREFPipeline; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.entities.SAREFProject; import fr.emse.gitlab.saref.entities.SAREFRepository; import fr.emse.gitlab.saref.entities.SAREFTerm; import fr.emse.gitlab.saref.entities.SAREFVersion; import fr.emse.gitlab.saref.vocabs.EX; import fr.emse.gitlab.saref.vocabs.VANN; public class DatasetManager extends SAREFErrorLogger { public class DatasetManager extends SAREFErrorLogger { private static final String NAME_DATASET = "tdb"; private static final String NAME_DATASET = "dataset"; private static final String CONFIG = SAREF.BASE + "config"; private static final String CONFIG = SAREF.BASE + "config"; private static final String NAME_TDB = "tdb"; private static final String NAME_LUCENE = "lucene"; private static final String NAME_ASSEMBLER_FILE = "assembler.ttl"; private final File datasetDir; private final File datasetDir; private final Dataset dataset; private final Dataset dataset; Loading @@ -61,138 +87,98 @@ public class DatasetManager extends SAREFErrorLogger { public DatasetManager(SAREFPipeline pipeline, Logger errorLogger) throws IOException { public DatasetManager(SAREFPipeline pipeline, Logger errorLogger) throws IOException { super(pipeline, errorLogger); super(pipeline, errorLogger); datasetDir = new File(pipeline.targetDir, NAME_DATASET); datasetDir = new File(pipeline.targetDir, NAME_DATASET); FileUtils.forceMkdir(datasetDir); File tdbFile = new File(datasetDir, NAME_TDB); dataset = TDBFactory.createDataset(datasetDir.getAbsolutePath()); File luceneFile = new File(datasetDir, NAME_LUCENE); FileUtils.forceMkdir(tdbFile); Dataset base = TDBFactory.createDataset(tdbFile.getAbsolutePath()); EntityDefinition entDef = new EntityDefinition("uri", "text", "graph"); entDef.setPrimaryPredicate(RDFS.label.asNode()); entDef.setUidField("uid"); entDef.setLangField("lang"); Collection<Node> textPredicates = entDef.getPredicates("text"); textPredicates.add(RDFS.comment.asNode()); textPredicates.add(RDFS.comment.asNode()); TextIndexConfig config = new TextIndexConfig(entDef); config.setAnalyzer(new EnglishAnalyzer()); config.setValueStored(true); Directory dir = new SimpleFSDirectory(luceneFile.toPath()); TextIndex textIndex = TextDatasetFactory.createLuceneIndex(dir, config); dataset = TextDatasetFactory.create(base, textIndex) ; } } /** public Dataset getDataset() { * Empty the Apache Jena TDB RDF dataset return dataset; */ } public void emptyDataset() { public void createDataset() { dataset.begin(ReadWrite.WRITE); dataset.begin(ReadWrite.WRITE); dataset.getDefaultModel().removeAll(); Model model = dataset.getDefaultModel(); List<String> toRemove = new ArrayList<>(); Iterator<String> it = dataset.listNames(); for (RepositoryManager repositoryManager : sourcesManager.getSourceRepositoryManagers()) { while (it.hasNext()) { SAREFRepository repository = repositoryManager.getRepository(); toRemove.add(it.next()); SAREFProject project = repository.getProject(); SAREFVersion priorVersion = null; for (SAREFVersion version : repositoryManager.getRepository().getVersions().values()) { model.add(version.getResource(), RDF.type, OWL2.Ontology); if (priorVersion != null) { model.add(version.getResource(), OWL.priorVersion, priorVersion.getResource()); } } for (String name : toRemove) { version.getModel().listObjectsOfProperty(project.getResource(), DCTerms.title) dataset.removeNamedModel(name); .forEachRemaining(node -> { model.add(version.getResource(), RDFS.label, node); }); version.getModel().listObjectsOfProperty(project.getResource(), DCTerms.description) .forEachRemaining(node -> { model.add(version.getResource(), RDFS.comment, node); }); version.getModel().listObjectsOfProperty(project.getResource(), OWL2.versionInfo) .forEachRemaining(node -> { model.add(version.getResource(), OWL2.versionInfo, node); }); version.getModel().listObjectsOfProperty(project.getResource(), OWL2.versionInfo) .forEachRemaining(node -> { model.add(version.getResource(), OWL2.versionInfo, node); }); priorVersion = version; } } dataset.addNamedModel(CONFIG, ModelFactory.createDefaultModel()); for (SAREFTerm term : repository.getTerms().values()) { dataset.commit(); term.getIsDefinedBy().forEach(version -> { model.add(term.getResource(), RDFS.isDefinedBy, version.getResource()); }); term.getIsExemplifiedBy().forEach(example -> { model.add(term.getResource(), VANN.example, example.getResource()); }); term.getIsUsedBy().forEach(version -> { model.add(term.getResource(), EX.isUsedBy, version.getResource()); }); SAREFVersion version = getLastVersion(term); if(version != null) { version.getModel().listObjectsOfProperty(term.getResource(), RDFS.label).forEachRemaining(node -> { model.add(term.getResource(), RDFS.label, node); }); version.getModel().listObjectsOfProperty(term.getResource(), RDFS.comment).forEachRemaining(node -> { model.add(term.getResource(), RDFS.comment, node); }); } } // public void consumeDataset(Consumer<Dataset> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // consumer.accept(dataset); // endTransaction(own); // } // // public void consumeDataset(Consumer<Dataset> consumer) throws SAREFPipelineException { // consumeDataset(consumer, ReadWrite.READ); // } // // public void consumeConfig(Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // final Model config = dataset.getNamedModel(CONFIG); // consumer.accept(config); // endTransaction(own); // } // // public Model getConfig(Dataset dataset) { // return dataset.getNamedModel(CONFIG); // } // // public void consumeConfig(Consumer<Model> consumer) throws SAREFPipelineException { // consumeConfig(consumer, ReadWrite.READ); // } // // public void setModel(SAREFVersion version, Model model) throws SAREFPipelineException { // boolean own = startTransaction(ReadWrite.WRITE); // dataset.addNamedModel(version.getVersionIRI(), model); // endTransaction(own); // } // // public void setModel(SAREFExample example, Model model) throws SAREFPipelineException { // boolean own = startTransaction(ReadWrite.WRITE); // dataset.addNamedModel(example.getIRI(), model); // endTransaction(own); // } // // public Model getModel(Dataset dataset, SAREFVersion version) { // return dataset.getNamedModel(version.getVersionIRI()); // } // // // public void consumeModel(SAREFVersion version, Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // Model model = dataset.getNamedModel(version.getVersionIRI()); // consumer.accept(model); // endTransaction(own); // } // // public void consumeModel(SAREFVersion version, Consumer<Model> consumer) throws SAREFPipelineException { // consumeModel(version, consumer, ReadWrite.READ); // } // // public Model getModel(Dataset dataset, SAREFExample example) { // return dataset.getNamedModel(example.getIRI()); // } // // public void consumeModel(SAREFExample example, Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // Model model = dataset.getNamedModel(example.getIRI()); // consumer.accept(model); // endTransaction(own); // } // // public void consumeModel(SAREFExample example, Consumer<Model> consumer) throws SAREFPipelineException { // consumeModel(example, consumer, ReadWrite.READ); // } // // // public void consumeModel(SAREFTerm term, Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // Model model = dataset.getNamedModel(term.getIRI()); // consumer.accept(model); // endTransaction(own); // } // // public void consumeModel(SAREFTerm term, Consumer<Model> consumer) throws SAREFPipelineException { // consumeModel(term, consumer, ReadWrite.READ); // } // // public void writeConfig() { // File configFile = new File(pipeline.targetDir, "config.ttl"); // try (FileOutputStream fos = new FileOutputStream(configFile)) { // boolean own = startTransaction(ReadWrite.READ); // consumeConfig(config -> config.write(fos, Lang.TURTLE.getLabel())); // endTransaction(own); // } catch (SAREFPipelineException | IOException ex) { // errorLogger.error("Unexpected exception while writing configuration file", ex); // } // } private boolean startTransaction(ReadWrite readWrite) throws SAREFPipelineException { if (dataset.transactionMode() == null) { dataset.begin(readWrite); return true; } else if(dataset.transactionMode() != readWrite) { throw new SAREFPipelineException(getMessage(MESSAGE.bad_transaction, readWrite)); } } return false; } } private void endTransaction(boolean own) throws SAREFPipelineException { if (dataset.transactionMode() == null) { throw new SAREFPipelineException(getMessage(MESSAGE.no_transaction)); } else if(dataset.transactionMode() == ReadWrite.WRITE) { dataset.commit(); dataset.commit(); } if(own) { dataset.end(); dataset.end(); } } private SAREFVersion getLastVersion(SAREFTerm term) { SAREFVersion lastVersion = null; for (SAREFVersion v : term.getIsDefinedBy()) { if (lastVersion == null) { lastVersion = v; continue; } if (v.getVersionName().compareTo(lastVersion.getVersionName()) > 0) { lastVersion = v; } } return lastVersion; } } } } src/main/java/fr/emse/gitlab/saref/managers/SiteManager.java +91 −14 Original line number Original line Diff line number Diff line Loading @@ -27,11 +27,14 @@ package fr.emse.gitlab.saref.managers; import java.io.File; import java.io.File; import java.io.FileOutputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.IOException; import java.io.StringWriter; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.List; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils; import org.apache.jena.atlas.io.IndentedWriter; import org.apache.jena.atlas.io.IndentedWriter; Loading @@ -58,6 +61,8 @@ import fr.emse.gitlab.saref.SAREFPipeline; import fr.emse.gitlab.saref.SAREFPipeline.Mode; import fr.emse.gitlab.saref.SAREFPipeline.Mode; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.entities.SAREFExample; import fr.emse.gitlab.saref.entities.SAREFExample; import fr.emse.gitlab.saref.entities.SAREFProject; import fr.emse.gitlab.saref.entities.SAREFRepository; import fr.emse.gitlab.saref.entities.SAREFTerm; import fr.emse.gitlab.saref.entities.SAREFTerm; import fr.emse.gitlab.saref.entities.SAREFVersion; import fr.emse.gitlab.saref.entities.SAREFVersion; import fr.emse.gitlab.saref.utils.StreamManagerFactory; import fr.emse.gitlab.saref.utils.StreamManagerFactory; Loading @@ -75,6 +80,13 @@ public class SiteManager extends SAREFErrorLogger { private static final String NAME_STATIC = "static"; private static final String NAME_STATIC = "static"; private static final String NAME_REPORT_HTML = "report.html"; private static final String NAME_REPORT_HTML = "report.html"; private static final String HTACCESS_HTML = "RewriteCond %{HTTP_ACCEPT} !(application/rdf\\+xml|text/turtle|text/n3|application/n\\-triples|application/ld\\+json)"; private static final String HTACCESS_RDFXML = "RewriteCond %{HTTP_ACCEPT} application/rdf\\+xml"; private static final String HTACCESS_TURTLE = "RewriteCond %{HTTP_ACCEPT} text/turtle"; private static final String HTACCESS_N3 = "RewriteCond %{HTTP_ACCEPT} text/n3"; private static final String HTACCESS_NTRIPLE = "RewriteCond %{HTTP_ACCEPT} application/n-triples"; private static final String HTACCESS_JSONLD = "RewriteCond %{HTTP_ACCEPT} application/ld\\+json"; private static final SPARQLExtStreamManager STREAM_MANAGER_BASE = StreamManagerFactory.get(); private static final SPARQLExtStreamManager STREAM_MANAGER_BASE = StreamManagerFactory.get(); public final File siteDir; public final File siteDir; private final File reportFileHTML; private final File reportFileHTML; Loading Loading @@ -108,9 +120,6 @@ public class SiteManager extends SAREFErrorLogger { * Prepare the site folder and clone the saref-portal-static project repository. * Prepare the site folder and clone the saref-portal-static project repository. */ */ public void prepareSite() throws SAREFPipelineException { public void prepareSite() throws SAREFPipelineException { // if (pipeline.ignoreSite) { // return; // } try (Git git = Git.cloneRepository().setURI(SAREF.SAREF_PORTAL_STATIC_GIT).setDirectory(siteDir).call()) { try (Git git = Git.cloneRepository().setURI(SAREF.SAREF_PORTAL_STATIC_GIT).setDirectory(siteDir).call()) { } catch (Exception ex) { } catch (Exception ex) { try (Git git = Git.open(siteDir)) { try (Git git = Git.open(siteDir)) { Loading @@ -124,9 +133,6 @@ public class SiteManager extends SAREFErrorLogger { } } public void writeReport(StringWriter sw) throws IOException { public void writeReport(StringWriter sw) throws IOException { // if (pipeline.ignoreSite) { // return; // } try (IndentedWriter writer = new IndentedWriter(new FileOutputStream(reportFileHTML));) { try (IndentedWriter writer = new IndentedWriter(new FileOutputStream(reportFileHTML));) { boolean debugTemplate = pipeline.mode == Mode.DEVELOP; boolean debugTemplate = pipeline.mode == Mode.DEVELOP; Context context = ContextUtils.build(writer).setBase(SAREF.BASE).setDebugTemplate(debugTemplate) Context context = ContextUtils.build(writer).setBase(SAREF.BASE).setDebugTemplate(debugTemplate) Loading @@ -146,12 +152,14 @@ public class SiteManager extends SAREFErrorLogger { } } } } public void generateOntologyDocumentation(SAREFVersion version, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { public void generateOntologyDocumentation(SAREFVersion version, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { Resource resource = version.getResource(); Resource resource = version.getResource(); generateHTML(planForOntologyVersion, VAR_VERSION_IRI, resource, writer, streamManager, dataset); generateHTML(planForOntologyVersion, VAR_VERSION_IRI, resource, writer, streamManager, dataset); } } public void generateExampleDocumentation(SAREFExample example, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { public void generateExampleDocumentation(SAREFExample example, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { Resource resource = example.getResource(); Resource resource = example.getResource(); generateHTML(planForExample, VAR_EXAMPLE, resource, writer, streamManager, dataset); generateHTML(planForExample, VAR_EXAMPLE, resource, writer, streamManager, dataset); } } Loading @@ -161,10 +169,10 @@ public class SiteManager extends SAREFErrorLogger { generateHTML(planForTerm, VAR_TERM, resource, writer, STREAM_MANAGER_BASE, dataset); generateHTML(planForTerm, VAR_TERM, resource, writer, STREAM_MANAGER_BASE, dataset); } } private void generateHTML(RootPlan plan, Var var, Resource resource, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { private void generateHTML(RootPlan plan, Var var, Resource resource, IndentedWriter writer, Context context = ContextUtils.build(writer).setBase(SAREF.BASE) SPARQLExtStreamManager streamManager, Dataset dataset) { .setDebugTemplate(pipeline.mode == Mode.DEVELOP).setInputDataset(dataset) Context context = ContextUtils.build(writer).setBase(SAREF.BASE).setDebugTemplate(pipeline.mode == Mode.DEVELOP) .setStreamManager(streamManager).build(); .setInputDataset(dataset).setStreamManager(streamManager).build(); BindingHashMap binding = new BindingHashMap(); BindingHashMap binding = new BindingHashMap(); binding.add(var, resource.asNode()); binding.add(var, resource.asNode()); Loading @@ -177,4 +185,73 @@ public class SiteManager extends SAREFErrorLogger { return STREAM_MANAGER_BASE; return STREAM_MANAGER_BASE; } } public void generateHtaccess() { File htaccess = new File(siteDir, ".htaccess"); try (FileWriter writer = new FileWriter(htaccess)) { writer.write("RewriteEngine on\nDirectorySlash Off\n\n"); writer.write(HTACCESS_HTML); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.html\n"); writer.write(HTACCESS_JSONLD); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.jsonld\n"); writer.write(HTACCESS_N3); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.n3\n"); writer.write(HTACCESS_NTRIPLE); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.nt\n"); writer.write(HTACCESS_RDFXML); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.rdf\n"); writer.write(HTACCESS_TURTLE); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.ttl\n"); writer.write("\n"); for (RepositoryManager repositoryManager : pipeline.getSourcesManager().getSourceRepositoryManagers()) { SAREFRepository repository = repositoryManager.getRepository(); SAREFProject project = repository.getProject(); SAREFVersion lastVersion = repository.getVersions().lastEntry().getValue(); // redirects core to core/v3.1.1 // redirects core/ to core/v3.1.1 writer.write(String.format("RewriteRule ^%s/?$ /%s\n", project.getPath(), lastVersion.getVersionPath())); // redirects core/Sensor to core/Sensor.conneg String choiceOfTerms = repository.getTerms().values().stream().map(SAREFTerm::getLocalName) .collect(Collectors.joining("|", "(", ")")); writer.write(String.format("RewriteCond %%{REQUEST_URI} ^/%s/%s$\n", project.getPath(), choiceOfTerms)); writer.write(String.format("RewriteRule ^%s/(.*)$ /%s/$1.conneg\n\n", project.getPath(), project.getPath())); // redirects core.ttl to core/v1.1.1.ttl writer.write(String.format("RewriteRule ^%s\\.([^\\./]+)$ /%s.$1\n\n", project.getPath(), lastVersion.getVersionPath())); for (SAREFVersion version : repository.getVersions().values()) { writer.write(String.format("RewriteRule ^%s/?$ /%s/%s.conneg\n", version.getVersionPath(), version.getVersionPath(), project.getOntologyFileName())); // redirects core/v1.1.1.ttl to core/v1.1.1/saref.ttl writer.write(String.format("RewriteRule ^%s\\.([^\\./]+)$ /%s/%s.$1\n", version.getVersionPath(), version.getVersionPath(), project.getOntologyFileName())); // redirects core/v1.1.1/saref to core/v1.1.1/saref.conneg writer.write(String.format("RewriteRule ^%s/%s$ /%s/%s.conneg\n", version.getVersionPath(), project.getOntologyFileName(), version.getVersionPath(), project.getOntologyFileName())); // redirects core/v1.1.1/tests to core/v1.1.1/tests.conneg writer.write(String.format("RewriteRule ^%s/tests$ /%s/tests.conneg\n", version.getVersionPath(), version.getVersionPath())); // redirects core/v1.1.1/requirements to core/v1.1.1/requirements.conneg writer.write(String.format("RewriteRule ^%s/requirements$ /%s/requirements.conneg\n", version.getVersionPath(), version.getVersionPath())); for (SAREFExample example : version.getExamples().values()) { writer.write(String.format("RewriteRule ^%s/example/%s$ /%s/example/%s.conneg\n", version.getVersionPath(), example.getName(), version.getVersionPath(), example.getName())); } writer.write("\n\n"); } } } catch (IOException ex) { ex.printStackTrace(); } } } } src/main/java/fr/emse/gitlab/saref/managers/SourcesManager.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -340,6 +340,7 @@ public class SourcesManager extends SAREFErrorLogger { new TermSiteManager(pipeline, repository).generateSite(); new TermSiteManager(pipeline, repository).generateSite(); } } } } siteManager.generateHtaccess(); } } } } Loading Loading
pom.xml +5 −0 Original line number Original line Diff line number Diff line Loading @@ -200,6 +200,11 @@ <version>4.1</version> <version>4.1</version> </dependency> </dependency> <dependency> <groupId>org.apache.jena</groupId> <artifactId>jena-text</artifactId> <version>3.13.0</version> </dependency> </dependencies> </dependencies> <build> <build> Loading
src/main/java/fr/emse/gitlab/saref/SAREFPipeline.java +16 −5 Original line number Original line Diff line number Diff line Loading @@ -36,11 +36,22 @@ import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Marshaller; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils; import org.apache.jena.query.Dataset; import org.apache.jena.query.QueryExecutionFactory; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.text.TextDatasetFactory; import org.apache.jena.query.text.TextIndexConfig; import org.apache.jena.query.text.TextIndexDB; import org.apache.jena.query.text.TextIndexLucene; import org.apache.jena.rdf.model.Model; import org.apache.jena.sparql.expr.nodevalue.NodeValueString; import org.apache.log4j.Layout; import org.apache.log4j.Layout; import org.apache.log4j.PatternLayout; import org.apache.log4j.PatternLayout; import org.slf4j.Logger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory; import com.sun.javafx.geom.AreaOp.NZWindOp; import fr.emse.gitlab.saref.managers.DatasetManager; import fr.emse.gitlab.saref.managers.DatasetManager; import fr.emse.gitlab.saref.managers.OntologyManager; import fr.emse.gitlab.saref.managers.OntologyManager; import fr.emse.gitlab.saref.managers.SiteManager; import fr.emse.gitlab.saref.managers.SiteManager; Loading @@ -52,7 +63,7 @@ public class SAREFPipeline { private static final Logger LOG = LoggerFactory.getLogger(SAREFPipeline.class); private static final Logger LOG = LoggerFactory.getLogger(SAREFPipeline.class); private static final String NAME_TARGET = "target"; public static final String NAME_TARGET = "target"; private static final String NAME_LOG_FILE = "output.log"; private static final String NAME_LOG_FILE = "output.log"; public static enum Mode { public static enum Mode { Loading Loading @@ -120,9 +131,6 @@ public class SAREFPipeline { ontologyManager = new OntologyManager(this, logger); ontologyManager = new OntologyManager(this, logger); // datasetManager = new DatasetManager(this, logger); // datasetManager.emptyDataset(); siteManager = new SiteManager(this, logger); siteManager = new SiteManager(this, logger); siteManager.prepareSite(); siteManager.prepareSite(); Loading @@ -134,7 +142,10 @@ public class SAREFPipeline { sourcesManager.checkTerms(); sourcesManager.checkTerms(); sourcesManager.generateSite(); sourcesManager.generateSite(); sourcesManager.resetCheckout(); sourcesManager.resetCheckout(); if(mode == Mode.PORTAL) { datasetManager = new DatasetManager(this, logger); datasetManager.createDataset(); } } catch (IOException ex) { } catch (IOException ex) { LOG.warn("IOException:", ex); LOG.warn("IOException:", ex); } catch (SAREFPipelineException ex) { } catch (SAREFPipelineException ex) { Loading
src/main/java/fr/emse/gitlab/saref/managers/DatasetManager.java +115 −129 Original line number Original line Diff line number Diff line Loading @@ -26,27 +26,53 @@ package fr.emse.gitlab.saref.managers; package fr.emse.gitlab.saref.managers; import java.io.File; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils; import org.apache.jena.graph.Node; import org.apache.jena.query.Dataset; import org.apache.jena.query.Dataset; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.ReadWrite; import org.apache.jena.query.text.EntityDefinition; import org.apache.jena.query.text.TextDatasetFactory; import org.apache.jena.query.text.TextIndex; import org.apache.jena.query.text.TextIndexConfig; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.Lang; import org.apache.jena.tdb.TDBFactory; import org.apache.jena.tdb.TDBFactory; import org.apache.jena.vocabulary.DCTerms; import org.apache.jena.vocabulary.OWL; import org.apache.jena.vocabulary.OWL2; import org.apache.jena.vocabulary.RDF; import org.apache.jena.vocabulary.RDFS; import org.apache.lucene.analysis.en.EnglishAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.store.SimpleFSDirectory; import org.slf4j.Logger; import org.slf4j.Logger; import fr.emse.gitlab.saref.SAREF; import fr.emse.gitlab.saref.SAREF; import fr.emse.gitlab.saref.SAREFErrorLogger; import fr.emse.gitlab.saref.SAREFErrorLogger; import fr.emse.gitlab.saref.SAREFPipeline; import fr.emse.gitlab.saref.SAREFPipeline; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.entities.SAREFProject; import fr.emse.gitlab.saref.entities.SAREFRepository; import fr.emse.gitlab.saref.entities.SAREFTerm; import fr.emse.gitlab.saref.entities.SAREFVersion; import fr.emse.gitlab.saref.vocabs.EX; import fr.emse.gitlab.saref.vocabs.VANN; public class DatasetManager extends SAREFErrorLogger { public class DatasetManager extends SAREFErrorLogger { private static final String NAME_DATASET = "tdb"; private static final String NAME_DATASET = "dataset"; private static final String CONFIG = SAREF.BASE + "config"; private static final String CONFIG = SAREF.BASE + "config"; private static final String NAME_TDB = "tdb"; private static final String NAME_LUCENE = "lucene"; private static final String NAME_ASSEMBLER_FILE = "assembler.ttl"; private final File datasetDir; private final File datasetDir; private final Dataset dataset; private final Dataset dataset; Loading @@ -61,138 +87,98 @@ public class DatasetManager extends SAREFErrorLogger { public DatasetManager(SAREFPipeline pipeline, Logger errorLogger) throws IOException { public DatasetManager(SAREFPipeline pipeline, Logger errorLogger) throws IOException { super(pipeline, errorLogger); super(pipeline, errorLogger); datasetDir = new File(pipeline.targetDir, NAME_DATASET); datasetDir = new File(pipeline.targetDir, NAME_DATASET); FileUtils.forceMkdir(datasetDir); File tdbFile = new File(datasetDir, NAME_TDB); dataset = TDBFactory.createDataset(datasetDir.getAbsolutePath()); File luceneFile = new File(datasetDir, NAME_LUCENE); FileUtils.forceMkdir(tdbFile); Dataset base = TDBFactory.createDataset(tdbFile.getAbsolutePath()); EntityDefinition entDef = new EntityDefinition("uri", "text", "graph"); entDef.setPrimaryPredicate(RDFS.label.asNode()); entDef.setUidField("uid"); entDef.setLangField("lang"); Collection<Node> textPredicates = entDef.getPredicates("text"); textPredicates.add(RDFS.comment.asNode()); textPredicates.add(RDFS.comment.asNode()); TextIndexConfig config = new TextIndexConfig(entDef); config.setAnalyzer(new EnglishAnalyzer()); config.setValueStored(true); Directory dir = new SimpleFSDirectory(luceneFile.toPath()); TextIndex textIndex = TextDatasetFactory.createLuceneIndex(dir, config); dataset = TextDatasetFactory.create(base, textIndex) ; } } /** public Dataset getDataset() { * Empty the Apache Jena TDB RDF dataset return dataset; */ } public void emptyDataset() { public void createDataset() { dataset.begin(ReadWrite.WRITE); dataset.begin(ReadWrite.WRITE); dataset.getDefaultModel().removeAll(); Model model = dataset.getDefaultModel(); List<String> toRemove = new ArrayList<>(); Iterator<String> it = dataset.listNames(); for (RepositoryManager repositoryManager : sourcesManager.getSourceRepositoryManagers()) { while (it.hasNext()) { SAREFRepository repository = repositoryManager.getRepository(); toRemove.add(it.next()); SAREFProject project = repository.getProject(); SAREFVersion priorVersion = null; for (SAREFVersion version : repositoryManager.getRepository().getVersions().values()) { model.add(version.getResource(), RDF.type, OWL2.Ontology); if (priorVersion != null) { model.add(version.getResource(), OWL.priorVersion, priorVersion.getResource()); } } for (String name : toRemove) { version.getModel().listObjectsOfProperty(project.getResource(), DCTerms.title) dataset.removeNamedModel(name); .forEachRemaining(node -> { model.add(version.getResource(), RDFS.label, node); }); version.getModel().listObjectsOfProperty(project.getResource(), DCTerms.description) .forEachRemaining(node -> { model.add(version.getResource(), RDFS.comment, node); }); version.getModel().listObjectsOfProperty(project.getResource(), OWL2.versionInfo) .forEachRemaining(node -> { model.add(version.getResource(), OWL2.versionInfo, node); }); version.getModel().listObjectsOfProperty(project.getResource(), OWL2.versionInfo) .forEachRemaining(node -> { model.add(version.getResource(), OWL2.versionInfo, node); }); priorVersion = version; } } dataset.addNamedModel(CONFIG, ModelFactory.createDefaultModel()); for (SAREFTerm term : repository.getTerms().values()) { dataset.commit(); term.getIsDefinedBy().forEach(version -> { model.add(term.getResource(), RDFS.isDefinedBy, version.getResource()); }); term.getIsExemplifiedBy().forEach(example -> { model.add(term.getResource(), VANN.example, example.getResource()); }); term.getIsUsedBy().forEach(version -> { model.add(term.getResource(), EX.isUsedBy, version.getResource()); }); SAREFVersion version = getLastVersion(term); if(version != null) { version.getModel().listObjectsOfProperty(term.getResource(), RDFS.label).forEachRemaining(node -> { model.add(term.getResource(), RDFS.label, node); }); version.getModel().listObjectsOfProperty(term.getResource(), RDFS.comment).forEachRemaining(node -> { model.add(term.getResource(), RDFS.comment, node); }); } } // public void consumeDataset(Consumer<Dataset> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // consumer.accept(dataset); // endTransaction(own); // } // // public void consumeDataset(Consumer<Dataset> consumer) throws SAREFPipelineException { // consumeDataset(consumer, ReadWrite.READ); // } // // public void consumeConfig(Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // final Model config = dataset.getNamedModel(CONFIG); // consumer.accept(config); // endTransaction(own); // } // // public Model getConfig(Dataset dataset) { // return dataset.getNamedModel(CONFIG); // } // // public void consumeConfig(Consumer<Model> consumer) throws SAREFPipelineException { // consumeConfig(consumer, ReadWrite.READ); // } // // public void setModel(SAREFVersion version, Model model) throws SAREFPipelineException { // boolean own = startTransaction(ReadWrite.WRITE); // dataset.addNamedModel(version.getVersionIRI(), model); // endTransaction(own); // } // // public void setModel(SAREFExample example, Model model) throws SAREFPipelineException { // boolean own = startTransaction(ReadWrite.WRITE); // dataset.addNamedModel(example.getIRI(), model); // endTransaction(own); // } // // public Model getModel(Dataset dataset, SAREFVersion version) { // return dataset.getNamedModel(version.getVersionIRI()); // } // // // public void consumeModel(SAREFVersion version, Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // Model model = dataset.getNamedModel(version.getVersionIRI()); // consumer.accept(model); // endTransaction(own); // } // // public void consumeModel(SAREFVersion version, Consumer<Model> consumer) throws SAREFPipelineException { // consumeModel(version, consumer, ReadWrite.READ); // } // // public Model getModel(Dataset dataset, SAREFExample example) { // return dataset.getNamedModel(example.getIRI()); // } // // public void consumeModel(SAREFExample example, Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // Model model = dataset.getNamedModel(example.getIRI()); // consumer.accept(model); // endTransaction(own); // } // // public void consumeModel(SAREFExample example, Consumer<Model> consumer) throws SAREFPipelineException { // consumeModel(example, consumer, ReadWrite.READ); // } // // // public void consumeModel(SAREFTerm term, Consumer<Model> consumer, ReadWrite readWrite) throws SAREFPipelineException { // boolean own = startTransaction(readWrite); // Model model = dataset.getNamedModel(term.getIRI()); // consumer.accept(model); // endTransaction(own); // } // // public void consumeModel(SAREFTerm term, Consumer<Model> consumer) throws SAREFPipelineException { // consumeModel(term, consumer, ReadWrite.READ); // } // // public void writeConfig() { // File configFile = new File(pipeline.targetDir, "config.ttl"); // try (FileOutputStream fos = new FileOutputStream(configFile)) { // boolean own = startTransaction(ReadWrite.READ); // consumeConfig(config -> config.write(fos, Lang.TURTLE.getLabel())); // endTransaction(own); // } catch (SAREFPipelineException | IOException ex) { // errorLogger.error("Unexpected exception while writing configuration file", ex); // } // } private boolean startTransaction(ReadWrite readWrite) throws SAREFPipelineException { if (dataset.transactionMode() == null) { dataset.begin(readWrite); return true; } else if(dataset.transactionMode() != readWrite) { throw new SAREFPipelineException(getMessage(MESSAGE.bad_transaction, readWrite)); } } return false; } } private void endTransaction(boolean own) throws SAREFPipelineException { if (dataset.transactionMode() == null) { throw new SAREFPipelineException(getMessage(MESSAGE.no_transaction)); } else if(dataset.transactionMode() == ReadWrite.WRITE) { dataset.commit(); dataset.commit(); } if(own) { dataset.end(); dataset.end(); } } private SAREFVersion getLastVersion(SAREFTerm term) { SAREFVersion lastVersion = null; for (SAREFVersion v : term.getIsDefinedBy()) { if (lastVersion == null) { lastVersion = v; continue; } if (v.getVersionName().compareTo(lastVersion.getVersionName()) > 0) { lastVersion = v; } } return lastVersion; } } } }
src/main/java/fr/emse/gitlab/saref/managers/SiteManager.java +91 −14 Original line number Original line Diff line number Diff line Loading @@ -27,11 +27,14 @@ package fr.emse.gitlab.saref.managers; import java.io.File; import java.io.File; import java.io.FileOutputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.IOException; import java.io.StringWriter; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.List; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils; import org.apache.jena.atlas.io.IndentedWriter; import org.apache.jena.atlas.io.IndentedWriter; Loading @@ -58,6 +61,8 @@ import fr.emse.gitlab.saref.SAREFPipeline; import fr.emse.gitlab.saref.SAREFPipeline.Mode; import fr.emse.gitlab.saref.SAREFPipeline.Mode; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.SAREFPipelineException; import fr.emse.gitlab.saref.entities.SAREFExample; import fr.emse.gitlab.saref.entities.SAREFExample; import fr.emse.gitlab.saref.entities.SAREFProject; import fr.emse.gitlab.saref.entities.SAREFRepository; import fr.emse.gitlab.saref.entities.SAREFTerm; import fr.emse.gitlab.saref.entities.SAREFTerm; import fr.emse.gitlab.saref.entities.SAREFVersion; import fr.emse.gitlab.saref.entities.SAREFVersion; import fr.emse.gitlab.saref.utils.StreamManagerFactory; import fr.emse.gitlab.saref.utils.StreamManagerFactory; Loading @@ -75,6 +80,13 @@ public class SiteManager extends SAREFErrorLogger { private static final String NAME_STATIC = "static"; private static final String NAME_STATIC = "static"; private static final String NAME_REPORT_HTML = "report.html"; private static final String NAME_REPORT_HTML = "report.html"; private static final String HTACCESS_HTML = "RewriteCond %{HTTP_ACCEPT} !(application/rdf\\+xml|text/turtle|text/n3|application/n\\-triples|application/ld\\+json)"; private static final String HTACCESS_RDFXML = "RewriteCond %{HTTP_ACCEPT} application/rdf\\+xml"; private static final String HTACCESS_TURTLE = "RewriteCond %{HTTP_ACCEPT} text/turtle"; private static final String HTACCESS_N3 = "RewriteCond %{HTTP_ACCEPT} text/n3"; private static final String HTACCESS_NTRIPLE = "RewriteCond %{HTTP_ACCEPT} application/n-triples"; private static final String HTACCESS_JSONLD = "RewriteCond %{HTTP_ACCEPT} application/ld\\+json"; private static final SPARQLExtStreamManager STREAM_MANAGER_BASE = StreamManagerFactory.get(); private static final SPARQLExtStreamManager STREAM_MANAGER_BASE = StreamManagerFactory.get(); public final File siteDir; public final File siteDir; private final File reportFileHTML; private final File reportFileHTML; Loading Loading @@ -108,9 +120,6 @@ public class SiteManager extends SAREFErrorLogger { * Prepare the site folder and clone the saref-portal-static project repository. * Prepare the site folder and clone the saref-portal-static project repository. */ */ public void prepareSite() throws SAREFPipelineException { public void prepareSite() throws SAREFPipelineException { // if (pipeline.ignoreSite) { // return; // } try (Git git = Git.cloneRepository().setURI(SAREF.SAREF_PORTAL_STATIC_GIT).setDirectory(siteDir).call()) { try (Git git = Git.cloneRepository().setURI(SAREF.SAREF_PORTAL_STATIC_GIT).setDirectory(siteDir).call()) { } catch (Exception ex) { } catch (Exception ex) { try (Git git = Git.open(siteDir)) { try (Git git = Git.open(siteDir)) { Loading @@ -124,9 +133,6 @@ public class SiteManager extends SAREFErrorLogger { } } public void writeReport(StringWriter sw) throws IOException { public void writeReport(StringWriter sw) throws IOException { // if (pipeline.ignoreSite) { // return; // } try (IndentedWriter writer = new IndentedWriter(new FileOutputStream(reportFileHTML));) { try (IndentedWriter writer = new IndentedWriter(new FileOutputStream(reportFileHTML));) { boolean debugTemplate = pipeline.mode == Mode.DEVELOP; boolean debugTemplate = pipeline.mode == Mode.DEVELOP; Context context = ContextUtils.build(writer).setBase(SAREF.BASE).setDebugTemplate(debugTemplate) Context context = ContextUtils.build(writer).setBase(SAREF.BASE).setDebugTemplate(debugTemplate) Loading @@ -146,12 +152,14 @@ public class SiteManager extends SAREFErrorLogger { } } } } public void generateOntologyDocumentation(SAREFVersion version, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { public void generateOntologyDocumentation(SAREFVersion version, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { Resource resource = version.getResource(); Resource resource = version.getResource(); generateHTML(planForOntologyVersion, VAR_VERSION_IRI, resource, writer, streamManager, dataset); generateHTML(planForOntologyVersion, VAR_VERSION_IRI, resource, writer, streamManager, dataset); } } public void generateExampleDocumentation(SAREFExample example, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { public void generateExampleDocumentation(SAREFExample example, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { Resource resource = example.getResource(); Resource resource = example.getResource(); generateHTML(planForExample, VAR_EXAMPLE, resource, writer, streamManager, dataset); generateHTML(planForExample, VAR_EXAMPLE, resource, writer, streamManager, dataset); } } Loading @@ -161,10 +169,10 @@ public class SiteManager extends SAREFErrorLogger { generateHTML(planForTerm, VAR_TERM, resource, writer, STREAM_MANAGER_BASE, dataset); generateHTML(planForTerm, VAR_TERM, resource, writer, STREAM_MANAGER_BASE, dataset); } } private void generateHTML(RootPlan plan, Var var, Resource resource, IndentedWriter writer, SPARQLExtStreamManager streamManager, Dataset dataset) { private void generateHTML(RootPlan plan, Var var, Resource resource, IndentedWriter writer, Context context = ContextUtils.build(writer).setBase(SAREF.BASE) SPARQLExtStreamManager streamManager, Dataset dataset) { .setDebugTemplate(pipeline.mode == Mode.DEVELOP).setInputDataset(dataset) Context context = ContextUtils.build(writer).setBase(SAREF.BASE).setDebugTemplate(pipeline.mode == Mode.DEVELOP) .setStreamManager(streamManager).build(); .setInputDataset(dataset).setStreamManager(streamManager).build(); BindingHashMap binding = new BindingHashMap(); BindingHashMap binding = new BindingHashMap(); binding.add(var, resource.asNode()); binding.add(var, resource.asNode()); Loading @@ -177,4 +185,73 @@ public class SiteManager extends SAREFErrorLogger { return STREAM_MANAGER_BASE; return STREAM_MANAGER_BASE; } } public void generateHtaccess() { File htaccess = new File(siteDir, ".htaccess"); try (FileWriter writer = new FileWriter(htaccess)) { writer.write("RewriteEngine on\nDirectorySlash Off\n\n"); writer.write(HTACCESS_HTML); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.html\n"); writer.write(HTACCESS_JSONLD); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.jsonld\n"); writer.write(HTACCESS_N3); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.n3\n"); writer.write(HTACCESS_NTRIPLE); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.nt\n"); writer.write(HTACCESS_RDFXML); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.rdf\n"); writer.write(HTACCESS_TURTLE); writer.write("\nRewriteRule ^(.*)\\.conneg$ /$1.ttl\n"); writer.write("\n"); for (RepositoryManager repositoryManager : pipeline.getSourcesManager().getSourceRepositoryManagers()) { SAREFRepository repository = repositoryManager.getRepository(); SAREFProject project = repository.getProject(); SAREFVersion lastVersion = repository.getVersions().lastEntry().getValue(); // redirects core to core/v3.1.1 // redirects core/ to core/v3.1.1 writer.write(String.format("RewriteRule ^%s/?$ /%s\n", project.getPath(), lastVersion.getVersionPath())); // redirects core/Sensor to core/Sensor.conneg String choiceOfTerms = repository.getTerms().values().stream().map(SAREFTerm::getLocalName) .collect(Collectors.joining("|", "(", ")")); writer.write(String.format("RewriteCond %%{REQUEST_URI} ^/%s/%s$\n", project.getPath(), choiceOfTerms)); writer.write(String.format("RewriteRule ^%s/(.*)$ /%s/$1.conneg\n\n", project.getPath(), project.getPath())); // redirects core.ttl to core/v1.1.1.ttl writer.write(String.format("RewriteRule ^%s\\.([^\\./]+)$ /%s.$1\n\n", project.getPath(), lastVersion.getVersionPath())); for (SAREFVersion version : repository.getVersions().values()) { writer.write(String.format("RewriteRule ^%s/?$ /%s/%s.conneg\n", version.getVersionPath(), version.getVersionPath(), project.getOntologyFileName())); // redirects core/v1.1.1.ttl to core/v1.1.1/saref.ttl writer.write(String.format("RewriteRule ^%s\\.([^\\./]+)$ /%s/%s.$1\n", version.getVersionPath(), version.getVersionPath(), project.getOntologyFileName())); // redirects core/v1.1.1/saref to core/v1.1.1/saref.conneg writer.write(String.format("RewriteRule ^%s/%s$ /%s/%s.conneg\n", version.getVersionPath(), project.getOntologyFileName(), version.getVersionPath(), project.getOntologyFileName())); // redirects core/v1.1.1/tests to core/v1.1.1/tests.conneg writer.write(String.format("RewriteRule ^%s/tests$ /%s/tests.conneg\n", version.getVersionPath(), version.getVersionPath())); // redirects core/v1.1.1/requirements to core/v1.1.1/requirements.conneg writer.write(String.format("RewriteRule ^%s/requirements$ /%s/requirements.conneg\n", version.getVersionPath(), version.getVersionPath())); for (SAREFExample example : version.getExamples().values()) { writer.write(String.format("RewriteRule ^%s/example/%s$ /%s/example/%s.conneg\n", version.getVersionPath(), example.getName(), version.getVersionPath(), example.getName())); } writer.write("\n\n"); } } } catch (IOException ex) { ex.printStackTrace(); } } } }
src/main/java/fr/emse/gitlab/saref/managers/SourcesManager.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -340,6 +340,7 @@ public class SourcesManager extends SAREFErrorLogger { new TermSiteManager(pipeline, repository).generateSite(); new TermSiteManager(pipeline, repository).generateSite(); } } } } siteManager.generateHtaccess(); } } } } Loading