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 - + + + + + +