- test improved

This commit is contained in:
lucio.lelii 2020-12-03 18:13:34 +01:00
parent f7ced19279
commit 43a07dcbff
7 changed files with 211 additions and 10 deletions

View File

@ -136,7 +136,7 @@
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.0</version>
<version>2.12.0</version>
</dependency>
<dependency>

View File

@ -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<String> contexts = contextContainer.getAvailableContexts();
log.debug("found {}",contexts);
return new ContextList(contexts);
}catch (Exception e) {
throw new WebApplicationException(e);
}
}
@PUT

View File

@ -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<String> 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;
}
}

View File

@ -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);
}
}

View File

@ -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<String, TreeItem> 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<String> getContexts(){
log.debug("searching for contexts");
List<String> 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<String> deepSearch(Set<TreeItem> children, String parentString) {
List<String> 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;
}
}

View File

@ -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<TreeItem> 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<TreeItem> 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;
}
}

View File

@ -1,12 +1,18 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%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
</Pattern>
</layout>
</appender>
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
<logger name="org.gcube.vremanagement" level="DEBUG"/>
</configuration>