package com.controlware.nocdwh.dao.spi;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateful;
import javax.jws.WebMethod;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Session Bean implementation class PersistenceUnitCanOpener
*/
@Stateful
public class PersistenceUnitCanOpener implements PersistenceUnitCanOpenerLocal {
@Resource
SessionContext ctx;
@PersistenceContext(unitName="etlmw")
protected EntityManager etl;
@PersistenceContext(unitName="inventory")
protected EntityManager inv;
private Map<String, EntityManager> emHash = new HashMap<String, EntityManager> ();
public Collection<Class<?>> importProcessIdAttached = null;
/**
* Default constructor.
*/
public PersistenceUnitCanOpener() {
// TODO Auto-generated constructor stub
}
public HashMap<Class<?>, EntityManager> class2EM=null;
@PostConstruct
public void initDatasources() {
try {
emHash.put("nocdwh-etlmw", etl);
emHash.put("nocdwh-inventory-etlmw", inv);
class2EM = readFromPersistenceUnit(emHash);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
public EntityManager getEntityManager4Class(Class<?> clazz) {
return class2EM.get(clazz);
}
public HashMap<Class<?>,EntityManager> readFromPersistenceUnit(Map<String, EntityManager> availableEntityManagers) throws Exception {
HashMap<Class<?>,EntityManager> result= new HashMap<Class<?>, EntityManager>();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Enumeration<URL> urls = cl.getResources("META-INF/persistence.xml");
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (urls.nextElement().openConnection().getInputStream());
// normalize text representation
doc.getDocumentElement ().normalize ();
System.out.println ("Root element of the doc is " +
doc.getDocumentElement().getNodeName());
NodeList nl = doc.getDocumentElement().getChildNodes();
for (int i = 0; i < nl.getLength(); ++i) {
Node node = nl.item(i);
if ("persistence-unit".equals(node.getNodeName())) {
Node puNode = node.getAttributes().getNamedItem("name");
String name = puNode.getNodeName();
System.out.println("PU : "+puNode);
NodeList pl = node.getChildNodes();
for (int j = 0; j < pl.getLength(); ++j) {
Node model = pl.item(j);
if ("class".equals(model.getNodeName())) {
Node clazz=model.getFirstChild();
String modelName = clazz.getNodeValue();
System.out.println(name + " -> " + modelName);
Class<?> clz = Thread.currentThread().getContextClassLoader().loadClass(modelName);
result.put(clz, availableEntityManagers.get(name));
}
}
}
}
return result;
}
}