diff --git a/pom.xml b/pom.xml
index ba404c5..a1cce6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -136,7 +136,7 @@
com.fasterxml.jackson.jaxrs
jackson-jaxrs-json-provider
- 2.3.0
+ 2.12.0
diff --git a/src/main/java/org/gcube/vremanagement/contextmanager/services/ContextService.java b/src/main/java/org/gcube/vremanagement/contextmanager/services/ContextService.java
index e264490..cc877cd 100644
--- a/src/main/java/org/gcube/vremanagement/contextmanager/services/ContextService.java
+++ b/src/main/java/org/gcube/vremanagement/contextmanager/services/ContextService.java
@@ -1,6 +1,5 @@
package org.gcube.vremanagement.contextmanager.services;
-import java.util.Arrays;
import java.util.List;
import javax.enterprise.context.RequestScoped;
@@ -11,6 +10,7 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import org.gcube.common.resources.gcore.Resource;
@@ -19,8 +19,9 @@ import org.gcube.smartgears.ApplicationManagerProvider;
import org.gcube.smartgears.ContextProvider;
import org.gcube.smartgears.annotations.ManagedBy;
import org.gcube.smartgears.context.application.ApplicationContext;
-import org.gcube.vremanagement.contextmanager.ResourceManager;
import org.gcube.vremanagement.contextmanager.ContextAppManager;
+import org.gcube.vremanagement.contextmanager.ResourceManager;
+import org.gcube.vremanagement.contextmanager.handlers.ContextContainer;
import org.gcube.vremanagement.contextmanager.handlers.ContextHandler;
import org.gcube.vremanagement.contextmanager.model.types.ContextList;
import org.slf4j.Logger;
@@ -56,11 +57,21 @@ public class ContextService {
@PathParam("vo")
String vo;
+ @Inject
+ ContextContainer contextContainer;
+
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("")
public ContextList getContexts() {
- return new ContextList(Arrays.asList("/gcube","/gcube/devsec"));
+ log.info("get Context called");
+ try {
+ List contexts = contextContainer.getAvailableContexts();
+ log.debug("found {}",contexts);
+ return new ContextList(contexts);
+ }catch (Exception e) {
+ throw new WebApplicationException(e);
+ }
}
@PUT
diff --git a/src/test/java/org/gcube/vremanagement/contextmanager/ContextContainerTester.java b/src/test/java/org/gcube/vremanagement/contextmanager/ContextContainerTester.java
new file mode 100644
index 0000000..f7a9114
--- /dev/null
+++ b/src/test/java/org/gcube/vremanagement/contextmanager/ContextContainerTester.java
@@ -0,0 +1,38 @@
+package org.gcube.vremanagement.contextmanager;
+
+import java.util.List;
+
+import org.gcube.vremanagement.contextmanager.handlers.ContextContainer;
+import org.gcube.vremanagement.contextmanager.model.types.Context;
+import org.gcube.vremanagement.contextmanager.model.types.Context.Type;
+
+public class ContextContainerTester implements ContextContainer {
+
+ private ContextTree contextTree = new ContextTree() {
+
+ @Override
+ public void init() {
+ TreeItem root = this.createItem(null, new Context("gcube", "gcube", Type.INFRASTRUCTURE));
+ TreeItem devsec = this.createItem(root.getContext().getId(), new Context("devsec", "devsec", Type.VO));
+ TreeItem devNext = this.createItem(root.getContext().getId(), new Context("devNext", "devNext", Type.VO));
+ this.createItem(devsec.getContext().getId(), new Context("devVRE", "devVRE", Type.VRE));
+ this.createItem(devNext.getContext().getId(), new Context("nextNext", "nextNext", Type.VRE));
+ }
+ };
+
+ @Override
+ public List getAvailableContexts() {
+ return contextTree.getContexts();
+ }
+
+ @Override
+ public boolean addContext(String parentId, Context toAdd) {
+ return contextTree.createItem(parentId, toAdd)!=null;
+ }
+
+ @Override
+ public boolean removeContext(String contextId) {
+ return contextTree.removeItem(contextId)!=null;
+ }
+
+}
diff --git a/src/test/java/org/gcube/vremanagement/contextmanager/ContextServiceIntegrationTest.java b/src/test/java/org/gcube/vremanagement/contextmanager/ContextServiceIntegrationTest.java
index 90a08e1..e4663bc 100644
--- a/src/test/java/org/gcube/vremanagement/contextmanager/ContextServiceIntegrationTest.java
+++ b/src/test/java/org/gcube/vremanagement/contextmanager/ContextServiceIntegrationTest.java
@@ -36,13 +36,12 @@ public class ContextServiceIntegrationTest extends JerseyTest {
public void getContexts_whenCorrectRequest_thenResponseIsOk() {
- Response response = target("/contexts").request()
- .get();
+ Response response = target("/contexts").request().get();
assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), response.getStatus());
assertEquals("Http Content-Type should be: ", MediaType.APPLICATION_JSON, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
- assertTrue(((ContextList)response.getEntity()).getContexts().size()>0);
+ assertTrue(response.readEntity(ContextList.class).getContexts().size()>0);
}
}
diff --git a/src/test/java/org/gcube/vremanagement/contextmanager/ContextTree.java b/src/test/java/org/gcube/vremanagement/contextmanager/ContextTree.java
new file mode 100644
index 0000000..245d0df
--- /dev/null
+++ b/src/test/java/org/gcube/vremanagement/contextmanager/ContextTree.java
@@ -0,0 +1,77 @@
+package org.gcube.vremanagement.contextmanager;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.gcube.vremanagement.contextmanager.model.types.Context;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class ContextTree {
+
+ private static Logger log = LoggerFactory.getLogger(ContextTree.class);
+
+ public ContextTree() {
+ init();
+ }
+
+ private static TreeItem root;
+
+ private static Map values = new HashMap<>();
+
+ public abstract void init();
+
+ public synchronized TreeItem removeItem(String itemId) {
+ TreeItem item = values.get(itemId);
+ if (item.isLeaf())
+ return values.remove(itemId);
+ throw new IllegalArgumentException("item is not a leaf");
+ }
+
+ public synchronized TreeItem createItem(String parentId, Context context) {
+ TreeItem item;
+ if (parentId==null) {
+ if (root!=null) throw new IllegalArgumentException("root is already set");
+ item = new TreeItem(null, context);
+ root= item;
+ } else {
+ TreeItem parentItem = values.get(parentId);
+ if (context.getType().getPossibleParent()!=parentItem.getContext().getType())
+ throw new IllegalArgumentException("parent not valid");
+ item = new TreeItem(parentItem, context);
+ parentItem.addChild(item);
+ }
+ values.put(context.getId(), item);
+ return item;
+ }
+
+ public Context getContext(String id) {
+ return values.get(id).getContext();
+ }
+
+ public List getContexts(){
+ log.debug("searching for contexts");
+ List toReturn = new ArrayList<>();
+ String rootString = "/"+root.getContext().getId();
+ toReturn.add(rootString);
+ if (!root.isLeaf())
+ toReturn.addAll(deepSearch(root.getChildren(), rootString));
+ log.debug("found {} contexts", toReturn.size());
+ return toReturn;
+ }
+
+ private List deepSearch(Set children, String parentString) {
+ List toReturn = new ArrayList<>();
+ for (TreeItem item : children) {
+ String itemString = String.format("%s/%s", parentString, item.getContext().getId());
+ toReturn.add(itemString);
+ if (!item.isLeaf())
+ toReturn.addAll(deepSearch(item.getChildren(), itemString));
+ }
+ return toReturn;
+ }
+
+}
diff --git a/src/test/java/org/gcube/vremanagement/contextmanager/TreeItem.java b/src/test/java/org/gcube/vremanagement/contextmanager/TreeItem.java
new file mode 100644
index 0000000..6bd78a4
--- /dev/null
+++ b/src/test/java/org/gcube/vremanagement/contextmanager/TreeItem.java
@@ -0,0 +1,70 @@
+package org.gcube.vremanagement.contextmanager;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.gcube.vremanagement.contextmanager.model.types.Context;
+
+public class TreeItem {
+
+ TreeItem parent;
+ Context context;
+
+ private Set children = new HashSet<>();
+
+ public TreeItem(TreeItem parent, Context context) {
+ this.parent = parent;
+ this.context = context;
+ }
+
+ public void addChild(TreeItem child) {
+ children.add(child);
+ }
+
+ public void removeChild(TreeItem child) {
+ children.remove(child);
+ }
+
+ public Set getChildren() {
+ return Collections.unmodifiableSet(children);
+ }
+
+ public TreeItem getParent() {
+ return parent;
+ }
+
+ public Context getContext() {
+ return context;
+ }
+
+ public boolean isLeaf() {
+ return children.size()==0;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((context == null) ? 0 : context.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TreeItem other = (TreeItem) obj;
+ if (context == null) {
+ if (other.context != null)
+ return false;
+ } else if (!context.equals(other.context))
+ return false;
+ return true;
+ }
+
+}
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index c5fbacc..79dd5bf 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -1,12 +1,18 @@
-
+
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
-
+
+
+
+
+
+