Skip to content

Commit 084dfbc

Browse files
committed
HHH-18455 - Deprecate Binder.bind(Source source, Origin origin)
Introduce JaxbBindingSource interface to avoid needing an InputStreamAccess instance variable inside AbtractBinder Remove unused XmlSources.fromDocument Remove unused JaxpSourceXmlSource Signed-off-by: Jan Schatteman <[email protected]>
1 parent f730293 commit 084dfbc

File tree

9 files changed

+75
-94
lines changed

9 files changed

+75
-94
lines changed

hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/AbstractBinder.java

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import javax.xml.transform.Source;
1414
import javax.xml.validation.Schema;
1515

16+
import org.hibernate.HibernateException;
1617
import org.hibernate.boot.MappingException;
1718
import org.hibernate.boot.ResourceStreamLocator;
1819
import org.hibernate.boot.archive.internal.RepeatableInputStreamAccess;
@@ -38,8 +39,6 @@ public abstract class AbstractBinder<T> implements Binder<T> {
3839

3940
private final LocalXmlResourceResolver xmlResourceResolver;
4041

41-
protected InputStreamAccess streamAccess;
42-
4342
protected AbstractBinder(ResourceStreamLocator resourceStreamLocator) {
4443
this.xmlResourceResolver = new LocalXmlResourceResolver( resourceStreamLocator );
4544
}
@@ -51,59 +50,60 @@ public <X extends T> Binding<X> bind(InputStream stream, Origin origin) {
5150

5251
@Override
5352
public <X extends T> Binding<X> bind(InputStreamAccess streamAccess, Origin origin) {
54-
this.streamAccess = streamAccess;
55-
final XMLEventReader eventReader = createReader( streamAccess.accessInputStream(), origin );
53+
final JaxbBindingSource jaxbBindingSource = createReader( streamAccess, origin );
5654
try {
57-
return doBind( eventReader, origin );
55+
return doBind( jaxbBindingSource );
5856
}
5957
finally {
6058
try {
61-
eventReader.close();
59+
jaxbBindingSource.getEventReader().close();
6260
}
6361
catch (XMLStreamException e) {
6462
log.debug( "Unable to close StAX reader", e );
6563
}
6664
}
6765
}
6866

69-
protected XMLEventReader createReader(InputStream stream, Origin origin) {
70-
try {
71-
// create a standard StAX reader
72-
final XMLEventReader staxReader = staxFactory().createXMLEventReader( stream );
73-
// and wrap it in a buffered reader (keeping 100 element sized buffer)
74-
return new BufferedXMLEventReader( staxReader, 100 );
75-
}
76-
catch ( XMLStreamException e ) {
77-
throw new MappingException( "Unable to create StAX reader", e, origin );
78-
}
67+
protected JaxbBindingSource createReader(InputStreamAccess streamAccess, Origin origin) {
68+
return new JaxbBindingSource() {
69+
@Override
70+
public Origin getOrigin() {
71+
return origin;
72+
}
73+
74+
@Override
75+
public InputStreamAccess getInputStreamAccess() {
76+
return streamAccess;
77+
}
78+
79+
@Override
80+
public XMLEventReader getEventReader() {
81+
try {
82+
// create a standard StAX reader
83+
final XMLEventReader staxReader = staxFactory().createXMLEventReader( streamAccess.accessInputStream() );
84+
// and wrap it in a buffered reader (keeping 100 element sized buffer)
85+
return new BufferedXMLEventReader( staxReader, 100 );
86+
}
87+
catch ( XMLStreamException e ) {
88+
throw new MappingException( "Unable to create StAX reader", e, origin );
89+
}
90+
}
91+
};
7992
}
8093

8194
@Override
8295
public <X extends T> Binding<X> bind(Source source, Origin origin) {
83-
final XMLEventReader eventReader = createReader( source, origin );
84-
return doBind( eventReader, origin );
85-
}
86-
87-
protected XMLEventReader createReader(Source source, Origin origin) {
88-
try {
89-
// create a standard StAX reader
90-
final XMLEventReader staxReader = staxFactory().createXMLEventReader( source );
91-
// and wrap it in a buffered reader (keeping 100 element sized buffer)
92-
return new BufferedXMLEventReader( staxReader, 100 );
93-
}
94-
catch ( XMLStreamException e ) {
95-
throw new MappingException( "Unable to create StAX reader", e, origin );
96-
}
96+
throw new HibernateException( "The Binder.bind(Source, Origin) method is no longer supported" );
9797
}
9898

99-
private <X extends T> Binding<X> doBind(XMLEventReader eventReader, Origin origin) {
99+
private <X extends T> Binding<X> doBind(JaxbBindingSource jaxbBindingSource) {
100100
try {
101-
final StartElement rootElementStartEvent = seekRootElementStartEvent( eventReader, origin );
102-
return doBind( eventReader, rootElementStartEvent, origin );
101+
final StartElement rootElementStartEvent = seekRootElementStartEvent( jaxbBindingSource.getEventReader(), jaxbBindingSource.getOrigin() );
102+
return doBind( jaxbBindingSource, rootElementStartEvent );
103103
}
104104
finally {
105105
try {
106-
eventReader.close();
106+
jaxbBindingSource.getEventReader().close();
107107
}
108108
catch (Exception e) {
109109
log.debug( "Unable to close StAX reader", e );
@@ -146,7 +146,7 @@ protected StartElement seekRootElementStartEvent(XMLEventReader staxEventReader,
146146
return rootElementStartEvent.asStartElement();
147147
}
148148

149-
protected abstract <X extends T> Binding<X> doBind(XMLEventReader staxEventReader, StartElement rootElementStartEvent, Origin origin);
149+
protected abstract <X extends T> Binding<X> doBind(JaxbBindingSource jaxbBindingSource, StartElement rootElementStartEvent);
150150

151151
@SuppressWarnings("unused")
152152
protected static boolean hasNamespace(StartElement startElement) {

hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/ConfigurationBinder.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.hibernate.Internal;
1313
import org.hibernate.boot.ResourceStreamLocator;
14-
import org.hibernate.boot.jaxb.Origin;
1514
import org.hibernate.boot.jaxb.configuration.spi.JaxbPersistenceImpl;
1615
import org.hibernate.boot.jaxb.internal.stax.ConfigurationEventReader;
1716
import org.hibernate.boot.jaxb.spi.Binding;
@@ -40,10 +39,9 @@ protected XmlValidationMode getXmlValidationMode() {
4039

4140
@Override
4241
protected <X extends JaxbPersistenceImpl> Binding<X> doBind(
43-
XMLEventReader staxEventReader,
44-
StartElement rootElementStartEvent,
45-
Origin origin) {
46-
final XMLEventReader reader = new ConfigurationEventReader( staxEventReader, xmlEventFactory );
42+
JaxbBindingSource jaxbBindingSource,
43+
StartElement rootElementStartEvent) {
44+
final XMLEventReader reader = new ConfigurationEventReader( jaxbBindingSource.getEventReader(), xmlEventFactory );
4745

4846
final Schema xsd;
4947
// evaluate extended (the former validate_xml 'true') in case anyone should override getXmlValidationMode() to switch it on
@@ -58,10 +56,10 @@ protected <X extends JaxbPersistenceImpl> Binding<X> doBind(
5856
reader,
5957
xsd,
6058
jaxbContext(),
61-
origin
59+
jaxbBindingSource.getOrigin()
6260
);
6361
//noinspection unchecked
64-
return new Binding<>( (X) bindingRoot, origin );
62+
return new Binding<>( (X) bindingRoot, jaxbBindingSource.getOrigin() );
6563
}
6664

6765
@Internal
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.boot.jaxb.internal;
6+
7+
8+
import org.hibernate.boot.archive.spi.InputStreamAccess;
9+
import org.hibernate.boot.jaxb.Origin;
10+
11+
import javax.xml.stream.XMLEventReader;
12+
13+
/**
14+
* @author Jan Schatteman
15+
*/
16+
public interface JaxbBindingSource {
17+
Origin getOrigin();
18+
InputStreamAccess getInputStreamAccess();
19+
XMLEventReader getEventReader();
20+
}

hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/JaxpSourceXmlSource.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/MappingBinder.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ protected XmlValidationMode getXmlValidationMode() {
141141

142142
@Override
143143
protected <X extends JaxbBindableMappingDescriptor> Binding<X> doBind(
144-
XMLEventReader staxEventReader,
145-
StartElement rootElementStartEvent,
146-
Origin origin) {
144+
JaxbBindingSource jaxbBindingSource,
145+
StartElement rootElementStartEvent) {
147146
final String rootElementLocalName = rootElementStartEvent.getName().getLocalPart();
147+
final XMLEventReader staxEventReader = jaxbBindingSource.getEventReader();
148+
final Origin origin = jaxbBindingSource.getOrigin();
148149
if ( "hibernate-mapping".equals( rootElementLocalName ) ) {
149150
if ( log.isTraceEnabled() ) {
150151
log.tracef( "Performing JAXB binding of hbm.xml document: %s", origin.toString() );
@@ -181,7 +182,7 @@ protected <X extends JaxbBindableMappingDescriptor> Binding<X> doBind(
181182
final XmlValidationMode validationMode = getXmlValidationMode();
182183
if ( validationMode == XmlValidationMode.STRICT ) {
183184
// deals with StrictValidationErrorHandler, etc
184-
doStrictValidation( origin );
185+
doStrictValidation( jaxbBindingSource );
185186
xsd = null;
186187
}
187188
else if ( validationMode == XmlValidationMode.EXTENDED ) {
@@ -208,21 +209,20 @@ else if ( validationMode == XmlValidationMode.EXTENDED ) {
208209
}
209210
}
210211

211-
private void doStrictValidation(Origin origin) {
212+
private void doStrictValidation(JaxbBindingSource jaxbBindingSource) {
212213
StrictValidationErrorHandler errorHandler = new StrictValidationErrorHandler();
213214
try {
214215
Validator validator = MappingXsdSupport.latestJpaDescriptor().getSchema()
215216
.newValidator();
216217
validator.setErrorHandler( errorHandler );
217218
// We need 'clean' access to the InputStream at this point, using the staxEventReader leads to errors
218-
validator.validate( new StAXSource(
219-
createReader( streamAccess.accessInputStream(), origin ) ) );
219+
validator.validate( new StAXSource(jaxbBindingSource.getEventReader()) );
220220
}
221221
catch (Exception e) {
222222
throw new MappingException(
223223
"Strict validation failure: " + errorHandler.getMessage(),
224224
e,
225-
origin );
225+
jaxbBindingSource.getOrigin() );
226226
}
227227
}
228228

hibernate-core/src/main/java/org/hibernate/boot/jaxb/internal/XmlSources.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.util.function.Consumer;
1313
import java.util.jar.JarEntry;
1414
import java.util.jar.JarFile;
15-
import javax.xml.transform.dom.DOMSource;
1615

1716
import org.hibernate.boot.MappingNotFoundException;
1817
import org.hibernate.boot.archive.spi.InputStreamAccess;
@@ -21,7 +20,6 @@
2120
import org.hibernate.boot.jaxb.spi.XmlSource;
2221
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
2322

24-
import org.w3c.dom.Document;
2523

2624
import static org.hibernate.boot.jaxb.JaxbLogger.JAXB_LOGGER;
2725

@@ -109,12 +107,6 @@ public static XmlSource fromStream(InputStream inputStream) {
109107
return new InputStreamXmlSource( origin, inputStream, false );
110108
}
111109

112-
public static XmlSource fromDocument(Document document) {
113-
JAXB_LOGGER.trace( "reading mappings from DOM" );
114-
final Origin origin = new Origin( SourceType.DOM, Origin.UNKNOWN_FILE_PATH );
115-
return new JaxpSourceXmlSource( origin, new DOMSource( document ) );
116-
}
117-
118110
/**
119111
* Read all {@code .hbm.xml} mappings from a jar file and pass them
120112
* to the given {@link Consumer}.

hibernate-core/src/main/java/org/hibernate/boot/jaxb/spi/Binder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ public interface Binder<T> {
2323
* @param source The XML source.
2424
* @param origin The descriptor of the source origin
2525
* @return The bound JAXB model
26+
* @deprecated Use {@link #bind(InputStreamAccess, Origin)} instead
2627
*/
28+
@Deprecated(since = "7.2")
2729
<X extends T> Binding<X> bind(Source source, Origin origin);
2830

2931
/**

hibernate-core/src/main/java/org/hibernate/jpa/boot/spi/PersistenceXmlParser.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
import java.util.List;
1515
import java.util.Map;
1616
import java.util.Properties;
17-
import javax.xml.transform.stream.StreamSource;
1817

1918
import org.hibernate.boot.archive.internal.ArchiveHelper;
19+
import org.hibernate.boot.archive.internal.ByteArrayInputStreamAccess;
2020
import org.hibernate.boot.jaxb.Origin;
2121
import org.hibernate.boot.jaxb.SourceType;
2222
import org.hibernate.boot.jaxb.configuration.spi.JaxbPersistenceImpl;
@@ -342,10 +342,9 @@ private JaxbPersistenceImpl loadUrlWithJaxb(URL xmlUrl) {
342342
conn.setUseCaches( false );
343343

344344
try ( InputStream inputStream = conn.getInputStream() ) {
345-
final StreamSource inputSource = new StreamSource( inputStream );
346345
final ConfigurationBinder configurationBinder = new ConfigurationBinder( classLoaderService );
347346
final Binding<JaxbPersistenceImpl> binding =
348-
configurationBinder.bind( inputSource, new Origin( SourceType.URL, resourceName ) );
347+
configurationBinder.bind( new ByteArrayInputStreamAccess( resourceName, inputStream.readAllBytes() ), new Origin( SourceType.URL, resourceName ) );
349348
return binding.getRoot();
350349
}
351350
catch (IOException e) {

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/jakarta/JakartaXmlSmokeTests.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.io.InputStream;
99
import java.util.Map;
1010
import java.util.stream.Stream;
11-
import javax.xml.transform.stream.StreamSource;
1211

1312
import org.hibernate.boot.jaxb.Origin;
1413
import org.hibernate.boot.jaxb.SourceType;
@@ -38,10 +37,10 @@ public class JakartaXmlSmokeTests {
3837
public void testLoadingOrmXml(ServiceRegistryScope scope) {
3938
final ClassLoaderService cls = scope.getRegistry().getService( ClassLoaderService.class );
4039
final MappingBinder mappingBinder = new MappingBinder( cls, MappingBinder.DEFAULT_VALIDATING );
41-
final InputStream inputStream = cls.locateResourceStream( "xml/jakarta/simple/orm.xml" );
40+
final String resourceName = "xml/jakarta/simple/orm.xml";
41+
final InputStream inputStream = cls.locateResourceStream( resourceName );
4242
try {
43-
final Binding<JaxbEntityMappingsImpl> binding = mappingBinder.bind( new StreamSource( inputStream ), new Origin( SourceType.RESOURCE, "xml/jakarta/simple/orm.xml" ) );
44-
43+
final Binding<JaxbEntityMappingsImpl> binding = mappingBinder.bind( inputStream, new Origin( SourceType.RESOURCE, resourceName ) );
4544
assertThat( binding.getRoot()
4645
.getEntities()
4746
.stream()

0 commit comments

Comments
 (0)