HHH-7981 - Load (now) locally defined orm.xsd while processing orm.xml files
This commit is contained in:
parent
fbdca39506
commit
467daa22b0
|
@ -84,7 +84,7 @@ task jaxb {
|
||||||
// input schemas
|
// input schemas
|
||||||
cfgXsd = file( 'src/main/resources/org/hibernate/hibernate-configuration-4.0.xsd')
|
cfgXsd = file( 'src/main/resources/org/hibernate/hibernate-configuration-4.0.xsd')
|
||||||
hbmXsd = file( 'src/main/resources/org/hibernate/hibernate-mapping-4.0.xsd' )
|
hbmXsd = file( 'src/main/resources/org/hibernate/hibernate-mapping-4.0.xsd' )
|
||||||
ormXsd = file( 'src/main/resources/org/hibernate/ejb/orm_2_0.xsd' )
|
ormXsd = file( 'src/main/resources/org/hibernate/jpa/orm_2_0.xsd' )
|
||||||
|
|
||||||
// input bindings
|
// input bindings
|
||||||
cfgXjb = file( 'src/main/xjb/hbm-configuration-bindings.xjb' )
|
cfgXjb = file( 'src/main/xjb/hbm-configuration-bindings.xjb' )
|
||||||
|
|
|
@ -56,37 +56,57 @@ public class EJB3DTDEntityResolver extends DTDEntityResolver {
|
||||||
@Override
|
@Override
|
||||||
public InputSource resolveEntity(String publicId, String systemId) {
|
public InputSource resolveEntity(String publicId, String systemId) {
|
||||||
LOG.tracev( "Resolving XML entity {0} : {1}", publicId, systemId );
|
LOG.tracev( "Resolving XML entity {0} : {1}", publicId, systemId );
|
||||||
InputSource is = super.resolveEntity( publicId, systemId );
|
if ( systemId != null ) {
|
||||||
if ( is == null ) {
|
if ( systemId.endsWith( "orm_2_1.xsd" ) ) {
|
||||||
if ( systemId != null ) {
|
InputStream dtdStream = getStreamFromClasspath( "orm_2_1.xsd" );
|
||||||
if ( systemId.endsWith( "orm_1_0.xsd" ) ) {
|
final InputSource source = buildInputSource( publicId, systemId, dtdStream, false );
|
||||||
InputStream dtdStream = getStreamFromClasspath( "orm_1_0.xsd" );
|
if ( source != null ) {
|
||||||
final InputSource source = buildInputSource( publicId, systemId, dtdStream, false );
|
return source;
|
||||||
if (source != null) return source;
|
|
||||||
}
|
}
|
||||||
else if ( systemId.endsWith( "orm_2_0.xsd" ) ) {
|
}
|
||||||
InputStream dtdStream = getStreamFromClasspath( "orm_2_0.xsd" );
|
else if ( systemId.endsWith( "orm_2_0.xsd" ) ) {
|
||||||
final InputSource source = buildInputSource( publicId, systemId, dtdStream, false );
|
InputStream dtdStream = getStreamFromClasspath( "orm_2_0.xsd" );
|
||||||
if (source != null) return source;
|
final InputSource source = buildInputSource( publicId, systemId, dtdStream, false );
|
||||||
|
if ( source != null ) {
|
||||||
|
return source;
|
||||||
}
|
}
|
||||||
else if ( systemId.endsWith( "persistence_1_0.xsd" ) ) {
|
}
|
||||||
InputStream dtdStream = getStreamFromClasspath( "persistence_1_0.xsd" );
|
else if ( systemId.endsWith( "orm_1_0.xsd" ) ) {
|
||||||
final InputSource source = buildInputSource( publicId, systemId, dtdStream, true );
|
InputStream dtdStream = getStreamFromClasspath( "orm_1_0.xsd" );
|
||||||
if (source != null) return source;
|
final InputSource source = buildInputSource( publicId, systemId, dtdStream, false );
|
||||||
|
if ( source != null ) {
|
||||||
|
return source;
|
||||||
}
|
}
|
||||||
else if ( systemId.endsWith( "persistence_2_0.xsd" ) ) {
|
}
|
||||||
InputStream dtdStream = getStreamFromClasspath( "persistence_2_0.xsd" );
|
else if ( systemId.endsWith( "persistence_2_1.xsd" ) ) {
|
||||||
final InputSource source = buildInputSource( publicId, systemId, dtdStream, true );
|
InputStream dtdStream = getStreamFromClasspath( "persistence_2_1.xsd" );
|
||||||
if (source != null) return source;
|
final InputSource source = buildInputSource( publicId, systemId, dtdStream, true );
|
||||||
|
if ( source != null ) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( systemId.endsWith( "persistence_2_0.xsd" ) ) {
|
||||||
|
InputStream dtdStream = getStreamFromClasspath( "persistence_2_0.xsd" );
|
||||||
|
final InputSource source = buildInputSource( publicId, systemId, dtdStream, true );
|
||||||
|
if ( source != null ) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( systemId.endsWith( "persistence_1_0.xsd" ) ) {
|
||||||
|
InputStream dtdStream = getStreamFromClasspath( "persistence_1_0.xsd" );
|
||||||
|
final InputSource source = buildInputSource( publicId, systemId, dtdStream, true );
|
||||||
|
if ( source != null ) {
|
||||||
|
return source;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
|
// because the old code did this too (in terms of setting resolved)
|
||||||
|
InputSource source = super.resolveEntity( publicId, systemId );
|
||||||
|
if ( source != null ) {
|
||||||
resolved = true;
|
resolved = true;
|
||||||
return is;
|
|
||||||
}
|
}
|
||||||
//use the default behavior
|
return source;
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private InputSource buildInputSource(String publicId, String systemId, InputStream dtdStream, boolean resolved) {
|
private InputSource buildInputSource(String publicId, String systemId, InputStream dtdStream, boolean resolved) {
|
||||||
|
@ -103,8 +123,8 @@ public class EJB3DTDEntityResolver extends DTDEntityResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
private InputStream getStreamFromClasspath(String fileName) {
|
private InputStream getStreamFromClasspath(String fileName) {
|
||||||
LOG.trace( "Recognized JPA ORM namespace; attempting to resolve on classpath under org/hibernate/ejb" );
|
LOG.trace( "Recognized JPA ORM namespace; attempting to resolve on classpath under org/hibernate/jpa" );
|
||||||
String path = "org/hibernate/ejb/" + fileName;
|
String path = "org/hibernate/jpa/" + fileName;
|
||||||
InputStream dtdStream = resolveInHibernateNamespace( path );
|
InputStream dtdStream = resolveInHibernateNamespace( path );
|
||||||
return dtdStream;
|
return dtdStream;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,9 +58,7 @@ public class ErrorLogger implements ErrorHandler, Serializable {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public void error(SAXParseException error) {
|
public void error(SAXParseException error) {
|
||||||
if ( this.errors == null ) {
|
if ( this.errors == null ) {
|
||||||
errors = new ArrayList<SAXParseException>();
|
errors = new ArrayList<SAXParseException>();
|
||||||
|
@ -68,23 +66,16 @@ public class ErrorLogger implements ErrorHandler, Serializable {
|
||||||
errors.add( error );
|
errors.add( error );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public void fatalError(SAXParseException error) {
|
public void fatalError(SAXParseException error) {
|
||||||
error( error );
|
error( error );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public void warning(SAXParseException warn) {
|
public void warning(SAXParseException warn) {
|
||||||
LOG.parsingXmlWarning( warn.getLineNumber(), warn.getMessage() );
|
LOG.parsingXmlWarning( warn.getLineNumber(), warn.getMessage() );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return returns a list of encountered xml parsing errors, or the empty list if there was no error
|
|
||||||
*/
|
|
||||||
public List<SAXParseException> getErrors() {
|
public List<SAXParseException> getErrors() {
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,17 +23,30 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.internal.util.xml;
|
package org.hibernate.internal.util.xml;
|
||||||
|
|
||||||
import java.io.StringReader;
|
import javax.xml.XMLConstants;
|
||||||
|
import javax.xml.transform.dom.DOMSource;
|
||||||
|
import javax.xml.transform.stream.StreamSource;
|
||||||
|
import javax.xml.validation.Schema;
|
||||||
|
import javax.xml.validation.SchemaFactory;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
import org.dom4j.Document;
|
import org.dom4j.Document;
|
||||||
|
import org.dom4j.DocumentException;
|
||||||
|
import org.dom4j.Element;
|
||||||
|
import org.dom4j.dom.DOMDocumentFactory;
|
||||||
import org.dom4j.io.SAXReader;
|
import org.dom4j.io.SAXReader;
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
import org.xml.sax.EntityResolver;
|
import org.xml.sax.EntityResolver;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
import org.hibernate.InvalidMappingException;
|
import org.hibernate.InvalidMappingException;
|
||||||
|
import org.hibernate.MappingException;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.internal.util.ConfigHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles reading mapping documents, both {@code hbm} and {@code orm} varieties.
|
* Handles reading mapping documents, both {@code hbm} and {@code orm} varieties.
|
||||||
|
@ -42,11 +55,13 @@ import org.hibernate.internal.CoreMessageLogger;
|
||||||
*/
|
*/
|
||||||
public class MappingReader {
|
public class MappingReader {
|
||||||
|
|
||||||
private static final CoreMessageLogger LOG = Logger.getMessageLogger(
|
private static final CoreMessageLogger log = Logger.getMessageLogger(
|
||||||
CoreMessageLogger.class,
|
CoreMessageLogger.class,
|
||||||
MappingReader.class.getName()
|
MappingReader.class.getName()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public static final String ASSUMED_ORM_XSD_VERSION = "2.1";
|
||||||
|
|
||||||
public static final MappingReader INSTANCE = new MappingReader();
|
public static final MappingReader INSTANCE = new MappingReader();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,70 +74,70 @@ public class MappingReader {
|
||||||
private MappingReader() {
|
private MappingReader() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public XmlDocument readMappingDocument(EntityResolver entityResolver, InputSource source, Origin origin) {
|
// public XmlDocument readMappingDocument(EntityResolver entityResolver, InputSource source, Origin origin) {
|
||||||
// IMPL NOTE : this is the legacy logic as pulled from the old AnnotationConfiguration code
|
// // IMPL NOTE : this is the legacy logic as pulled from the old AnnotationConfiguration code
|
||||||
|
//
|
||||||
Exception failure;
|
// Exception failure;
|
||||||
ErrorLogger errorHandler = new ErrorLogger();
|
// ErrorLogger errorHandler = new ErrorLogger();
|
||||||
|
//
|
||||||
SAXReader saxReader = new SAXReader();
|
// SAXReader saxReader = new SAXReader();
|
||||||
saxReader.setEntityResolver( entityResolver );
|
// saxReader.setEntityResolver( entityResolver );
|
||||||
saxReader.setErrorHandler( errorHandler );
|
// saxReader.setErrorHandler( errorHandler );
|
||||||
saxReader.setMergeAdjacentText( true );
|
// saxReader.setMergeAdjacentText( true );
|
||||||
saxReader.setValidation( true );
|
// saxReader.setValidation( true );
|
||||||
|
//
|
||||||
Document document = null;
|
// Document document = null;
|
||||||
try {
|
// try {
|
||||||
// first try with orm 2.0 xsd validation
|
// // first try with orm 2.0 xsd validation
|
||||||
setValidationFor( saxReader, "orm_2_0.xsd" );
|
// setValidationFor( saxReader, "orm_2_0.xsd" );
|
||||||
document = saxReader.read( source );
|
// document = saxReader.read( source );
|
||||||
if ( errorHandler.hasErrors() ) {
|
// if ( errorHandler.hasErrors() ) {
|
||||||
throw errorHandler.getErrors().get( 0 );
|
// throw errorHandler.getErrors().get( 0 );
|
||||||
}
|
// }
|
||||||
return new XmlDocumentImpl( document, origin.getType(), origin.getName() );
|
// return new XmlDocumentImpl( document, origin.getType(), origin.getName() );
|
||||||
}
|
// }
|
||||||
catch ( Exception orm2Problem ) {
|
// catch ( Exception orm2Problem ) {
|
||||||
if ( LOG.isDebugEnabled() ) {
|
// if ( LOG.isDebugEnabled() ) {
|
||||||
LOG.debugf( "Problem parsing XML using orm 2 xsd : %s", orm2Problem.getMessage() );
|
// LOG.debugf( "Problem parsing XML using orm 2 xsd : %s", orm2Problem.getMessage() );
|
||||||
}
|
// }
|
||||||
failure = orm2Problem;
|
// failure = orm2Problem;
|
||||||
errorHandler.reset();
|
// errorHandler.reset();
|
||||||
|
//
|
||||||
if ( document != null ) {
|
// if ( document != null ) {
|
||||||
// next try with orm 1.0 xsd validation
|
// // next try with orm 1.0 xsd validation
|
||||||
try {
|
// try {
|
||||||
setValidationFor( saxReader, "orm_1_0.xsd" );
|
// setValidationFor( saxReader, "orm_1_0.xsd" );
|
||||||
document = saxReader.read( new StringReader( document.asXML() ) );
|
// document = saxReader.read( new StringReader( document.asXML() ) );
|
||||||
if ( errorHandler.hasErrors() ) {
|
// if ( errorHandler.hasErrors() ) {
|
||||||
errorHandler.logErrors();
|
// errorHandler.logErrors();
|
||||||
throw errorHandler.getErrors().get( 0 );
|
// throw errorHandler.getErrors().get( 0 );
|
||||||
}
|
// }
|
||||||
return new XmlDocumentImpl( document, origin.getType(), origin.getName() );
|
// return new XmlDocumentImpl( document, origin.getType(), origin.getName() );
|
||||||
}
|
// }
|
||||||
catch ( Exception orm1Problem ) {
|
// catch ( Exception orm1Problem ) {
|
||||||
if ( LOG.isDebugEnabled() ) {
|
// if ( LOG.isDebugEnabled() ) {
|
||||||
LOG.debugf( "Problem parsing XML using orm 1 xsd : %s", orm1Problem.getMessage() );
|
// LOG.debugf( "Problem parsing XML using orm 1 xsd : %s", orm1Problem.getMessage() );
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
throw new InvalidMappingException( "Unable to read XML", origin.getType(), origin.getName(), failure );
|
// throw new InvalidMappingException( "Unable to read XML", origin.getType(), origin.getName(), failure );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private void setValidationFor(SAXReader saxReader, String xsd) {
|
// private void setValidationFor(SAXReader saxReader, String xsd) {
|
||||||
try {
|
// try {
|
||||||
saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
|
// saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
|
||||||
//saxReader.setFeature( "http://apache.org/xml/features/validation/dynamic", true );
|
// //saxReader.setFeature( "http://apache.org/xml/features/validation/dynamic", true );
|
||||||
//set the default schema locators
|
// //set the default schema locators
|
||||||
saxReader.setProperty(
|
// saxReader.setProperty(
|
||||||
"http://apache.org/xml/properties/schema/external-schemaLocation",
|
// "http://apache.org/xml/properties/schema/external-schemaLocation",
|
||||||
"http://java.sun.com/xml/ns/persistence/orm " + xsd
|
// "http://java.sun.com/xml/ns/persistence/orm " + xsd
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
catch ( SAXException e ) {
|
// catch ( SAXException e ) {
|
||||||
saxReader.setValidation( false );
|
// saxReader.setValidation( false );
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// this is the version of the code I'd like to use, but it unfortunately works very differently between
|
// this is the version of the code I'd like to use, but it unfortunately works very differently between
|
||||||
// JDK 1.5 ad JDK 1.6. On 1.5 the vaildation "passes" even with invalid content.
|
// JDK 1.5 ad JDK 1.6. On 1.5 the vaildation "passes" even with invalid content.
|
||||||
|
@ -132,134 +147,131 @@ public class MappingReader {
|
||||||
// 2) Document the issue on 1.5 and how to fix (specifying alternate SchemaFactory instance)
|
// 2) Document the issue on 1.5 and how to fix (specifying alternate SchemaFactory instance)
|
||||||
// 3) Use a specific JAXP library (Xerces2, Saxon, Jing, MSV) and its SchemaFactory instance directly
|
// 3) Use a specific JAXP library (Xerces2, Saxon, Jing, MSV) and its SchemaFactory instance directly
|
||||||
|
|
||||||
// public XmlDocument readMappingDocument(EntityResolver entityResolver, InputSource source, Origin origin) {
|
public XmlDocument readMappingDocument(EntityResolver entityResolver, InputSource source, Origin origin) {
|
||||||
// ErrorLogger errorHandler = new ErrorLogger();
|
ErrorLogger errorHandler = new ErrorLogger();
|
||||||
//
|
|
||||||
// SAXReader saxReader = new SAXReader( new DOMDocumentFactory() );
|
SAXReader saxReader = new SAXReader( new DOMDocumentFactory() );
|
||||||
// saxReader.setEntityResolver( entityResolver );
|
saxReader.setEntityResolver( entityResolver );
|
||||||
// saxReader.setErrorHandler( errorHandler );
|
saxReader.setErrorHandler( errorHandler );
|
||||||
// saxReader.setMergeAdjacentText( true );
|
saxReader.setMergeAdjacentText( true );
|
||||||
//
|
|
||||||
// Document documentTree = null;
|
Document documentTree;
|
||||||
//
|
|
||||||
// // IMPL NOTE : here we enable DTD validation in case the mapping is a HBM file. This will validate
|
// IMPL NOTE : here we enable DTD validation in case the mapping is a HBM file. This will validate
|
||||||
// // the document as it is parsed. This is needed because the DTD defines default values that have to be
|
// the document as it is parsed. This is needed because the DTD defines default values that have to be
|
||||||
// // applied as the document is parsed, so thats something we need to account for as we (if we) transition
|
// applied as the document is parsed, so thats something we need to account for as we (if we) transition
|
||||||
// // to XSD.
|
// to XSD.
|
||||||
// saxReader.setValidation( true );
|
saxReader.setValidation( true );
|
||||||
// try {
|
try {
|
||||||
// documentTree = saxReader.read( source );
|
documentTree = saxReader.read( source );
|
||||||
// }
|
}
|
||||||
// catch ( DocumentException e ) {
|
catch ( DocumentException e ) {
|
||||||
// // we had issues reading the input, most likely malformed document or validation error against DTD
|
// we had issues reading the input, most likely malformed document or validation error against DTD
|
||||||
// throw new InvalidMappingException( "Unable to read XML", origin.getType(), origin.getName(), e );
|
throw new InvalidMappingException( "Unable to read XML", origin.getType(), origin.getName(), e );
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// Element rootElement = documentTree.getRootElement();
|
Element rootElement = documentTree.getRootElement();
|
||||||
// if ( rootElement == null ) {
|
if ( rootElement == null ) {
|
||||||
// throw new InvalidMappingException( "No root element", origin.getType(), origin.getName() );
|
throw new InvalidMappingException( "No root element", origin.getType(), origin.getName() );
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if ( "entity-mappings".equals( rootElement.getName() ) ) {
|
if ( "entity-mappings".equals( rootElement.getName() ) ) {
|
||||||
// final String explicitVersion = rootElement.attributeValue( "version" );
|
final String explicitVersion = rootElement.attributeValue( "version" );
|
||||||
// final String xsdVersionString = explicitVersion == null ? ASSUMED_ORM_XSD_VERSION : explicitVersion;
|
final String xsdVersionString = explicitVersion == null ? ASSUMED_ORM_XSD_VERSION : explicitVersion;
|
||||||
// final SupportedOrmXsdVersion xsdVersion = SupportedOrmXsdVersion.parse( xsdVersionString );
|
final SupportedOrmXsdVersion xsdVersion = SupportedOrmXsdVersion.parse( xsdVersionString, origin );
|
||||||
// final Schema schema = xsdVersion == SupportedOrmXsdVersion.ORM_1_0 ? orm1Schema() : orm2Schema();
|
final Schema schema = xsdVersion.getSchema();
|
||||||
// try {
|
try {
|
||||||
// schema.newValidator().validate( new DOMSource( (org.w3c.dom.Document) documentTree ) );
|
schema.newValidator().validate( new DOMSource( (org.w3c.dom.Document) documentTree ) );
|
||||||
// }
|
}
|
||||||
// catch ( SAXException e ) {
|
catch ( SAXException e ) {
|
||||||
// throw new InvalidMappingException( "Validation problem", origin.getType(), origin.getName(), e );
|
throw new InvalidMappingException( "Validation problem", origin.getType(), origin.getName(), e );
|
||||||
// }
|
}
|
||||||
// catch ( IOException e ) {
|
catch ( IOException e ) {
|
||||||
// throw new InvalidMappingException( "Validation problem", origin.getType(), origin.getName(), e );
|
throw new InvalidMappingException( "Validation problem", origin.getType(), origin.getName(), e );
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// else {
|
else {
|
||||||
// if ( errorHandler.getError() != null ) {
|
if ( errorHandler.hasErrors() ) {
|
||||||
// throw new InvalidMappingException(
|
errorHandler.logErrors();
|
||||||
// "Error validating hibernate-mapping against DTD",
|
errorHandler.reset();
|
||||||
// origin.getType(),
|
throw new InvalidMappingException(
|
||||||
// origin.getName(),
|
"Error validating hibernate-mapping against DTD; see logs for details",
|
||||||
// errorHandler.getError()
|
origin.getType(),
|
||||||
// );
|
origin.getName()
|
||||||
// }
|
);
|
||||||
// }
|
}
|
||||||
//
|
}
|
||||||
// return new XmlDocumentImpl( documentTree, origin );
|
|
||||||
// }
|
return new XmlDocumentImpl( documentTree, origin );
|
||||||
//
|
}
|
||||||
// public static enum SupportedOrmXsdVersion {
|
|
||||||
// ORM_1_0,
|
public static enum SupportedOrmXsdVersion {
|
||||||
// ORM_2_0;
|
ORM_1_0( "org/hibernate/jpa/orm_1_0.xsd" ),
|
||||||
//
|
ORM_2_0( "org/hibernate/jpa/orm_2_0.xsd"),
|
||||||
// public static SupportedOrmXsdVersion parse(String name) {
|
ORM_2_1( "org/hibernate/jpa/orm_2_1.xsd");
|
||||||
// if ( "1.0".equals( name ) ) {
|
|
||||||
// return ORM_1_0;
|
private final String schemaResourceName;
|
||||||
// }
|
private Schema schema;
|
||||||
// else if ( "2.0".equals( name ) ) {
|
|
||||||
// return ORM_2_0;
|
private SupportedOrmXsdVersion(String schemaResourceName) {
|
||||||
// }
|
this.schemaResourceName = schemaResourceName;
|
||||||
// throw new IllegalArgumentException( "Unsupported orm.xml XSD version encountered [" + name + "]" );
|
}
|
||||||
// }
|
|
||||||
// }
|
public static SupportedOrmXsdVersion parse(String name, Origin origin) {
|
||||||
//
|
if ( "1.0".equals( name ) ) {
|
||||||
//
|
return ORM_1_0;
|
||||||
// public static final String ORM_1_SCHEMA_NAME = "org/hibernate/ejb/orm_1_0.xsd";
|
}
|
||||||
// public static final String ORM_2_SCHEMA_NAME = "org/hibernate/ejb/orm_2_0.xsd";
|
else if ( "2.0".equals( name ) ) {
|
||||||
//
|
return ORM_2_0;
|
||||||
// private static Schema orm1Schema;
|
}
|
||||||
//
|
else if ( "2.1".equals( name ) ) {
|
||||||
// private static Schema orm1Schema() {
|
return ORM_2_1;
|
||||||
// if ( orm1Schema == null ) {
|
}
|
||||||
// orm1Schema = resolveLocalSchema( ORM_1_SCHEMA_NAME );
|
throw new UnsupportedOrmXsdVersionException( name, origin );
|
||||||
// }
|
}
|
||||||
// return orm1Schema;
|
|
||||||
// }
|
public Schema getSchema() {
|
||||||
//
|
if ( schema == null ) {
|
||||||
// private static Schema orm2Schema;
|
schema = resolveLocalSchema( schemaResourceName );
|
||||||
//
|
}
|
||||||
// private static Schema orm2Schema() {
|
return schema;
|
||||||
// if ( orm2Schema == null ) {
|
}
|
||||||
// orm2Schema = resolveLocalSchema( ORM_2_SCHEMA_NAME );
|
}
|
||||||
// }
|
|
||||||
// return orm2Schema;
|
private static Schema resolveLocalSchema(String schemaName) {
|
||||||
// }
|
return resolveLocalSchema( schemaName, XMLConstants.W3C_XML_SCHEMA_NS_URI );
|
||||||
//
|
}
|
||||||
// private static Schema resolveLocalSchema(String schemaName) {
|
|
||||||
// return resolveLocalSchema( schemaName, XMLConstants.W3C_XML_SCHEMA_NS_URI );
|
private static Schema resolveLocalSchema(String schemaName, String schemaLanguage) {
|
||||||
// }
|
URL url = ConfigHelper.findAsResource( schemaName );
|
||||||
//
|
if ( url == null ) {
|
||||||
// private static Schema resolveLocalSchema(String schemaName, String schemaLanguage) {
|
throw new MappingException( "Unable to locate schema [" + schemaName + "] via classpath" );
|
||||||
// URL url = ConfigHelper.findAsResource( schemaName );
|
}
|
||||||
// if ( url == null ) {
|
try {
|
||||||
// throw new MappingException( "Unable to locate schema [" + schemaName + "] via classpath" );
|
InputStream schemaStream = url.openStream();
|
||||||
// }
|
try {
|
||||||
// try {
|
StreamSource source = new StreamSource(url.openStream());
|
||||||
// InputStream schemaStream = url.openStream();
|
SchemaFactory schemaFactory = SchemaFactory.newInstance( schemaLanguage );
|
||||||
// try {
|
return schemaFactory.newSchema(source);
|
||||||
// StreamSource source = new StreamSource(url.openStream());
|
}
|
||||||
// SchemaFactory schemaFactory = SchemaFactory.newInstance( schemaLanguage );
|
catch ( SAXException e ) {
|
||||||
// return schemaFactory.newSchema(source);
|
throw new MappingException( "Unable to load schema [" + schemaName + "]", e );
|
||||||
// }
|
}
|
||||||
// catch ( SAXException e ) {
|
catch ( IOException e ) {
|
||||||
// throw new MappingException( "Unable to load schema [" + schemaName + "]", e );
|
throw new MappingException( "Unable to load schema [" + schemaName + "]", e );
|
||||||
// }
|
}
|
||||||
// catch ( IOException e ) {
|
finally {
|
||||||
// throw new MappingException( "Unable to load schema [" + schemaName + "]", e );
|
try {
|
||||||
// }
|
schemaStream.close();
|
||||||
// finally {
|
}
|
||||||
// try {
|
catch ( IOException e ) {
|
||||||
// schemaStream.close();
|
log.debugf( "Problem closing schema stream - %s", e.toString() );
|
||||||
// }
|
}
|
||||||
// catch ( IOException e ) {
|
}
|
||||||
// log.warn( "Problem closing schema stream [{}]", e.toString() );
|
}
|
||||||
// }
|
catch ( IOException e ) {
|
||||||
// }
|
throw new MappingException( "Stream error handling schema url [" + url.toExternalForm() + "]" );
|
||||||
// }
|
}
|
||||||
// catch ( IOException e ) {
|
|
||||||
// throw new MappingException( "Stream error handling schema url [" + url.toExternalForm() + "]" );
|
}
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.internal.util.xml;
|
||||||
|
|
||||||
|
import org.hibernate.InvalidMappingException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class UnsupportedOrmXsdVersionException extends InvalidMappingException {
|
||||||
|
public UnsupportedOrmXsdVersionException(String version, Origin origin) {
|
||||||
|
super( "Encountered unsupported orm.xml xsd version [" + version + "]", origin.getType(), origin.getName() );
|
||||||
|
}
|
||||||
|
}
|
|
@ -216,8 +216,8 @@ public class JaxbHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String HBM_SCHEMA_NAME = "org/hibernate/hibernate-mapping-4.0.xsd";
|
public static final String HBM_SCHEMA_NAME = "org/hibernate/hibernate-mapping-4.0.xsd";
|
||||||
public static final String ORM_1_SCHEMA_NAME = "org/hibernate/ejb/orm_1_0.xsd";
|
public static final String ORM_1_SCHEMA_NAME = "org/hibernate/jpa/orm_1_0.xsd";
|
||||||
public static final String ORM_2_SCHEMA_NAME = "org/hibernate/ejb/orm_2_0.xsd";
|
public static final String ORM_2_SCHEMA_NAME = "org/hibernate/jpa/orm_2_0.xsd";
|
||||||
|
|
||||||
private Schema hbmSchema;
|
private Schema hbmSchema;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
version="2.1">
|
version="2.1">
|
||||||
|
|
||||||
<jaxb:bindings schemaLocation="../resources/org/hibernate/ejb/orm_2_0.xsd" node="/xsd:schema">
|
<jaxb:bindings schemaLocation="../resources/org/hibernate/jpa/orm_2_0.xsd" node="/xsd:schema">
|
||||||
<jaxb:schemaBindings>
|
<jaxb:schemaBindings>
|
||||||
<jaxb:nameXmlTransform>
|
<jaxb:nameXmlTransform>
|
||||||
<jaxb:typeName prefix="Jaxb"/>
|
<jaxb:typeName prefix="Jaxb"/>
|
||||||
|
|
|
@ -50,8 +50,9 @@ import static org.junit.Assert.fail;
|
||||||
* @author Strong Liu
|
* @author Strong Liu
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractMockerTest {
|
public abstract class AbstractMockerTest {
|
||||||
private static final String ORM1_MAPPING_XSD = "org/hibernate/ejb/orm_1_0.xsd";
|
private static final String ORM1_MAPPING_XSD = "org/hibernate/jpa/orm_1_0.xsd";
|
||||||
private static final String ORM2_MAPPING_XSD = "org/hibernate/ejb/orm_2_0.xsd";
|
private static final String ORM2_MAPPING_XSD = "org/hibernate/jpa/orm_2_0.xsd";
|
||||||
|
|
||||||
private IndexBuilder indexBuilder;
|
private IndexBuilder indexBuilder;
|
||||||
private Index index;
|
private Index index;
|
||||||
private ServiceRegistry serviceRegistry;
|
private ServiceRegistry serviceRegistry;
|
||||||
|
|
|
@ -25,14 +25,15 @@ package org.hibernate.test.annotations.xml.ejb3;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.Configuration;
|
||||||
|
import org.hibernate.internal.util.xml.UnsupportedOrmXsdVersionException;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.hibernate.MappingException;
|
|
||||||
import org.hibernate.cfg.Configuration;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
@TestForIssue(jiraKey = "HHH-6271")
|
@TestForIssue(jiraKey = "HHH-6271")
|
||||||
public class NonExistentOrmVersionTest extends BaseCoreFunctionalTestCase {
|
public class NonExistentOrmVersionTest extends BaseCoreFunctionalTestCase {
|
||||||
|
@ -44,14 +45,9 @@ public class NonExistentOrmVersionTest extends BaseCoreFunctionalTestCase {
|
||||||
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFileName );
|
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFileName );
|
||||||
config.addInputStream( is );
|
config.addInputStream( is );
|
||||||
config.buildMappings();
|
config.buildMappings();
|
||||||
|
fail( "Expecting failure due to unsupported xsd version" );
|
||||||
}
|
}
|
||||||
catch ( MappingException mappingException ) {
|
catch ( UnsupportedOrmXsdVersionException expected ) {
|
||||||
Throwable cause = mappingException.getCause();
|
|
||||||
assertTrue(
|
|
||||||
cause.getMessage().contains(
|
|
||||||
"Value '3.0' of attribute 'version' of element 'entity-mappings' is not valid"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||||
|
log4j.appender.stdout.Target=System.out
|
||||||
|
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||||
|
|
||||||
|
|
||||||
|
log4j.rootLogger=info, stdout
|
||||||
|
|
||||||
|
log4j.logger.org.hibernate.tool.hbm2ddl=trace
|
||||||
|
log4j.logger.org.hibernate.testing.cache=debug
|
||||||
|
|
||||||
|
# SQL Logging - HHH-6833
|
||||||
|
log4j.logger.org.hibernate.SQL=debug
|
||||||
|
|
||||||
|
log4j.logger.org.hibernate.hql.internal.ast=debug
|
||||||
|
|
||||||
|
log4j.logger.org.hibernate.sql.ordering.antlr=debug
|
Loading…
Reference in New Issue