package br.com.geraldoferraz.testyourquery.config;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.EntityManagerFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DefaultEntityManagerProvider implements EntityManagerProvider {
private String url;
private String user;
private String password;
private Set<Class<?>> entities = new HashSet<Class<?>>();
private EntityManagerProvider other;
public DefaultEntityManagerProvider(EntityManagerProvider entityManagerProvider) {
this.other = entityManagerProvider;
carregarXML();
}
private void carregarXML() {
try {
Enumeration<URL> resources = ((URLClassLoader) Thread.currentThread().getContextClassLoader()).getResources("META-INF/persistence.xml");
if (resources.hasMoreElements()) {
URL persistenceXMLURL = resources.nextElement();
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(persistenceXMLURL.toURI()));
NodeList listOfPersistenceUnits = doc.getElementsByTagName("persistence-unit");
for (int i = 0; i < listOfPersistenceUnits.getLength(); i++) {
Node persistenceUnitNode = listOfPersistenceUnits.item(i);
NamedNodeMap attributes = persistenceUnitNode.getAttributes();
Node atributoName = attributes.getNamedItem("name");
if (atributoName.getTextContent().equals(other.getPersistenceUnit())) {
findEntities(persistenceUnitNode);
findUserPasswordAndURL(persistenceUnitNode);
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void findUserPasswordAndURL(Node persistenceUnitNode) {
NodeList childNodes = persistenceUnitNode.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node item = childNodes.item(i);
if (item.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) item;
if(element.getTagName().equals("properties")){
NodeList properties = element.getElementsByTagName("property");
for (int z = 0; i < properties.getLength(); z++) {
NamedNodeMap attributes = properties.item(z).getAttributes();
String name = attributes.getNamedItem("name").getTextContent();
String value = attributes.getNamedItem("value").getTextContent();
if (name.length() > 0 && name.contains("password")) {
password = value;
}
if (name.length() > 0 && name.contains("user")) {
user = value;
}
if (name.length() > 0 && name.contains("url")) {
url = value;
}
if (user != null && password != null && url != null) {
break;
}
}
}
}
}
}
private void findEntities(Node persistenceUnit) throws ClassNotFoundException {
NodeList childNodes = persistenceUnit.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node item = childNodes.item(i);
if (item.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) item;
if (element.getTagName().equals("class")) {
entities.add(Class.forName(element.getTextContent()));
}
}
}
}
public Connection getJDBCConnection() {
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
public Set<Class<?>> getEntities() {
return entities;
}
public EntityManagerFactory getEntityManagerFactory() {
return other.getEntityManagerFactory();
}
public String getPersistenceUnit() {
return other.getPersistenceUnit();
}
}