From 528eae3d5ead5f828b3ff51e2b75e5c5c57c1b34 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Tue, 19 Feb 2019 14:18:19 +0000 Subject: [PATCH] git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@177181 82a268e6-3cf1-43bd-a215-b396298e98cf --- pom.xml | 34 +-- .../resolver/ConstantsResolver.java | 17 ++ .../resolver/MultiReadHttpServletRequest.java | 181 +++++++++++++++ .../datatransfer/resolver/UriResolver.java | 5 +- .../resolver/UriResolverServices.java | 213 ++++++++++++++++++ .../init/UriResolverSmartGearManagerInit.java | 3 - .../resolver/requesthandler/TokenSetter.java | 48 +++- .../services/AnalyticsCreateResolver.java | 2 +- .../services/AnalyticsGetResolver.java | 2 +- .../services/BackCatalogueResolver.java | 39 ++++ .../resolver/services/CatalogueResolver.java | 6 +- .../resolver/services/GeonetworkResolver.java | 4 +- .../services/KnimeCreateResolver.java | 2 +- .../resolver/services/KnimeGetResolver.java | 2 +- .../services/PartheosRegistryResolver.java | 2 +- .../resolver/services/SMPIDResolver.java | 4 +- .../resolver/services/SMPResolver.java | 4 +- .../resolver/services/StorageHubResolver.java | 62 +---- .../resolver/services/StorageIDResolver.java | 4 +- .../resolver/services/UriResolverIndex.java | 11 +- .../resolver/services/UriResolverInfo.java | 31 +++ .../services/UriResolverResources.java | 52 +++++ src/test/java/rest/TestResolvers.java | 4 +- 23 files changed, 619 insertions(+), 113 deletions(-) create mode 100644 src/main/java/org/gcube/datatransfer/resolver/MultiReadHttpServletRequest.java create mode 100644 src/main/java/org/gcube/datatransfer/resolver/UriResolverServices.java create mode 100644 src/main/java/org/gcube/datatransfer/resolver/services/BackCatalogueResolver.java create mode 100644 src/main/java/org/gcube/datatransfer/resolver/services/UriResolverInfo.java create mode 100644 src/main/java/org/gcube/datatransfer/resolver/services/UriResolverResources.java diff --git a/pom.xml b/pom.xml index 3b11a87..5626931 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.gcube.data.transfer uri-resolver - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT war The URI Resolver is an HTTP URI resolver implemented as an REST service which gives access trough HTTP to different gcube Resolvers and gCube Applications. @@ -103,7 +103,6 @@ discovery-client - org.gcube.common authorization-client @@ -115,34 +114,25 @@ [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT) - - - - - - - - - - - org.glassfish.jersey.containers jersey-container-servlet - 2.24.1 + ${jersey.version} + compile - - - - - - javax.transaction - javax.transaction-api - 1.2 + org.glassfish.jersey.core + jersey-server + ${jersey.version} + compile + + + + + diff --git a/src/main/java/org/gcube/datatransfer/resolver/ConstantsResolver.java b/src/main/java/org/gcube/datatransfer/resolver/ConstantsResolver.java index 597690d..b8f7be5 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/ConstantsResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/ConstantsResolver.java @@ -4,6 +4,7 @@ package org.gcube.datatransfer.resolver; + /** * The Class ConstantsResolver. * @@ -24,4 +25,20 @@ public class ConstantsResolver { public static final String QUERY_PARAM_CONTENT_TYPE = "contentType"; public static final String QUERY_PARAM_FILE_NAME = "fileName"; + + /*static { + Map aMap = new HashMap(); + aMap.put("smp", "smp"); + aMap.put("id", "id"); + aMap.put("gis", "gis"); + aMap.put("storage", "storage"); + aMap.put("ctlg", "ctlg"); + aMap.put("catalogue", "catalogue"); + aMap.put("geonetwork", "geonetwork"); + aMap.put("shub", "shub"); + aMap.put("parthenos_registry", "parthenos_registry"); + aMap.put("knime", "knime"); + aMap = Collections.unmodifiableMap(aMap); + }*/ + } diff --git a/src/main/java/org/gcube/datatransfer/resolver/MultiReadHttpServletRequest.java b/src/main/java/org/gcube/datatransfer/resolver/MultiReadHttpServletRequest.java new file mode 100644 index 0000000..1eb0a2a --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/MultiReadHttpServletRequest.java @@ -0,0 +1,181 @@ +/** + * + */ + +package org.gcube.datatransfer.resolver; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Map; +import java.util.TreeMap; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.output.ByteArrayOutputStream; + + +/** + * The Class MultiReadHttpServletRequest. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Apr 26, 2016 + */ +public class MultiReadHttpServletRequest extends HttpServletRequestWrapper { + + private ByteArrayOutputStream cachedBytes; + private final Map modifiableParameters; + private Map allParameters = null; + + /** + * Instantiates a new multi read http servlet request. + * + * @param request the request + */ + public MultiReadHttpServletRequest(HttpServletRequest request) { + super(request); + modifiableParameters = new TreeMap(); + } + + /** + * Create a new request wrapper that will merge additional parameters into + * the request object without prematurely reading parameters from the + * original request. + * + * @param request + * the request + * @param additionalParams + * the additional params + */ + public MultiReadHttpServletRequest( + final HttpServletRequest request, + final Map additionalParams) { + + super(request); + modifiableParameters = new TreeMap(); + modifiableParameters.putAll(additionalParams); + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequestWrapper#getInputStream() + */ + @Override + public ServletInputStream getInputStream() throws IOException { + + if (cachedBytes == null) + cacheInputStream(); + return new CachedServletInputStream(); + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequestWrapper#getReader() + */ + @Override + public BufferedReader getReader() throws IOException { + + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + /** + * Cache input stream. + * + * @throws IOException Signals that an I/O exception has occurred. + */ + private void cacheInputStream() + throws IOException { + + /* + * Cache the inputstream in order to read it multiple times. For + * convenience, I use apache.commons IOUtils + */ + cachedBytes = new ByteArrayOutputStream(); + IOUtils.copy(super.getInputStream(), cachedBytes); + } + + /* An inputstream which reads the cached request body */ + /** + * The Class CachedServletInputStream. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Apr 26, 2016 + */ + public class CachedServletInputStream extends ServletInputStream { + + private ByteArrayInputStream input; + + /** + * Instantiates a new cached servlet input stream. + */ + public CachedServletInputStream() { + + /* create a new input stream from the cached request body */ + input = new ByteArrayInputStream(cachedBytes.toByteArray()); + } + + /* (non-Javadoc) + * @see java.io.InputStream#read() + */ + @Override + public int read() throws IOException { + return input.read(); + } + } + + /* + * (non-Javadoc) + * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String) + */ + @Override + public String getParameter(final String name) { + + String[] strings = getParameterMap().get(name); + if (strings != null) { + return strings[0]; + } + return super.getParameter(name); + } + + /* + * (non-Javadoc) + * @see javax.servlet.ServletRequestWrapper#getParameterMap() + */ + @Override + public Map getParameterMap() { + + if (allParameters == null) { + allParameters = new TreeMap(); + allParameters.putAll(super.getParameterMap()); + allParameters.putAll(modifiableParameters); + } + // Return an unmodifiable collection because we need to uphold the + // interface contract. + return Collections.unmodifiableMap(allParameters); + } + + /* + * (non-Javadoc) + * @see javax.servlet.ServletRequestWrapper#getParameterNames() + */ + @Override + public Enumeration getParameterNames() { + + return Collections.enumeration(getParameterMap().keySet()); + } + + /* + * (non-Javadoc) + * @see + * javax.servlet.ServletRequestWrapper#getParameterValues(java.lang.String) + */ + @Override + public String[] getParameterValues(final String name) { + + return getParameterMap().get(name); + } +} diff --git a/src/main/java/org/gcube/datatransfer/resolver/UriResolver.java b/src/main/java/org/gcube/datatransfer/resolver/UriResolver.java index 209e3ac..c90e4ba 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/UriResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/UriResolver.java @@ -1,5 +1,7 @@ package org.gcube.datatransfer.resolver; +import java.util.List; + import javax.ws.rs.Path; import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation; @@ -13,11 +15,12 @@ import org.glassfish.jersey.server.ResourceConfig; @ManagedBy(UriResolverSmartGearManagerInit.class) public class UriResolver extends ResourceConfig { + private static List listOfResources; + public UriResolver() { // Register all resources present under the package. packages(CatalogueResolver.class.getPackage().getName(), TokenSetter.class.getPackage().getName()); packages(DataMinerInvocation.class.getPackage().getName()); - } } diff --git a/src/main/java/org/gcube/datatransfer/resolver/UriResolverServices.java b/src/main/java/org/gcube/datatransfer/resolver/UriResolverServices.java new file mode 100644 index 0000000..9a29f88 --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/UriResolverServices.java @@ -0,0 +1,213 @@ +/** + * + */ + +package org.gcube.datatransfer.resolver; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.ws.rs.Path; + +import org.glassfish.jersey.server.model.Resource; +import org.glassfish.jersey.server.model.ResourceMethod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + + +/** + * The Class UriResolverServices. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * Feb 19, 2019 + */ +public class UriResolverServices { + + + private static Logger log = LoggerFactory.getLogger(UriResolverServices.class); + + private ObjectNode rootResources = null; + private ArrayNode arrayResources = null; + private List listResourcePath = new ArrayList(); + + private static UriResolverServices INSTANCE; + + /** + * Instantiates a new uri resolver services. + */ + private UriResolverServices() { + + } + + /** + * Gets the single instance of UriResolverServices. + * + * @return single instance of UriResolverServices + */ + public static UriResolverServices getInstance() { + + if (INSTANCE == null) { + // synchronized block to remove overhead + synchronized (UriResolverServices.class) { + if (INSTANCE == null) { + // if instance is null, initialize + INSTANCE = new UriResolverServices(); + } + } + } + return INSTANCE; + } + + /** + * Read resources. + * + * @param applicationClasses the application classes + * @return the list + */ + private List readResources(Set> applicationClasses){ + log.info("Read Resources called"); + String basePath = ""; + rootResources = JsonNodeFactory.instance.objectNode(); + arrayResources = JsonNodeFactory.instance.arrayNode(); + rootResources.set("resources", arrayResources); + log.info("Checking basePath: {}",basePath); + for (Class aClass : applicationClasses) { + if (isAnnotatedResourceClass(aClass)) { + + Resource resource = Resource.builder(aClass).build(); + //String uriPrefix = resource.getPath(); + log.info("The resource: {} isAnnotatedResource",resource.getNames()); + process(basePath, resource); + } + } + + if(log.isDebugEnabled()){ + for (String path : listResourcePath) { + log.debug("Found path: {}", path); + } + } + + return listResourcePath; + } + + + /** + * Process. + * + * @param uriPrefix the uri prefix + * @param resource the resource + * @return the list + */ + private void process(String uriPrefix, Resource resource) { + String pathPrefix = uriPrefix; + List resources = new ArrayList<>(); + resources.addAll(resource.getChildResources()); + if (resource.getPath() != null) { + pathPrefix+= resource.getPath(); + } + for (ResourceMethod method : resource.getAllMethods()) { + if (method.getType().equals(ResourceMethod.JaxrsType.SUB_RESOURCE_LOCATOR)) { + resources.add(Resource.from(resource.getResourceLocator().getInvocable().getDefinitionMethod().getReturnType())); + } + else { + addTo(uriPrefix, method, pathPrefix); + log.info("Adding path: {} to ListPrefix",pathPrefix); + listResourcePath.add(pathPrefix); + } + } + for (Resource childResource : resources) { + log.debug("SUB RESOURCES adding: {} with path: {}"+childResource.getName(), childResource.getPath()); + process(pathPrefix, childResource); + } + } + + + /** + * Adds the to. + * + * @param uriPrefix the uri prefix + * @param srm the srm + * @param pathPrefix the path prefix + */ + private void addTo(String uriPrefix, ResourceMethod srm, String pathPrefix){ + + ObjectNode resourceNode = (ObjectNode) arrayResources.get(uriPrefix); + log.debug("The Resource Node with uriPrefix: {} is null: {}", uriPrefix, resourceNode==null); + + if (resourceNode == null){ + //THE RESOURCE NODE DOES NOT EXIST CREATING IT... + ObjectNode theNode = JsonNodeFactory.instance.objectNode(); + ObjectNode inner = JsonNodeFactory.instance.objectNode(); + inner.put("path", pathPrefix); + inner.set("verbs", JsonNodeFactory.instance.arrayNode()); + theNode.set(uriPrefix, inner); + resourceNode = inner; + //ADDING THE RESOURCE NODE CREATED TO THE LIST OF RESOURCES + arrayResources.add(theNode); + } + + //THE RESOURCE ALREADY ADDED SO ADDING ONLY VERB TO IT + ((ArrayNode) resourceNode.get("verbs")).add(srm.getHttpMethod()); + } + + /** + * Checks if is annotated resource class. + * + * @param rc the rc + * @return true, if is annotated resource class + */ + @SuppressWarnings({ + "rawtypes", "unchecked" + }) + private static boolean isAnnotatedResourceClass(Class rc) { + + if (rc.isAnnotationPresent(Path.class)) { + return true; + } + for (Class i : rc.getInterfaces()) { + if (i.isAnnotationPresent(Path.class)) { + return true; + } + } + return false; + } + + + + /** + * Gets the list of resource path. + * + * @param applicationClasses the application classes + * @return the list of resource path + */ + public List getListOfResourcePath(Set> applicationClasses) { + log.trace("The Application Classes are {}", applicationClasses); + + if(listResourcePath.isEmpty()){ + readResources(applicationClasses); + } + + return listResourcePath; + } + + + /** + * Gets the list of resource node. + * + * @param applicationClasses the application classes + * @return the list of resource node + */ + public ObjectNode getListOfResourceNode(Set> applicationClasses) { + + if(rootResources==null){ + readResources(applicationClasses); + } + + return rootResources; + } +} diff --git a/src/main/java/org/gcube/datatransfer/resolver/init/UriResolverSmartGearManagerInit.java b/src/main/java/org/gcube/datatransfer/resolver/init/UriResolverSmartGearManagerInit.java index 074ae25..76a64b8 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/init/UriResolverSmartGearManagerInit.java +++ b/src/main/java/org/gcube/datatransfer/resolver/init/UriResolverSmartGearManagerInit.java @@ -51,7 +51,6 @@ public class UriResolverSmartGearManagerInit implements ApplicationManager { private static ApplicationProfilePropertyReader geoExplorerProfile; private static String parthenosVREName; - /* (non-Javadoc) * @see org.gcube.smartgears.ApplicationManager#onInit() */ @@ -226,6 +225,4 @@ public class UriResolverSmartGearManagerInit implements ApplicationManager { return rootContextScope; } - - } diff --git a/src/main/java/org/gcube/datatransfer/resolver/requesthandler/TokenSetter.java b/src/main/java/org/gcube/datatransfer/resolver/requesthandler/TokenSetter.java index 8526590..d654a27 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/requesthandler/TokenSetter.java +++ b/src/main/java/org/gcube/datatransfer/resolver/requesthandler/TokenSetter.java @@ -1,21 +1,35 @@ package org.gcube.datatransfer.resolver.requesthandler; import java.io.IOException; +import java.net.URI; +import java.util.List; import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.container.ResourceContext; +import javax.ws.rs.core.Application; import javax.ws.rs.core.Context; +import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.Provider; import org.gcube.common.authorization.library.provider.SecurityTokenProvider; import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.datatransfer.resolver.MultiReadHttpServletRequest; +import org.gcube.datatransfer.resolver.UriResolverServices; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * The Class TokenSetter. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * Feb 19, 2019 + */ @Provider public class TokenSetter implements ContainerRequestFilter, ContainerResponseFilter { @@ -27,8 +41,20 @@ public class TokenSetter implements ContainerRequestFilter, ContainerResponseFil @Context ServletContext context; + @Context + HttpServletRequest webRequest; + + @Context + Application application; + + @Context + ResourceContext resourceContext; + + /* (non-Javadoc) + * @see javax.ws.rs.container.ContainerRequestFilter#filter(javax.ws.rs.container.ContainerRequestContext) + */ @Override - public void filter(ContainerRequestContext ctx) throws IOException { + public void filter(ContainerRequestContext reqContext) throws IOException { log.info("TokenSetter Request called"); if(SecurityTokenProvider.instance.get()==null) @@ -36,8 +62,28 @@ public class TokenSetter implements ContainerRequestFilter, ContainerResponseFil if(ScopeProvider.instance.get()==null) ScopeProvider.instance.set(context.getInitParameter(ROOT_SCOPE)); + + + MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest(webRequest); + String requestURI = multiReadRequest.getRequestURI(); + String queryString = multiReadRequest.getQueryString(); + log.debug("Request URI: " + requestURI + ", QueryString: " +queryString+ ", Path Info: "+multiReadRequest.getPathInfo()); + List listOfPath = UriResolverServices.getInstance().getListOfResourcePath(application.getClasses()); + log.info("The resources are: {}", listOfPath); + + UriInfo uriInfo = reqContext.getUriInfo(); + String prefix = "/redirect"; + String path = uriInfo.getRequestUri().getPath(); + log.info("The path is: {}", path); + if(requestURI.startsWith("qqqqq")){ + URI newRequestURI = uriInfo.getBaseUriBuilder().path("new").build(); + reqContext.setRequestUri(newRequestURI); + } } + /* (non-Javadoc) + * @see javax.ws.rs.container.ContainerResponseFilter#filter(javax.ws.rs.container.ContainerRequestContext, javax.ws.rs.container.ContainerResponseContext) + */ @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java index 11cd807..199c113 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java @@ -62,7 +62,7 @@ import org.xml.sax.SAXException; * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * Dec 12, 2018 */ -@Path("/analytics") +@Path("analytics") public class AnalyticsCreateResolver { /** diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java index 5220ea3..abe473d 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java @@ -29,7 +29,7 @@ import com.google.common.cache.CacheLoader.InvalidCacheLoadException; * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * Dec 13, 2018 */ -@Path("/analytics") +@Path("analytics") public class AnalyticsGetResolver { private static Logger logger = LoggerFactory.getLogger(AnalyticsGetResolver.class); diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/BackCatalogueResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/BackCatalogueResolver.java new file mode 100644 index 0000000..a02e08a --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/services/BackCatalogueResolver.java @@ -0,0 +1,39 @@ +package org.gcube.datatransfer.resolver.services; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.gcube.datatransfer.resolver.catalogue.CatalogueRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The Class CatalogueResolver. + * + * To Backward compatibility + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * Nov 16, 2018 + */ +@Path("catalogue") +public class BackCatalogueResolver { + + private static Logger logger = LoggerFactory.getLogger(BackCatalogueResolver.class); + + @POST + @Path("") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.TEXT_PLAIN) + public Response postCatalogue(@Context HttpServletRequest req, CatalogueRequest jsonRequest) throws WebApplicationException{ + logger.info(this.getClass().getSimpleName()+" POST starts..."); + return new CatalogueResolver().postCatalogue(req, jsonRequest); + + } +} diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java index 167859a..6847401 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java @@ -39,7 +39,7 @@ import eu.trentorise.opendata.jackan.model.CkanDataset; * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * Nov 16, 2018 */ -@Path("/") +@Path("{entityContext:ctlg(-(o|g|p|d))?}") public class CatalogueResolver { private static Logger logger = LoggerFactory.getLogger(CatalogueResolver.class); @@ -55,7 +55,7 @@ public class CatalogueResolver { * @return the response */ @GET - @Path("{entityContext:ctlg(-(o|g|p|d))?}/{vreName}/{entityName}") + @Path("/{vreName}/{entityName}") public Response resolveCatalogue(@Context HttpServletRequest req, @PathParam("entityName") String entityName, @PathParam("vreName") String vreName, @@ -101,7 +101,7 @@ public class CatalogueResolver { * @return the response */ @POST - @Path("catalogue") + @Path("") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public Response postCatalogue(@Context HttpServletRequest req, CatalogueRequest jsonRequest) throws WebApplicationException{ diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java index d177d31..d99589f 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java @@ -111,7 +111,7 @@ public class GeonetworkResolver { */ @GET - @Path("{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}") + @Path("/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}") public Response submitGet(@Context HttpServletRequest req, @PathParam(PATH_PARAM_SCOPE) @Nullable String scope, @PathParam(PATH_PARAM_MODE) @Nullable String mode, @@ -229,7 +229,7 @@ public class GeonetworkResolver { } @POST - @Path("{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}") + @Path("/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}") public Response submitPost(@Context HttpServletRequest req, @PathParam(PATH_PARAM_SCOPE) @Nullable String scope, @PathParam(PATH_PARAM_MODE) @Nullable String mode, diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java index 8fca4f2..6d21ae4 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/KnimeCreateResolver.java @@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory; * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Dec 13, 2018 */ -@Path("/knime") +@Path("knime") public class KnimeCreateResolver { private static Logger logger = LoggerFactory.getLogger(KnimeCreateResolver.class); diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/KnimeGetResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/KnimeGetResolver.java index b2886d4..0cf42f8 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/KnimeGetResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/KnimeGetResolver.java @@ -29,7 +29,7 @@ import com.google.common.cache.CacheLoader.InvalidCacheLoadException; * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Dec 13, 2018 */ -@Path("/knime") +@Path("knime") public class KnimeGetResolver { private static Logger logger = LoggerFactory.getLogger(KnimeGetResolver.class); diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java index 909ece1..96d0dda 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java @@ -107,7 +107,7 @@ public class PartheosRegistryResolver { * @throws Exception the exception */ @POST - @Path("/") + @Path("") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public Response postCatalogue(@Context HttpServletRequest req, ParthenosRequest jsonRequest) throws WebApplicationException{ diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/SMPIDResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/SMPIDResolver.java index 9ec8dca..60fa8e5 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/SMPIDResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/SMPIDResolver.java @@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory; * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Oct 22, 2018 */ -@Path("/") +@Path("id") public class SMPIDResolver { /** @@ -48,7 +48,7 @@ public class SMPIDResolver { * @throws WebApplicationException the web application exception */ @GET - @Path("id") + @Path("") public Response getSMPID(@Context HttpServletRequest req, @QueryParam(SMP_ID) @Nullable String smpId, @QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName, diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/SMPResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/SMPResolver.java index 045f6c5..2a36a64 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/SMPResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/SMPResolver.java @@ -24,7 +24,7 @@ import org.slf4j.LoggerFactory; * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * Dec 14, 2018 */ -@Path("/") +@Path("smp") public class SMPResolver { /** @@ -48,7 +48,7 @@ public class SMPResolver { * @throws WebApplicationException the web application exception */ @GET - @Path("smp") + @Path("") public Response getSMPURI(@Context HttpServletRequest req, @QueryParam(SMP_URI) @Nullable String smpURI, diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/StorageHubResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/StorageHubResolver.java index c71206d..ca0453d 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/StorageHubResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/StorageHubResolver.java @@ -26,7 +26,7 @@ import org.slf4j.LoggerFactory; * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) * Dec 14, 2018 */ -@Path("shub/{id}") +@Path("shub") public class StorageHubResolver { /** @@ -50,7 +50,7 @@ public class StorageHubResolver { * @return the metadata */ @HEAD - @Path("") + @Path("/{id}") public Response getMetadata(@Context HttpServletRequest req) { logger.info(this.getClass().getSimpleName()+" HEAD getMetadata called"); @@ -98,7 +98,7 @@ public class StorageHubResolver { * @return the response */ @GET - @Path("") + @Path("/{id}") public Response download(@Context HttpServletRequest req) { logger.info(this.getClass().getSimpleName()+" GET download called"); @@ -138,60 +138,4 @@ public class StorageHubResolver { throw (WebApplicationException) e; } } - - /** - * Download version. NEVER USED - * - * @param req the req - * @param version the version - * @return the response - */ - /*@GET - @Path("{version}") - public Response downloadVersion(@Context HttpServletRequest req, @PathParam("version") String version) { - logger.info(this.getClass().getSimpleName() +" GET downloadVersion called"); - - try{ - InnerMethodName.instance.set("resolveStorageHubPublicLinkWithVersion"); - ItemManagerClient client = AbstractPlugin.item().build(); - - //Checking mandatory parameter id - if(id==null || id.isEmpty()){ - logger.error("Path Parameter "+STORAGE_HUB_ID+" not found"); - throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter "+STORAGE_HUB_ID, StorageHubResolver.class, help); - } - - //Checking mandatory parameter id - if(version==null || version.isEmpty()){ - logger.error("Parameter 'version' not found"); - throw ExceptionManager.badRequestException(req, "Missing mandatory parameter 'version'", StorageHubResolver.class, help); - } - try{ - - String identifier = String.format("%s%s%s",id, versionPrefix, version); - StreamDescriptor descriptor = client.resolvePublicLink(identifier); - ResponseBuilder response = Response.ok(descriptor.getStream()); - - response = new StorageHubMetadataResponseBuilder(req, response).fillMetadata(descriptor, id); - //Adding ETag to version requested - response.header("ETag", version); - return response.build(); - - }catch(Exception e){ - String errorMsg = "Error on getting versioned file with hub id '"+id+ "' and version '"+version+"'"; - logger.error(errorMsg, e); - throw ExceptionManager.internalErrorException(req, errorMsg, StorageHubResolver.class, help); - } - }catch (Exception e) { - - if(!(e instanceof WebApplicationException)){ - //UNEXPECTED EXCEPTION managing it as WebApplicationException - String error = "Error occurred on resolving the StorageHub URL with id: "+id+" and version: "+version+". Please, contact the support!"; - throw ExceptionManager.internalErrorException(req, error, this.getClass(), help); - } - //ALREADY MANAGED as WebApplicationException - logger.error("Exception:", e); - throw (WebApplicationException) e; - } - }*/ } diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/StorageIDResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/StorageIDResolver.java index 6bccdb0..71cfcd8 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/StorageIDResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/StorageIDResolver.java @@ -62,7 +62,7 @@ public class StorageIDResolver { * @throws WebApplicationException the web application exception */ @GET - @Path("{storage-id}") + @Path("/{storage-id}") public Response getStorageId(@Context HttpServletRequest req, @PathParam(STORAGE_ID) String storageId, @QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName, @@ -183,7 +183,7 @@ public class StorageIDResolver { * @throws WebApplicationException the web application exception */ @HEAD - @Path("{storage-id}") + @Path("/{storage-id}") public Response httpDoHead(@Context HttpServletRequest req, @PathParam(STORAGE_ID) String storageId, @QueryParam(ConstantsResolver.HPC) Boolean hproxycheck) throws WebApplicationException { diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverIndex.java b/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverIndex.java index 44cc1c5..b5835e2 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverIndex.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverIndex.java @@ -24,14 +24,14 @@ import org.slf4j.LoggerFactory; * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Oct 22, 2018 */ -@Path("/") +@Path("index") public class UriResolverIndex { private static Logger logger = LoggerFactory.getLogger(UriResolverIndex.class); @GET @Produces({MediaType.TEXT_HTML}) - @Path("index") + @Path("") public InputStream index(@Context HttpServletRequest req) throws WebApplicationException{ String indexFile = "/WEB-INF/jsp/index.jsp"; @@ -52,12 +52,5 @@ public class UriResolverIndex { throw (WebApplicationException) e; } } - - @GET - @Produces({MediaType.TEXT_HTML}) - @Path("info") - public InputStream info(@Context HttpServletRequest req){ - return index(req); - } } diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverInfo.java b/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverInfo.java new file mode 100644 index 0000000..4ec9625 --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverInfo.java @@ -0,0 +1,31 @@ +/** + * + */ +package org.gcube.datatransfer.resolver.services; + +import java.io.InputStream; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Oct 22, 2018 + */ +@Path("info") +public class UriResolverInfo { + + @GET + @Produces({MediaType.TEXT_HTML}) + @Path("") + public InputStream info(@Context HttpServletRequest req) throws WebApplicationException{ + return new UriResolverIndex().index(req); + } +} + diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverResources.java b/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverResources.java new file mode 100644 index 0000000..cab6298 --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/services/UriResolverResources.java @@ -0,0 +1,52 @@ +/** + * + */ + +package org.gcube.datatransfer.resolver.services; + +import javax.inject.Singleton; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.gcube.datatransfer.resolver.UriResolverServices; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.node.ObjectNode; + + +/** + * The Class ResourceListingResource. + * + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * Feb 14, 2019 + */ +@Path("resources") +@Singleton +public class UriResolverResources { + + private static Logger log = LoggerFactory.getLogger(UriResolverResources.class); + + /** + * Show all. + * + * @param application the application + * @param request the request + * @return the response + */ + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getServices(@Context Application application, @Context HttpServletRequest request) { + log.info("Get Services called"); + + ObjectNode rootResources = UriResolverServices.getInstance().getListOfResourceNode(application.getClasses()); + return Response.ok().entity(rootResources).build(); + } + +} diff --git a/src/test/java/rest/TestResolvers.java b/src/test/java/rest/TestResolvers.java index 0a03b13..baf0ea1 100644 --- a/src/test/java/rest/TestResolvers.java +++ b/src/test/java/rest/TestResolvers.java @@ -217,9 +217,9 @@ public class TestResolvers { String entityName = "sarda-sarda"; //String entityContext = "product"; String entityContext = "dataset"; - String scope = "/gcube/devNext/NextNext"; + String scope = "/gcube/devsec/devVRE"; - String url = String.format("%s/%s",URI_RESOLVER_SERVICE_ENDPOINT,"catalogue"); + String url = String.format("%s/%s",URI_RESOLVER_SERVICE_ENDPOINT,"ctlg"); logger.info("POST Request to URL: "+url); try {