JPA classes manually managed

This commit is contained in:
Fabio Sinibaldi 2020-10-26 12:12:43 +01:00
parent 89ff09e630
commit 14ac05ea6c
1 changed files with 136 additions and 117 deletions

View File

@ -5,6 +5,7 @@ import java.io.UncheckedIOException;
import java.net.URL; import java.net.URL;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -43,7 +44,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public abstract class AbstractRecordManager<T extends Record> { public abstract class AbstractRecordManager<T extends Record> {
private static EntityManagerFactory emf=null; private static EntityManagerFactory emf=null;
@Synchronized @Synchronized
@ -52,38 +53,38 @@ public abstract class AbstractRecordManager<T extends Record> {
try { try {
DatabaseConnection conn=ISUtils.queryForDB("postgresql", "internal-db"); DatabaseConnection conn=ISUtils.queryForDB("postgresql", "internal-db");
log.debug("Found Internal Database : "+conn); log.debug("Found Internal Database : "+conn);
emf = new HibernatePersistenceProvider().createContainerEntityManagerFactory( emf = new HibernatePersistenceProvider().createContainerEntityManagerFactory(
archiverPersistenceUnitInfo(), archiverPersistenceUnitInfo(),
ImmutableMap.<String, Object>builder() ImmutableMap.<String, Object>builder()
.put(AvailableSettings.JPA_JDBC_DRIVER, "org.postgresql.Driver") .put(AvailableSettings.JPA_JDBC_DRIVER, "org.postgresql.Driver")
.put(AvailableSettings.JPA_JDBC_URL, conn.getUrl()) .put(AvailableSettings.JPA_JDBC_URL, conn.getUrl())
.put(AvailableSettings.DIALECT, org.hibernate.dialect.PostgreSQLDialect.class) .put(AvailableSettings.DIALECT, org.hibernate.dialect.PostgreSQLDialect.class)
.put(AvailableSettings.HBM2DDL_AUTO, org.hibernate.tool.schema.Action.UPDATE) .put(AvailableSettings.HBM2DDL_AUTO, org.hibernate.tool.schema.Action.UPDATE)
.put(AvailableSettings.SHOW_SQL, true) .put(AvailableSettings.SHOW_SQL, true)
.put(AvailableSettings.QUERY_STARTUP_CHECKING, false) .put(AvailableSettings.QUERY_STARTUP_CHECKING, false)
.put(AvailableSettings.GENERATE_STATISTICS, false) .put(AvailableSettings.GENERATE_STATISTICS, false)
.put(AvailableSettings.USE_REFLECTION_OPTIMIZER, false) .put(AvailableSettings.USE_REFLECTION_OPTIMIZER, false)
.put(AvailableSettings.USE_SECOND_LEVEL_CACHE, false) .put(AvailableSettings.USE_SECOND_LEVEL_CACHE, false)
.put(AvailableSettings.USE_QUERY_CACHE, false) .put(AvailableSettings.USE_QUERY_CACHE, false)
.put(AvailableSettings.USE_STRUCTURED_CACHE, false) .put(AvailableSettings.USE_STRUCTURED_CACHE, false)
.put(AvailableSettings.STATEMENT_BATCH_SIZE, 20) .put(AvailableSettings.STATEMENT_BATCH_SIZE, 20)
.put(AvailableSettings.JPA_JDBC_USER, conn.getUser()) .put(AvailableSettings.JPA_JDBC_USER, conn.getUser())
.put(AvailableSettings.JPA_JDBC_PASSWORD, conn.getPwd()) .put(AvailableSettings.JPA_JDBC_PASSWORD, conn.getPwd())
.build()); .build());
}catch(Throwable t) { }catch(Throwable t) {
log.warn("Unable to contact DB from IS, trying local..",t); log.warn("Unable to contact DB from IS, trying local..",t);
try{ try{
emf=Persistence.createEntityManagerFactory(DBConstants.INTERNAL.DB_NAME); emf=Persistence.createEntityManagerFactory(DBConstants.INTERNAL.DB_NAME);
}catch(Throwable t1) { }catch(Throwable t1) {
log.error("NO INTERNAL DATABASE FOUND ",t); log.error("NO INTERNAL DATABASE FOUND ",t);
throw new RuntimeException("NO INTERNAL DATABASE",t); throw new RuntimeException("NO INTERNAL DATABASE",t);
}
} }
}
} }
return emf; return emf;
} }
public static void shutdown() { public static void shutdown() {
getEMF().close(); getEMF().close();
} }
@ -106,10 +107,10 @@ public abstract class AbstractRecordManager<T extends Record> {
} }
//Transaction management //Transaction management
EntityTransaction transaction=null; EntityTransaction transaction=null;
EntityManager entityManager=null; EntityManager entityManager=null;
//************************ INSTANCE //************************ INSTANCE
private T theRecord; private T theRecord;
@ -122,7 +123,7 @@ public abstract class AbstractRecordManager<T extends Record> {
transaction.begin(); transaction.begin();
this.theRecord=theRecord; this.theRecord=theRecord;
storeInfo(); storeInfo();
this.contentHandler=new ContentHandler(theRecord); this.contentHandler=new ContentHandler(theRecord);
} }
@ -147,24 +148,24 @@ public abstract class AbstractRecordManager<T extends Record> {
log.trace("Committing record "+theRecord+" Publish is "+publish); log.trace("Committing record "+theRecord+" Publish is "+publish);
if (publish) validate(); if (publish) validate();
// storeInfo(); // storeInfo();
log.debug("Record is valid, storing changed content"); log.debug("Record is valid, storing changed content");
contentHandler.storeChanges(publish); contentHandler.storeChanges(publish);
// storeInfo(); // storeInfo();
if(publish) { if(publish) {
log.debug("Registering centroid of "+theRecord); log.debug("Registering centroid of "+theRecord);
registerCentroid(); registerCentroid();
// storeInfo(); // storeInfo();
} }
transaction.commit(); transaction.commit();
return theRecord; return theRecord;
} }
@Override @Override
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
entityManager.close(); entityManager.close();
@ -184,11 +185,11 @@ public abstract class AbstractRecordManager<T extends Record> {
log.debug("Inserting / updated centroid Row {} ",centroidRow); log.debug("Inserting / updated centroid Row {} ",centroidRow);
PreparedStatement ps = db.prepareInsertStatement(centroidsTable, true, true); PreparedStatement ps = db.prepareInsertStatement(centroidsTable, true, true);
log.debug("Deleting centroid if present. ID is "+theRecord.getId()); log.debug("Deleting centroid if present. ID is "+theRecord.getId());
db.deleteByFieldValue(centroidsTable, new Field(DBConstants.Concessioni.ID,FieldType.TEXT), theRecord.getId()+""); db.deleteByFieldValue(centroidsTable, new Field(DBConstants.Concessioni.ID,FieldType.TEXT), theRecord.getId()+"");
centroidsTable.fillCSVPreparedStatament(centroidRow, ps, false); centroidsTable.fillCSVPreparedStatament(centroidRow, ps, false);
ps.executeUpdate(); ps.executeUpdate();
db.commit(); db.commit();
@ -198,8 +199,8 @@ public abstract class AbstractRecordManager<T extends Record> {
// //
} }
protected abstract Map<String,String> evaluateCentroid(); protected abstract Map<String,String> evaluateCentroid();
protected void publish() { protected void publish() {
//TODO //TODO
@ -214,99 +215,117 @@ public abstract class AbstractRecordManager<T extends Record> {
//*********** PERSISTENCE //*********** PERSISTENCE
private static PersistenceUnitInfo archiverPersistenceUnitInfo() { private static PersistenceUnitInfo archiverPersistenceUnitInfo() {
return new PersistenceUnitInfo() {
@Override
public String getPersistenceUnitName() {
return "ApplicationPersistenceUnit";
}
@Override final List<String> MANAGED_CLASSES=Arrays.asList(new String[] {
public String getPersistenceProviderClassName() { "org.gcube.application.geoportal.model.Record",
return "org.hibernate.jpa.HibernatePersistenceProvider"; "org.gcube.application.geoportal.model.concessioni.Concessione",
} "org.gcube.application.geoportal.model.concessioni.LayerConcessione",
"org.gcube.application.geoportal.model.concessioni.RelazioneScavo",
@Override "org.gcube.application.geoportal.model.content.AssociatedContent",
public PersistenceUnitTransactionType getTransactionType() { "org.gcube.application.geoportal.model.content.GeoServerContent",
return PersistenceUnitTransactionType.RESOURCE_LOCAL; "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",
@Override "org.gcube.application.geoportal.model.gis.ShapeFileLayerDescriptor",
public DataSource getJtaDataSource() { "org.gcube.application.geoportal.model.gis.SDILayerDescriptor"});
return null;
}
@Override
public DataSource getNonJtaDataSource() {
return null;
}
@Override return new PersistenceUnitInfo() {
public List<String> getMappingFileNames() { @Override
return Collections.emptyList(); public String getPersistenceUnitName() {
} return "ApplicationPersistenceUnit";
}
@Override @Override
public List<URL> getJarFileUrls() { public String getPersistenceProviderClassName() {
try { return "org.hibernate.jpa.HibernatePersistenceProvider";
return Collections.list(this.getClass() }
.getClassLoader()
.getResources(""));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override @Override
public URL getPersistenceUnitRootUrl() { public PersistenceUnitTransactionType getTransactionType() {
return null; return PersistenceUnitTransactionType.RESOURCE_LOCAL;
} }
@Override @Override
public List<String> getManagedClassNames() { public DataSource getJtaDataSource() {
return Collections.emptyList(); return null;
} }
@Override @Override
public boolean excludeUnlistedClasses() { public DataSource getNonJtaDataSource() {
return false; return null;
} }
@Override @Override
public SharedCacheMode getSharedCacheMode() { public List<String> getMappingFileNames() {
return null; return Collections.emptyList();
} }
@Override @Override
public ValidationMode getValidationMode() { public List<URL> getJarFileUrls() {
return null; try {
} return Collections.list(this.getClass()
.getClassLoader()
.getResources(""));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override @Override
public Properties getProperties() { public URL getPersistenceUnitRootUrl() {
return new Properties(); return null;
} }
@Override @Override
public String getPersistenceXMLSchemaVersion() { public List<String> getManagedClassNames() {
return null; return MANAGED_CLASSES;
} }
@Override @Override
public ClassLoader getClassLoader() { public boolean excludeUnlistedClasses() {
return null; return true;
} }
@Override @Override
public void addTransformer(ClassTransformer transformer) { public SharedCacheMode getSharedCacheMode() {
return null;
}
} @Override
public ValidationMode getValidationMode() {
return null;
}
@Override @Override
public ClassLoader getNewTempClassLoader() { public Properties getProperties() {
return null; 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;
}
};
} }
} }