diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/ImplementationProvider.java b/src/main/java/org/gcube/application/geoportal/service/engine/ImplementationProvider.java index 404d700..eb6f22a 100644 --- a/src/main/java/org/gcube/application/geoportal/service/engine/ImplementationProvider.java +++ b/src/main/java/org/gcube/application/geoportal/service/engine/ImplementationProvider.java @@ -1,6 +1,7 @@ package org.gcube.application.geoportal.service.engine; import org.gcube.application.geoportal.managers.AbstractRecordManager; +import org.gcube.application.geoportal.managers.EMFProvider; import org.gcube.application.geoportal.service.engine.cache.MongoClientProvider; import org.gcube.application.geoportal.service.engine.cache.MongoConnectionProvider; @@ -34,6 +35,12 @@ public class ImplementationProvider { @Setter private StorageClientProvider storageProvider=new StorageClientProvider(); + + @Getter + @Setter + private EMFProvider emfProvider=new ScopedEMFProvider(); + + public void shutdown() { // Stop JPA AbstractRecordManager.shutdown(); @@ -42,6 +49,7 @@ public class ImplementationProvider { } public void startup() { + AbstractRecordManager.setDefaultProvider(emfProvider); mongoConnectionProvider.init(); mongoClientProvider.init(); } diff --git a/src/main/java/org/gcube/application/geoportal/service/engine/ScopedEMFProvider.java b/src/main/java/org/gcube/application/geoportal/service/engine/ScopedEMFProvider.java new file mode 100644 index 0000000..6f96010 --- /dev/null +++ b/src/main/java/org/gcube/application/geoportal/service/engine/ScopedEMFProvider.java @@ -0,0 +1,205 @@ +package org.gcube.application.geoportal.service.engine; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Properties; + +import javax.persistence.EntityManagerFactory; +import javax.persistence.SharedCacheMode; +import javax.persistence.ValidationMode; +import javax.persistence.spi.ClassTransformer; +import javax.persistence.spi.PersistenceUnitInfo; +import javax.persistence.spi.PersistenceUnitTransactionType; +import javax.sql.DataSource; + +import org.gcube.application.geoportal.managers.EMFProvider; +import org.gcube.application.geoportal.model.db.DatabaseConnection; +import org.gcube.application.geoportal.model.fault.ConfigurationException; +import org.gcube.application.geoportal.utils.ISUtils; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.jpa.HibernatePersistenceProvider; + +import jersey.repackaged.com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ScopedEMFProvider extends AbstractScopedMap implements EMFProvider { + + public ScopedEMFProvider() { + super("EMF Cache"); +// setTTL(Duration.of(10, ChronoUnit.MINUTES)); + } + + @Override + protected void dispose(EntityManagerFactory toDispose) { + if(toDispose!=null) { + if(toDispose.isOpen()) toDispose.close(); + toDispose=null; + } + } + + @Override + public EntityManagerFactory getFactory() { + try { + return getObject(); + } catch (ConfigurationException e) { + throw new RuntimeException("Unable to get Factory ",e); + } + } + @Override + public void init() { + + } + + @Override + protected EntityManagerFactory retrieveObject() throws ConfigurationException { + DatabaseConnection conn=ISUtils.queryForDB("postgresql", "internal-db"); + log.debug("Found Internal Database : "+conn); + + return new HibernatePersistenceProvider().createContainerEntityManagerFactory( + archiverPersistenceUnitInfo(), + ImmutableMap.builder() + .put(AvailableSettings.JPA_JDBC_DRIVER, "org.postgresql.Driver") + .put(AvailableSettings.JPA_JDBC_URL, conn.getUrl()) + .put(AvailableSettings.DIALECT, org.hibernate.dialect.PostgreSQLDialect.class) + .put(AvailableSettings.HBM2DDL_AUTO, org.hibernate.tool.schema.Action.UPDATE) + .put(AvailableSettings.SHOW_SQL, true) + .put(AvailableSettings.QUERY_STARTUP_CHECKING, false) + .put(AvailableSettings.GENERATE_STATISTICS, false) + .put(AvailableSettings.USE_REFLECTION_OPTIMIZER, false) + .put(AvailableSettings.USE_SECOND_LEVEL_CACHE, false) + .put(AvailableSettings.USE_QUERY_CACHE, false) + .put(AvailableSettings.USE_STRUCTURED_CACHE, false) + .put(AvailableSettings.STATEMENT_BATCH_SIZE, 20) + .put(AvailableSettings.JPA_JDBC_USER, conn.getUser()) + .put(AvailableSettings.JPA_JDBC_PASSWORD, conn.getPwd()) + .build()); + } + + + @Override + public void shutdown() { + super.shustdown(); + } + + + + ///** * + + private static PersistenceUnitInfo archiverPersistenceUnitInfo() { + + final List MANAGED_CLASSES=Arrays.asList(new String[] { + "org.gcube.application.geoportal.model.Record", + "org.gcube.application.geoportal.model.concessioni.Concessione", + "org.gcube.application.geoportal.model.concessioni.LayerConcessione", + "org.gcube.application.geoportal.model.concessioni.RelazioneScavo", + + "org.gcube.application.geoportal.model.content.AssociatedContent", + "org.gcube.application.geoportal.model.content.GeoServerContent", + "org.gcube.application.geoportal.model.content.OtherContent", + "org.gcube.application.geoportal.model.content.PersistedContent", + "org.gcube.application.geoportal.model.content.UploadedImage", + "org.gcube.application.geoportal.model.content.WorkspaceContent", + + "org.gcube.application.geoportal.model.gis.ShapeFileLayerDescriptor", + "org.gcube.application.geoportal.model.gis.SDILayerDescriptor"}); + + + return new PersistenceUnitInfo() { + @Override + public String getPersistenceUnitName() { + return "ApplicationPersistenceUnit"; + } + + @Override + public String getPersistenceProviderClassName() { + return "org.hibernate.jpa.HibernatePersistenceProvider"; + } + + @Override + public PersistenceUnitTransactionType getTransactionType() { + return PersistenceUnitTransactionType.RESOURCE_LOCAL; + } + + @Override + public DataSource getJtaDataSource() { + return null; + } + + @Override + public DataSource getNonJtaDataSource() { + return null; + } + + @Override + public List getMappingFileNames() { + return Collections.emptyList(); + } + + @Override + public List getJarFileUrls() { + try { + return Collections.list(this.getClass() + .getClassLoader() + .getResources("")); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public URL getPersistenceUnitRootUrl() { + return null; + } + + @Override + public List getManagedClassNames() { + return MANAGED_CLASSES; + } + + @Override + public boolean excludeUnlistedClasses() { + return true; + } + + @Override + public SharedCacheMode getSharedCacheMode() { + return null; + } + + @Override + public ValidationMode getValidationMode() { + return null; + } + + @Override + public Properties getProperties() { + return new Properties(); + } + + @Override + public String getPersistenceXMLSchemaVersion() { + return null; + } + + @Override + public ClassLoader getClassLoader() { + return null; + } + + @Override + public void addTransformer(ClassTransformer transformer) { + + } + + @Override + public ClassLoader getNewTempClassLoader() { + return null; + } + }; + } +} diff --git a/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java b/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java index fa4ddbc..735afcd 100644 --- a/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java +++ b/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java @@ -17,8 +17,6 @@ import javax.ws.rs.core.Response; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.Files; -import org.gcube.application.geoportal.managers.AbstractRecordManager; -import org.gcube.application.geoportal.managers.DefatulEMFProvider; import org.gcube.application.geoportal.model.concessioni.Concessione; import org.gcube.application.geoportal.model.concessioni.LayerConcessione; import org.gcube.application.geoportal.model.content.AssociatedContent; @@ -28,6 +26,7 @@ import org.gcube.application.geoportal.model.report.PublicationReport; import org.gcube.application.geoportal.model.report.ValidationReport.ValidationStatus; import org.gcube.application.geoportal.service.GeoPortalService; import org.gcube.application.geoportal.service.engine.ImplementationProvider; +import org.gcube.application.geoportal.service.engine.ScopedEMFProvider; import org.gcube.application.geoportal.service.engine.StorageClientProvider; import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest; import org.gcube.application.geoportal.service.model.internal.rest.AddSectionToConcessioneRequest.SHUBFileDescriptor; @@ -55,8 +54,8 @@ public class ConcessioniTest extends JerseyTest { @BeforeClass public static void init() { - String scope="/gcube/devNext/NextNext"; - AbstractRecordManager.setDefaultProvider(new DefatulEMFProvider(){ + String scope="/gcube/devsec/devVRE"; + ImplementationProvider.get().setEmfProvider(new ScopedEMFProvider(){ @Override public EntityManagerFactory getFactory() {