tabular-data-service/src/main/java/org/gcube/data/analysis/tabulardata/utils/CDIProducer.java

134 lines
4.5 KiB
Java

package org.gcube.data.analysis.tabulardata.utils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Named;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.gcube.common.database.DatabaseEndpointIdentifier;
import org.gcube.common.database.DatabaseProvider;
import org.gcube.common.database.endpoint.DatabaseEndpoint;
import org.gcube.common.database.endpoint.DatabaseProperty;
import org.gcube.data.analysis.tabulardata.operation.OperationId;
import org.gcube.data.analysis.tabulardata.operation.worker.WorkerFactory;
import org.gcube.smartgears.ContextProvider;
import org.gcube.smartgears.context.application.ApplicationContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Maps;
public class CDIProducer {
private static ExecutorService executorService;
@Produces
public ApplicationContext getApplicationContext(){
return ContextProvider.get();
}
private static Factories factoryMap;
@Produces @TabularDataMetadata
public EntityManagerFactory createEntityManagerFactory(@Named("Metadata-Admin") DatabaseEndpointIdentifier metaDBEndpointId,
DatabaseProvider dbProvider) {
DatabaseEndpoint dbDescriptor = dbProvider.get(metaDBEndpointId);
// Retrieve driver from properties
String driver = null;
String eclipseLinkTargetDb = null;
String ddlGenerationStrategy = null;
for (DatabaseProperty p : dbDescriptor.getProperties()) {
if (p.getKey().equals("driver"))
driver = p.getValue();
if (p.getKey().equals("eclipselink.target-database"))
eclipseLinkTargetDb = p.getValue();
if (p.getKey().equals("eclipselink.ddl-generation"))
ddlGenerationStrategy = p.getValue();
}
if (driver == null)
throw new RuntimeException("Unable to find the right driver for the connection to the DB: "
+ dbDescriptor);
Map<String, String> properties = Maps.newHashMap();
properties.put("javax.persistence.jdbc.user", dbDescriptor.getCredentials().getUsername());
properties.put("javax.persistence.jdbc.password", dbDescriptor.getCredentials().getPassword());
properties.put("javax.persistence.jdbc.driver", driver);
properties.put("javax.persistence.jdbc.url", dbDescriptor.getConnectionString());
properties.put("eclipselink.target-database", eclipseLinkTargetDb);
if (ddlGenerationStrategy != null)
properties.put("eclipselink.ddl-generation", ddlGenerationStrategy);
else
properties.put("eclipselink.ddl-generation", "create-tables");
// properties.put("eclipselink.ddl-generation","create-or-extend-tables");
// properties.put("eclipselink.ddl-generation","drop-and-create-tables");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("tabulardata", properties);
return emf;
}
protected void disposeEntityManagerFactory(@Disposes @TabularDataMetadata EntityManagerFactory entityManagerFactory){
if(entityManagerFactory.isOpen())
entityManagerFactory.close();
}
@Produces
public Logger getLogger(InjectionPoint injectionPoint){
return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getClass());
}
@Produces
public ExecutorService getExecutor(){
if (executorService==null)
executorService = Executors.newCachedThreadPool(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(new ThreadGroup(UUID.randomUUID().toString()), r);
}
});
return executorService;
}
protected void shutdownExecutor(@Disposes ExecutorService executorService){
if (!executorService.isShutdown())
executorService.shutdown();
}
@Produces
public Factories workerFactoryPerId(Instance<WorkerFactory<?>> factories){
if (factoryMap ==null){
HashMap<OperationId, WorkerFactory<?>> tempFactoryMap = Maps.newHashMap();
Iterator<WorkerFactory<?>> factoriesIT =factories.iterator();
while( factoriesIT.hasNext()){
WorkerFactory<?> factory = factoriesIT.next();
tempFactoryMap.put(factory.getOperationDescriptor().getOperationId(), factory);
}
factoryMap = new Factories(tempFactoryMap);
}
return factoryMap;
}
public static Factories getFactoryMap(){
if (factoryMap==null) throw new RuntimeException("factory map not yet initialized");
return factoryMap;
}
}