1925: Uri-Resolver: resolve gCubeStorage smp uri like http uri

Task-Url: https://support.d4science.org/issues/1925

Added Filter to rewrite public link 
updated pom version at 1.5.0

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@122206 82a268e6-3cf1-43bd-a215-b396298e98cf
feature/18038
Francesco Mangiacrapa 8 years ago
parent af3d5aa1ff
commit b8d2257a12

@ -8,7 +8,7 @@
</parent>
<groupId>org.gcube.data.transfer</groupId>
<artifactId>uri-resolver</artifactId>
<version>1.4.0-SNAPSHOT</version>
<version>1.5.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>

@ -0,0 +1,78 @@
/**
*
*/
package org.gcube.datatransfer.resolver;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Nov 20, 2015
*/
public class UriResolverRewriteFilter implements Filter{
protected static final String SMP_ID = "smp-id";
protected static final String SERVLET_RESOLVER_BY_ID = "id";
protected static final Logger logger = LoggerFactory.getLogger(UriResolverRewriteFilter.class);
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy() {
logger.trace("run destroy");
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String requestURI = request.getRequestURI();
String queryString = request.getQueryString();
logger.debug("Request URI: " + requestURI + ", QueryString: " +queryString);
if (queryString == null) { // IS A /XXXXX
logger.debug("QueryString is null, is It a new SMP public uri by ID?");
int lastSlash = requestURI.lastIndexOf("/");
if ((lastSlash + 1) == requestURI.length()) {
logger.debug("'/' is last index, doFilter Request");
// req.getRequestDispatcher("/").forward(req, res);
chain.doFilter(req, res);
}
else {
String toStorageID = requestURI.substring(lastSlash + 1, requestURI.length());
// String newURI = requestURI.replace(toReplace,
// SERVLET_RESOLVER_BY_ID+"?"+SMP_ID+"="+toReplace);
String newURI = SERVLET_RESOLVER_BY_ID + "?" + SMP_ID + "=" + toStorageID;
logger.debug("forward to: " + requestURI + newURI);
req.getRequestDispatcher(newURI).forward(req, res);
}
}
else {
logger.debug("is NOT a SMP public uri by ID, doFilter Request");
chain.doFilter(req, res);
}
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
logger.trace("run init");
}
}

