|
From: <hib...@li...> - 2006-05-04 18:07:00
|
Author: epbernard
Date: 2006-05-04 14:04:44 -0400 (Thu, 04 May 2006)
New Revision: 9877
Modified:
trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java
trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java
trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java
Log:
EJB-84
Modified: trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java
===================================================================
--- trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-05-04 16:41:12 UTC (rev 9876)
+++ trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-05-04 18:04:44 UTC (rev 9877)
@@ -139,7 +139,7 @@
private EntityResolver entityResolver;
private EntityNotFoundDelegate entityNotFoundDelegate;
- private transient XMLHelper xmlHelper;
+ protected transient XMLHelper xmlHelper;
protected transient Map typeDefs;
protected NamingStrategy namingStrategy;
Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java
===================================================================
--- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-05-04 16:41:12 UTC (rev 9876)
+++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-05-04 18:04:44 UTC (rev 9877)
@@ -1,6 +1,7 @@
//$Id$
package org.hibernate.ejb;
+import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
@@ -21,9 +22,9 @@
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityNotFoundException;
import javax.persistence.MappedSuperclass;
import javax.persistence.PersistenceException;
-import javax.persistence.EntityNotFoundException;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
@@ -32,12 +33,15 @@
import javassist.bytecode.ClassFile;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.MappingException;
+import org.hibernate.ObjectNotFoundException;
import org.hibernate.SessionFactory;
-import org.hibernate.ObjectNotFoundException;
-import org.hibernate.proxy.EntityNotFoundDelegate;
+import org.hibernate.reflection.java.xml.XMLContext;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
@@ -56,13 +60,16 @@
import org.hibernate.event.EventListeners;
import org.hibernate.mapping.AuxiliaryDatabaseObject;
import org.hibernate.mapping.PersistentClass;
+import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.secure.JACCConfiguration;
import org.hibernate.transaction.JDBCTransactionFactory;
import org.hibernate.util.CollectionHelper;
import org.hibernate.util.ReflectHelper;
import org.hibernate.util.StringHelper;
+import org.hibernate.util.XMLHelper;
import org.jboss.util.file.ArchiveBrowser;
import org.xml.sax.EntityResolver;
+import org.xml.sax.SAXException;
/**
* @author Emmanuel Bernard
@@ -305,6 +312,9 @@
new Properties();
ConfigurationHelper.overrideProperties( properties, integration );
+ //fill up entities with the on found in xml files
+ addXMLEntities( xmlFiles, info, entities );
+
//FIXME send the appropriate entites.
if ( "true".equalsIgnoreCase( properties.getProperty( HibernatePersistence.USE_CLASS_ENHANCER ) ) ) {
info.addTransformer( new InterceptFieldClassFileTransformer( entities ) );
@@ -348,6 +358,78 @@
return entityManagerFactory;
}
+ private void addXMLEntities(List<String> xmlFiles, PersistenceUnitInfo info, List<String> entities) {
+ //TODO handle inputstream related hbm files
+ ClassLoader newTempClassLoader = info.getNewTempClassLoader();
+ if (newTempClassLoader == null) {
+ log.warn( "Persistence provider caller does not implements the EJB3 spec correctly. PersistenceUnitInfo.getNewTempClassLoader() is null." );
+ return;
+ }
+ XMLHelper xmlHelper = new XMLHelper();
+ List errors = new ArrayList();
+ SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, cfg.getEntityResolver() );
+ try {
+ saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+ }
+ catch (SAXException e) {
+ saxReader.setValidation( false );
+ }
+
+ for ( String xmlFile : xmlFiles ) {
+
+ InputStream resourceAsStream = newTempClassLoader.getResourceAsStream( xmlFile );
+ if (resourceAsStream == null) continue;
+ BufferedInputStream is = new BufferedInputStream( resourceAsStream );
+ try {
+ errors.clear();
+ org.dom4j.Document doc = saxReader.read( is );
+ if ( errors.size() != 0 ) {
+ throw new MappingException( "invalid mapping", (Throwable) errors.get( 0 ) );
+ }
+ Element rootElement = doc.getRootElement();
+ if ( rootElement != null && "entity-mappings".equals( rootElement.getName() ) ) {
+ Element element = rootElement.element( "package" );
+ String defaultPackage = element != null ? element.getTextTrim() : null;
+ List<Element> elements = rootElement.elements( "entity" );
+ for (Element subelement : elements ) {
+ String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
+ if ( ! entities.contains( classname ) ) {
+ entities.add( classname );
+ }
+ }
+ elements = rootElement.elements( "mapped-superclass" );
+ for (Element subelement : elements ) {
+ String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
+ if ( ! entities.contains( classname ) ) {
+ entities.add( classname );
+ }
+ }
+ elements = rootElement.elements( "embeddable" );
+ for (Element subelement : elements ) {
+ String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
+ if ( ! entities.contains( classname ) ) {
+ entities.add( classname );
+ }
+ }
+ }
+ else if ( rootElement != null && "hibernate-mappings".equals( rootElement.getName() ) ) {
+ //TODO
+ }
+ }
+ catch (DocumentException e) {
+ throw new MappingException( "Could not parse mapping document in input stream", e );
+ }
+ finally {
+ try {
+ is.close();
+ }
+ catch (IOException ioe) {
+ log.warn( "Could not close input stream", ioe );
+ }
+ }
+ }
+ }
+
private void defineTransactionType(Object overridenTxType, Map workingVars) {
if ( overridenTxType == null ) {
// if ( transactionType == null ) {
@@ -508,7 +590,7 @@
}
boolean isEmbeddableSuperclass = visible.getAnnotation( MappedSuperclass.class.getName() ) != null;
if ( isEmbeddableSuperclass ) {
- log.info( "found EJB3 @EmbeddableSuperclass: " + cf.getName() );
+ log.info( "found EJB3 @MappedSuperclass: " + cf.getName() );
entities.add( cf.getName() );
}
}
Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java
===================================================================
--- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java 2006-05-04 16:41:12 UTC (rev 9876)
+++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java 2006-05-04 18:04:44 UTC (rev 9877)
@@ -89,6 +89,6 @@
}
public ClassLoader getNewTempClassLoader() {
- return null;
+ return Thread.currentThread().getContextClassLoader();
}
}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-05-04 16:41:12 UTC (rev 9876)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2006-05-04 18:04:44 UTC (rev 9877)
@@ -39,7 +39,6 @@
import org.hibernate.util.JoinedIterator;
import org.hibernate.util.ReflectHelper;
import org.hibernate.util.StringHelper;
-import org.hibernate.util.XMLHelper;
import org.hibernate.validator.ClassValidator;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -78,7 +77,6 @@
private List<Document> hbmDocuments; //user ordering matters, hence the list
private String precedence = null;
private boolean inSecondPass = false;
- protected XMLHelper xmlHelper;
private ReflectionManager reflectionManager;
private boolean isDefaultProcessed = false;
@@ -227,7 +225,6 @@
namingStrategy = EJB3NamingStrategy.INSTANCE;
setEntityResolver( new EJB3DTDEntityResolver() );
reflectionManager = new JavaXFactory();
- xmlHelper = new XMLHelper();
}
@Override
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-05-04 16:41:12 UTC (rev 9876)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-05-04 18:04:44 UTC (rev 9877)
@@ -134,7 +134,7 @@
return localAddedClasses;
}
- private static String buildSafeClassName(String className, String defaultPackageName) {
+ public static String buildSafeClassName(String className, String defaultPackageName) {
if ( className.indexOf( '.' ) < 0 && defaultPackageName != null ) {
className = StringHelper.qualify( defaultPackageName, className );
}
|