GeoenetworkResolver migrated
git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@173788 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
d47e6b4748
commit
ce9a3f9128
|
@ -104,4 +104,9 @@
|
||||||
public/private items to public/private catalogue
|
public/private items to public/private catalogue
|
||||||
</Change>
|
</Change>
|
||||||
</Changeset>
|
</Changeset>
|
||||||
|
<Changeset component="org.gcube.data-transfer.uri-resolver.2-0-0"
|
||||||
|
date="2018-10-23">
|
||||||
|
<Change>[Task #12740] Developed as web-service by using jersey
|
||||||
|
</Change>
|
||||||
|
</Changeset>
|
||||||
</ReleaseNotes>
|
</ReleaseNotes>
|
|
@ -16,11 +16,12 @@ public class ConstantsResolver {
|
||||||
public static final String DEFAULT_CONTENTTYPE_UNKNOWN_UNKNOWN = "unknown/unknown";
|
public static final String DEFAULT_CONTENTTYPE_UNKNOWN_UNKNOWN = "unknown/unknown";
|
||||||
public static final String DEFAULT_FILENAME_FROM_STORAGE_MANAGER = "fromStorageManager";
|
public static final String DEFAULT_FILENAME_FROM_STORAGE_MANAGER = "fromStorageManager";
|
||||||
public static final String CONTENT_LENGTH = "Content-Length";
|
public static final String CONTENT_LENGTH = "Content-Length";
|
||||||
|
public static final String CONTENT_TYPE= "Content-Type";
|
||||||
|
|
||||||
protected static final String HPC = "hproxycheck"; //for hproxycheck
|
protected static final String HPC = "hproxycheck"; //for hproxycheck
|
||||||
|
|
||||||
public static final String VALIDATION = "validation";
|
public static final String QUERY_PARAM_VALIDATION = "validation";
|
||||||
public static final String CONTENT_TYPE = "contentType";
|
public static final String QUERY_PARAM_CONTENT_TYPE = "contentType";
|
||||||
public static final String FILE_NAME = "fileName";
|
public static final String QUERY_PARAM_FILE_NAME = "fileName";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,620 @@
|
||||||
|
package org.gcube.datatransfer.resolver.services;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.QueryParam;
|
||||||
|
import javax.ws.rs.core.Context;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import javax.ws.rs.core.Response.ResponseBuilder;
|
||||||
|
import javax.ws.rs.core.StreamingOutput;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.datatransfer.resolver.Constants;
|
||||||
|
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters;
|
||||||
|
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.MODE;
|
||||||
|
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.VISIBILITY;
|
||||||
|
import org.gcube.datatransfer.resolver.SingleFileStreamingOutput;
|
||||||
|
import org.gcube.datatransfer.resolver.Util;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.GeonetworkInstance;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.exception.GeonetworkInstanceException;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.geonetwork.FilterGetRecords;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.geonetwork.GNAuthentication;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.geonetwork.HTTPCallsUtils;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.geonetwork.HTTPCallsUtils.HttpResponse;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.geonetwork.ReusableInputStream;
|
||||||
|
import org.gcube.datatransfer.resolver.gis.util.GetResponseRecordFilter;
|
||||||
|
import org.gcube.datatransfer.resolver.services.error.ExceptionManager;
|
||||||
|
import org.gcube.datatransfer.resolver.services.exceptions.InternalServerException;
|
||||||
|
import org.gcube.spatial.data.geonetwork.configuration.Configuration;
|
||||||
|
import org.gcube.spatial.data.geonetwork.model.Account;
|
||||||
|
import org.gcube.spatial.data.geonetwork.model.Account.Type;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class GeonetworkResolver.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||||
|
* Oct 23, 2018
|
||||||
|
*/
|
||||||
|
@Path(Constants.SERVLET_GEONETWORK)
|
||||||
|
public class GeonetworkResolver {
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(GeonetworkResolver.class);
|
||||||
|
|
||||||
|
public static final String PATH_PARAM_MODE = "mode";
|
||||||
|
public static final String PATH_PARAM_REQUEST_DELIMITER = "requestDelimiter";
|
||||||
|
public static final String PATH_PARAM_OWNER = "owner";
|
||||||
|
private static final String PATH_PARAM_VISIBILITY = "visibility";
|
||||||
|
|
||||||
|
private static final String PATH_PARAM_SCOPE = "scope";
|
||||||
|
public static final String CSW_SERVER = "srv/en/csw";
|
||||||
|
|
||||||
|
public static final String PATH_PARAM_REQUEST_DELIMITIER = "/$$";
|
||||||
|
public static final String PATH_PARAM_REMAINING = "remainPath";
|
||||||
|
|
||||||
|
public static final String QUERY_PARAM_RESET_CACHE_PARAM = "resetcache";
|
||||||
|
public static final String QUERY_PARAM_RESET_CACHED_SCOPE_PARAM = "resetcachedscope";
|
||||||
|
|
||||||
|
public static final String SRV_EN_MEF_EXPORT = "/srv/en/mef.export"; //MEF Geonetwork service
|
||||||
|
|
||||||
|
public static final String UUID = "uuid";
|
||||||
|
|
||||||
|
protected Map<String, GeonetworkInstance> cacheGNInstances;
|
||||||
|
|
||||||
|
private String help = "https://wiki.gcube-system.org/gcube/URI_Resolver#GIS_Resolver";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the geonetwork request criteria.
|
||||||
|
* Creates a request criteria from input parameter pathWithoutGN
|
||||||
|
* The parameter pathWithoutGN should be an ordered string (like REST request):
|
||||||
|
* MODE/SCOPE/VISIBILITY/OWNER/$$
|
||||||
|
* MODE must be: {@link MODE}
|
||||||
|
* SCOPE must be: ROOT|VO|VRE
|
||||||
|
* VISIBILITY must be: {@link VISIBILITY}
|
||||||
|
* OWNER (is optional): filter by owner
|
||||||
|
*
|
||||||
|
* @param req the req
|
||||||
|
* @param mode the mode
|
||||||
|
* @param scope the scope
|
||||||
|
* @param visibility the visibility
|
||||||
|
* @param owner the owner
|
||||||
|
* @param requestDelimiter the request delimiter
|
||||||
|
* @param resetCache the reset cache
|
||||||
|
* @param resetScope the reset scope
|
||||||
|
* @return the geonetwork request criteria
|
||||||
|
*/
|
||||||
|
|
||||||
|
// /* (non-Javadoc)
|
||||||
|
// * @see javax.servlet.GenericServlet#init()
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public void init() throws ServletException {
|
||||||
|
// super.init();
|
||||||
|
// timer = new Timer(true);
|
||||||
|
// timer.schedule(new TimerTask() {
|
||||||
|
// @Override
|
||||||
|
// public void run() {
|
||||||
|
// logger.info("Resetting Geonetwork configuratiors cache...");
|
||||||
|
// purgeCacheGeonetworkInstances();
|
||||||
|
// }
|
||||||
|
// }, CACHE_RESET_DELAY, CACHE_RESET_TIME);
|
||||||
|
// }
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_VISIBILITY+"}/{"+PATH_PARAM_OWNER+"}/{"+PATH_PARAM_REQUEST_DELIMITER+"}")
|
||||||
|
public Response submitGet(@Context HttpServletRequest req,
|
||||||
|
@PathParam(PATH_PARAM_MODE) MODE mode,
|
||||||
|
@PathParam(PATH_PARAM_SCOPE) String scope,
|
||||||
|
@PathParam(PATH_PARAM_VISIBILITY) VISIBILITY visibility,
|
||||||
|
@PathParam(PATH_PARAM_OWNER) @Nullable String owner,
|
||||||
|
@PathParam(PATH_PARAM_REQUEST_DELIMITER) String requestDelimiter,
|
||||||
|
@QueryParam(QUERY_PARAM_RESET_CACHE_PARAM) String resetCache,
|
||||||
|
@QueryParam(QUERY_PARAM_RESET_CACHED_SCOPE_PARAM) String resetScope) {
|
||||||
|
|
||||||
|
|
||||||
|
//Checking mandatory parameters
|
||||||
|
if(mode==null){
|
||||||
|
logger.error("Path Parameter 'mode' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'mode' as value "+MODE.values(), GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(scope==null || scope.isEmpty()){
|
||||||
|
logger.error("Path Parameter 'scope' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'scope'", GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(visibility==null){
|
||||||
|
logger.error("Path Parameter 'visibility' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'visibility'", GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility:"+visibility+", owner:"+owner+"]");
|
||||||
|
|
||||||
|
if(requestDelimiter==null){
|
||||||
|
logger.error("Path Parameter to REQUEST_DELIMITIER '"+PATH_PARAM_REQUEST_DELIMITIER+"' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Path Parameter to REQUEST_DELIMITIER '"+PATH_PARAM_REQUEST_DELIMITIER+"' not found", GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resetCache!=null && Boolean.parseBoolean(resetCache)){
|
||||||
|
purgeCacheGeonetworkInstances();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resetScope!=null && Boolean.parseBoolean(resetScope)){
|
||||||
|
resetGeonetoworkInstanceCacheForScope(scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fullURL = Util.getFullURL(req);
|
||||||
|
int index = fullURL.indexOf(GeonetworkRequestFilterParameters.REQUEST_DELIMITIER);
|
||||||
|
int delimiterIndex = index+GeonetworkRequestFilterParameters.REQUEST_DELIMITIER.length();
|
||||||
|
//BUILDING REMAINING PATH WITHOUT GeonetworkRequestFilterParameters.REQUEST_DELIMITIER
|
||||||
|
String remainPath = null;
|
||||||
|
if(delimiterIndex<fullURL.length()){
|
||||||
|
remainPath = fullURL.substring(delimiterIndex, fullURL.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Remaining path is: "+remainPath);
|
||||||
|
String gnGetlURL = null;
|
||||||
|
try {
|
||||||
|
|
||||||
|
GeonetworkInstance gnInstance = getGeonetworkInstanceForScope(scope);
|
||||||
|
|
||||||
|
// if(gnInstance==null){
|
||||||
|
// logger.info("GeonetworkInstance not istanciable via geonetwork library.. using ");
|
||||||
|
// ServerParameters serverParams = getGeonetworkCachedServerParameters(scopeValue);
|
||||||
|
// gnInstance = gntwAccess.getGeonetworkInstance();
|
||||||
|
// }
|
||||||
|
|
||||||
|
ScopeProvider.instance.set(scope);
|
||||||
|
|
||||||
|
HTTPCallsUtils httpUtils = new HTTPCallsUtils();
|
||||||
|
Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
|
||||||
|
String geonetworkUrl = config.getGeoNetworkEndpoint();
|
||||||
|
// boolean authorized = GNAuthentication.login(httpUtils, geonetworkParams.getUrl(), geonetworkParams.getUser(), geonetworkParams.getPassword());
|
||||||
|
// logger.trace("Authorized on "+geonetworkParams +" ? "+authorized);
|
||||||
|
// String newQueryString = purgeScopeFromQueryString(scope, req.getQueryString());
|
||||||
|
// logger.trace("Purged query string from "+scope+" is: "+newQueryString);
|
||||||
|
String baseURL = remainPath==null ||remainPath.isEmpty()?geonetworkUrl+"/"+CSW_SERVER:geonetworkUrl+"/"+CSW_SERVER+remainPath;
|
||||||
|
logger.info("The base URL is: "+baseURL);
|
||||||
|
//newQueryString = purgeRemainFromQueryString(remainPath, newQueryString);
|
||||||
|
//logger.trace("Purged query string from "+remainPath+" is: "+newQueryString);
|
||||||
|
gnGetlURL = baseURL+"?"+req.getQueryString();
|
||||||
|
logger.info("Sending get request to URL: "+gnGetlURL);
|
||||||
|
HttpResponse proxedGNResponse = httpUtils.get(gnGetlURL);
|
||||||
|
|
||||||
|
switch(proxedGNResponse.getStatus()){
|
||||||
|
case HttpServletResponse.SC_OK:
|
||||||
|
|
||||||
|
//Building the response
|
||||||
|
InputStream streamToWrite = IOUtils.toInputStream(proxedGNResponse.getResponse());
|
||||||
|
StreamingOutput so = new SingleFileStreamingOutput(streamToWrite);
|
||||||
|
|
||||||
|
logger.info("Response return Content-Type: "+httpUtils.getLastContentType());
|
||||||
|
|
||||||
|
ResponseBuilder responseBuilder = Response
|
||||||
|
.ok(so)
|
||||||
|
//.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename = \""+fileName+"\"")
|
||||||
|
.header(ConstantsResolver.CONTENT_TYPE, httpUtils.getLastContentType());
|
||||||
|
|
||||||
|
/*resp.setContentType(httpUtils.getLastContentType());
|
||||||
|
InputStream in = IOUtils.toInputStream(proxedGNResponse.getResponse());
|
||||||
|
OutputStream out = resp.getOutputStream();
|
||||||
|
try{
|
||||||
|
int bytes = IOUtils.copy(in, out);
|
||||||
|
if(bytes==0)
|
||||||
|
logger.warn("ResponseBody is empty, returning empty resp");
|
||||||
|
}catch(Exception e){
|
||||||
|
logger.error("Error on copy response:", e);
|
||||||
|
}finally{
|
||||||
|
IOUtils.closeQuietly(in);
|
||||||
|
}*/
|
||||||
|
return responseBuilder.build();
|
||||||
|
|
||||||
|
case HttpServletResponse.SC_FORBIDDEN:
|
||||||
|
ExceptionManager.throwForbiddenException(req, "You are not authorized to perform the request "+gnGetlURL, GeonetworkResolver.class, help);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ExceptionManager.throwInternalErrorException(req, "Sorry, an error occurred performing the geonetwork request "+gnGetlURL+" with scope "+scope, GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Exception:", e);
|
||||||
|
String error = "Sorry, an error occurred on resolving geonetwork request with scope "+scope+". Please, contact support!";
|
||||||
|
ExceptionManager.throwInternalErrorException(req, error, GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
//An error occurred
|
||||||
|
try {
|
||||||
|
|
||||||
|
throw new InternalServerException(req, javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, "Error during perform GET operation to: "+gnGetlURL, GeonetworkResolver.class, new URI(help));
|
||||||
|
}
|
||||||
|
catch (URISyntaxException e) {
|
||||||
|
//silent
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submit post.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
@POST
|
||||||
|
@Path("{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_VISIBILITY+"}/{"+PATH_PARAM_OWNER+"}/{"+PATH_PARAM_REQUEST_DELIMITER+"}")
|
||||||
|
public Response submitPost(@Context HttpServletRequest req,
|
||||||
|
@PathParam(PATH_PARAM_MODE) MODE mode,
|
||||||
|
@PathParam(PATH_PARAM_SCOPE) String scope,
|
||||||
|
@PathParam(PATH_PARAM_VISIBILITY) VISIBILITY visibility,
|
||||||
|
@PathParam(PATH_PARAM_OWNER) @Nullable String owner,
|
||||||
|
@PathParam(PATH_PARAM_REQUEST_DELIMITER) String requestDelimiter,
|
||||||
|
@QueryParam(QUERY_PARAM_RESET_CACHE_PARAM) String resetCache,
|
||||||
|
@QueryParam(QUERY_PARAM_RESET_CACHED_SCOPE_PARAM) String resetScope){
|
||||||
|
|
||||||
|
//Checking mandatory parameters
|
||||||
|
if(mode==null){
|
||||||
|
logger.error("Path Parameter 'mode' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'mode' as value "+MODE.values(), GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(scope==null || scope.isEmpty()){
|
||||||
|
logger.error("Path Parameter 'scope' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'scope'", GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(visibility==null){
|
||||||
|
logger.error("Path Parameter 'visibility' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'visibility'", GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility:"+visibility+", owner:"+owner+"]");
|
||||||
|
|
||||||
|
if(requestDelimiter==null){
|
||||||
|
logger.error("Path Parameter to REQUEST_DELIMITIER '"+PATH_PARAM_REQUEST_DELIMITIER+"' not found");
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Path Parameter to REQUEST_DELIMITIER '"+PATH_PARAM_REQUEST_DELIMITIER+"' not found", GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resetCache!=null && Boolean.parseBoolean(resetCache)){
|
||||||
|
purgeCacheGeonetworkInstances();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resetScope!=null && Boolean.parseBoolean(resetScope)){
|
||||||
|
resetGeonetoworkInstanceCacheForScope(scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
String fullURL = Util.getFullURL(req);
|
||||||
|
int index = fullURL.indexOf(GeonetworkRequestFilterParameters.REQUEST_DELIMITIER);
|
||||||
|
int delimiterIndex = index+GeonetworkRequestFilterParameters.REQUEST_DELIMITIER.length();
|
||||||
|
//BUILDING REMAINING PATH WITHOUT GeonetworkRequestFilterParameters.REQUEST_DELIMITIER
|
||||||
|
String remainPath = null;
|
||||||
|
if(delimiterIndex<fullURL.length()){
|
||||||
|
remainPath = fullURL.substring(delimiterIndex, fullURL.length());
|
||||||
|
}
|
||||||
|
String gnCSWlURL = null;
|
||||||
|
try {
|
||||||
|
|
||||||
|
GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter(scope);
|
||||||
|
GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance();
|
||||||
|
|
||||||
|
ScopeProvider.instance.set(scope);
|
||||||
|
logger.info("set scope provider "+scope);
|
||||||
|
Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
|
||||||
|
Account account = config.getScopeConfiguration().getAccounts().get(Type.CKAN);
|
||||||
|
logger.info("CKAN user owner is: "+account.getUser());
|
||||||
|
|
||||||
|
logger.info("Parameters..");
|
||||||
|
for (Enumeration<String> e = req.getParameterNames(); e.hasMoreElements();){
|
||||||
|
String p = e.nextElement();
|
||||||
|
logger.debug("param "+p + " value "+Arrays.toString(req.getParameterValues(p)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//DEBUG BODY
|
||||||
|
// String readBody = IOUtils.toString(req.getReader());
|
||||||
|
// logger.debug("doPost read body request: "+readBody);
|
||||||
|
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
|
||||||
|
|
||||||
|
String geonetworkUrl = config.getGeoNetworkEndpoint();
|
||||||
|
|
||||||
|
// SPECIFIC HANDLER FOR GEONETWORK REQUEST: /srv/en/mef.export
|
||||||
|
if(remainPath!=null && remainPath.compareTo(SRV_EN_MEF_EXPORT)==0){
|
||||||
|
logger.info("In case of mef.export, perfoming a custom handler");
|
||||||
|
gnCSWlURL = geonetworkUrl + SRV_EN_MEF_EXPORT;
|
||||||
|
String[] uuidValues = req.getParameterValues(UUID);
|
||||||
|
if(uuidValues!=null){
|
||||||
|
String data = null;
|
||||||
|
for (String uuid : uuidValues) {
|
||||||
|
data = UUID+"="+uuid;
|
||||||
|
}
|
||||||
|
if(data!=null){
|
||||||
|
logger.debug("Writing "+data +" into byte array");
|
||||||
|
byteArray.write(data.getBytes());
|
||||||
|
}else
|
||||||
|
IOUtils.copy(req.getReader(), byteArray);
|
||||||
|
}else
|
||||||
|
IOUtils.copy(req.getReader(), byteArray);
|
||||||
|
}else{
|
||||||
|
gnCSWlURL = remainPath==null ||remainPath.isEmpty()?geonetworkUrl+"/"+CSW_SERVER:geonetworkUrl+"/"+CSW_SERVER+remainPath;
|
||||||
|
IOUtils.copy(req.getReader(), byteArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
//filterPublicMetadata = theVisibility.equals(VISIBILITY.PRV)?true:false;
|
||||||
|
|
||||||
|
HTTPCallsUtils httpUtils = new HTTPCallsUtils();
|
||||||
|
|
||||||
|
//PRIVATE LAYERS
|
||||||
|
if(visibility.equals(VISIBILITY.PRV)){
|
||||||
|
logger.debug("Visibility: "+VISIBILITY.PRV+" getting private layers..");
|
||||||
|
//VRE LAYERS
|
||||||
|
if(mode.equals(MODE.VRE)){
|
||||||
|
logger.debug("Getting "+MODE.VRE+" layers..");
|
||||||
|
|
||||||
|
//HARVESTED LAYERS
|
||||||
|
}else{
|
||||||
|
logger.debug("Getting "+MODE.HARVEST+" layers, I'm using the owner: '"+owner +"' passed as parameter to filter layer/s returned..");
|
||||||
|
if(owner==null || owner.isEmpty()){
|
||||||
|
String error = "Harvest owner is missing. It is not possible to filter layers for the request "+MODE.HARVEST + " in the scope: "+scope+", without a valid owner as input";
|
||||||
|
logger.error(error);
|
||||||
|
ExceptionManager.throwBadRequestException(req, error, GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(account.getUser()!=null){
|
||||||
|
boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account. getPassword());
|
||||||
|
logger.trace("Authorized on "+geonetworkUrl +" ? "+authorized);
|
||||||
|
}else
|
||||||
|
logger.info("Skipping authentication, ckan user (the owner) is null");
|
||||||
|
|
||||||
|
//PUBLIC LAYERS
|
||||||
|
}else{
|
||||||
|
logger.debug("Visibility: "+VISIBILITY.PUB+" getting public layers..");
|
||||||
|
//VRE LAYERS
|
||||||
|
if(mode.equals(MODE.VRE)){
|
||||||
|
logger.debug("Getting "+MODE.VRE+" layers, the VRE account: "+account.getUser() +" will be used as owner user for filtering... Is it right?");
|
||||||
|
owner = account.getUser();
|
||||||
|
|
||||||
|
//HARVESTED LAYERS
|
||||||
|
}else{
|
||||||
|
logger.debug("Getting "+MODE.HARVEST+" layers, I'm using the owner: '"+owner +"' passed as parameter to filter layer/s returned..");
|
||||||
|
if(owner==null || owner.isEmpty()){
|
||||||
|
String error = "Harvest owner is missing. It is not possible to filter layers for the request "+MODE.HARVEST + " in the scope: "+scope+", without a valid owner as input";
|
||||||
|
logger.error(error);
|
||||||
|
ExceptionManager.throwBadRequestException(req, error, GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Sending CSW POST request to URL: "+gnCSWlURL);
|
||||||
|
logger.debug("Content-Type: "+req.getContentType());
|
||||||
|
|
||||||
|
|
||||||
|
//DEBUG
|
||||||
|
//logger.debug("POST - BODY : "+byteArray.toString());
|
||||||
|
InputStream in = httpUtils.post(gnCSWlURL, new ByteArrayInputStream(byteArray.toByteArray()), req.getContentType(), req.getParameterMap());
|
||||||
|
// resp.setContentType(httpUtils.getLastContentType());
|
||||||
|
// OutputStream out = resp.getOutputStream();
|
||||||
|
|
||||||
|
if(in==null){
|
||||||
|
logger.warn("Input stream returned is null, sending "+HttpServletResponse.SC_NOT_FOUND);
|
||||||
|
ExceptionManager.throwNotFoundException(req, "Input stream is null to the request "+gnCSWlURL+ " with body: "+byteArray.toString(), GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
|
||||||
|
ReusableInputStream reus = new ReusableInputStream(in);
|
||||||
|
|
||||||
|
if(visibility.equals(VISIBILITY.PRV)){
|
||||||
|
logger.info("Private VISIBILITY performing so getting public file identifiers to apply filtering..");
|
||||||
|
FilterGetRecords filterGetRecords = new FilterGetRecords(byteArray.toString());
|
||||||
|
if(filterGetRecords.getFoundPublicIds()!=null && filterGetRecords.getFoundPublicIds().size()>0){
|
||||||
|
logger.info("I'm removing list of public IDs with "+filterGetRecords.getFoundPublicIds().size() +" item/s. Is it right?");
|
||||||
|
in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, filterGetRecords.getFoundPublicIds(), "Replaced a public UUID, please ignore");
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
|
||||||
|
logger.info("Public VISIBILITY perfoming check on ownership...");
|
||||||
|
Document doc = GetResponseRecordFilter.inputStreamToW3CDocument(reus);
|
||||||
|
List<String> fileIdentifiers = GetResponseRecordFilter.getTextContentStringsForTagName(doc, "gmd:fileIdentifier");
|
||||||
|
List<String> noMatchingOwner = new ArrayList<String>();
|
||||||
|
for (String fileId : fileIdentifiers) {
|
||||||
|
String own = GetResponseRecordFilter.getMetaCategoryByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword());
|
||||||
|
//String own = GetResponseRecordFilter.getMetaOwnerNameByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword());
|
||||||
|
if(own.compareTo(owner)!=0){
|
||||||
|
logger.debug("Owner of file Identifier "+fileId+" not matching the owner passed: "+owner+", removing it..");
|
||||||
|
noMatchingOwner.add(fileId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(noMatchingOwner.size()>0){
|
||||||
|
logger.info("Removing "+noMatchingOwner.size()+" layer/s not macthing the owner: "+owner);
|
||||||
|
in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, noMatchingOwner, "Replaced UUID owned by another user, please ignore");
|
||||||
|
}else{
|
||||||
|
logger.info("No replace on UUIDs was applied for the owner: "+owner);
|
||||||
|
in = reus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ReusableInputStream reusIs = new ReusableInputStream(in);
|
||||||
|
|
||||||
|
//END DEBUG
|
||||||
|
logger.debug("Response return Content-Type: "+httpUtils.getLastContentType());
|
||||||
|
return Response
|
||||||
|
.ok(reusIs)
|
||||||
|
//.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename = \""+fileName+"\"")
|
||||||
|
.header(ConstantsResolver.CONTENT_TYPE, httpUtils.getLastContentType()).build();
|
||||||
|
|
||||||
|
//int bytes = IOUtils.copy(reusIs, out);
|
||||||
|
//logger.trace("POST - RETURN : "+IOUtils.toString(reusIs));
|
||||||
|
|
||||||
|
// if(bytes==0)
|
||||||
|
// logger.warn("ResponseBody is empty, returning empty resp");
|
||||||
|
}catch(Exception e){
|
||||||
|
logger.error("Error on copy the response to send to client: ", e);
|
||||||
|
ExceptionManager.throwInternalErrorException(req, "Error on copy the response!", GeonetworkResolver.class, help);
|
||||||
|
}finally{
|
||||||
|
IOUtils.closeQuietly(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (IllegalArgumentException e){
|
||||||
|
logger.error("IllegalArgumentException:", e);
|
||||||
|
ExceptionManager.throwBadRequestException(req, "Illegal argument to carry out the request!", GeonetworkResolver.class, help);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Exception:", e);
|
||||||
|
String error = "Sorry, an error occurred on resolving geonetwork request with scope "+scope+". Please, contact support!";
|
||||||
|
ExceptionManager.throwInternalErrorException(req, error, GeonetworkResolver.class, help);
|
||||||
|
}
|
||||||
|
|
||||||
|
//An error occurred
|
||||||
|
try {
|
||||||
|
|
||||||
|
throw new InternalServerException(req, javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, "Error during perform POST operation to: "+gnCSWlURL, GeonetworkResolver.class, new URI(help));
|
||||||
|
}
|
||||||
|
catch (URISyntaxException e) {
|
||||||
|
//silent
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purge remain from query string.
|
||||||
|
*
|
||||||
|
* @param remain_value the scope
|
||||||
|
* @param queryString the query string
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
private static String purgeRemainFromQueryString(String remain_value, String queryString){
|
||||||
|
// SCOPE is: /gcube/devsec/devVRE
|
||||||
|
// [INFO ] 2016-04-05 15:01:42,808 org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkResolver -
|
||||||
|
// Query String is: scope=/gcube/devsec/devVRE&version=2.0.2&request=GetCapabilities&service=CSW
|
||||||
|
int start = queryString.indexOf(PATH_PARAM_REMAINING+"=");
|
||||||
|
|
||||||
|
if(start>=0){
|
||||||
|
int end = queryString.indexOf("&", start);
|
||||||
|
|
||||||
|
if(end==-1 && queryString.length()==(PATH_PARAM_REMAINING+"="+remain_value).length()){ //SCOPE IS THE UNIQUE PARAMETER INTO QUETY STRING
|
||||||
|
logger.debug("Scope is the unique parameter, returning empty query string");
|
||||||
|
return "";
|
||||||
|
}else if(end<queryString.length())
|
||||||
|
return queryString.substring(end+1, queryString.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
return queryString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Discovery geonetwork instance.
|
||||||
|
*
|
||||||
|
* @param scope the scope
|
||||||
|
* @return the geonetwork instance
|
||||||
|
* @throws GeonetworkInstanceException the geonetwork instance exception
|
||||||
|
*/
|
||||||
|
private GeonetworkInstance discoveryGeonetworkInstance(String scope) throws GeonetworkInstanceException{
|
||||||
|
|
||||||
|
GeonetworkAccessParameter gntwAccess = new GeonetworkAccessParameter(scope);
|
||||||
|
return gntwAccess.getGeonetworkInstance(true, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purge scope from query string.
|
||||||
|
*
|
||||||
|
* @param scope_value the scope_value
|
||||||
|
* @param queryString the query string
|
||||||
|
* @return the string
|
||||||
|
*/
|
||||||
|
private static String purgeScopeFromQueryString(String scope_value, String queryString){
|
||||||
|
// SCOPE is: /gcube/devsec/devVRE
|
||||||
|
// [INFO ] 2016-04-05 15:01:42,808 org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkResolver -
|
||||||
|
// Query String is: scope=/gcube/devsec/devVRE&version=2.0.2&request=GetCapabilities&service=CSW
|
||||||
|
int start = queryString.indexOf(PATH_PARAM_SCOPE+"=");
|
||||||
|
|
||||||
|
if(start>=0){
|
||||||
|
int end = queryString.indexOf("&", start);
|
||||||
|
|
||||||
|
if(end==-1 && queryString.length()==(PATH_PARAM_SCOPE+"="+scope_value).length()){ //SCOPE IS THE UNIQUE PARAMETER INTO QUETY STRING
|
||||||
|
logger.debug("Scope is the unique parameter, returning empty query string");
|
||||||
|
return "";
|
||||||
|
}else if(end<queryString.length())
|
||||||
|
return queryString.substring(end+1, queryString.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
return queryString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset geonetowork instance cache for scope.
|
||||||
|
*
|
||||||
|
* @param scope the scope
|
||||||
|
*/
|
||||||
|
private void resetGeonetoworkInstanceCacheForScope(String scope){
|
||||||
|
if(cacheGNInstances!=null && cacheGNInstances.get(scope)!=null){
|
||||||
|
cacheGNInstances.remove(scope);
|
||||||
|
logger.info("Reset of "+scope+" in Cache Geonetwork server params perfomed!");
|
||||||
|
}else
|
||||||
|
logger.info("Reset of "+scope+" in Cache Geonetwork skipped, scope not exists!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Purge cache geonetwork instances.
|
||||||
|
*/
|
||||||
|
private void purgeCacheGeonetworkInstances(){
|
||||||
|
cacheGNInstances = new HashMap<String, GeonetworkInstance>();
|
||||||
|
logger.info("Reset of GeonetworkInstance cache perfomed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the geonetwork instance for scope.
|
||||||
|
*
|
||||||
|
* @param scope the scope
|
||||||
|
* @return the geonetwork instance for scope
|
||||||
|
* @throws Exception the exception
|
||||||
|
*/
|
||||||
|
protected GeonetworkInstance getGeonetworkInstanceForScope(String scope) throws Exception{
|
||||||
|
|
||||||
|
if(cacheGNInstances==null)
|
||||||
|
purgeCacheGeonetworkInstances();
|
||||||
|
|
||||||
|
logger.info("Attempt to get geonetwork instance from GeonetworkInstance cache for scope: "+scope);
|
||||||
|
GeonetworkInstance geoInstance = cacheGNInstances.get(scope);
|
||||||
|
|
||||||
|
if(geoInstance==null){
|
||||||
|
logger.info("Cache having null GeonetworkInstance for scope "+scope+", reading by Geonetwork library...");
|
||||||
|
try {
|
||||||
|
geoInstance = discoveryGeonetworkInstance(scope);
|
||||||
|
cacheGNInstances.put(scope, geoInstance);
|
||||||
|
logger.info("Updated GeonetworkInstance Cache adding couple: Scope "+scope+" - GeonetworkInstance "+geoInstance);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("An error occurred on reading GeonetworkInstance for scope "+scope, e);
|
||||||
|
throw new Exception("Sorry, An error occurred on reading GeonetworkInstance for scope "+scope);
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
logger.info("GeonetworkInstance cache for scope: "+scope+" is not null using it: "+geoInstance);
|
||||||
|
|
||||||
|
return geoInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,89 +0,0 @@
|
||||||
package org.gcube.datatransfer.resolver.services;
|
|
||||||
|
|
||||||
import java.net.URI;
|
|
||||||
import java.net.URISyntaxException;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.core.Context;
|
|
||||||
import javax.ws.rs.core.Response.Status;
|
|
||||||
|
|
||||||
import org.gcube.datatransfer.resolver.Constants;
|
|
||||||
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.MODE;
|
|
||||||
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.VISIBILITY;
|
|
||||||
import org.gcube.datatransfer.resolver.services.exceptions.BadRequestException;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
@Path(Constants.SERVLET_GEONETWORK)
|
|
||||||
public class GisResolver {
|
|
||||||
|
|
||||||
private static Logger logger = LoggerFactory.getLogger(GisResolver.class);
|
|
||||||
|
|
||||||
private String help = "https://wiki.gcube-system.org/gcube/URI_Resolver#GIS_Resolver";
|
|
||||||
|
|
||||||
@GET
|
|
||||||
public void submitGet(@Context HttpServletRequest req, @PathParam("mode") MODE mode, @PathParam("scope") String scope, @PathParam("visibility") VISIBILITY visibility, @PathParam("owner") String owner) {
|
|
||||||
|
|
||||||
// MODE mode = null;
|
|
||||||
// String theScope = null;
|
|
||||||
// VISIBILITY visibility = null;
|
|
||||||
// String owner = null;
|
|
||||||
|
|
||||||
|
|
||||||
//Checking mandatory parameter id
|
|
||||||
if(mode==null){
|
|
||||||
logger.error("Path Parameter 'mode' not found");
|
|
||||||
try {
|
|
||||||
throw new BadRequestException(req, Status.NOT_ACCEPTABLE, "Missing mandatory path parameter 'mode'", StorageHubResolver.class, new URI(help));
|
|
||||||
}
|
|
||||||
catch (URISyntaxException e) {
|
|
||||||
//silent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(scope==null || scope.isEmpty()){
|
|
||||||
logger.error("Path Parameter 'scope' not found");
|
|
||||||
try {
|
|
||||||
throw new BadRequestException(req, Status.NOT_ACCEPTABLE, "Missing mandatory path parameter 'scope'", StorageHubResolver.class, new URI(help));
|
|
||||||
}
|
|
||||||
catch (URISyntaxException e) {
|
|
||||||
//silent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(visibility==null){
|
|
||||||
logger.error("Path Parameter 'visibility' not found");
|
|
||||||
try {
|
|
||||||
throw new BadRequestException(req, Status.NOT_ACCEPTABLE, "Missing mandatory path parameter 'visibility'", StorageHubResolver.class, new URI(help));
|
|
||||||
}
|
|
||||||
catch (URISyntaxException e) {
|
|
||||||
//silent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(visibility==null){
|
|
||||||
logger.error("Path Parameter 'visibility' not found");
|
|
||||||
try {
|
|
||||||
throw new BadRequestException(req, Status.NOT_ACCEPTABLE, "Missing mandatory path parameter 'visibility'", StorageHubResolver.class, new URI(help));
|
|
||||||
}
|
|
||||||
catch (URISyntaxException e) {
|
|
||||||
//silent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
public void submitPost(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -43,7 +43,7 @@ public class SMPIDResolver {
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("id")
|
@Path("id")
|
||||||
public Response getSMPID(@Context HttpServletRequest httpRequest, @QueryParam(SMP_ID) @Nullable String smpId, @QueryParam(ConstantsResolver.FILE_NAME) String fileName, @QueryParam(ConstantsResolver.CONTENT_TYPE) String contentType, @QueryParam(ConstantsResolver.VALIDATION) Boolean validation){
|
public Response getSMPID(@Context HttpServletRequest httpRequest, @QueryParam(SMP_ID) @Nullable String smpId, @QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName, @QueryParam(ConstantsResolver.QUERY_PARAM_CONTENT_TYPE) String contentType, @QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) Boolean validation){
|
||||||
logger.info("resolve smp-id called");
|
logger.info("resolve smp-id called");
|
||||||
|
|
||||||
//Checking mandatory parameter smpId
|
//Checking mandatory parameter smpId
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class SMPResolver {
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("smp")
|
@Path("smp")
|
||||||
public Response getSMPURI(@Context HttpServletRequest httpRequest, @QueryParam(SMP_URI) @Nullable String smpURI, @QueryParam(ConstantsResolver.FILE_NAME) String fileName, @QueryParam(ConstantsResolver.CONTENT_TYPE) String contentType, @QueryParam(ConstantsResolver.VALIDATION) Boolean validation){
|
public Response getSMPURI(@Context HttpServletRequest httpRequest, @QueryParam(SMP_URI) @Nullable String smpURI, @QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName, @QueryParam(ConstantsResolver.QUERY_PARAM_CONTENT_TYPE) String contentType, @QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) Boolean validation){
|
||||||
logger.info("resolve smp-uri called");
|
logger.info("resolve smp-uri called");
|
||||||
|
|
||||||
//Checking mandatory parameter smpURI
|
//Checking mandatory parameter smpURI
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class StorageIDResolver {
|
||||||
@GET
|
@GET
|
||||||
@Path("{storage-id:(?!index)[^/?$]*}")
|
@Path("{storage-id:(?!index)[^/?$]*}")
|
||||||
//@Path("{storage-id}")
|
//@Path("{storage-id}")
|
||||||
public Response getStorageId(@Context HttpServletRequest httpRequest, @PathParam(STORAGE_ID) String storageId, @QueryParam(ConstantsResolver.FILE_NAME) String fileName, @QueryParam(ConstantsResolver.CONTENT_TYPE) String contentType, @QueryParam(ConstantsResolver.VALIDATION) Boolean validation) {
|
public Response getStorageId(@Context HttpServletRequest httpRequest, @PathParam(STORAGE_ID) String storageId, @QueryParam(ConstantsResolver.QUERY_PARAM_FILE_NAME) String fileName, @QueryParam(ConstantsResolver.QUERY_PARAM_CONTENT_TYPE) String contentType, @QueryParam(ConstantsResolver.QUERY_PARAM_VALIDATION) Boolean validation) {
|
||||||
logger.info("resolve Storage-Id called");
|
logger.info("resolve Storage-Id called");
|
||||||
//Checking mandatory parameter storageId
|
//Checking mandatory parameter storageId
|
||||||
if(storageId==null || storageId.isEmpty()){
|
if(storageId==null || storageId.isEmpty()){
|
||||||
|
|
|
@ -84,6 +84,39 @@ public class ExceptionManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throw unauthorized exception.
|
||||||
|
*
|
||||||
|
* @param httpRequest the http request
|
||||||
|
* @param errorMessage the error message
|
||||||
|
* @param thrownBy the thrown by
|
||||||
|
* @param helpURI the help uri
|
||||||
|
*/
|
||||||
|
public static void throwUnauthorizedException(HttpServletRequest httpRequest, String errorMessage, Class thrownBy, String helpURI){
|
||||||
|
|
||||||
|
URI theURI = checkURI(helpURI);
|
||||||
|
throw new WrongParameterException(httpRequest, Status.UNAUTHORIZED, errorMessage, thrownBy, theURI);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throw forbidden exception.
|
||||||
|
*
|
||||||
|
* @param httpRequest the http request
|
||||||
|
* @param errorMessage the error message
|
||||||
|
* @param thrownBy the thrown by
|
||||||
|
* @param helpURI the help uri
|
||||||
|
*/
|
||||||
|
public static void throwForbiddenException(HttpServletRequest httpRequest, String errorMessage, Class thrownBy, String helpURI){
|
||||||
|
|
||||||
|
URI theURI = checkURI(helpURI);
|
||||||
|
throw new WrongParameterException(httpRequest, Status.FORBIDDEN, errorMessage, thrownBy, theURI);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check uri.
|
* Check uri.
|
||||||
*
|
*
|
||||||
|
|
|
@ -26,11 +26,11 @@ import org.gcube.datatransfer.resolver.services.error.ExceptionReport;
|
||||||
*/
|
*/
|
||||||
public class BadParameterException extends WebApplicationException {
|
public class BadParameterException extends WebApplicationException {
|
||||||
|
|
||||||
/**
|
|
||||||
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -7600028435121268528L;
|
private static final long serialVersionUID = 6838352737725193114L;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new bad parameter exception.
|
* Instantiates a new bad parameter exception.
|
||||||
|
|
|
@ -25,11 +25,12 @@ import org.gcube.datatransfer.resolver.services.error.ExceptionReport;
|
||||||
*/
|
*/
|
||||||
public class BadRequestException extends WebApplicationException {
|
public class BadRequestException extends WebApplicationException {
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -7600028435121268528L;
|
private static final long serialVersionUID = -6095255435634429757L;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new bad parameter exception.
|
* Instantiates a new bad parameter exception.
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.datatransfer.resolver.services.exceptions;
|
||||||
|
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import javax.ws.rs.core.Response.Status;
|
||||||
|
|
||||||
|
import org.gcube.datatransfer.resolver.Util;
|
||||||
|
import org.gcube.datatransfer.resolver.services.error.ErrorReport;
|
||||||
|
import org.gcube.datatransfer.resolver.services.error.ExceptionReport;
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class ForbiddenRequestException.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||||
|
* Oct 23, 2018
|
||||||
|
*/
|
||||||
|
public class ForbiddenRequestException extends WebApplicationException {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = -7693811244686509390L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new forbidden request exception.
|
||||||
|
*
|
||||||
|
* @param request the request
|
||||||
|
* @param httpReturnStatus the http return status
|
||||||
|
* @param message the message
|
||||||
|
* @param thrownBySource the thrown by source
|
||||||
|
* @param help the help
|
||||||
|
*/
|
||||||
|
public ForbiddenRequestException(HttpServletRequest request, Status httpReturnStatus, String message, Class thrownBySource, URI help) {
|
||||||
|
|
||||||
|
super(Response.status(httpReturnStatus).entity(
|
||||||
|
ExceptionReport.builder().
|
||||||
|
request(Util.getFullURL(request)).
|
||||||
|
method(request.getMethod()).
|
||||||
|
success(false).
|
||||||
|
help(help).
|
||||||
|
error(
|
||||||
|
ErrorReport.builder().
|
||||||
|
httpErrorCode(Status.FORBIDDEN.getStatusCode()).
|
||||||
|
name(Status.FORBIDDEN.name())
|
||||||
|
.message(message).
|
||||||
|
thrownBy(thrownBySource.getName()).build())
|
||||||
|
.build())
|
||||||
|
.type(MediaType.APPLICATION_XML).build());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.datatransfer.resolver.services.exceptions;
|
||||||
|
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import javax.ws.rs.core.Response.Status;
|
||||||
|
|
||||||
|
import org.gcube.datatransfer.resolver.Util;
|
||||||
|
import org.gcube.datatransfer.resolver.services.error.ErrorReport;
|
||||||
|
import org.gcube.datatransfer.resolver.services.error.ExceptionReport;
|
||||||
|
;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Class NotAuthorizedRequestException.
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||||
|
* Oct 23, 2018
|
||||||
|
*/
|
||||||
|
public class NotAuthorizedRequestException extends WebApplicationException {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 7305531473428888453L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiates a new not authorized request exception.
|
||||||
|
*
|
||||||
|
* @param request the request
|
||||||
|
* @param httpReturnStatus the http return status
|
||||||
|
* @param message the message
|
||||||
|
* @param thrownBySource the thrown by source
|
||||||
|
* @param help the help
|
||||||
|
*/
|
||||||
|
public NotAuthorizedRequestException(HttpServletRequest request, Status httpReturnStatus, String message, Class thrownBySource, URI help) {
|
||||||
|
|
||||||
|
super(Response.status(httpReturnStatus).entity(
|
||||||
|
ExceptionReport.builder().
|
||||||
|
request(Util.getFullURL(request)).
|
||||||
|
method(request.getMethod()).
|
||||||
|
success(false).
|
||||||
|
help(help).
|
||||||
|
error(
|
||||||
|
ErrorReport.builder().
|
||||||
|
httpErrorCode(Status.UNAUTHORIZED.getStatusCode()).
|
||||||
|
name(Status.UNAUTHORIZED.name())
|
||||||
|
.message(message).
|
||||||
|
thrownBy(thrownBySource.getName()).build())
|
||||||
|
.build())
|
||||||
|
.type(MediaType.APPLICATION_XML).build());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -26,11 +26,11 @@ import org.gcube.datatransfer.resolver.services.error.ExceptionReport;
|
||||||
*/
|
*/
|
||||||
public class WrongParameterException extends WebApplicationException {
|
public class WrongParameterException extends WebApplicationException {
|
||||||
|
|
||||||
/**
|
|
||||||
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = -7600028435121268528L;
|
private static final long serialVersionUID = 6528328881336941898L;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new wrong parameter exception.
|
* Instantiates a new wrong parameter exception.
|
||||||
|
|
Loading…
Reference in New Issue