From fc14a7290842049316edd3af501e42719f749a31 Mon Sep 17 00:00:00 2001 From: Olaf Hartig Date: Fri, 25 Dec 2015 22:02:45 +0100 Subject: [PATCH 1/3] added the possibility to specify relevant IDataSourceType implementations in the config file --- config-example.json | 5 ++ .../config/ConfigReader.java | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/config-example.json b/config-example.json index 4a5a721..11fcdf1 100644 --- a/config-example.json +++ b/config-example.json @@ -1,6 +1,11 @@ { "title": "My Linked Data Fragments server", + "datasourcetypes": { + "HdtDatasource" : "org.linkeddatafragments.datasource.hdt.HdtDataSourceType", + "JenaTDBDatasource" : "org.linkeddatafragments.datasource.tdb.JenaTDBDataSourceType" + }, + "datasources": { "dbpedia": { "title": "DBPedia", diff --git a/src/org/linkeddatafragments/config/ConfigReader.java b/src/org/linkeddatafragments/config/ConfigReader.java index a3240cc..7b2d99a 100644 --- a/src/org/linkeddatafragments/config/ConfigReader.java +++ b/src/org/linkeddatafragments/config/ConfigReader.java @@ -5,6 +5,8 @@ import java.util.Map; import java.util.Map.Entry; +import org.linkeddatafragments.datasource.IDataSourceType; + import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -13,8 +15,10 @@ * Reads the configuration of a Linked Data Fragments server. * * @author Ruben Verborgh + * @author Olaf Hartig */ public class ConfigReader { + private final Map dataSourceTypes = new HashMap<>(); private final Map dataSources = new HashMap<>(); private final Map prefixes = new HashMap<>(); private final String baseURL; @@ -28,6 +32,10 @@ public ConfigReader(Reader configReader) { JsonObject root = new JsonParser().parse(configReader).getAsJsonObject(); this.baseURL = root.has("baseURL") ? root.getAsJsonPrimitive("baseURL").getAsString() : null; + for (Entry entry : root.getAsJsonObject("datasourcetypes").entrySet()) { + final String className = entry.getValue().getAsString(); + dataSourceTypes.put(entry.getKey(), initDataSouceType(className) ); + } for (Entry entry : root.getAsJsonObject("datasources").entrySet()) { JsonObject dataSource = entry.getValue().getAsJsonObject(); this.dataSources.put(entry.getKey(), dataSource); @@ -37,6 +45,15 @@ public ConfigReader(Reader configReader) { } } + /** + * Gets the data source types. + * + * @return a mapping of names of data source types to these types + */ + public Map getDataSourceTypes() { + return dataSourceTypes; + } + /** * Gets the data sources. * @@ -58,4 +75,35 @@ public Map getPrefixes() { public String getBaseURL() { return baseURL; } + + protected IDataSourceType initDataSouceType( final String className ) + { + final Class c; + try { + c = Class.forName( className ); + } + catch ( ClassNotFoundException e ) { + throw new IllegalArgumentException( "Class not found: " + className, + e ); + } + + final Object o; + try { + o = c.newInstance(); + } + catch ( Exception e ) { + throw new IllegalArgumentException( + "Creating an instance of class '" + className + "' " + + "caused a " + e.getClass().getSimpleName() + ": " + + e.getMessage(), e ); + } + + if ( ! (o instanceof IDataSourceType) ) + throw new IllegalArgumentException( + "Class '" + className + "' is not an implementation " + + "of IDataSourceType." ); + + return (IDataSourceType) o; + } + } From 5022839d7e121d9eb19acc01d1729ffb2e8fe6cb Mon Sep 17 00:00:00 2001 From: Olaf Hartig Date: Fri, 25 Dec 2015 22:04:55 +0100 Subject: [PATCH 2/3] changed the servlet to make use of thespecification of relevant IDataSourceType implementations as given in the config file --- .../servlet/LinkedDataFragmentServlet.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/org/linkeddatafragments/servlet/LinkedDataFragmentServlet.java b/src/org/linkeddatafragments/servlet/LinkedDataFragmentServlet.java index 9a16dce..6b4f89b 100644 --- a/src/org/linkeddatafragments/servlet/LinkedDataFragmentServlet.java +++ b/src/org/linkeddatafragments/servlet/LinkedDataFragmentServlet.java @@ -20,11 +20,10 @@ import org.apache.jena.riot.RDFLanguages; import org.linkeddatafragments.config.ConfigReader; import org.linkeddatafragments.datasource.DataSourceFactory; +import org.linkeddatafragments.datasource.DataSourceTypesRegistry; import org.linkeddatafragments.datasource.IDataSource; -import org.linkeddatafragments.datasource.hdt.HdtDataSourceType; +import org.linkeddatafragments.datasource.IDataSourceType; import org.linkeddatafragments.datasource.index.IndexDataSource; -import org.linkeddatafragments.datasource.tdb.JenaTDBDataSourceType; -import org.linkeddatafragments.exceptions.DataSourceException; import org.linkeddatafragments.exceptions.DataSourceNotFoundException; import org.linkeddatafragments.fragments.FragmentRequestParserBase; import org.linkeddatafragments.fragments.LinkedDataFragment; @@ -49,11 +48,6 @@ public class LinkedDataFragmentServlet extends HttpServlet { private final HashMap dataSources = new HashMap<>(); private final Collection mimeTypes = new ArrayList<>(); - public LinkedDataFragmentServlet() { - HdtDataSourceType.register(); - JenaTDBDataSourceType.register(); - } - private File getConfigFile(ServletConfig config) throws IOException { String path = config.getServletContext().getRealPath("/"); if (path == null) { @@ -80,6 +74,13 @@ public void init(ServletConfig servletConfig) throws ServletException { File configFile = getConfigFile(servletConfig); config = new ConfigReader(new FileReader(configFile)); + // register data source types + for ( Entry typeEntry : config.getDataSourceTypes().entrySet() ) { + DataSourceTypesRegistry.register( typeEntry.getKey(), + typeEntry.getValue() ); + } + + // register data sources for (Entry dataSource : config.getDataSources().entrySet()) { dataSources.put(dataSource.getKey(), DataSourceFactory.create(dataSource.getValue())); } @@ -89,7 +90,7 @@ public void init(ServletConfig servletConfig) throws ServletException { mimeTypes.add(Lang.JSONLD.getHeaderString()); mimeTypes.add(Lang.NTRIPLES.getHeaderString()); mimeTypes.add(Lang.RDFXML.getHeaderString()); - } catch (IOException | DataSourceException e) { + } catch (Exception e) { throw new ServletException(e); } } From 1a5d567303ff567705c7046d0657440215ca2858 Mon Sep 17 00:00:00 2001 From: Olaf Hartig Date: Fri, 25 Dec 2015 22:06:17 +0100 Subject: [PATCH 3/3] removed static code for registering the existing data source types --- .../datasource/hdt/HdtDataSourceType.java | 10 ---------- .../datasource/tdb/JenaTDBDataSourceType.java | 10 ---------- .../datasource/HdtDataSourceTest.java | 10 +++++++--- .../datasource/JenaTDBDataSourceTest.java | 9 +++++++-- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/org/linkeddatafragments/datasource/hdt/HdtDataSourceType.java b/src/org/linkeddatafragments/datasource/hdt/HdtDataSourceType.java index d72e2aa..2826c2f 100644 --- a/src/org/linkeddatafragments/datasource/hdt/HdtDataSourceType.java +++ b/src/org/linkeddatafragments/datasource/hdt/HdtDataSourceType.java @@ -3,7 +3,6 @@ import java.io.File; import java.io.IOException; -import org.linkeddatafragments.datasource.DataSourceTypesRegistry; import org.linkeddatafragments.datasource.IDataSource; import org.linkeddatafragments.datasource.IDataSourceType; import org.linkeddatafragments.exceptions.DataSourceException; @@ -17,15 +16,6 @@ */ public class HdtDataSourceType implements IDataSourceType { - public static final String TYPE_NAME = "HdtDatasource"; - - public static void register() { - if ( ! DataSourceTypesRegistry.isRegistered(TYPE_NAME) ) { - DataSourceTypesRegistry.register( TYPE_NAME, - new HdtDataSourceType() ); - } - } - @Override public IDataSource createDataSource( final String title, final String description, diff --git a/src/org/linkeddatafragments/datasource/tdb/JenaTDBDataSourceType.java b/src/org/linkeddatafragments/datasource/tdb/JenaTDBDataSourceType.java index 5f38eee..3be3dea 100644 --- a/src/org/linkeddatafragments/datasource/tdb/JenaTDBDataSourceType.java +++ b/src/org/linkeddatafragments/datasource/tdb/JenaTDBDataSourceType.java @@ -2,7 +2,6 @@ import java.io.File; -import org.linkeddatafragments.datasource.DataSourceTypesRegistry; import org.linkeddatafragments.datasource.IDataSource; import org.linkeddatafragments.datasource.IDataSourceType; import org.linkeddatafragments.exceptions.DataSourceException; @@ -17,15 +16,6 @@ */ public class JenaTDBDataSourceType implements IDataSourceType { - public static final String TYPE_NAME = "JenaTDBDatasource"; - - public static void register() { - if ( ! DataSourceTypesRegistry.isRegistered(TYPE_NAME) ) { - DataSourceTypesRegistry.register( TYPE_NAME, - new JenaTDBDataSourceType() ); - } - } - @Override public IDataSource createDataSource( final String title, final String description, diff --git a/src/test/java/org/linkeddatafragments/datasource/HdtDataSourceTest.java b/src/test/java/org/linkeddatafragments/datasource/HdtDataSourceTest.java index f9f7ef4..482ec77 100644 --- a/src/test/java/org/linkeddatafragments/datasource/HdtDataSourceTest.java +++ b/src/test/java/org/linkeddatafragments/datasource/HdtDataSourceTest.java @@ -7,6 +7,7 @@ import org.junit.Before; import org.junit.BeforeClass; import org.linkeddatafragments.datasource.DataSourceFactory; +import org.linkeddatafragments.datasource.DataSourceTypesRegistry; import org.linkeddatafragments.datasource.hdt.HdtDataSourceType; import org.rdfhdt.hdt.enums.RDFNotation; import org.rdfhdt.hdt.hdt.HDT; @@ -24,7 +25,11 @@ public class HdtDataSourceTest extends DataSourceTest { @BeforeClass public static void setUpClass() throws Exception { - HdtDataSourceType.register(); + final String typeName = "HdtTestSourceType"; + if ( ! DataSourceTypesRegistry.isRegistered(typeName) ) { + DataSourceTypesRegistry.register( typeName, new HdtDataSourceType() ); + } + // HDT does not seem to support an InputReader, so write to temp file File temp = getResourceAsFile(); @@ -37,8 +42,7 @@ public static void setUpClass() throws Exception { temp.getAbsoluteFile().delete(); // Everything is in place, now create the LDF datasource - JsonObject config = createConfig("hdt test", "hdt test", - HdtDataSourceType.TYPE_NAME); + JsonObject config = createConfig("hdt test", "hdt test", typeName); JsonObject settings = new JsonObject(); settings.addProperty("file", hdtfile.getAbsolutePath()); diff --git a/src/test/java/org/linkeddatafragments/datasource/JenaTDBDataSourceTest.java b/src/test/java/org/linkeddatafragments/datasource/JenaTDBDataSourceTest.java index 00548b3..6a3be38 100644 --- a/src/test/java/org/linkeddatafragments/datasource/JenaTDBDataSourceTest.java +++ b/src/test/java/org/linkeddatafragments/datasource/JenaTDBDataSourceTest.java @@ -19,6 +19,7 @@ import org.junit.BeforeClass; import org.linkeddatafragments.datasource.DataSourceFactory; +import org.linkeddatafragments.datasource.DataSourceTypesRegistry; import org.linkeddatafragments.datasource.tdb.JenaTDBDataSourceType; /** @@ -31,7 +32,11 @@ public class JenaTDBDataSourceTest extends DataSourceTest { @BeforeClass public static void setUpClass() throws Exception { - JenaTDBDataSourceType.register(); + final String typeName = "JenaSourceType"; + if ( ! DataSourceTypesRegistry.isRegistered(typeName) ) { + DataSourceTypesRegistry.register( typeName, + new JenaTDBDataSourceType() ); + } String tmpdir = System.getProperty("java.io.tmpdir"); jena = new File(tmpdir, "ldf-jena-test"); @@ -46,7 +51,7 @@ public static void setUpClass() throws Exception { // Everything is in place, now create the LDF datasource JsonObject config = createConfig("jena tdb test", "jena tdb test", - JenaTDBDataSourceType.TYPE_NAME); + typeName); JsonObject settings = new JsonObject(); settings.addProperty("directory", jena.getAbsolutePath());