on going on bug fixing the Incident #16671

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@179493 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Francesco Mangiacrapa 2019-05-21 14:27:58 +00:00
parent a04336e3bf
commit 5cc9343aeb
10 changed files with 501 additions and 277 deletions

View File

@ -4,9 +4,6 @@
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<dependent-module archiveName="ckan-util-library-2.9.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/ckan-util-library-BRANCH-2.9/ckan-util-library-BRANCH-2.9">
<dependency-type>uses</dependency-type>
</dependent-module>
<property name="context-root" value="uri-resolver"/>
<property name="java-output-path" value="/uri-resolver/target/classes"/>
</wb-module>

View File

@ -0,0 +1,116 @@
/**
*
*/
package org.gcube.datatransfer.resolver.caches;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.gcube.spatial.data.geonetwork.GeoNetwork;
import org.gcube.spatial.data.geonetwork.GeoNetworkAdministration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification;
import it.geosolutions.geonetwork.util.GNSearchRequest;
import it.geosolutions.geonetwork.util.GNSearchResponse;
import it.geosolutions.geonetwork.util.GNSearchResponse.GNMetadata;
/**
* The Class LoadingGNPublicLayerIDsInstanceCache.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
*
* May 21, 2019
*/
public class LoadingGNPublicLayerIDsInstanceCache {
private static Logger logger = LoggerFactory.getLogger(LoadingGNPublicLayerIDsInstanceCache.class);
private static LoadingCache<String, List<String>> gnPublicLayersCache;
static {
CacheLoader<String, List<String>> loader = new CacheLoader<String, List<String>> () {
@Override
public List<String> load(String geonetworkEndPoint)
throws Exception {
//logger.info("Loading public layer IDS for GN endpoint: "+geonetworkEndPoint);
return loadGNPublicLayersID(geonetworkEndPoint);
}
};
RemovalListener<String, List<String>> removalListener = new RemovalListener<String, List<String>>() {
public void onRemoval(RemovalNotification<String, List<String>> removal) {
logger.info("cache expired");
}
};
gnPublicLayersCache =
CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(
1, TimeUnit.DAYS).removalListener(removalListener).
build(loader);
logger.info("cache instancied");
}
/**
* Gets the.
*
* @param scope the scope
* @return the geonetwork instance
* @throws ExecutionException the execution exception
*/
public static List<String> get(String scope) throws ExecutionException{
return gnPublicLayersCache.get(scope);
}
/**
* Load GN public layers ID.
*
* @param geonetworkEndPoint the geonetwork end point
* @return the list
* @throws Exception the exception
*/
protected static List<String> loadGNPublicLayersID(String geonetworkEndPoint)
throws Exception {
if (geonetworkEndPoint == null || geonetworkEndPoint.isEmpty()){
logger.warn("geonetworkEndPoint is null or empty, returning null");
return null;
}
List<String> foundPublicIds = new ArrayList<String>();
try {
logger.info("Loading Public Layers ID for GN endpoint: {}",geonetworkEndPoint);
GeoNetworkAdministration reader = GeoNetwork.get();
final GNSearchRequest req=new GNSearchRequest();
req.addParam(GNSearchRequest.Param.any,"");
GNSearchResponse resp=reader.query(req);
Iterator<GNMetadata> iterator=resp.iterator();
while(iterator.hasNext()){
foundPublicIds.add(iterator.next().getUUID());
}
logger.info("Public Layers ID are: "+foundPublicIds.size());
}catch (Exception e) {
logger.error("Error during sending GNSearchRequest: ",e);
}
return foundPublicIds;
}
}

View File

@ -8,6 +8,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.AccountType;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.GeonetworkLoginLevel;
import org.gcube.datatransfer.resolver.gis.GeonetworkInstance;
import org.gcube.datatransfer.resolver.gis.exception.GeonetworkInstanceException;
@ -52,7 +53,7 @@ public class LoadingGeonetworkInstanceCache {
};
geonetworkInstancesCache =
CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(
CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(
1, TimeUnit.DAYS).removalListener(removalListener).
build(loader);
@ -89,8 +90,8 @@ public class LoadingGeonetworkInstanceCache {
}
GeonetworkAccessParameter gntwAccess = new GeonetworkAccessParameter(scope);
GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance(true, GeonetworkLoginLevel.ADMIN);
logger.info("Loaded "+gnInstance+" for scope: " + scope);
return gnInstance;
GeonetworkInstance geoInstance = gntwAccess.getGeonetworkInstance(false, GeonetworkLoginLevel.CKAN, AccountType.CKAN);
logger.info("Loaded "+geoInstance+" for scope: " + scope);
return geoInstance;
}
}

