HHH-8344 metamodel JAXB processing should throw

UnsupportedOrmXsdVersionException
This commit is contained in:
Brett Meyer 2013-07-02 18:41:10 -04:00
parent 5d114797e1
commit f81f12317d
3 changed files with 26 additions and 30 deletions

View File

@ -82,19 +82,9 @@ public class JaxbMappingProcessor extends AbstractJaxbProcessor{
final String elementName = event.asStartElement().getName().getLocalPart();
final Schema validationSchema;
if ( "entity-mappings".equals( elementName ) ) {
// final Attribute attribute = event.asStartElement().getAttributeByName( ORM_VERSION_ATTRIBUTE_QNAME );
// final String explicitVersion = attribute == null ? null : attribute.getValue();
// validationSchema = validateXml ? resolveSupportedOrmXsd( explicitVersion, origin ) : null;
/**
* here we always use JPA 2.1 schema to do the validation, since the {@link LegacyJPAEventReader} already
* transform the legacy orm.xml to JPA 2.1 namespace and version.
*
* This may causing some problems, like a jpa 1.0 orm.xml has some element which only available in the later
* version, which is "invalid" but due to the fact of we're using the latest schema to do the validation, then
* it is "valid". don't know if this will cause any problem, but let's do it for now.
*/
validationSchema = validateXml ? MappingReader.SupportedOrmXsdVersion.ORM_2_1.getSchema() : null;
final Attribute attribute = event.asStartElement().getAttributeByName( ORM_VERSION_ATTRIBUTE_QNAME );
final String explicitVersion = attribute == null ? null : attribute.getValue();
validationSchema = validateXml ? resolveSupportedOrmXsd( explicitVersion, origin ) : null;
}
else {
validationSchema = validateXml ? MappingReader.SupportedOrmXsdVersion.HBM_4_0.getSchema() : null;
@ -166,9 +156,24 @@ public class JaxbMappingProcessor extends AbstractJaxbProcessor{
}
private Schema resolveSupportedOrmXsd(String explicitVersion, Origin origin) {
if ( StringHelper.isEmpty( explicitVersion ) ) {
return MappingReader.SupportedOrmXsdVersion.ORM_2_1.getSchema();
}
return MappingReader.SupportedOrmXsdVersion.parse( explicitVersion, origin ).getSchema();
// Here we always use JPA 2.1 schema to do the validation, since the {@link LegacyJPAEventReader} already
// transforms the legacy orm.xml to JPA 2.1 namespace and version.
//
// This may cause some problems, like a jpa 1.0 orm.xml having some element which is only available in the later
// version. It is "invalid" but due to the fact we're using the latest schema to do the validation, then
// it is "valid". Don't know if this will cause any problems, but let's do it for now.
//
// However, still check for the validity of the version by calling #parse. If someone explicitly uses a value
// that doesn't exist, we still need to throw the exception.
@SuppressWarnings("unused")
MappingReader.SupportedOrmXsdVersion version = MappingReader.SupportedOrmXsdVersion.parse( explicitVersion, origin );
// return version.getSchema();
return MappingReader.SupportedOrmXsdVersion.ORM_2_1.getSchema();
}
}

View File

@ -30,7 +30,6 @@ import java.io.InputStream;
import org.hibernate.InvalidMappingException;
import org.hibernate.internal.util.xml.UnsupportedOrmXsdVersionException;
import org.hibernate.metamodel.MetadataSources;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Test;
@ -39,7 +38,6 @@ import org.junit.Test;
public class NonExistentOrmVersionTest extends BaseCoreFunctionalTestCase {
@Test
@FailureExpectedWithNewMetamodel
public void testNonExistentOrmVersion() {
try {
MetadataSources sources = new MetadataSources( buildBootstrapServiceRegistry() );

View File

@ -23,21 +23,19 @@
*/
package org.hibernate.test.annotations.xml.ejb3;
import static org.junit.Assert.assertEquals;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.byteman.BytemanHelper;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.jboss.byteman.contrib.bmunit.BMRule;
import org.jboss.byteman.contrib.bmunit.BMRules;
import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.byteman.BytemanHelper;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import static org.junit.Assert.assertEquals;
@TestForIssue(jiraKey = "HHH-6271")
@RunWith(BMUnitRunner.class)
public class OrmVersion1SupportedTest extends BaseCoreFunctionalTestCase {
@ -55,12 +53,7 @@ public class OrmVersion1SupportedTest extends BaseCoreFunctionalTestCase {
action = "countInvocation()",
name = "testOrm1Support")
})
@FailureExpectedWithNewMetamodel // This doesn't actually work since this test class requires BMUnitRunner instead of
// CustomRunner. Thus, the if block below skips the test if the new metamodel is being used.
public void testOrm1Support() {
if ( isMetadataUsed ) {
return;
}
// need to call buildSessionFactory, because this test is not using org.hibernate.testing.junit4.CustomRunner
buildSessionFactory();