Author: epbernard Date: 2006-03-14 20:00:50 -0500 (Tue, 14 Mar 2006) New Revision: 9623 Modified: trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java trunk/HibernateExt/ejb/build.xml trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java Log: EJB-147 Modified: trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/Hibernate3/src/org/hibernate/cfg/Configuration.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -231,6 +231,10 @@ this.entityResolver = entityResolver; } + public EntityResolver getEntityResolver() { + return entityResolver; + } + /** * Read mappings from a particular XML file * Modified: trunk/HibernateExt/ejb/build.xml =================================================================== --- trunk/HibernateExt/ejb/build.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/build.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -129,7 +129,11 @@ <target name="junit" depends="compiletest,test-resources"> <mkdir dir="test_output"/> <mkdir dir="${classes.dir}/META-INF/services"/> - <copy file="${resources.dir}/META-INF/services/javax.persistence.spi.PersistenceProvider" todir="${classes.dir}/META-INF/services"/> + <copy todir="${classes.dir}"> + <fileset dir="${resources.dir}"> + <include name="**/*.*"/> + </fileset> + </copy> <junit fork="once" printsummary="yes" haltonfailure="yes"> <classpath> <fileset dir="${jdbc.dir}"> @@ -188,7 +192,11 @@ <target name="jar" depends="compile" description="Build the distribution .jar file"> <mkdir dir="${classes.dir}/META-INF/services"/> - <copy file="${resources.dir}/META-INF/services/javax.persistence.spi.PersistenceProvider" todir="${classes.dir}/META-INF/services"/> + <copy todir="${classes.dir}"> + <fileset dir="${resources.dir}"> + <include name="**/*.*"/> + </fileset> + </copy> <manifest file="${classes.dir}/META-INF/MANIFEST.MF"> <attribute name="Product" value="${Name}"/> <attribute name="Version" value="${version}"/> Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Ejb3Configuration.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -147,7 +147,11 @@ while ( xmls.hasMoreElements() ) { URL url = xmls.nextElement(); log.trace( "Analyse of persistence.xml: " + url ); - List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( url, integration ); + List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy( + url, + integration, + cfg.getEntityResolver() + ); for ( PersistenceMetadata metadata : metadataFiles ) { JarVisitor.Filter[] filters = getFilters( metadata.getProps(), integration ); Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -6,8 +6,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; -import java.util.Properties; import javax.persistence.PersistenceException; import javax.persistence.spi.PersistenceUnitTransactionType; import javax.xml.parsers.DocumentBuilder; @@ -21,13 +21,16 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; +import org.xml.sax.SAXParseException; /** - * Comment + * Persistence.xml handler * * @author <a href="mailto:bi...@jb...">Bill Burke</a> - * @version $Revision$ + * @author Emmanuel Bernard */ public final class PersistenceXmlLoader { private static Log log = LogFactory.getLog( PersistenceXmlLoader.class ); @@ -35,28 +38,38 @@ private PersistenceXmlLoader() { } - private static Document loadURL(URL configURL) throws Exception { + private static Document loadURL(URL configURL, EntityResolver resolver) throws Exception { InputStream is = configURL != null ? configURL.openStream() : null; if ( is == null ) { throw new IOException( "Failed to obtain InputStream from url: " + configURL ); } - + List errors = new ArrayList(); DocumentBuilderFactory docBuilderFactory = null; docBuilderFactory = DocumentBuilderFactory.newInstance(); - docBuilderFactory.setValidating( false ); + docBuilderFactory.setValidating( true ); + docBuilderFactory.setNamespaceAware( true ); + try { + //otherwise Xerces fails in validation + docBuilderFactory.setAttribute( "http://apache.org/xml/features/validation/schema", true); + } + catch (IllegalArgumentException e) { + docBuilderFactory.setValidating( false ); + docBuilderFactory.setNamespaceAware( false ); + } InputSource source = new InputSource( is ); - //URL url = AspectXmlLoader.class.getResource("/jboss-aop_1_0.dtd"); - //source.setSystemId( url.toString() ); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); - //docBuilder.setEntityResolver( new AspectXmlLoader.Resolver() ); - //docBuilder.setErrorHandler( new LocalErrorHandler() ); + docBuilder.setEntityResolver( resolver ); + docBuilder.setErrorHandler( new ErrorLogger("XML InputStream", errors) ); Document doc = docBuilder.parse( source ); + if ( errors.size() != 0 ) { + throw new PersistenceException( "invalid persistence.xml", (Throwable) errors.get( 0 ) ); + } return doc; } - public static List<PersistenceMetadata> deploy(URL url, Map overrides) throws Exception { + public static List<PersistenceMetadata> deploy(URL url, Map overrides, EntityResolver resolver) throws Exception { - Document doc = loadURL( url ); + Document doc = loadURL( url, resolver ); Element top = doc.getDocumentElement(); NodeList children = top.getChildNodes(); ArrayList<PersistenceMetadata> units = new ArrayList<PersistenceMetadata>(); @@ -97,7 +110,7 @@ return units; } - public static PersistenceMetadata parsePersistenceUnit(Element top) + private static PersistenceMetadata parsePersistenceUnit(Element top) throws Exception { PersistenceMetadata metadata = new PersistenceMetadata(); String puName = top.getAttribute( "name" ); @@ -168,4 +181,23 @@ else throw new PersistenceException("Unknown TransactionType: " + elementContent); } + public static class ErrorLogger implements ErrorHandler { + private String file; + private List errors; + ErrorLogger(String file, List errors) { + this.file=file; + this.errors = errors; + } + public void error(SAXParseException error) { + log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() ); + errors.add(error); + } + public void fatalError(SAXParseException error) { + error(error); + } + public void warning(SAXParseException warn) { + log.warn( "Warning parsing XML: " + file + '(' + warn.getLineNumber() + ") " + warn.getMessage() ); + } + } + } Modified: trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,6 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of reference to a cfg.xml file --> -<persistence> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> <persistence-unit name="cfgxmlpar" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> Modified: trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/defaultpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of a default persistence.xml --> -<persistence> - <persistence-unit transaction-type="RESOURCE_LOCAL"> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> + <persistence-unit name="defaultpar" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> Modified: trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/excludehbmpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of a default persistence.xml --> -<persistence> - <persistence-unit transaction-type="RESOURCE_LOCAL"> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> + <persistence-unit name="excludehbmpar" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> Modified: trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/explicitpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,11 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> -<persistence> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> + <jar-file>./build/testresources/externaljar.jar</jar-file> <class>org.hibernate.ejb.test.Cat</class> <class>org.hibernate.ejb.test.Distributor</class> <class>org.hibernate.ejb.test.Item</class> <class>org.hibernate.ejb.test</class> - <jar-file>./build/testresources/externaljar.jar</jar-file> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> @@ -20,8 +23,9 @@ <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.generate_statistics" value="true"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> - <property name="hibernate.ejb.naming_strategy">org.hibernate.ejb.test.MyNamingStrategy</property> + <property name="hibernate.ejb.naming_strategy" value="org.hibernate.ejb.test.MyNamingStrategy"/> <!-- test naming strategy and fall back to element content --> + <!-- property name="hibernate.ejb.naming_strategy">org.hibernate.ejb.test.MyNamingStrategy</property --> <!-- cache configuration --> <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/> Modified: trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml =================================================================== --- trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/ejb/src/test-resources/explodedpar/META-INF/persistence.xml 2006-03-15 01:00:50 UTC (rev 9623) @@ -1,7 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- example of a default persistence.xml --> -<persistence> - <persistence-unit transaction-type="RESOURCE_LOCAL"> +<persistence xmlns="http://java.sun.com/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" + version="1.0"> + <persistence-unit name="explodedpar" transaction-type="RESOURCE_LOCAL"> + <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2006-03-15 00:24:08 UTC (rev 9622) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2006-03-15 01:00:50 UTC (rev 9623) @@ -15,16 +15,14 @@ public class EJB3DTDEntityResolver extends DTDEntityResolver { public static final EntityResolver INSTANCE = new EJB3DTDEntityResolver(); - private static final Log log = LogFactory.getLog( DTDEntityResolver.class ); + private static final Log log = LogFactory.getLog( EJB3DTDEntityResolver.class ); - private static final String EJB3ORM_NAMESPACE = "http://java.sun.com/xml/ns/persistence/orm"; - public InputSource resolveEntity(String publicId, String systemId) { InputSource is = super.resolveEntity( publicId, systemId ); if (is == null) { if ( systemId != null ) { if ( systemId.endsWith( "orm_1_0.xsd" ) ) { - log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/" ); + log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb" ); String path = "org/hibernate/ejb/" + "orm_1_0.xsd"; InputStream dtdStream = resolveInHibernateNamespace( path ); if ( dtdStream == null ) { @@ -38,6 +36,21 @@ return source; } } + else if ( systemId.endsWith( "persistence_1_0.xsd" ) ) { + log.debug( "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb" ); + String path = "org/hibernate/ejb/" + "persistence_1_0.xsd"; + InputStream dtdStream = resolveInHibernateNamespace( path ); + if ( dtdStream == null ) { + log.debug( "unable to locate [" + systemId + "] on classpath" ); + } + else { + log.debug( "located [" + systemId + "] in classpath" ); + InputSource source = new InputSource( dtdStream ); + source.setPublicId( publicId ); + source.setSystemId( systemId ); + return source; + } + } } } else { |