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 ); } |