View File

@ -10,8 +10,9 @@ import org.slf4j.LoggerFactory;
/**
* The Class GeonetworkAccessParameter.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jun 9, 2016
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
*
* May 20, 2019
*/
public class GeonetworkAccessParameter implements GeonetworkServiceInterface{
@ -57,58 +58,27 @@ public class GeonetworkAccessParameter implements GeonetworkServiceInterface{
public GeonetworkAccessParameter(String scope) {
this.scope = scope;
}
/* (non-Javadoc)
* @see org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface#getGeonetworkInstance(boolean, org.gcube.datatransfer.resolver.gis.GeonetowrkAccessParameter.GeonetworkLoginLevel)
* @see org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface#getGeonetworkInstance(boolean, org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.GeonetworkLoginLevel, org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.AccountType)
*/
public GeonetworkInstance getGeonetworkInstance(boolean authenticate, GeonetworkLoginLevel loginLevel) throws GeonetworkInstanceException {
return instanceGeonetwork(authenticate, loginLevel, null);
}
public GeonetworkInstance getGeonetworkInstance(boolean authenticate, GeonetworkLoginLevel loginLevel, AccountType accType) throws GeonetworkInstanceException{
if(geonetworkInstance==null) {
/**
* Instance geonetwork.
*
* @param authenticate the authenticate
* @param loginLevel the login level
* @param accType the acc type
* @return the geonetwork instance
* @throws GeonetworkInstanceException the geonetwork instance exception
*/
private GeonetworkInstance instanceGeonetwork(boolean authenticate, GeonetworkLoginLevel loginLevel, AccountType accType) throws GeonetworkInstanceException{
if(scope == null || scope.isEmpty())
throw new GeonetworkInstanceException("Scope is null");
LoginLevel level = toLoginLevel(loginLevel);
Type type = toType(accType);
if(geonetworkInstance==null)
if(scope == null || scope.isEmpty())
throw new GeonetworkInstanceException("Scope is null");
LoginLevel level = loginLevel!=null?toLoginLevel(loginLevel):null;
Type type = accType!=null?toType(accType):null;
geonetworkInstance = new GeonetworkInstance(scope, authenticate, level, type);
return geonetworkInstance;
}
/* (non-Javadoc)
* @see org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface#getGeonetworkInstance()
*/
@Override
public GeonetworkInstance getGeonetworkInstance()
throws Exception {
if(scope == null || scope.isEmpty())
throw new GeonetworkInstanceException("Scope is null");
/*if(serverParam.getUrl() == null || serverParam.getUrl().isEmpty())
throw new GeonetworkInstanceException("Geonetwork url is null or empty");*/
if(geonetworkInstance==null)
geonetworkInstance = new GeonetworkInstance(scope, false, null, null);
}
return geonetworkInstance;
}
/* (non-Javadoc)
* @see org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface#getScope()
*/

View File

@ -6,6 +6,7 @@ import org.gcube.spatial.data.geonetwork.GeoNetwork;
import org.gcube.spatial.data.geonetwork.GeoNetworkPublisher;
import org.gcube.spatial.data.geonetwork.LoginLevel;
import org.gcube.spatial.data.geonetwork.configuration.Configuration;
import org.gcube.spatial.data.geonetwork.extension.ServerAccess.Version;
import org.gcube.spatial.data.geonetwork.model.Account;
import org.gcube.spatial.data.geonetwork.model.Account.Type;
import org.gcube.spatial.data.geonetwork.model.faults.AuthorizationException;
@ -14,39 +15,25 @@ import org.gcube.spatial.data.geonetwork.model.faults.MissingServiceEndpointExce
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class GeonetworkInstance.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* May 16, 2017
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
*
* May 21, 2019
*/
public class GeonetworkInstance {
private GeoNetworkPublisher geonetworkPublisher = null;
/**
* Instantiates a new geonetwork instance.
*/
public GeonetworkInstance(){} //FOR SERIALIZATION
private Logger logger = LoggerFactory.getLogger(GeonetworkInstance.class);
private String scope;
private Account account;
private LoginLevel level;
private Type type;
/**
* Instantiates a new geonetwork instance.
*
* @param scope the scope
* @throws GeonetworkInstanceException the geonetwork instance exception
*/
public GeonetworkInstance(String scope) throws GeonetworkInstanceException{
this(scope, false, null, null);
}
private Configuration config;
private Version version;
private String endPoint;
/**
* Instantiates a new geonetwork instance.
@ -67,9 +54,11 @@ public class GeonetworkInstance {
ScopeProvider.instance.set(scope);
logger.info("setting scope "+scope);
createInstanceGeonetworkPublisher(authenticate, level);
this.config = geonetworkPublisher.getConfiguration();
this.version = this.config.getGeoNetworkVersion();
this.endPoint = this.config.getGeoNetworkEndpoint();
if(this.type!=null){
Configuration config = geonetworkPublisher.getConfiguration();
this.account=config.getScopeConfiguration().getAccounts().get(type);
this.account=config.getScopeConfiguration().getAccounts().get(this.type);
}
//logger.info("Admin: "+config.getAdminAccount().getUser()+", Pwd: "+config.getAdminAccount().getPassword());
} catch (Exception e) {
@ -140,7 +129,26 @@ public class GeonetworkInstance {
public GeoNetworkPublisher getGeonetworkPublisher() {
return geonetworkPublisher;
}
/**
* Gets the version.
*
* @return the version
*/
public Version getVersion() {
return version;
}
/**
* Gets the level.
*
* @return the level
*/
public LoginLevel getLevel() {
return level;
}
/**
* Gets the account.
*
@ -150,6 +158,25 @@ public class GeonetworkInstance {
return account;
}
/**
* Gets the end point.
*
* @return the end point
*/
public String getEndPoint() {
return endPoint;
}
/**
* Gets the config.
*
* @return the config
*/
public Configuration getConfig() {
return config;
}
/**
* Gets the scope.
@ -166,12 +193,9 @@ public class GeonetworkInstance {
*/
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("GeonetworkInstance [geonetworkPublisher=");
builder.append(geonetworkPublisher);
builder.append(", logger=");
builder.append(logger);
builder.append(", scope=");
builder.append(scope);
builder.append(", account=");
@ -180,8 +204,12 @@ public class GeonetworkInstance {
builder.append(level);
builder.append(", type=");
builder.append(type);
builder.append(", config=");
builder.append(config);
builder.append("]");
return builder.toString();
}
}

View File

@ -3,6 +3,7 @@
*/
package org.gcube.datatransfer.resolver.gis;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.AccountType;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.GeonetworkLoginLevel;
/**
@ -17,20 +18,21 @@ public interface GeonetworkServiceInterface {
*
* @param authenticate the authenticate
* @param loginLevel the login level
* @param accType the acc type
* @return the geonetwork instance
* @throws Exception the exception
*/
public GeonetworkInstance getGeonetworkInstance(boolean authenticate, GeonetworkLoginLevel loginLevel) throws Exception;
public GeonetworkInstance getGeonetworkInstance(boolean authenticate, GeonetworkLoginLevel loginLevel, AccountType accType) throws Exception;
/**
* Gets the geonetwork instance with authenticate = false and LoginLevel = null
*
* @return the geonetwork instance
* @throws Exception the exception
*/
public GeonetworkInstance getGeonetworkInstance() throws Exception;
//
// /**
// * Gets the geonetwork instance with authenticate = false and LoginLevel = null.
// *
// * @return the geonetwork instance
// * @throws Exception the exception
// */
// public GeonetworkInstance getGeonetworkInstance() throws Exception;
/**
* Gets the scope.

View File

@ -3,19 +3,12 @@
*/
package org.gcube.datatransfer.resolver.gis.geonetwork;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.gcube.spatial.data.geonetwork.GeoNetwork;
import org.gcube.spatial.data.geonetwork.GeoNetworkReader;
import org.gcube.datatransfer.resolver.caches.LoadingGNPublicLayerIDsInstanceCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import it.geosolutions.geonetwork.util.GNSearchRequest;
import it.geosolutions.geonetwork.util.GNSearchResponse;
import it.geosolutions.geonetwork.util.GNSearchResponse.GNMetadata;
/**
* The Class FilterGetRecords.
@ -32,78 +25,53 @@ public class FilterGetRecords {
private static final Logger logger = LoggerFactory.getLogger(FilterGetRecords.class);
private List<String> foundPublicIds = null;
private List<String> foundPublicLayerIds = null;
private String geonetworkEndPoint;
/**
* Instantiates a new filter get records.
*
* @param readBody the read body
* @param geonetworkEndPoint the geonetwork end point
*/
public FilterGetRecords(String readBody) {
public FilterGetRecords(String readBody, String geonetworkEndPoint) {
this.geonetworkEndPoint = geonetworkEndPoint;
if(readBody!=null && !readBody.isEmpty() && readBody.contains(CSW_GET_RECORDS)){
logger.info("Is "+CSW_GET_RECORDS+" request, getting public ids");
GeoNetworkReader reader;
try {
reader = GeoNetwork.get();
final GNSearchRequest req=new GNSearchRequest();
req.addParam(GNSearchRequest.Param.any,"");
GNSearchResponse resp=reader.query(req);
foundPublicIds = new ArrayList<String>();
Iterator<GNMetadata> iterator=resp.iterator();
while(iterator.hasNext()){
foundPublicIds.add(iterator.next().getUUID());
}
logger.info("Public Metadata ids are: "+foundPublicIds.size());
}catch (Exception e) {
logger.error("Error during sending GNSearchRequest: ",e);
}
logger.info("The request is "+CSW_GET_RECORDS+" so getting GN public layer IDs");
loadGNPublicLayers();
}else
logger.trace("Is not a"+CSW_GET_RECORDS+" request, skipping");
}
/**
* Gets the public file identifiers.
*
* @return the public file identifiers
*/
public List<String> getPublicFileIdentifiers(){
logger.info("Performing query to retrieve the public file identifiers");
GeoNetworkReader reader;
try {
reader = GeoNetwork.get();
final GNSearchRequest req=new GNSearchRequest();
req.addParam(GNSearchRequest.Param.any,"");
GNSearchResponse resp=reader.query(req);
foundPublicIds = new ArrayList<String>();
Iterator<GNMetadata> iterator=resp.iterator();
while(iterator.hasNext()){
foundPublicIds.add(iterator.next().getUUID());
}
logger.info("Public Metadata ids are: "+foundPublicIds.size());
}catch (Exception e) {
logger.error("Error during performing "+CSW_GET_RECORDS+": ",e);
}
return foundPublicIds;
}
/**
* Gets the found public ids.
*
* @return the foundPublicIds
* @return the found public ids
*/
public List<String> getFoundPublicIds() {
return foundPublicIds==null || foundPublicIds.isEmpty()? null: foundPublicIds;
if(foundPublicLayerIds==null) {
loadGNPublicLayers();
}
if(foundPublicLayerIds.isEmpty()) {
return null;
}
return foundPublicLayerIds;
}
private void loadGNPublicLayers(){
try {
foundPublicLayerIds = LoadingGNPublicLayerIDsInstanceCache.get(geonetworkEndPoint);
logger.info("For the GN {}, I found {} public ID layer/s",geonetworkEndPoint,foundPublicLayerIds.size());
}catch (Exception e) {
logger.error("Error occurred on loading cache of GN public IDs: ",e);
}
}
@ -115,7 +83,7 @@ public class FilterGetRecords {
StringBuilder builder = new StringBuilder();
builder.append("FilterGetRecords [foundPublicIds=");
builder.append(foundPublicIds);
builder.append(foundPublicLayerIds);
builder.append("]");
return builder.toString();
}

View File

@ -18,8 +18,8 @@ import javax.ws.rs.core.Response;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.common.scope.impl.ScopeBean;
import org.gcube.common.scope.impl.ScopeBean.Type;
import org.gcube.datatransfer.resolver.caches.LoadingMapOfScopeCache;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.caches.LoadingMapOfScopeCache;
import org.gcube.datatransfer.resolver.catalogue.CatalogueRequest;
import org.gcube.datatransfer.resolver.catalogue.ItemCatalogueURLs;
import org.gcube.datatransfer.resolver.catalogue.ResourceCatalogueCodes;

View File

@ -26,10 +26,10 @@ import javax.ws.rs.core.StreamingOutput;
import org.apache.commons.io.IOUtils;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datatransfer.resolver.ConstantsResolver;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter;
import org.gcube.datatransfer.resolver.caches.LoadingGeonetworkInstanceCache;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.AccountType;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.GeonetworkLoginLevel;
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.GeonetworkRequestFilterParameters.MODE;
@ -42,6 +42,7 @@ import org.gcube.datatransfer.resolver.util.HTTPCallsUtils.HttpResponse;
import org.gcube.datatransfer.resolver.util.ScopeUtil;
import org.gcube.datatransfer.resolver.util.SingleFileStreamingOutput;
import org.gcube.spatial.data.geonetwork.configuration.Configuration;
import org.gcube.spatial.data.geonetwork.extension.ServerAccess.Version;
import org.gcube.spatial.data.geonetwork.model.Account;
import org.gcube.spatial.data.geonetwork.model.Account.Type;
import org.slf4j.Logger;
@ -85,7 +86,7 @@ public class GeonetworkResolver {
public static final String SCOPE_SEPARATOR = "|";
protected Map<String, GeonetworkInstance> cacheGNInstances;
//protected Map<String, GeonetworkInstance> cacheGNInstances;
private String helpURI = "https://wiki.gcube-system.org/gcube/GCube_Resource_Catalogue#Geonetwork_Resolver";
@ -100,14 +101,16 @@ public class GeonetworkResolver {
* OWNER (is optional): filter by owner
*
* @param req the req
* @param mode the mode
* @param scope the scope
* @param mode the mode
* @param visibility the visibility
* @param owner the owner - pass 'null' as string if no filter applied
* @param requestDelimiter the request delimiter
* @param filterKey the filter key
* @param filterValue the filter value
* @param remainPath the remain path
* @param resetCache the reset cache
* @param resetScope the reset scope
* @return the geonetwork request criteria
* @throws WebApplicationException the web application exception
*/
@GET
@ -162,28 +165,62 @@ public class GeonetworkResolver {
throw ExceptionManager.wrongParameterException(req, "The 'visibility' parameter must be value of "+toPrint, this.getClass(), helpURI);
}
if(resetCache!=null && Boolean.parseBoolean(resetCache)){
purgeCacheGeonetworkInstances();
}
if(resetScope!=null && Boolean.parseBoolean(resetScope)){
resetGeonetoworkInstanceCacheForScope(scope);
}
logger.info("Remaining path is: "+remainPath);
try {
GeonetworkInstance gnInstance = getGeonetworkInstanceForScope(scope);
//I'M LOADING THE GN CONFIGURATIONS (ENDPOINT, USER, PWD AND SO ON..) FROM GN LIBRARY BY GENERAL CONSTRUCTOR THAT PERFORMS AUTHENTICATION ON GN,
//THEN THE CONGIGURATIONS LAODED, USER TO PERFORM AUTHENTICATION AND SO ON ARE MANAGE VIA HTTP_CLIENTS.
//I'M LOADING THE GN CONFIGURATIONS (ENDPOINT, USER, PWD AND SO ON..) FROM GN LIBRARY BY GENERAL CONSTRUCTOR THAT PERFORMS AUTHENTICATION ON GN,
//THEN THE CONGIGURATIONS LAODED, USER TO PERFORM AUTHENTICATION AND SO ON ARE MANAGE VIA HTTP_CLIENTS.
logger.info("set scope provider "+scope);
ScopeProvider.instance.set(scope);
GeonetworkInstance gnInstance = getGeonetworkInstanceForScope(scope, GeonetworkLoginLevel.CKAN, AccountType.CKAN);
Account account = gnInstance.getAccount();
Version version = gnInstance.getVersion();
String geonetworkUrl = gnInstance.getEndPoint();
Configuration config = gnInstance.getConfig()!=null?gnInstance.getConfig():null;
if(account==null || account.getUser()==null || account.getPassword()==null || config==null) {
logger.info("Loading GN istance and configurations via Geonetwork Library...");
logger.info("set scope provider "+scope);
ScopeProvider.instance.set(scope);
config = gnInstance.getGeonetworkPublisher().getConfiguration();
account = config.getScopeConfiguration().getAccounts().get(Type.CKAN);
version = config.getGeoNetworkVersion();
geonetworkUrl = config.getGeoNetworkEndpoint();
}
//logger.info("set scope provider "+scope);
//ScopeProvider.instance.set(scope);
logger.info("SCOPE: {}, CKAN user owner is: {}",scope, account.getUser());
logger.info("SCOPE: {}, GN EndPoint: {}",scope, geonetworkUrl);
// ScopeProvider.instance.set(scope);
HTTPCallsUtils httpUtils = new HTTPCallsUtils();
Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
String geonetworkUrl = config.getGeoNetworkEndpoint();
// Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
// String geonetworkUrl = config.getGeoNetworkEndpoint();
String baseURL = remainPath==null ||remainPath.isEmpty()?geonetworkUrl+"/"+CSW_SERVER:geonetworkUrl+"/"+CSW_SERVER+remainPath;
logger.info("The base URL is: "+baseURL);
String queryString = req.getQueryString()==null || req.getQueryString().isEmpty()?"":"?"+req.getQueryString();
gnGetlURL = baseURL+queryString;
// Account account = config.getScopeConfiguration().getAccounts().get(Type.CKAN);
if(account.getUser()!=null){
switch (version) {
case DUE:
boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account.getPassword());
logger.info("Authorized on GN2 "+geonetworkUrl +" ? "+authorized);
break;
default:
httpUtils = new HTTPCallsUtils(account.getUser(), account.getPassword());
logger.info("Authorized on GN3 via HTTCallsUtils...");
break;
}
}else {
logger.warn("I'm not able to perform authentication, the user read from config with "+Type.CKAN+" is null");
}
logger.info("Sending get request to URL: "+gnGetlURL);
HttpResponse proxedGNResponse = httpUtils.get(gnGetlURL);
@ -228,6 +265,21 @@ public class GeonetworkResolver {
}
/**
* Submit post.
*
* @param req the req
* @param scope the scope
* @param mode the mode
* @param visibility the visibility
* @param filterKey the filter key
* @param filterValue the filter value
* @param remainPath the remain path
* @param resetCache the reset cache
* @param resetScope the reset scope
* @return the response
* @throws WebApplicationException the web application exception
*/
@POST
@Path("/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}")
public Response submitPost(@Context HttpServletRequest req,
@ -294,14 +346,34 @@ public class GeonetworkResolver {
try {
GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter(scope);
GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance();
ScopeProvider.instance.set(scope);
//MANUALLY INSTANCING THE GEONETWORK TO MANGE LOGIN IF NEEDED AND SO ON..
//DO NOT USE THE LOADING_CACHE OF GEONETWORK
// GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter(scope);
// GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance(false, null, null);
//I'M LOADING THE GN CONFIGURATIONS (ENDPOINT, USER, PWD AND SO ON..) FROM GN LIBRARY BY GENERAL CONSTRUCTOR THAT PERFORMS AUTHENTICATION ON GN,
//THEN THE CONGIGURATIONS LAODED, USER TO PERFORM AUTHENTICATION AND SO ON ARE MANAGE VIA HTTP_CLIENTS.
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());
ScopeProvider.instance.set(scope);
GeonetworkInstance gnInstance = getGeonetworkInstanceForScope(scope, GeonetworkLoginLevel.CKAN, AccountType.CKAN);
Account account = gnInstance.getAccount();
Version version = gnInstance.getVersion();
String geonetworkUrl = gnInstance.getEndPoint();
Configuration config = gnInstance.getConfig()!=null?gnInstance.getConfig():null;
if(account==null || account.getUser()==null || account.getPassword()==null || config==null) {
logger.info("Loading GN istance and configurations via Geonetwork Library...");
logger.info("set scope provider "+scope);
ScopeProvider.instance.set(scope);
config = gnInstance.getGeonetworkPublisher().getConfiguration();
account = config.getScopeConfiguration().getAccounts().get(Type.CKAN);
version = config.getGeoNetworkVersion();
geonetworkUrl = config.getGeoNetworkEndpoint();
}
logger.info("set scope provider "+scope);
ScopeProvider.instance.set(scope);
logger.info("SCOPE: {}, CKAN user used is: {}",scope, account.getUser(), account.getPassword());
logger.info("SCOPE: {}, GN EndPoint: {}",scope, geonetworkUrl);
// logger.info("Parameters..");
// for (Enumeration<String> e = req.getParameterNames(); e.hasMoreElements();){
@ -314,7 +386,6 @@ public class GeonetworkResolver {
// 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){
@ -345,7 +416,7 @@ public class GeonetworkResolver {
if(visibility.equals(VISIBILITY.PRV.name())){
logger.info("Visibility: "+VISIBILITY.PRV+" getting private layers..");
//VRE LAYERS
if(mode.equals(MODE.VRE)){
if(mode.equals(MODE.VRE.name())){
logger.info("Getting "+MODE.VRE+" layers..");
//HARVESTED LAYERS
}else{
@ -354,10 +425,21 @@ public class GeonetworkResolver {
}
if(account.getUser()!=null){
boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account. getPassword());
logger.info("Authorized on "+geonetworkUrl +" ? "+authorized);
}else
logger.info("Skipping authentication, ckan user (the owner) is null");
switch (version) {
case DUE:
boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account.getPassword());
logger.info("Authorized on GN2 "+geonetworkUrl +" ? "+authorized);
break;
default:
httpUtils = new HTTPCallsUtils(account.getUser(), account.getPassword());
logger.info("Authorized on GN3 via HTTCallsUtils...");
break;
}
}else {
logger.warn("I'm not able to perform authentication, the user read from config with "+Type.CKAN+" is null");
}
//PUBLIC LAYERS
}else{
@ -391,7 +473,7 @@ public class GeonetworkResolver {
if(visibility.equals(VISIBILITY.PRV.name())){
logger.info("Private VISIBILITY requested, retrieving public file identifiers to apply filtering..");
FilterGetRecords filterGetRecords = new FilterGetRecords(byteArray.toString());
FilterGetRecords filterGetRecords = new FilterGetRecords(byteArray.toString(), geonetworkUrl);
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);
@ -475,73 +557,31 @@ public class GeonetworkResolver {
}
}
/**
* 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);
}
/**
* 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!");
}
/**
*
* !!!!!USE ONLY IN GET METHOD
*
* Gets the geonetwork instance for scope.
*
* @param scope the scope
* @param loginLevel the login level
* @param accountType the account type
* @return the geonetwork instance for scope
* @throws Exception the exception
*/
protected GeonetworkInstance getGeonetworkInstanceForScope(String scope) throws Exception{
if(cacheGNInstances==null)
purgeCacheGeonetworkInstances();
scope = ScopeUtil.normalizeScope(scope, "|");
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);
protected GeonetworkInstance getGeonetworkInstanceForScope(String scope, GeonetworkLoginLevel loginLevel, AccountType accountType) throws Exception{
logger.info("Trying to read the {} from cache for scope: {}",GeonetworkInstance.class.getSimpleName(), scope);
GeonetworkInstance geoInstance;
try {
geoInstance = LoadingGeonetworkInstanceCache.get(scope);
}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);
}
return geoInstance;
}
}

View File

@ -13,8 +13,10 @@ import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@ -125,13 +127,14 @@ public class GetResponseRecordFilter {
* @param doc the doc
* @param identifier the identifier
* @param messageToReplace the message to replace
* @return true, if successful
* @return the map
*/
private static boolean overrideSummaryRecord(Document doc, String identifier, String messageToReplace) {
private static boolean overrideSummaryRecord(Document doc, String identifier, String messageToReplace, Map<String,Boolean> overridingRecordsMap) {
// <csw:SummaryRecord> list
NodeList nodes = doc.getElementsByTagName("gmd:MD_Metadata");
logger.trace("gmd:MD_Metadata are: " + nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++) {
Element mdMetadata = (Element) nodes.item(i);
@ -152,14 +155,22 @@ public class GetResponseRecordFilter {
Element gco = (Element) gcoLst.item(0);
String idValue = gco.getTextContent();
if(overridingRecordsMap.get(idValue)==null) {
overridingRecordsMap.put(idValue, false);
}
logger.trace("Summary gmd:fileIdentifier is: " + idValue);
if (idValue!=null && idValue.equals(identifier)) {
if (idValue!=null && idValue.compareTo(identifier)==0) {
String msg = messageToReplace==null?MESSAGE_TO_REPLACED_ID:messageToReplace;
gco.setTextContent(msg);
logger.debug("Overrided child " + idValue);
overridingRecordsMap.put(idValue, true);
//logger.debug("Returning Record IDs: "+toPrintIds.keySet());
return true;
}
}
}
//logger.debug("Returning Record IDs: "+toPrintIds.keySet());
return false;
}
@ -189,6 +200,70 @@ public class GetResponseRecordFilter {
/**
* Override response ids by list ids.
*
* @param getRecordsResponse the get records response
* @param idsToRemove the ids to remove
* @param messageToWrite the message to replace the right ID in the response.
* @return the input stream
* @throws IOException Signals that an I/O exception has occurred.
*/
// public static InputStream overrideResponseIdsByListIds(InputStream getRecordsResponse, List<String> idsToRemove, String messageToWrite) throws IOException {
//
// try {
// Document doc = inputStreamToW3CDocument(getRecordsResponse);
// int overrideCount = 0;
// Map<String, Boolean> recordToOverride = new HashMap<String, Boolean>();
// for (String identifier : idsToRemove) {
// if(overrideSummaryRecord(doc, identifier, messageToWrite, recordToOverride)) {
// overrideCount++;
// }
// }
//
// logger.info("Overrided node/s should be {}", overrideCount);
// if(logger.isDebugEnabled()) {
// for (String idRecord : recordToOverride.keySet()) {
// if(recordToOverride.get(idRecord)) {
// logger.debug("The record id {} has been overrided into response", idRecord);
// }else {
// logger.debug("No overriding for the record id: {}", idRecord);
// }
// }
// }
//
//
// //TODO IS IT POSSIBLE TO REMOVE?
// /*NodeList nodeList = doc.getElementsByTagName("csw:SearchResults");
// if(nodeList!=null && nodeList.item(0)!=null){
// Node nd = nodeList.item(0);
// // update staff attribute
// NamedNodeMap attr = nd.getAttributes();
// Node numberOfRecordsMatched = attr.getNamedItem("numberOfRecordsMatched");
// Node numberOfRecordsReturned = attr.getNamedItem("numberOfRecordsReturned");
// logger.trace("Old numberOfRecordsMatched: "+numberOfRecordsMatched.getTextContent());
// logger.trace("Old numberOfRecordsReturned: "+numberOfRecordsReturned.getTextContent());
// try{
// int oldValueM = Integer.parseInt(numberOfRecordsMatched.getTextContent());
// int oldValueR = Integer.parseInt(numberOfRecordsReturned.getTextContent());
// int newValueM = oldValueM-removed;
// int newValueR = oldValueR-removed;
// logger.trace("Updating numberOfRecordsMatched at: "+newValueM);
// logger.trace("Updating numberOfRecordsReturned at: "+newValueR);
// numberOfRecordsMatched.setTextContent(newValueM+"");
// numberOfRecordsReturned.setTextContent(newValueR+"");
// }catch (Exception e) {
// logger.warn("An error occurred during attribe numberOfRecordsMatched updating, skipping operation");
// }
// }*/
// return w3CDocumentToInputStream(doc);
// }
// catch (Exception e) {
// logger.error("An error occurred during removing IDS by List: ", e);
// return getRecordsResponse;
// }
// }
/**
* Override response ids by list ids.
*
@ -202,36 +277,63 @@ public class GetResponseRecordFilter {
try {
Document doc = inputStreamToW3CDocument(getRecordsResponse);
int override = 0;
NodeList nodes = doc.getElementsByTagName("gmd:MD_Metadata");
logger.trace("gmd:MD_Metadata are: " + nodes.getLength());
Map<String, Boolean> overridingRecordsMap = new HashMap<String, Boolean>();
int overrideCount = 0;
//FOR EACH PUBLIC IDS
for (String identifier : idsToRemove) {
if(overrideSummaryRecord(doc, identifier, messageToWrite))
override++;
}
logger.info("Overrided "+override +" node/s");
//FOR EACH gmd:fileIdentifier RETURNED IN THE GET_RECORDS RESPONSE
//CHECKING IF IT IS A PUBLIC ID
for (int i = 0; i < nodes.getLength(); i++) {
Element mdMetadata = (Element) nodes.item(i);
//TODO IS IT POSSIBLE TO REMOVE?
/*NodeList nodeList = doc.getElementsByTagName("csw:SearchResults");
if(nodeList!=null && nodeList.item(0)!=null){
Node nd = nodeList.item(0);
// update staff attribute
NamedNodeMap attr = nd.getAttributes();
Node numberOfRecordsMatched = attr.getNamedItem("numberOfRecordsMatched");
Node numberOfRecordsReturned = attr.getNamedItem("numberOfRecordsReturned");
logger.trace("Old numberOfRecordsMatched: "+numberOfRecordsMatched.getTextContent());
logger.trace("Old numberOfRecordsReturned: "+numberOfRecordsReturned.getTextContent());
try{
int oldValueM = Integer.parseInt(numberOfRecordsMatched.getTextContent());
int oldValueR = Integer.parseInt(numberOfRecordsReturned.getTextContent());
int newValueM = oldValueM-removed;
int newValueR = oldValueR-removed;
logger.trace("Updating numberOfRecordsMatched at: "+newValueM);
logger.trace("Updating numberOfRecordsReturned at: "+newValueR);
numberOfRecordsMatched.setTextContent(newValueM+"");
numberOfRecordsReturned.setTextContent(newValueR+"");
}catch (Exception e) {
logger.warn("An error occurred during attribe numberOfRecordsMatched updating, skipping operation");
// <dc:identifier>
NodeList fileIdentifierLst = mdMetadata.getElementsByTagName("gmd:fileIdentifier");
if(fileIdentifierLst==null || fileIdentifierLst.getLength()==0 || fileIdentifierLst.item(0)==null){
logger.info("skipping identifier: " + identifier +" it has not fileidentifier");
break;
}
Element id = (Element) fileIdentifierLst.item(0);
NodeList gcoLst = id.getElementsByTagName("gco:CharacterString");
if(gcoLst==null || gcoLst.getLength()==0 || gcoLst.item(0)==null){
logger.debug("skipping identifier: " + identifier +" it has not gco:CharacterString");
break;
}
Element gco = (Element) gcoLst.item(0);
String idValue = gco.getTextContent();
if(overridingRecordsMap.get(idValue)==null && idValue.compareTo(messageToWrite)!=0) {
overridingRecordsMap.put(idValue, false);
}
logger.trace("Summary gmd:fileIdentifier is: " + idValue);
if (idValue!=null && idValue.compareTo(identifier)==0) {
gco.setTextContent(messageToWrite);
logger.debug("Overrided child " + idValue);
overridingRecordsMap.put(idValue, true);
overrideCount++;
//logger.debug("Returning Record IDs: "+toPrintIds.keySet());
break;
}
}
}*/
}
logger.info("Overrided node/s should be {}", overrideCount);
if(logger.isDebugEnabled()) {
for (String idRecord : overridingRecordsMap.keySet()) {
if(overridingRecordsMap.get(idRecord)) {
logger.debug("The record id {} has been overrided into response", idRecord);
}else {
logger.debug("No overriding for the record id: {}", idRecord);
}
}
}
return w3CDocumentToInputStream(doc);
}
catch (Exception e) {