diff --git a/README.md b/README.md
index 0233966..dcdb0cf 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# eENVplus Thesaurus Framework Exploitation Service
+# eENVplus Thesaurus Framework Exploitation Service
\ No newline at end of file
diff --git a/TF_Exploitation_Server_core/pom.xml b/TF_Exploitation_Server_core/pom.xml
index 7190dbf..c73a1ba 100644
--- a/TF_Exploitation_Server_core/pom.xml
+++ b/TF_Exploitation_Server_core/pom.xml
@@ -7,7 +7,7 @@
net.disy.eenvplus
eenvplus-tf-exploitation-server-parent
- 0.3.3-SNAPSHOT
+ 0.4.4-SNAPSHOT
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/exceptions/UnknownRelationException.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/exceptions/UnknownRelationException.java
new file mode 100644
index 0000000..c43ded7
--- /dev/null
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/exceptions/UnknownRelationException.java
@@ -0,0 +1,20 @@
+//Copyright (c) 2015 by Disy Informationssysteme GmbH
+package net.disy.eenvplus.tfes.core.api.exceptions;
+
+// NOT_PUBLISHED
+
+public class UnknownRelationException extends ServiceException {
+ private static final long serialVersionUID = 1L;
+
+ private final String relation;
+
+ public UnknownRelationException(String relation) {
+ super(null);
+ this.relation = relation;
+ }
+
+ public String getRelation() {
+ return relation;
+ }
+
+}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/modules/IRelativeNeighbourhoodProviderServiceModule.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/modules/IRelativeNeighbourhoodProviderServiceModule.java
new file mode 100644
index 0000000..f54af33
--- /dev/null
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/modules/IRelativeNeighbourhoodProviderServiceModule.java
@@ -0,0 +1,15 @@
+//Copyright (c) 2015 by Disy Informationssysteme GmbH
+package net.disy.eenvplus.tfes.core.api.modules;
+
+import java.util.concurrent.Callable;
+
+import net.disy.eenvplus.tfes.core.api.query.IConceptQuery;
+import net.disy.eenvplus.tfes.core.api.response.IVisualizationNode;
+
+// NOT_PUBLISHED
+
+public interface IRelativeNeighbourhoodProviderServiceModule extends IServiceModule {
+
+ Callable getNeighbourhood(IConceptQuery query);
+
+}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/query/QueryParameterKeys.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/query/QueryParameterKeys.java
new file mode 100644
index 0000000..dfd3f3c
--- /dev/null
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/query/QueryParameterKeys.java
@@ -0,0 +1,18 @@
+//Copyright (c) 2015 by Disy Informationssysteme GmbH
+package net.disy.eenvplus.tfes.core.api.query;
+
+// NOT_PUBLISHED
+
+public enum QueryParameterKeys {
+ QUERY_DEPTH("query_depth"), RELATIONS("relations"); //$NON-NLS-1$//$NON-NLS-2$
+
+ private String key;
+
+ private QueryParameterKeys(String key) {
+ this.key = key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/response/IVisualizationNode.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/response/IVisualizationNode.java
new file mode 100644
index 0000000..4d85759
--- /dev/null
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/response/IVisualizationNode.java
@@ -0,0 +1,13 @@
+//Copyright (c) 2015 by Disy Informationssysteme GmbH
+package net.disy.eenvplus.tfes.core.api.response;
+
+import java.util.Collection;
+
+// NOT_PUBLISHED
+
+public interface IVisualizationNode {
+ IRelatedConcept getElement();
+
+ Collection getChildren();
+
+}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/service/IServiceManager.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/service/IServiceManager.java
index c547e16..a3f3205 100644
--- a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/service/IServiceManager.java
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/api/service/IServiceManager.java
@@ -6,6 +6,7 @@
import net.disy.eenvplus.tfes.core.api.capabilities.ServiceModuleDescription;
import net.disy.eenvplus.tfes.core.api.exceptions.ServiceException;
+import net.disy.eenvplus.tfes.core.api.query.IConceptQuery;
import net.disy.eenvplus.tfes.core.api.query.IDescribeConceptQuery;
import net.disy.eenvplus.tfes.core.api.query.IRelativeQuery;
import net.disy.eenvplus.tfes.core.api.query.IResolveThesaurusQuery;
@@ -18,6 +19,7 @@
import net.disy.eenvplus.tfes.core.api.response.ISuggestion;
import net.disy.eenvplus.tfes.core.api.response.ISynonym;
import net.disy.eenvplus.tfes.core.api.response.ITopMostConcept;
+import net.disy.eenvplus.tfes.core.api.response.IVisualizationNode;
// NOT_PUBLISHED
public interface IServiceManager {
@@ -34,6 +36,8 @@ public interface IServiceManager {
List getTopMostConceptDescriptions();
+ List getRelativeNeighbourhoodDescriptions();
+
Collection getSuggestions(ISuggestionQuery query) throws ServiceException;
IConceptDescription describeConcept(IDescribeConceptQuery capture) throws ServiceException;
@@ -47,4 +51,6 @@ public interface IServiceManager {
Collection getTopMostConcepts(ITopMostConceptQuery query)
throws ServiceException;
+ IVisualizationNode getRelativeNeighbourhood(IConceptQuery query) throws ServiceException;
+
}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/manager/ServiceManager.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/manager/ServiceManager.java
index 99d75cf..2431983 100644
--- a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/manager/ServiceManager.java
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/manager/ServiceManager.java
@@ -6,6 +6,7 @@
import net.disy.eenvplus.tfes.core.api.capabilities.ServiceModuleDescription;
import net.disy.eenvplus.tfes.core.api.exceptions.ServiceException;
+import net.disy.eenvplus.tfes.core.api.query.IConceptQuery;
import net.disy.eenvplus.tfes.core.api.query.IDescribeConceptQuery;
import net.disy.eenvplus.tfes.core.api.query.IRelativeQuery;
import net.disy.eenvplus.tfes.core.api.query.IResolveThesaurusQuery;
@@ -18,8 +19,10 @@
import net.disy.eenvplus.tfes.core.api.response.ISuggestion;
import net.disy.eenvplus.tfes.core.api.response.ISynonym;
import net.disy.eenvplus.tfes.core.api.response.ITopMostConcept;
+import net.disy.eenvplus.tfes.core.api.response.IVisualizationNode;
import net.disy.eenvplus.tfes.core.api.service.IServiceManager;
import net.disy.eenvplus.tfes.core.module.DescribeConceptModulesManager;
+import net.disy.eenvplus.tfes.core.module.RelatedNeighbourhoodModulesManager;
import net.disy.eenvplus.tfes.core.module.RelativeModulesManager;
import net.disy.eenvplus.tfes.core.module.ResolveThesaurusModulesManager;
import net.disy.eenvplus.tfes.core.module.SuggestionModulesManager;
@@ -45,6 +48,9 @@ public class ServiceManager implements IServiceManager {
@Autowired
private RelativeModulesManager relativeModulesManager;
+ @Autowired
+ private RelatedNeighbourhoodModulesManager relatedNeighbourhoodModulesManager;
+
@Autowired
private SynonymModulesManager synonymModulesManager;
@@ -113,4 +119,14 @@ public Collection getTopMostConcepts(ITopMostConceptQuery query
return topMostConceptModulesManager.getTopMostConcepts(query);
}
+ @Override
+ public List getRelativeNeighbourhoodDescriptions() {
+ return relatedNeighbourhoodModulesManager.getServiceModuleDescription();
+ }
+
+ @Override
+ public IVisualizationNode getRelativeNeighbourhood(IConceptQuery query) throws ServiceException {
+ return relatedNeighbourhoodModulesManager.getRelativeNeighbourhood(query);
+ }
+
}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/DescribeConceptModulesManager.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/DescribeConceptModulesManager.java
index 618f078..e4ae47c 100644
--- a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/DescribeConceptModulesManager.java
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/DescribeConceptModulesManager.java
@@ -2,10 +2,10 @@
package net.disy.eenvplus.tfes.core.module;
import static net.disy.eenvplus.tfes.core.api.response.EmptyConceptDescription.EMPTY_CONCEPT;
+import static net.disy.eenvplus.tfes.core.util.CollectionUtilities.first;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -44,11 +44,7 @@ public IConceptDescription getConceptDescription(IDescribeConceptQuery query)
throws ServiceException {
Set> futures = submitQuery(query);
Collection results = retrieveResults(futures);
- Iterator result = results.iterator();
- if (result.hasNext()) {
- return result.next();
- }
- return EMPTY_CONCEPT;
+ return first(results, EMPTY_CONCEPT);
}
}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/RelatedNeighbourhoodModulesManager.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/RelatedNeighbourhoodModulesManager.java
new file mode 100644
index 0000000..1e4875b
--- /dev/null
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/module/RelatedNeighbourhoodModulesManager.java
@@ -0,0 +1,48 @@
+//Copyright (c) 2015 by Disy Informationssysteme GmbH
+package net.disy.eenvplus.tfes.core.module;
+
+import static net.disy.eenvplus.tfes.core.util.CollectionUtilities.first;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+
+import net.disy.eenvplus.tfes.core.api.exceptions.ServiceException;
+import net.disy.eenvplus.tfes.core.api.modules.IRelativeNeighbourhoodProviderServiceModule;
+import net.disy.eenvplus.tfes.core.api.query.IConceptQuery;
+import net.disy.eenvplus.tfes.core.api.response.IVisualizationNode;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+// NOT_PUBLISHED
+@Service
+public class RelatedNeighbourhoodModulesManager
+ extends
+ AbstractModuleManager {
+
+ @Autowired(required = false)
+ List modules = new ArrayList<>();
+
+ @Override
+ protected List getServiceModules() {
+ return modules;
+ }
+
+ @Override
+ protected Callable createCallable(
+ IConceptQuery query,
+ IRelativeNeighbourhoodProviderServiceModule module) {
+ return module.getNeighbourhood(query);
+ }
+
+ public IVisualizationNode getRelativeNeighbourhood(IConceptQuery query) throws ServiceException {
+ Set> futures = submitQuery(query);
+ Collection results = retrieveResults(futures);
+ return first(results, null);
+ }
+
+}
diff --git a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/util/CollectionUtilities.java b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/util/CollectionUtilities.java
index a006710..94ccc34 100644
--- a/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/util/CollectionUtilities.java
+++ b/TF_Exploitation_Server_core/src/main/java/net/disy/eenvplus/tfes/core/util/CollectionUtilities.java
@@ -2,6 +2,7 @@
package net.disy.eenvplus.tfes.core.util;
import java.util.Collection;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -30,4 +31,12 @@ public static List limitResults(List list, int maxIndex) {
return list;
}
+ public static E first(Collection extends E> collection, E alternative) {
+ Iterator extends E> iterator = collection.iterator();
+ if (iterator.hasNext()) {
+ return iterator.next();
+ }
+ return alternative;
+ }
+
}
diff --git a/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IConceptQueryMatcher.java b/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IConceptQueryMatcher.java
index a8d955c..279f0b1 100644
--- a/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IConceptQueryMatcher.java
+++ b/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IConceptQueryMatcher.java
@@ -7,7 +7,7 @@
// NOT_PUBLISHED
public class IConceptQueryMatcher {
- public static Matcher hasKeyword(Matcher expected) {
+ public static Matcher hasConcept(Matcher expected) {
return new FeatureMatcher(expected, "Concept", "Concept") { //$NON-NLS-1$ //$NON-NLS-2$
@Override
diff --git a/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IServiceQueryMatcher.java b/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IServiceQueryMatcher.java
index 64b364c..12d856a 100644
--- a/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IServiceQueryMatcher.java
+++ b/TF_Exploitation_Server_core/src/test/java/net/disy/eenvplus/tfes/core/api/query/IServiceQueryMatcher.java
@@ -3,6 +3,7 @@
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.is;
import java.util.Map;
@@ -66,20 +67,27 @@ protected Iterable featureValueOf(IServiceQuery query) {
};
}
- public static Matcher super IServiceQuery> hasExtraParameters(
- Matcher