@ -28,10 +28,12 @@ import org.gcube.datatransfer.resolver.gis.property.PropertyFileNotFoundExceptio
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* @Oct 7, 2014
* The Class GisResolver.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jan 7, 2016
*/
public class GisResolver extends HttpServlet{
@ -72,6 +74,9 @@ public class GisResolver extends HttpServlet{
//TEN MINUTES
public static final long CACHE_RESET_DELAY = 10*1000;
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init()
*/
@Override
public void init() throws ServletException {
super.init();
@ -81,12 +86,19 @@ public class GisResolver extends HttpServlet{
public void run() {
logger.info("Resetting cache...");
reseCacheServerParameters();
reseGisViewerAppEndPoint();
resetGisViewerAppEndPoint();
reseCacheGisViewerApplicationHostname();
}
}, CACHE_RESET_DELAY, CACHE_RESET_TIME);
}
/**
* Gets the cached server parameters.
*
* @param scope the scope
* @return the cached server parameters
* @throws Exception the exception
*/
protected ServerParameters getCachedServerParameters(String scope) throws Exception{
if(cachedServerParams==null)
@ -114,17 +126,26 @@ public class GisResolver extends HttpServlet{
return serverParam;
}
/**
* Rese cache server parameters.
*/
private void reseCacheServerParameters(){
cachedServerParams = new HashMap<String, ServerParameters>();
logger.info("Cache server params reset!");
}
/**
* Rese cache gis viewer application hostname.
*/
private void reseCacheGisViewerApplicationHostname(){
cachedGisViewerApplHostname = new HashMap<String, String>();
logger.info("Cache Gis Viewer Hostname reset!");
}
private void reseGisViewerAppEndPoint(){
/**
* Reset gis viewer app end point.
*/
private void resetGisViewerAppEndPoint(){
try {
gisViewerAppPropertyReader = new GisViewerAppGenericResourcePropertyReader();
logger.info("GisViewerApp end point updated!");
@ -133,18 +154,25 @@ public class GisResolver extends HttpServlet{
}
}
/**
* Gets the gis viewer application url.
*
* @param scope the scope
* @return the gis viewer application url
* @throws Exception the exception
*/
protected String getGisViewerApplicationURL(String scope) throws Exception{
if(cachedGisViewerApplHostname==null)
reseCacheGisViewerApplicationHostname();
String infra = ScopeUtil.getInfrastructureNameFromScope(scope);
logger.info("Tentative to recovering gis viewer application hostname from cache to scope "+scope);
logger.info("Tentative of recovering gis viewer application hostname from cache for scope: "+scope);
String gisViewerAppHostname = cachedGisViewerApplHostname.get(infra);
if(gisViewerAppHostname==null){
logger.info("Gis viewer application hostname is null, reading from application profile..");
if(gisViewerAppPropertyReader==null)
reseGisViewerAppEndPoint();
resetGisViewerAppEndPoint();
ApplicationProfileReader reader = new ApplicationProfileReader(infra, gisViewerAppPropertyReader.getGenericResource(), gisViewerAppPropertyReader.getAppId());
String url = reader.getApplicationProfile().getUrl();
@ -221,39 +249,43 @@ public class GisResolver extends HttpServlet{
}
/**
*
* @param wmsRequest
* @return
* Encode url with param delimiter.
*
* @param wmsRequest the wms request
* @return the string
*/
private String encodeURLWithParamDelimiter(String wmsRequest){
return wmsRequest.replaceAll("&", PARAM_SEPARATOR_REPLACEMENT_VALUE);
}
/**
*
* @param wmsRequest
* @return
* Decode url with param delimiter.
*
* @param wmsRequest the wms request
* @return the string
*/
private String decodeURLWithParamDelimiter(String wmsRequest){
return wmsRequest.replaceAll(PARAM_SEPARATOR_REPLACEMENT_VALUE, "&");
}
/**
*
* @param wmsRequest
* @return
* Append param replacement.
*
* @param wmsRequest the wms request
* @return the string
*/
private String appendParamReplacement(String wmsRequest){
return wmsRequest+"&"+PARAM_SEPARATOR_REPLACEMENT_KEY+"="+PARAM_SEPARATOR_REPLACEMENT_VALUE;
}
/**
*
* @param scope
* @param gisUUID
* @param geonetworkParams
* @return
* @throws Exception
* Gets the layer wms request.
*
* @param scope the scope
* @param gisUUID the gis uuid
* @param geonetworkParams the geonetwork params
* @return the layer wms request
* @throws Exception the exception
*/
protected String getLayerWmsRequest(String scope, String gisUUID, ServerParameters geonetworkParams) throws Exception{
@ -278,11 +310,12 @@ public class GisResolver extends HttpServlet{
}
/**
*
* @param response
* @param status
* @param message
* @throws IOException
* Send error.
*
* @param response the response
* @param status the status
* @param message the message
* @throws IOException Signals that an I/O exception has occurred.
*/
protected void sendError(HttpServletResponse response, int status, String message) throws IOException
{
@ -298,11 +331,25 @@ public class GisResolver extends HttpServlet{
response.flushBuffer();
}
/**
* Url redirect.
*
* @param req the req
* @param response the response
* @param redirectTo the redirect to
* @throws IOException Signals that an I/O exception has occurred.
*/
protected void urlRedirect(HttpServletRequest req, HttpServletResponse response, String redirectTo) throws IOException {
response.sendRedirect(response.encodeRedirectURL(redirectTo));
return;
}
/**
* Gets the request url.
*
* @param req the req
* @return the request url
*/
public static String getRequestURL(HttpServletRequest req) {
String scheme = req.getScheme(); // http
@ -325,7 +372,7 @@ public class GisResolver extends HttpServlet{
logger.trace("omitted contextPath: "+contextPath);
return url.toString();
}
/*
public static void main(String[] args) {
GisResolver gisResolver = new GisResolver();
String scope = "/gcube/devsec/devVRE";
@ -350,6 +397,5 @@ public class GisResolver extends HttpServlet{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}*/
}

@ -10,10 +10,12 @@ import org.opengis.metadata.distribution.DigitalTransferOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* @Apr 26, 2013
* The Class MetadataConverter.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jan 7, 2016
*/
public class MetadataConverter {
@ -23,9 +25,10 @@ public class MetadataConverter {
public static final String NOT_FOUND = "";
/**
* Gets the geoserver base uri.
*
* @param uri
* @return the input uri without the parameters, (the uri substring from start to index of '?' char (if exists)) if geoserver base url not found,
* @param uri the uri
* @return the input uri without the parameters, (the uri substring from start to index of '?' char (if exists)) if geoserver base url not found,
* geoserver url otherwise
*/
public static GeoserverBaseUri getGeoserverBaseUri(String uri){
@ -95,28 +98,32 @@ public class MetadataConverter {
}
}
/**
* Gets the WMS on line resource.
*
* @param geonetowrkInstance the geonetowrk instance
* @param uuid the uuid
* @return the WMS on line resource
* @throws Exception the exception
*/
public static String getWMSOnLineResource(GeonetworkInstance geonetowrkInstance, String uuid) throws Exception{
String fullWmsPath = "";
boolean isOwsService = false;
boolean foundGeoserverUrl = false;
GeoserverBaseUri tempBaseUri = null;
//GEOSERVER URL
String geoserverBaseUrlOnlineResource = "";
//LAYER NAME
String layerName = "";
// boolean isOwsService = false;
// GeoserverBaseUri tempBaseUri = null;
//GEOSERVER URL
// String geoserverBaseUrlOnlineResource = "";
try{
logger.trace("geonetowrkInstance is null? "+(geonetowrkInstance==null));
Metadata meta = geonetowrkInstance.getGeonetworkPublisher().getById(uuid);
if(meta.getDistributionInfo()!=null && meta.getDistributionInfo()!=null){
for (DigitalTransferOptions item: meta.getDistributionInfo().getTransferOptions()) {
// System.out.println(++i +" item DigitalTransferOptions options: "+item);
// System.out.println(++i +" item DigitalTransferOptions options: "+item);
if(item.getOnLines()!=null){
Collection<? extends OnlineResource> onlineResources = item.getOnLines();
@ -128,15 +135,14 @@ public class MetadataConverter {
int indexServiceWMS = geoserverUrl.toLowerCase().lastIndexOf(SERVICE_WMS);
fullWmsPath = geoserverUrl;
//IS OWS OR WMS?
if(indexServiceWMS>-1){
logger.info("found "+SERVICE_WMS+" url "+geoserverUrl);
isOwsService = geoserverUrl.contains("ows");
tempBaseUri = getGeoserverBaseUri(geoserverUrl);
// isOwsService = geoserverUrl.contains("ows");
// tempBaseUri = getGeoserverBaseUri(geoserverUrl);
geoserverUrl.contains("ows");
getGeoserverBaseUri(geoserverUrl);
if(!geoserverUrl.contains("layers") && !geoserverUrl.contains("LAYERS")){
logger.info("geoserverUrl does not contain 'layers' param, reading");
layerName= onlineResource.getName()!=null? onlineResource.getName():"";
@ -146,7 +152,6 @@ public class MetadataConverter {
fullWmsPath+="&layers="+layerName;
}
}
break;
}
@ -154,24 +159,21 @@ public class MetadataConverter {
logger.trace(SERVICE_WMS+" not found for "+uuid);
}
}
}
}
}
}catch(Exception e){
logger.error("getWMSOnLineResource with UUID "+uuid + " has throw exception: ",e);
logger.error("getWMSOnLineResource with UUID "+uuid + " has thrown exception: ",e);
throw new Exception("An error occurred when converting layer with UUID "+uuid);
}
logger.trace("returning: "+fullWmsPath);
return fullWmsPath;
}
/*
public static void main(String[] args) throws Exception {
// String geoserver = "http://www.fao.org/figis/a/wms/?service=WMS&version=1.1.0&request=GetMap&layers=area:FAO_AREAS&styles=Species_prob, puppa&bbox=-180.0,-88.0,180.0,90.0000000694&width=667&height=330&srs=EPSG:4326&format=image%2Fpng";
//
// String geoserver = "http://www.fao.org/figis/a/wms/?service=WMS&version=1.1.0&request=GetMap&layers=area:FAO_AREAS&styles=Species_prob, puppa&bbox=-180.0,-88.0,180.0,90.0000000694&width=667&height=330&srs=EPSG:4326&format=image%2Fpng";
// System.out.println(MetadataConverter.getGeoserverBaseUri(geoserver));
String user ="admin";
@ -185,5 +187,5 @@ public class MetadataConverter {
String onLineResource = getWMSOnLineResource(geonetowrkInstance, uuid);
System.out.println(onLineResource);
}
}*/
}

@ -4,41 +4,51 @@
<web-app>
<display-name>http resolver</display-name>
<filter>
<filter-name>uriResolverRewriteFilter</filter-name>
<filter-class>org.gcube.datatransfer.resolver.UriResolverRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>uriResolverRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>smp</servlet-name>
<display-name>smp</display-name>
<servlet-class>org.gcube.datatransfer.resolver.http.HttpResolver</servlet-class>
<load-on-startup>true</load-on-startup>
</servlet>
<servlet>
<servlet-name>id</servlet-name>
<display-name>id</display-name>
<servlet-class>org.gcube.datatransfer.resolver.http.StorageIDResolver</servlet-class>
<load-on-startup>true</load-on-startup>
</servlet>
<servlet>
<servlet-name>gisResolver</servlet-name>
<display-name>gisResolver</display-name>
<servlet-class>org.gcube.datatransfer.resolver.gis.GisResolver</servlet-class>
<load-on-startup>true</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>smp</servlet-name>
<url-pattern>/smp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>gisResolver</servlet-name>
<url-pattern>/gis</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>id</servlet-name>
<url-pattern>/id</url-pattern>
</servlet-mapping>
</web-app>

Loading…
Cancel
Save