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:
parent
a04336e3bf
commit
5cc9343aeb
|
@ -4,9 +4,6 @@
|
||||||
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
|
<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/java"/>
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
|
<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="context-root" value="uri-resolver"/>
|
||||||
<property name="java-output-path" value="/uri-resolver/target/classes"/>
|
<property name="java-output-path" value="/uri-resolver/target/classes"/>
|
||||||
</wb-module>
|
</wb-module>
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter;
|
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.GeonetworkAccessParameter.GeonetworkLoginLevel;
|
||||||
import org.gcube.datatransfer.resolver.gis.GeonetworkInstance;
|
import org.gcube.datatransfer.resolver.gis.GeonetworkInstance;
|
||||||
import org.gcube.datatransfer.resolver.gis.exception.GeonetworkInstanceException;
|
import org.gcube.datatransfer.resolver.gis.exception.GeonetworkInstanceException;
|
||||||
|
@ -52,7 +53,7 @@ public class LoadingGeonetworkInstanceCache {
|
||||||
};
|
};
|
||||||
|
|
||||||
geonetworkInstancesCache =
|
geonetworkInstancesCache =
|
||||||
CacheBuilder.newBuilder().maximumSize(100).expireAfterWrite(
|
CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(
|
||||||
1, TimeUnit.DAYS).removalListener(removalListener).
|
1, TimeUnit.DAYS).removalListener(removalListener).
|
||||||
build(loader);
|
build(loader);
|
||||||
|
|
||||||
|
@ -89,8 +90,8 @@ public class LoadingGeonetworkInstanceCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
GeonetworkAccessParameter gntwAccess = new GeonetworkAccessParameter(scope);
|
GeonetworkAccessParameter gntwAccess = new GeonetworkAccessParameter(scope);
|
||||||
GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance(true, GeonetworkLoginLevel.ADMIN);
|
GeonetworkInstance geoInstance = gntwAccess.getGeonetworkInstance(false, GeonetworkLoginLevel.CKAN, AccountType.CKAN);
|
||||||
logger.info("Loaded "+gnInstance+" for scope: " + scope);
|
logger.info("Loaded "+geoInstance+" for scope: " + scope);
|
||||||
return gnInstance;
|
return geoInstance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,9 @@ import org.slf4j.LoggerFactory;
|
||||||
/**
|
/**
|
||||||
* The Class GeonetworkAccessParameter.
|
* The Class GeonetworkAccessParameter.
|
||||||
*
|
*
|
||||||
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||||
* Jun 9, 2016
|
*
|
||||||
|
* May 20, 2019
|
||||||
*/
|
*/
|
||||||
public class GeonetworkAccessParameter implements GeonetworkServiceInterface{
|
public class GeonetworkAccessParameter implements GeonetworkServiceInterface{
|
||||||
|
|
||||||
|
@ -57,58 +58,27 @@ public class GeonetworkAccessParameter implements GeonetworkServiceInterface{
|
||||||
public GeonetworkAccessParameter(String scope) {
|
public GeonetworkAccessParameter(String scope) {
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (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 {
|
public GeonetworkInstance getGeonetworkInstance(boolean authenticate, GeonetworkLoginLevel loginLevel, AccountType accType) throws GeonetworkInstanceException{
|
||||||
return instanceGeonetwork(authenticate, loginLevel, null);
|
|
||||||
}
|
if(geonetworkInstance==null) {
|
||||||
|
|
||||||
/**
|
if(scope == null || scope.isEmpty())
|
||||||
* Instance geonetwork.
|
throw new GeonetworkInstanceException("Scope is null");
|
||||||
*
|
|
||||||
* @param authenticate the authenticate
|
LoginLevel level = loginLevel!=null?toLoginLevel(loginLevel):null;
|
||||||
* @param loginLevel the login level
|
Type type = accType!=null?toType(accType):null;
|
||||||
* @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)
|
|
||||||
geonetworkInstance = new GeonetworkInstance(scope, authenticate, level, type);
|
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;
|
return geonetworkInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface#getScope()
|
* @see org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface#getScope()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -6,6 +6,7 @@ import org.gcube.spatial.data.geonetwork.GeoNetwork;
|
||||||
import org.gcube.spatial.data.geonetwork.GeoNetworkPublisher;
|
import org.gcube.spatial.data.geonetwork.GeoNetworkPublisher;
|
||||||
import org.gcube.spatial.data.geonetwork.LoginLevel;
|
import org.gcube.spatial.data.geonetwork.LoginLevel;
|
||||||
import org.gcube.spatial.data.geonetwork.configuration.Configuration;
|
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;
|
||||||
import org.gcube.spatial.data.geonetwork.model.Account.Type;
|
import org.gcube.spatial.data.geonetwork.model.Account.Type;
|
||||||
import org.gcube.spatial.data.geonetwork.model.faults.AuthorizationException;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Class GeonetworkInstance.
|
* The Class GeonetworkInstance.
|
||||||
*
|
*
|
||||||
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
|
||||||
* May 16, 2017
|
*
|
||||||
|
* May 21, 2019
|
||||||
*/
|
*/
|
||||||
public class GeonetworkInstance {
|
public class GeonetworkInstance {
|
||||||
|
|
||||||
private GeoNetworkPublisher geonetworkPublisher = null;
|
private GeoNetworkPublisher geonetworkPublisher = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates a new geonetwork instance.
|
|
||||||
*/
|
|
||||||
public GeonetworkInstance(){} //FOR SERIALIZATION
|
|
||||||
|
|
||||||
private Logger logger = LoggerFactory.getLogger(GeonetworkInstance.class);
|
private Logger logger = LoggerFactory.getLogger(GeonetworkInstance.class);
|
||||||
private String scope;
|
private String scope;
|
||||||
private Account account;
|
private Account account;
|
||||||
private LoginLevel level;
|
private LoginLevel level;
|
||||||
private Type type;
|
private Type type;
|
||||||
|
private Configuration config;
|
||||||
/**
|
private Version version;
|
||||||
* Instantiates a new geonetwork instance.
|
private String endPoint;
|
||||||
*
|
|
||||||
* @param scope the scope
|
|
||||||
* @throws GeonetworkInstanceException the geonetwork instance exception
|
|
||||||
*/
|
|
||||||
public GeonetworkInstance(String scope) throws GeonetworkInstanceException{
|
|
||||||
this(scope, false, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new geonetwork instance.
|
* Instantiates a new geonetwork instance.
|
||||||
|
@ -67,9 +54,11 @@ public class GeonetworkInstance {
|
||||||
ScopeProvider.instance.set(scope);
|
ScopeProvider.instance.set(scope);
|
||||||
logger.info("setting scope "+scope);
|
logger.info("setting scope "+scope);
|
||||||
createInstanceGeonetworkPublisher(authenticate, level);
|
createInstanceGeonetworkPublisher(authenticate, level);
|
||||||
|
this.config = geonetworkPublisher.getConfiguration();
|
||||||
|
this.version = this.config.getGeoNetworkVersion();
|
||||||
|
this.endPoint = this.config.getGeoNetworkEndpoint();
|
||||||
if(this.type!=null){
|
if(this.type!=null){
|
||||||
Configuration config = geonetworkPublisher.getConfiguration();
|
this.account=config.getScopeConfiguration().getAccounts().get(this.type);
|
||||||
this.account=config.getScopeConfiguration().getAccounts().get(type);
|
|
||||||
}
|
}
|
||||||
//logger.info("Admin: "+config.getAdminAccount().getUser()+", Pwd: "+config.getAdminAccount().getPassword());
|
//logger.info("Admin: "+config.getAdminAccount().getUser()+", Pwd: "+config.getAdminAccount().getPassword());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -140,7 +129,26 @@ public class GeonetworkInstance {
|
||||||
public GeoNetworkPublisher getGeonetworkPublisher() {
|
public GeoNetworkPublisher getGeonetworkPublisher() {
|
||||||
return geonetworkPublisher;
|
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.
|
* Gets the account.
|
||||||
*
|
*
|
||||||
|
@ -150,6 +158,25 @@ public class GeonetworkInstance {
|
||||||
|
|
||||||
return account;
|
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.
|
* Gets the scope.
|
||||||
|
@ -166,12 +193,9 @@ public class GeonetworkInstance {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("GeonetworkInstance [geonetworkPublisher=");
|
builder.append("GeonetworkInstance [geonetworkPublisher=");
|
||||||
builder.append(geonetworkPublisher);
|
builder.append(geonetworkPublisher);
|
||||||
builder.append(", logger=");
|
|
||||||
builder.append(logger);
|
|
||||||
builder.append(", scope=");
|
builder.append(", scope=");
|
||||||
builder.append(scope);
|
builder.append(scope);
|
||||||
builder.append(", account=");
|
builder.append(", account=");
|
||||||
|
@ -180,8 +204,12 @@ public class GeonetworkInstance {
|
||||||
builder.append(level);
|
builder.append(level);
|
||||||
builder.append(", type=");
|
builder.append(", type=");
|
||||||
builder.append(type);
|
builder.append(type);
|
||||||
|
builder.append(", config=");
|
||||||
|
builder.append(config);
|
||||||
builder.append("]");
|
builder.append("]");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*/
|
*/
|
||||||
package org.gcube.datatransfer.resolver.gis;
|
package org.gcube.datatransfer.resolver.gis;
|
||||||
|
|
||||||
|
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.AccountType;
|
||||||
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.GeonetworkLoginLevel;
|
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter.GeonetworkLoginLevel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,20 +18,21 @@ public interface GeonetworkServiceInterface {
|
||||||
*
|
*
|
||||||
* @param authenticate the authenticate
|
* @param authenticate the authenticate
|
||||||
* @param loginLevel the login level
|
* @param loginLevel the login level
|
||||||
|
* @param accType the acc type
|
||||||
* @return the geonetwork instance
|
* @return the geonetwork instance
|
||||||
* @throws Exception the exception
|
* @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
|
// * Gets the geonetwork instance with authenticate = false and LoginLevel = null.
|
||||||
*
|
// *
|
||||||
* @return the geonetwork instance
|
// * @return the geonetwork instance
|
||||||
* @throws Exception the exception
|
// * @throws Exception the exception
|
||||||
*/
|
// */
|
||||||
public GeonetworkInstance getGeonetworkInstance() throws Exception;
|
// public GeonetworkInstance getGeonetworkInstance() throws Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the scope.
|
* Gets the scope.
|
||||||
|
|
|
@ -3,19 +3,12 @@
|
||||||
*/
|
*/
|
||||||
package org.gcube.datatransfer.resolver.gis.geonetwork;
|
package org.gcube.datatransfer.resolver.gis.geonetwork;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.gcube.spatial.data.geonetwork.GeoNetwork;
|
import org.gcube.datatransfer.resolver.caches.LoadingGNPublicLayerIDsInstanceCache;
|
||||||
import org.gcube.spatial.data.geonetwork.GeoNetworkReader;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
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.
|
* The Class FilterGetRecords.
|
||||||
|
@ -32,78 +25,53 @@ public class FilterGetRecords {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(FilterGetRecords.class);
|
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.
|
* Instantiates a new filter get records.
|
||||||
*
|
*
|
||||||
* @param readBody the read body
|
* @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)){
|
if(readBody!=null && !readBody.isEmpty() && readBody.contains(CSW_GET_RECORDS)){
|
||||||
logger.info("Is "+CSW_GET_RECORDS+" request, getting public ids");
|
logger.info("The request is "+CSW_GET_RECORDS+" so getting GN public layer IDs");
|
||||||
GeoNetworkReader reader;
|
loadGNPublicLayers();
|
||||||
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);
|
|
||||||
}
|
|
||||||
}else
|
}else
|
||||||
logger.trace("Is not a"+CSW_GET_RECORDS+" request, skipping");
|
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.
|
* Gets the found public ids.
|
||||||
*
|
*
|
||||||
* @return the foundPublicIds
|
* @return the found public ids
|
||||||
*/
|
*/
|
||||||
public List<String> getFoundPublicIds() {
|
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();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("FilterGetRecords [foundPublicIds=");
|
builder.append("FilterGetRecords [foundPublicIds=");
|
||||||
builder.append(foundPublicIds);
|
builder.append(foundPublicLayerIds);
|
||||||
builder.append("]");
|
builder.append("]");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@ import javax.ws.rs.core.Response;
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
import org.gcube.common.scope.impl.ScopeBean;
|
import org.gcube.common.scope.impl.ScopeBean;
|
||||||
import org.gcube.common.scope.impl.ScopeBean.Type;
|
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.ConstantsResolver;
|
||||||
|
import org.gcube.datatransfer.resolver.caches.LoadingMapOfScopeCache;
|
||||||
import org.gcube.datatransfer.resolver.catalogue.CatalogueRequest;
|
import org.gcube.datatransfer.resolver.catalogue.CatalogueRequest;
|
||||||
import org.gcube.datatransfer.resolver.catalogue.ItemCatalogueURLs;
|
import org.gcube.datatransfer.resolver.catalogue.ItemCatalogueURLs;
|
||||||
import org.gcube.datatransfer.resolver.catalogue.ResourceCatalogueCodes;
|
import org.gcube.datatransfer.resolver.catalogue.ResourceCatalogueCodes;
|
||||||
|
|
|
@ -26,10 +26,10 @@ import javax.ws.rs.core.StreamingOutput;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
import org.gcube.datatransfer.resolver.ConstantsResolver;
|
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.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.FilterGetRecords;
|
||||||
import org.gcube.datatransfer.resolver.gis.geonetwork.GNAuthentication;
|
import org.gcube.datatransfer.resolver.gis.geonetwork.GNAuthentication;
|
||||||
import org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkRequestFilterParameters.MODE;
|
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.ScopeUtil;
|
||||||
import org.gcube.datatransfer.resolver.util.SingleFileStreamingOutput;
|
import org.gcube.datatransfer.resolver.util.SingleFileStreamingOutput;
|
||||||
import org.gcube.spatial.data.geonetwork.configuration.Configuration;
|
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;
|
||||||
import org.gcube.spatial.data.geonetwork.model.Account.Type;
|
import org.gcube.spatial.data.geonetwork.model.Account.Type;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -85,7 +86,7 @@ public class GeonetworkResolver {
|
||||||
|
|
||||||
public static final String SCOPE_SEPARATOR = "|";
|
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";
|
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
|
* OWNER (is optional): filter by owner
|
||||||
*
|
*
|
||||||
* @param req the req
|
* @param req the req
|
||||||
* @param mode the mode
|
|
||||||
* @param scope the scope
|
* @param scope the scope
|
||||||
|
* @param mode the mode
|
||||||
* @param visibility the visibility
|
* @param visibility the visibility
|
||||||
* @param owner the owner - pass 'null' as string if no filter applied
|
* @param filterKey the filter key
|
||||||
* @param requestDelimiter the request delimiter
|
* @param filterValue the filter value
|
||||||
|
* @param remainPath the remain path
|
||||||
* @param resetCache the reset cache
|
* @param resetCache the reset cache
|
||||||
* @param resetScope the reset scope
|
* @param resetScope the reset scope
|
||||||
* @return the geonetwork request criteria
|
* @return the geonetwork request criteria
|
||||||
|
* @throws WebApplicationException the web application exception
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@ -162,28 +165,62 @@ public class GeonetworkResolver {
|
||||||
throw ExceptionManager.wrongParameterException(req, "The 'visibility' parameter must be value of "+toPrint, this.getClass(), helpURI);
|
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);
|
logger.info("Remaining path is: "+remainPath);
|
||||||
try {
|
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);
|
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();
|
HTTPCallsUtils httpUtils = new HTTPCallsUtils();
|
||||||
Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
|
// Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
|
||||||
String geonetworkUrl = config.getGeoNetworkEndpoint();
|
// String geonetworkUrl = config.getGeoNetworkEndpoint();
|
||||||
String baseURL = remainPath==null ||remainPath.isEmpty()?geonetworkUrl+"/"+CSW_SERVER:geonetworkUrl+"/"+CSW_SERVER+remainPath;
|
String baseURL = remainPath==null ||remainPath.isEmpty()?geonetworkUrl+"/"+CSW_SERVER:geonetworkUrl+"/"+CSW_SERVER+remainPath;
|
||||||
logger.info("The base URL is: "+baseURL);
|
logger.info("The base URL is: "+baseURL);
|
||||||
String queryString = req.getQueryString()==null || req.getQueryString().isEmpty()?"":"?"+req.getQueryString();
|
String queryString = req.getQueryString()==null || req.getQueryString().isEmpty()?"":"?"+req.getQueryString();
|
||||||
gnGetlURL = baseURL+queryString;
|
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);
|
logger.info("Sending get request to URL: "+gnGetlURL);
|
||||||
HttpResponse proxedGNResponse = httpUtils.get(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
|
@POST
|
||||||
@Path("/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}")
|
@Path("/{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}")
|
||||||
public Response submitPost(@Context HttpServletRequest req,
|
public Response submitPost(@Context HttpServletRequest req,
|
||||||
|
@ -294,14 +346,34 @@ public class GeonetworkResolver {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter(scope);
|
//MANUALLY INSTANCING THE GEONETWORK TO MANGE LOGIN IF NEEDED AND SO ON..
|
||||||
GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance();
|
//DO NOT USE THE LOADING_CACHE OF GEONETWORK
|
||||||
|
// GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter(scope);
|
||||||
ScopeProvider.instance.set(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);
|
logger.info("set scope provider "+scope);
|
||||||
Configuration config = gnInstance.getGeonetworkPublisher().getConfiguration();
|
ScopeProvider.instance.set(scope);
|
||||||
Account account = config.getScopeConfiguration().getAccounts().get(Type.CKAN);
|
GeonetworkInstance gnInstance = getGeonetworkInstanceForScope(scope, GeonetworkLoginLevel.CKAN, AccountType.CKAN);
|
||||||
logger.info("CKAN user owner is: "+account.getUser());
|
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..");
|
// logger.info("Parameters..");
|
||||||
// for (Enumeration<String> e = req.getParameterNames(); e.hasMoreElements();){
|
// for (Enumeration<String> e = req.getParameterNames(); e.hasMoreElements();){
|
||||||
|
@ -314,7 +386,6 @@ public class GeonetworkResolver {
|
||||||
// logger.debug("doPost read body request: "+readBody);
|
// logger.debug("doPost read body request: "+readBody);
|
||||||
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
|
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
|
||||||
|
|
||||||
String geonetworkUrl = config.getGeoNetworkEndpoint();
|
|
||||||
|
|
||||||
// SPECIFIC HANDLER FOR GEONETWORK REQUEST: /srv/en/mef.export
|
// SPECIFIC HANDLER FOR GEONETWORK REQUEST: /srv/en/mef.export
|
||||||
if(remainPath!=null && remainPath.compareTo(SRV_EN_MEF_EXPORT)==0){
|
if(remainPath!=null && remainPath.compareTo(SRV_EN_MEF_EXPORT)==0){
|
||||||
|
@ -345,7 +416,7 @@ public class GeonetworkResolver {
|
||||||
if(visibility.equals(VISIBILITY.PRV.name())){
|
if(visibility.equals(VISIBILITY.PRV.name())){
|
||||||
logger.info("Visibility: "+VISIBILITY.PRV+" getting private layers..");
|
logger.info("Visibility: "+VISIBILITY.PRV+" getting private layers..");
|
||||||
//VRE LAYERS
|
//VRE LAYERS
|
||||||
if(mode.equals(MODE.VRE)){
|
if(mode.equals(MODE.VRE.name())){
|
||||||
logger.info("Getting "+MODE.VRE+" layers..");
|
logger.info("Getting "+MODE.VRE+" layers..");
|
||||||
//HARVESTED LAYERS
|
//HARVESTED LAYERS
|
||||||
}else{
|
}else{
|
||||||
|
@ -354,10 +425,21 @@ public class GeonetworkResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(account.getUser()!=null){
|
if(account.getUser()!=null){
|
||||||
boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account. getPassword());
|
switch (version) {
|
||||||
logger.info("Authorized on "+geonetworkUrl +" ? "+authorized);
|
case DUE:
|
||||||
}else
|
boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account.getPassword());
|
||||||
logger.info("Skipping authentication, ckan user (the owner) is null");
|
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
|
//PUBLIC LAYERS
|
||||||
}else{
|
}else{
|
||||||
|
@ -391,7 +473,7 @@ public class GeonetworkResolver {
|
||||||
|
|
||||||
if(visibility.equals(VISIBILITY.PRV.name())){
|
if(visibility.equals(VISIBILITY.PRV.name())){
|
||||||
logger.info("Private VISIBILITY requested, retrieving public file identifiers to apply filtering..");
|
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){
|
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?");
|
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);
|
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.
|
* Gets the geonetwork instance for scope.
|
||||||
*
|
*
|
||||||
* @param scope the scope
|
* @param scope the scope
|
||||||
|
* @param loginLevel the login level
|
||||||
|
* @param accountType the account type
|
||||||
* @return the geonetwork instance for scope
|
* @return the geonetwork instance for scope
|
||||||
* @throws Exception the exception
|
* @throws Exception the exception
|
||||||
*/
|
*/
|
||||||
protected GeonetworkInstance getGeonetworkInstanceForScope(String scope) throws Exception{
|
protected GeonetworkInstance getGeonetworkInstanceForScope(String scope, GeonetworkLoginLevel loginLevel, AccountType accountType) 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);
|
|
||||||
|
|
||||||
|
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;
|
return geoInstance;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,8 +13,10 @@ import java.io.UnsupportedEncodingException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
@ -125,13 +127,14 @@ public class GetResponseRecordFilter {
|
||||||
* @param doc the doc
|
* @param doc the doc
|
||||||
* @param identifier the identifier
|
* @param identifier the identifier
|
||||||
* @param messageToReplace the message to replace
|
* @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
|
// <csw:SummaryRecord> list
|
||||||
NodeList nodes = doc.getElementsByTagName("gmd:MD_Metadata");
|
NodeList nodes = doc.getElementsByTagName("gmd:MD_Metadata");
|
||||||
logger.trace("gmd:MD_Metadata are: " + nodes.getLength());
|
logger.trace("gmd:MD_Metadata are: " + nodes.getLength());
|
||||||
|
|
||||||
for (int i = 0; i < nodes.getLength(); i++) {
|
for (int i = 0; i < nodes.getLength(); i++) {
|
||||||
Element mdMetadata = (Element) nodes.item(i);
|
Element mdMetadata = (Element) nodes.item(i);
|
||||||
|
|
||||||
|
@ -152,14 +155,22 @@ public class GetResponseRecordFilter {
|
||||||
|
|
||||||
Element gco = (Element) gcoLst.item(0);
|
Element gco = (Element) gcoLst.item(0);
|
||||||
String idValue = gco.getTextContent();
|
String idValue = gco.getTextContent();
|
||||||
|
|
||||||
|
if(overridingRecordsMap.get(idValue)==null) {
|
||||||
|
overridingRecordsMap.put(idValue, false);
|
||||||
|
}
|
||||||
|
|
||||||
logger.trace("Summary gmd:fileIdentifier is: " + idValue);
|
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;
|
String msg = messageToReplace==null?MESSAGE_TO_REPLACED_ID:messageToReplace;
|
||||||
gco.setTextContent(msg);
|
gco.setTextContent(msg);
|
||||||
logger.debug("Overrided child " + idValue);
|
logger.debug("Overrided child " + idValue);
|
||||||
|
overridingRecordsMap.put(idValue, true);
|
||||||
|
//logger.debug("Returning Record IDs: "+toPrintIds.keySet());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//logger.debug("Returning Record IDs: "+toPrintIds.keySet());
|
||||||
return false;
|
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.
|
* Override response ids by list ids.
|
||||||
*
|
*
|
||||||
|
@ -202,36 +277,63 @@ public class GetResponseRecordFilter {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Document doc = inputStreamToW3CDocument(getRecordsResponse);
|
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) {
|
for (String identifier : idsToRemove) {
|
||||||
if(overrideSummaryRecord(doc, identifier, messageToWrite))
|
|
||||||
override++;
|
//FOR EACH gmd:fileIdentifier RETURNED IN THE GET_RECORDS RESPONSE
|
||||||
}
|
//CHECKING IF IT IS A PUBLIC ID
|
||||||
logger.info("Overrided "+override +" node/s");
|
for (int i = 0; i < nodes.getLength(); i++) {
|
||||||
|
Element mdMetadata = (Element) nodes.item(i);
|
||||||
|
|
||||||
//TODO IS IT POSSIBLE TO REMOVE?
|
// <dc:identifier>
|
||||||
/*NodeList nodeList = doc.getElementsByTagName("csw:SearchResults");
|
NodeList fileIdentifierLst = mdMetadata.getElementsByTagName("gmd:fileIdentifier");
|
||||||
if(nodeList!=null && nodeList.item(0)!=null){
|
if(fileIdentifierLst==null || fileIdentifierLst.getLength()==0 || fileIdentifierLst.item(0)==null){
|
||||||
Node nd = nodeList.item(0);
|
logger.info("skipping identifier: " + identifier +" it has not fileidentifier");
|
||||||
// update staff attribute
|
break;
|
||||||
NamedNodeMap attr = nd.getAttributes();
|
}
|
||||||
Node numberOfRecordsMatched = attr.getNamedItem("numberOfRecordsMatched");
|
|
||||||
Node numberOfRecordsReturned = attr.getNamedItem("numberOfRecordsReturned");
|
Element id = (Element) fileIdentifierLst.item(0);
|
||||||
logger.trace("Old numberOfRecordsMatched: "+numberOfRecordsMatched.getTextContent());
|
|
||||||
logger.trace("Old numberOfRecordsReturned: "+numberOfRecordsReturned.getTextContent());
|
NodeList gcoLst = id.getElementsByTagName("gco:CharacterString");
|
||||||
try{
|
if(gcoLst==null || gcoLst.getLength()==0 || gcoLst.item(0)==null){
|
||||||
int oldValueM = Integer.parseInt(numberOfRecordsMatched.getTextContent());
|
logger.debug("skipping identifier: " + identifier +" it has not gco:CharacterString");
|
||||||
int oldValueR = Integer.parseInt(numberOfRecordsReturned.getTextContent());
|
break;
|
||||||
int newValueM = oldValueM-removed;
|
}
|
||||||
int newValueR = oldValueR-removed;
|
|
||||||
logger.trace("Updating numberOfRecordsMatched at: "+newValueM);
|
Element gco = (Element) gcoLst.item(0);
|
||||||
logger.trace("Updating numberOfRecordsReturned at: "+newValueR);
|
String idValue = gco.getTextContent();
|
||||||
numberOfRecordsMatched.setTextContent(newValueM+"");
|
|
||||||
numberOfRecordsReturned.setTextContent(newValueR+"");
|
if(overridingRecordsMap.get(idValue)==null && idValue.compareTo(messageToWrite)!=0) {
|
||||||
}catch (Exception e) {
|
overridingRecordsMap.put(idValue, false);
|
||||||
logger.warn("An error occurred during attribe numberOfRecordsMatched updating, skipping operation");
|
}
|
||||||
|
|
||||||
|
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);
|
return w3CDocumentToInputStream(doc);
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
|
|
Loading…
Reference in New Issue