diff --git a/server/src/main/java/org/diskproject/server/db/DiskDB.java b/server/src/main/java/org/diskproject/server/db/DiskDB.java index a1bd5e9..16079bf 100644 --- a/server/src/main/java/org/diskproject/server/db/DiskDB.java +++ b/server/src/main/java/org/diskproject/server/db/DiskDB.java @@ -6,7 +6,6 @@ import java.util.Date; import java.util.List; -import org.diskproject.server.managers.MethodAdapterManager; import org.diskproject.server.repository.DiskRDF; import org.diskproject.server.util.KBCache; import org.diskproject.server.util.KBUtils; @@ -44,12 +43,10 @@ public class DiskDB { private DiskRDF rdf; private KBAPI diskKB, domainKB; private KBCache DISKOnt; - public MethodAdapterManager methodAdapters; - public DiskDB (String domain, DiskRDF rdf, MethodAdapterManager methodAdapters) { + public DiskDB (String domain, DiskRDF rdf) { this.domain = domain; this.rdf = rdf; - this.methodAdapters = methodAdapters; this.loadKB(); this.domainKB = getOrCreateKB(domain); if (this.domainKB == null) //TODO: check this. @@ -230,19 +227,34 @@ private List completeGraphWithDomains (Graph graph, String domain, Strin return triples; } - // -- Common - private KBObject findOrWriteEndpoint (Endpoint p) { - // All entities should be unique - int id = p.toString().hashCode(); - KBObject KBEndpoint = domainKB.getIndividual(createEndpointURI(id)); - //Check if this entity exists + // -- Endpoints + public Endpoint registerEndpoint (Endpoint item) { + int id = (item.getName() + item.getUrl()).hashCode(); + item.setId(createEndpointURI(id)); + + this.rdf.startRead(); + KBObject KBEndpoint = domainKB.getIndividual(item.getId()); Endpoint endpoint = loadEndpoint(KBEndpoint); + this.rdf.end(); if (endpoint == null) { - //FIXME: Cannot create the endpoint here, we need to check that the endpoint is valid first - System.out.println("Endpoint does not exist. Creating..."); - domainKB.setPropertyValue(KBEndpoint, DISKOnt.getProperty(DISK.HAS_SOURCE_NAME), domainKB.createLiteral(p.getName())); - domainKB.setPropertyValue(KBEndpoint, DISKOnt.getProperty(DISK.HAS_SOURCE_URL), domainKB.createLiteral(p.getUrl())); + System.out.println("Configuration changed! Adding endpoint:"); + this.rdf.startWrite(); + this.writeEndpoint(item); + this.rdf.save(domainKB); + this.rdf.end(); + System.out.println(item); + return item; } + return endpoint; + } + + // -- Common + private KBObject writeEndpoint (Endpoint p) { + KBObject KBEndpoint = domainKB.createObjectOfClass(p.getId(), DISKOnt.getClass(DISK.ENDPOINT)); + domainKB.setPropertyValue(KBEndpoint, DISKOnt.getProperty(DISK.HAS_SOURCE_NAME), + domainKB.createLiteral(p.getName())); + domainKB.setPropertyValue(KBEndpoint, DISKOnt.getProperty(DISK.HAS_SOURCE_URL), + domainKB.createLiteral(p.getUrl())); return KBEndpoint; } @@ -251,7 +263,7 @@ private Endpoint loadEndpoint (KBObject endpoint) { KBObject url = domainKB.getPropertyValue(endpoint, DISKOnt.getProperty(DISK.HAS_SOURCE_URL)); if (name == null || url == null) return null; - return new Endpoint(name.getValueAsString(), url.getValueAsString()); + return new Endpoint(name.getValueAsString(), url.getValueAsString(), endpoint.getID()); } private KBObject writeEntity (Entity src) { @@ -492,7 +504,7 @@ private KBObject _writeDataQueryTemplate (DataQueryTemplate dataQuery, KBObject if (dataQuery.getDescription() != null) domainKB.setComment(dq, dataQuery.getDescription()); if (dataQuery.getEndpoint() != null) - domainKB.setPropertyValue(dq, DISKOnt.getProperty(DISK.HAS_DATA_SOURCE), findOrWriteEndpoint(dataQuery.getEndpoint())); + domainKB.setPropertyValue(dq, DISKOnt.getProperty(DISK.HAS_DATA_SOURCE), domainKB.getIndividual(dataQuery.getEndpoint().getId())); if (dataQuery.getTemplate() != null) domainKB.setPropertyValue(dq, DISKOnt.getProperty(DISK.HAS_QUERY_TEMPLATE), domainKB.createLiteral(dataQuery.getTemplate())); if (dataQuery.getVariablesToShow() != null) @@ -696,7 +708,7 @@ private KBObject _writeWorkflowSeed (WorkflowSeed seed, KBObject seedObj, String if (seed.getDescription() != null) domainKB.setComment(seedObj, seed.getDescription()); if (seed.getSource() != null) - domainKB.setPropertyValue(seedObj, DISKOnt.getClass(DISK.HAS_WORKFLOW_SOURCE), findOrWriteEndpoint(seed.getSource())); + domainKB.setPropertyValue(seedObj, DISKOnt.getClass(DISK.HAS_WORKFLOW_SOURCE), domainKB.getResource(seed.getSource().getId())); if (seed.getLink() != null) domainKB.setPropertyValue(seedObj, DISKOnt.getClass(DISK.HAS_WORKFLOW), domainKB.createLiteral(seed.getLink()) ); diff --git a/server/src/main/java/org/diskproject/server/managers/DataAdapterManager.java b/server/src/main/java/org/diskproject/server/managers/DataAdapterManager.java index 3ff3a35..91d1a35 100644 --- a/server/src/main/java/org/diskproject/server/managers/DataAdapterManager.java +++ b/server/src/main/java/org/diskproject/server/managers/DataAdapterManager.java @@ -3,13 +3,16 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.Callable; import org.diskproject.server.adapters.GraphDBAdapter; import org.diskproject.server.adapters.SparqlAdapter; +import org.diskproject.server.db.DiskDB; import org.diskproject.server.util.Config; import org.diskproject.server.util.Config.DataAdapterConfig; import org.diskproject.server.util.ConfigKeys; import org.diskproject.shared.classes.adapters.DataAdapter; +import org.diskproject.shared.classes.common.Endpoint; public class DataAdapterManager { protected Map byUrl, byName; @@ -84,4 +87,11 @@ public String toString () { public Collection values () { return this.byUrl.values(); } + + public void registerAdapters (DiskDB db) { + for (DataAdapter adp: this.values()) { + Endpoint cur = db.registerEndpoint(new Endpoint(adp.getName(), adp.getEndpointUrl())); + adp.setId(cur.getId()); + } + } } \ No newline at end of file diff --git a/server/src/main/java/org/diskproject/server/managers/MethodAdapterManager.java b/server/src/main/java/org/diskproject/server/managers/MethodAdapterManager.java index c13c43b..72ec1ac 100644 --- a/server/src/main/java/org/diskproject/server/managers/MethodAdapterManager.java +++ b/server/src/main/java/org/diskproject/server/managers/MethodAdapterManager.java @@ -1,16 +1,19 @@ package org.diskproject.server.managers; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.diskproject.server.adapters.AirFlowAdapter; +import org.diskproject.server.db.DiskDB; import org.diskproject.server.repository.WingsAdapter; import org.diskproject.server.util.Config; import org.diskproject.server.util.Config.MethodAdapterConfig; import org.diskproject.server.util.ConfigKeys; import org.diskproject.shared.classes.adapters.MethodAdapter; +import org.diskproject.shared.classes.common.Endpoint; import org.diskproject.shared.classes.workflow.Workflow; import org.diskproject.shared.classes.workflow.WorkflowVariable; @@ -75,6 +78,10 @@ public List getWorkflowList () { return list; } + public Collection values () { + return this.byUrl.values(); + } + public List getWorkflowVariablesByName (String sourceName, String id) { MethodAdapter cur = this.getMethodAdapterByName(sourceName); if (cur != null) @@ -96,4 +103,11 @@ public String toString () { } return txt; } + + public void registerAdapters (DiskDB db) { + for (MethodAdapter adp: this.values()) { + Endpoint cur = db.registerEndpoint(new Endpoint(adp.getName(), adp.getEndpointUrl())); + adp.setId(cur.getId()); + } + } } \ No newline at end of file diff --git a/server/src/main/java/org/diskproject/server/repository/DiskRepository.java b/server/src/main/java/org/diskproject/server/repository/DiskRepository.java index 363c630..6db6347 100644 --- a/server/src/main/java/org/diskproject/server/repository/DiskRepository.java +++ b/server/src/main/java/org/diskproject/server/repository/DiskRepository.java @@ -116,10 +116,14 @@ public DiskRepository() { // Threads this.threadManager = new ThreadManager(methodAdapters, this); // FIXME: instead of this should be the db & adapters. // These read/write RDF - this.diskDB = new DiskDB(server, this.rdf, this.methodAdapters); + this.diskDB = new DiskDB(server, this.rdf); this.questionDB = new QuestionDB(this.rdf, this.dataAdapters); this.vocabularyManager = new VocabularyManager(this.rdf); this.addInternalVocabularies(); + + // Register adapters as Endpoints on the RDF store + this.dataAdapters.registerAdapters(diskDB); + this.methodAdapters.registerAdapters(diskDB); } public void shutdownExecutors() { diff --git a/shared/src/main/java/org/diskproject/shared/classes/adapters/DataAdapter.java b/shared/src/main/java/org/diskproject/shared/classes/adapters/DataAdapter.java index f8fbef1..632a8a4 100644 --- a/shared/src/main/java/org/diskproject/shared/classes/adapters/DataAdapter.java +++ b/shared/src/main/java/org/diskproject/shared/classes/adapters/DataAdapter.java @@ -6,6 +6,7 @@ public abstract class DataAdapter { private String endpointUrl, name, username, password, description; private String prefix, namespace, prefixResolution; + private String id; public DataAdapter(String URI, String name) { this.endpointUrl = URI; @@ -70,6 +71,14 @@ public String toString () { return "[" + this.name + "] " + (this.username != null ? this.username + "@" : "") + this.endpointUrl; } + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public abstract List query (String queryString) throws Exception; public abstract byte[] queryCSV(String queryString) throws Exception; diff --git a/shared/src/main/java/org/diskproject/shared/classes/adapters/MethodAdapter.java b/shared/src/main/java/org/diskproject/shared/classes/adapters/MethodAdapter.java index abefd75..75ec64c 100644 --- a/shared/src/main/java/org/diskproject/shared/classes/adapters/MethodAdapter.java +++ b/shared/src/main/java/org/diskproject/shared/classes/adapters/MethodAdapter.java @@ -16,6 +16,7 @@ public abstract class MethodAdapter { private String password; private String description; private Float version; + private String id; public static class FileAndMeta { public byte[] data; @@ -70,6 +71,14 @@ protected String getPassword () { return this.password; } + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public String toString () { return "[" + this.name + "] " + (this.username != null ? this.username + "@" : "") + this.endpointUrl; } diff --git a/shared/src/main/java/org/diskproject/shared/classes/common/Endpoint.java b/shared/src/main/java/org/diskproject/shared/classes/common/Endpoint.java index 349338a..d2871af 100644 --- a/shared/src/main/java/org/diskproject/shared/classes/common/Endpoint.java +++ b/shared/src/main/java/org/diskproject/shared/classes/common/Endpoint.java @@ -2,6 +2,7 @@ public class Endpoint { private String name, url; + private String id; public Endpoint() {} @@ -10,6 +11,12 @@ public Endpoint(String name, String url) { this.url = url; } + public Endpoint(String name, String url, String id) { + this.name = name; + this.url = url; + this.id = id; + } + public String getName() { return name; } @@ -26,8 +33,16 @@ public void setUrl(String url) { this.url = url; } + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + @Override public String toString() { - return "[" + this.name + "|" + this.url + "]"; + return (this.id != null ? "(" + this.id + ")" : "") + "[" + this.name + "|" + this.url + "]"; } } \ No newline at end of file diff --git a/shared/src/main/java/org/diskproject/shared/classes/util/DataAdapterResponse.java b/shared/src/main/java/org/diskproject/shared/classes/util/DataAdapterResponse.java index 523f109..700630b 100644 --- a/shared/src/main/java/org/diskproject/shared/classes/util/DataAdapterResponse.java +++ b/shared/src/main/java/org/diskproject/shared/classes/util/DataAdapterResponse.java @@ -3,7 +3,7 @@ import org.diskproject.shared.classes.adapters.DataAdapter; public class DataAdapterResponse { - public String url, name, prefix, namespace, description, prefixResolution; + public String url, name, prefix, namespace, description, prefixResolution, id; public DataAdapterResponse (DataAdapter dataAdapter) { this.url = dataAdapter.getEndpointUrl(); @@ -18,5 +18,7 @@ public DataAdapterResponse (DataAdapter dataAdapter) { this.description = dataAdapter.getDescription(); if (dataAdapter.getPrefixResolution() != null) this.prefixResolution = dataAdapter.getPrefixResolution(); + if (dataAdapter.getId() != null) + this.id = dataAdapter.getId(); } } \ No newline at end of file