2022-02-16 22:34:30 +01:00
package org.gcube.gcat.configuration ;
2022-02-15 09:59:02 +01:00
2023-06-23 17:25:20 +02:00
import java.util.ArrayList ;
2022-02-15 09:59:02 +01:00
import java.util.HashMap ;
2023-06-23 17:25:20 +02:00
import java.util.List ;
2022-02-15 09:59:02 +01:00
import java.util.Map ;
2023-06-23 17:25:20 +02:00
import org.gcube.common.authorization.utils.manager.SecretManager ;
2022-02-28 15:43:40 +01:00
import org.gcube.common.authorization.utils.manager.SecretManagerProvider ;
2023-06-23 17:25:20 +02:00
import org.gcube.common.authorization.utils.secret.Secret ;
import org.gcube.gcat.configuration.isproxies.ISConfigurationProxy ;
import org.gcube.gcat.configuration.isproxies.ISConfigurationProxyFactory ;
import org.gcube.gcat.configuration.isproxies.impl.FacetBasedISConfigurationProxyFactory ;
import org.gcube.gcat.configuration.isproxies.impl.GCoreISConfigurationProxyFactory ;
2022-11-29 14:42:20 +01:00
import org.gcube.gcat.configuration.service.ServiceCatalogueConfiguration ;
2022-04-21 17:18:02 +02:00
import org.gcube.gcat.persistence.ckan.CKANUserCache ;
2023-06-23 17:25:20 +02:00
import org.gcube.gcat.utils.Constants ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2022-02-15 09:59:02 +01:00
/ * *
* @author Luca Frosini ( ISTI - CNR )
* /
public class CatalogueConfigurationFactory {
2023-06-23 17:25:20 +02:00
private static final Logger logger = LoggerFactory . getLogger ( CatalogueConfigurationFactory . class ) ;
2022-02-17 16:32:54 +01:00
private static final Map < String , ServiceCatalogueConfiguration > catalogueConfigurations ;
2022-02-15 09:59:02 +01:00
2023-06-23 17:25:20 +02:00
private static List < ISConfigurationProxyFactory < ? > > factories ;
2022-02-15 09:59:02 +01:00
static {
catalogueConfigurations = new HashMap < > ( ) ;
2023-06-23 17:25:20 +02:00
factories = new ArrayList < > ( ) ;
}
private static List < ISConfigurationProxyFactory < ? > > getFactories ( ) {
if ( factories . size ( ) = = 0 ) {
factories . add ( new FacetBasedISConfigurationProxyFactory ( ) ) ;
factories . add ( new GCoreISConfigurationProxyFactory ( ) ) ;
}
return factories ;
}
public static void addISConfigurationProxyFactory ( ISConfigurationProxyFactory < ? > icpf ) {
factories . add ( icpf ) ;
2022-02-15 09:59:02 +01:00
}
2022-11-29 15:03:35 +01:00
private static ServiceCatalogueConfiguration load ( String context ) {
2022-12-07 09:36:19 +01:00
ServiceCatalogueConfiguration serviceCatalogueConfiguration = null ;
2023-06-23 17:25:20 +02:00
SecretManager secretManager = SecretManagerProvider . instance . get ( ) ;
2022-12-07 09:36:19 +01:00
try {
2023-06-23 17:25:20 +02:00
Secret secret = Constants . getCatalogueSecret ( ) ;
secretManager . startSession ( secret ) ;
for ( ISConfigurationProxyFactory < ? > icpf : getFactories ( ) ) {
try {
ISConfigurationProxy < ? > icp = icpf . getInstance ( context ) ;
serviceCatalogueConfiguration = icp . getCatalogueConfiguration ( ) ;
logger . trace ( " The configuration has been read using {}. " , icp . getClass ( ) . getSimpleName ( ) ) ;
} catch ( Exception e ) {
logger . warn ( " {} cannot be used to read {}. Reason is {} " , icpf . getClass ( ) . getSimpleName ( ) , ServiceCatalogueConfiguration . class . getSimpleName ( ) , e . getMessage ( ) ) ;
}
}
} catch ( Exception e ) {
logger . error ( " Unable to start session. Reason is " + e . getMessage ( ) ) ;
} finally {
secretManager . endSession ( ) ;
}
if ( serviceCatalogueConfiguration = = null ) {
throw new RuntimeException ( " Unable to load " + ServiceCatalogueConfiguration . class . getSimpleName ( ) + " by using configured " + ISConfigurationProxyFactory . class . getSimpleName ( ) + " i.e. " + getFactories ( ) ) ;
2022-11-29 15:03:35 +01:00
}
return serviceCatalogueConfiguration ;
}
private static void purgeFromIS ( String context ) {
2023-06-23 17:25:20 +02:00
SecretManager secretManager = SecretManagerProvider . instance . get ( ) ;
try {
Secret secret = Constants . getCatalogueSecret ( ) ;
secretManager . startSession ( secret ) ;
for ( ISConfigurationProxyFactory < ? > icpf : getFactories ( ) ) {
ISConfigurationProxy < ? > icp = icpf . getInstance ( context ) ;
icp . delete ( ) ;
}
} catch ( Exception e ) {
logger . error ( " Unable to start session. Reason is " + e . getMessage ( ) ) ;
} finally {
secretManager . endSession ( ) ;
}
2022-11-29 15:03:35 +01:00
}
private static void createOrUpdateOnIS ( String context , ServiceCatalogueConfiguration catalogueConfiguration ) throws Exception {
2023-06-23 17:25:20 +02:00
SecretManager secretManager = SecretManagerProvider . instance . get ( ) ;
try {
Secret secret = Constants . getCatalogueSecret ( ) ;
secretManager . startSession ( secret ) ;
for ( ISConfigurationProxyFactory < ? > icpf : getFactories ( ) ) {
ISConfigurationProxy < ? > icp = icpf . getInstance ( context ) ;
icp . setCatalogueConfiguration ( catalogueConfiguration ) ;
icp . createOrUpdateOnIS ( ) ;
}
} finally {
secretManager . endSession ( ) ;
}
2022-02-15 09:59:02 +01:00
}
2022-02-17 16:32:54 +01:00
public synchronized static ServiceCatalogueConfiguration getInstance ( ) {
2022-02-28 15:43:40 +01:00
String context = SecretManagerProvider . instance . get ( ) . getContext ( ) ;
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = catalogueConfigurations . get ( context ) ;
2022-02-15 09:59:02 +01:00
if ( catalogueConfiguration = = null ) {
catalogueConfiguration = load ( context ) ;
catalogueConfigurations . put ( context , catalogueConfiguration ) ;
}
return catalogueConfiguration ;
}
public synchronized static void renew ( ) {
2022-02-28 15:43:40 +01:00
String context = SecretManagerProvider . instance . get ( ) . getContext ( ) ;
2022-02-15 09:59:02 +01:00
catalogueConfigurations . remove ( context ) ;
2022-02-17 16:32:54 +01:00
ServiceCatalogueConfiguration catalogueConfiguration = load ( context ) ;
2022-02-15 09:59:02 +01:00
catalogueConfigurations . put ( context , catalogueConfiguration ) ;
}
public synchronized static void purge ( ) {
// Remove the resource from IS
2022-02-28 15:43:40 +01:00
String context = SecretManagerProvider . instance . get ( ) . getContext ( ) ;
2022-02-15 09:59:02 +01:00
catalogueConfigurations . remove ( context ) ;
2022-11-29 15:03:35 +01:00
purgeFromIS ( context ) ;
2022-02-15 09:59:02 +01:00
}
2022-02-17 16:32:54 +01:00
public synchronized static ServiceCatalogueConfiguration createOrUpdate ( ServiceCatalogueConfiguration catalogueConfiguration ) throws Exception {
2022-02-28 15:43:40 +01:00
String context = SecretManagerProvider . instance . get ( ) . getContext ( ) ;
2022-02-15 09:59:02 +01:00
catalogueConfigurations . remove ( context ) ;
2022-11-29 12:33:42 +01:00
2022-11-29 15:03:35 +01:00
createOrUpdateOnIS ( context , catalogueConfiguration ) ;
2022-02-15 09:59:02 +01:00
catalogueConfigurations . put ( context , catalogueConfiguration ) ;
2022-04-21 17:18:02 +02:00
// The supported organizations could be changed we need to empty the user cache for the context
// to avoid to miss to add an user in an organization which has been added.
2022-05-27 17:25:36 +02:00
CKANUserCache . emptyUserCache ( ) ;
2022-04-21 17:18:02 +02:00
2022-02-15 09:59:02 +01:00
return catalogueConfiguration ;
}
}