Skip to content

Commit 67742fb

Browse files
committed
HHH-17404 remove use of reflection
1 parent 04248ea commit 67742fb

File tree

10 files changed

+59
-135
lines changed

10 files changed

+59
-135
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.hibernate.QueryTimeoutException;
2020
import org.hibernate.boot.model.FunctionContributions;
2121
import org.hibernate.boot.model.TypeContributions;
22+
import org.hibernate.cfg.MappingSettings;
2223
import org.hibernate.dialect.aggregate.AggregateSupport;
2324
import org.hibernate.dialect.aggregate.OracleAggregateSupport;
2425
import org.hibernate.dialect.function.CommonFunctionFactory;
@@ -98,6 +99,7 @@
9899
import org.hibernate.type.descriptor.sql.internal.NamedNativeOrdinalEnumDdlTypeImpl;
99100
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
100101
import org.hibernate.type.format.jackson.JacksonIntegration;
102+
import org.hibernate.type.format.jackson.JacksonJsonFormatMapper;
101103
import org.hibernate.type.spi.TypeConfiguration;
102104

103105
import jakarta.persistence.GenerationType;
@@ -108,13 +110,15 @@
108110
import static org.hibernate.LockOptions.NO_WAIT;
109111
import static org.hibernate.LockOptions.SKIP_LOCKED;
110112
import static org.hibernate.LockOptions.WAIT_FOREVER;
113+
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_OSON_DISABLED;
111114
import static org.hibernate.dialect.DialectLogging.DIALECT_MESSAGE_LOGGER;
112115
import static org.hibernate.dialect.OracleJdbcHelper.getArrayJdbcTypeConstructor;
113116
import static org.hibernate.dialect.OracleJdbcHelper.getNestedTableJdbcTypeConstructor;
114117
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
115118
import static org.hibernate.internal.util.JdbcExceptionHelper.extractErrorCode;
116119
import static org.hibernate.internal.util.StringHelper.isEmpty;
117120
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
121+
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
118122
import static org.hibernate.query.common.TemporalUnit.DAY;
119123
import static org.hibernate.query.common.TemporalUnit.HOUR;
120124
import static org.hibernate.query.common.TemporalUnit.MINUTE;
@@ -183,8 +187,7 @@ public class OracleDialect extends Dialect {
183187

184188
private static final DatabaseVersion MINIMUM_VERSION = DatabaseVersion.make( 19 );
185189

186-
private static final String JACKSON_MAPPER_NAME = "jackson";
187-
private static boolean OracleOsonExtensionUsed = false;
190+
private boolean OracleOsonExtensionUsed = false;
188191

189192
private final OracleUserDefinedTypeExporter userDefinedTypeExporter = new OracleUserDefinedTypeExporter( this );
190193
private final UniqueDelegate uniqueDelegate = new CreateTableUniqueDelegate(this);
@@ -209,9 +212,6 @@ protected void applyAggregateColumnCheck(StringBuilder buf, AggregateColumn aggr
209212
// Is the database accessed using a database service protected by Application Continuity.
210213
protected final boolean applicationContinuity;
211214

212-
// Is the database OSON format should be disabled.
213-
protected final boolean isOracleOsonDisabled;
214-
215215
protected final int driverMajorVersion;
216216

217217
protected final int driverMinorVersion;
@@ -226,7 +226,6 @@ public OracleDialect(DatabaseVersion version) {
226226
autonomous = false;
227227
extended = false;
228228
applicationContinuity = false;
229-
isOracleOsonDisabled = false;
230229
driverMajorVersion = 19;
231230
driverMinorVersion = 0;
232231
}
@@ -240,7 +239,6 @@ public OracleDialect(DialectResolutionInfo info, OracleServerConfiguration serve
240239
autonomous = serverConfiguration.isAutonomous();
241240
extended = serverConfiguration.isExtended();
242241
applicationContinuity = serverConfiguration.isApplicationContinuity();
243-
isOracleOsonDisabled = serverConfiguration.isOSONEnabled();
244242
this.driverMinorVersion = serverConfiguration.getDriverMinorVersion();
245243
this.driverMajorVersion = serverConfiguration.getDriverMajorVersion();
246244
}
@@ -257,7 +255,13 @@ public boolean isApplicationContinuity() {
257255
return applicationContinuity;
258256
}
259257

260-
public boolean isOracleOsonDisabled() {return isOracleOsonDisabled;}
258+
private static boolean isJacksonJsonFormatMapper(ConfigurationService configService) {
259+
// Mirror the behavior of SessionFactoryOptionsBuilder#determineJsonFormatMapper
260+
final String mapperName = configService.getSetting( MappingSettings.JSON_FORMAT_MAPPER,
261+
StandardConverters.STRING,JacksonJsonFormatMapper.SHORT_NAME);
262+
return JacksonJsonFormatMapper.SHORT_NAME.equalsIgnoreCase( mapperName )
263+
|| mapperName == null && JacksonIntegration.getJsonJacksonFormatMapperOrNull() != null;
264+
}
261265

262266
@Override
263267
protected DatabaseVersion getMinimumSupportedVersion() {
@@ -994,20 +998,16 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
994998

995999
final ConfigurationService configService = serviceRegistry.requireService( ConfigurationService.class );
9961000

997-
998-
final String mapperName = configService.getSetting( "hibernate.type.json_format_mapper",
999-
StandardConverters.STRING,JACKSON_MAPPER_NAME);
1000-
10011001
if ( getVersion().isSameOrAfter( 21 ) ) {
1002-
1003-
if ( !isOracleOsonDisabled() && JacksonIntegration.isOracleOsonExtensionAvailable() && JACKSON_MAPPER_NAME.equalsIgnoreCase( mapperName )) {
1002+
final boolean osonDisabled = getBoolean( ORACLE_OSON_DISABLED , configService.getSettings() );
1003+
if ( !osonDisabled && JacksonIntegration.isOracleOsonExtensionAvailable() && isJacksonJsonFormatMapper( configService )) {
10041004
// We must check that that extension is available and actually used.
10051005
typeContributions.contributeJdbcType( OracleOsonJacksonJdbcType.INSTANCE );
10061006
typeContributions.contributeJdbcTypeConstructor( OracleOsonArrayJdbcTypeConstructor.INSTANCE );
10071007

10081008
DIALECT_MESSAGE_LOGGER.DIALECT_LOGGER.log( Logger.Level.DEBUG,
10091009
"Oracle OSON Jackson extension used" );
1010-
// as we speak this is not supported by OSON extension
1010+
// as we speak, this is not supported by OSON extension
10111011
OracleOsonExtensionUsed = true;
10121012
}
10131013
else {
@@ -1017,8 +1017,6 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
10171017
DIALECT_MESSAGE_LOGGER.DIALECT_LOGGER.log( Logger.Level.DEBUG,
10181018
"JacksonIntegration.isOracleOsonExtensionAvailable(): " +
10191019
JacksonIntegration.isOracleOsonExtensionAvailable());
1020-
DIALECT_MESSAGE_LOGGER.DIALECT_LOGGER.log( Logger.Level.DEBUG,
1021-
"hibernate.type.json_format_mapper : " + mapperName);
10221020
}
10231021
typeContributions.contributeJdbcType( OracleJsonJdbcType.INSTANCE );
10241022
typeContributions.contributeJdbcTypeConstructor( OracleJsonArrayJdbcTypeConstructor.NATIVE_INSTANCE );

hibernate-core/src/main/java/org/hibernate/dialect/OracleOsonJacksonArrayJdbcType.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
*/
55
package org.hibernate.dialect;
66

7-
import com.fasterxml.jackson.core.JsonFactory;
87
import com.fasterxml.jackson.core.JsonParser;
98
import oracle.jdbc.OracleType;
9+
import oracle.jdbc.provider.oson.OsonFactory;
1010
import oracle.sql.json.OracleJsonDatum;
1111
import oracle.sql.json.OracleJsonFactory;
1212
import oracle.sql.json.OracleJsonGenerator;
@@ -24,7 +24,6 @@
2424
import org.hibernate.type.descriptor.jdbc.JsonJdbcType;
2525
import org.hibernate.type.format.FormatMapper;
2626
import org.hibernate.type.format.OsonDocumentWriter;
27-
import org.hibernate.type.format.jackson.JacksonOsonFormatMapper;
2827

2928
import java.io.ByteArrayOutputStream;
3029
import java.io.InputStream;
@@ -45,20 +44,7 @@
4544
public class OracleOsonJacksonArrayJdbcType extends OracleJsonArrayJdbcType {
4645

4746

48-
private static final Object osonFactory;
49-
static {
50-
try {
51-
Class osonFactoryKlass = JacksonOsonFormatMapper.class.getClassLoader().loadClass( "oracle.jdbc.provider.oson.OsonFactory" );
52-
osonFactory = osonFactoryKlass.getDeclaredConstructor().newInstance();
53-
}
54-
catch (Exception | LinkageError e) {
55-
// should not happen as OracleOsonJacksonJdbcType is loaded
56-
// only when Oracle OSON JDBC extension is present
57-
// see OracleDialect class.
58-
throw new ExceptionInInitializerError( "OracleOsonJacksonJdbcType class loaded without OSON extension: " + e.getClass()+" "+ e.getMessage());
59-
}
60-
}
61-
47+
private static final OsonFactory osonFactory = new OsonFactory();
6248

6349
public OracleOsonJacksonArrayJdbcType(JdbcType elementJdbcType) {
6450
super(elementJdbcType);
@@ -134,7 +120,7 @@ public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
134120

135121
private X fromOson(InputStream osonBytes, WrapperOptions options) throws Exception {
136122
FormatMapper mapper = options.getJsonFormatMapper();
137-
JsonParser osonParser = ((JsonFactory)osonFactory).createParser( osonBytes );
123+
JsonParser osonParser = osonFactory.createParser( osonBytes );
138124
return mapper.readFromSource( getJavaType(), osonParser, options);
139125
}
140126

hibernate-core/src/main/java/org/hibernate/dialect/OracleOsonJacksonJdbcType.java

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.fasterxml.jackson.core.JsonParser;
1010
import oracle.jdbc.OracleType;
1111
import oracle.jdbc.driver.DatabaseError;
12+
import oracle.jdbc.provider.oson.OsonFactory;
1213
import oracle.sql.json.OracleJsonDatum;
1314
import oracle.sql.json.OracleJsonFactory;
1415
import oracle.sql.json.OracleJsonGenerator;
@@ -27,11 +28,10 @@
2728
import org.hibernate.type.format.FormatMapper;
2829
import org.hibernate.type.format.OsonDocumentReader;
2930
import org.hibernate.type.format.OsonDocumentWriter;
30-
import org.hibernate.type.format.jackson.JacksonOsonFormatMapper;
3131

32-
import java.io.ByteArrayInputStream;
3332
import java.io.ByteArrayOutputStream;
3433
import java.io.InputStream;
34+
import java.nio.charset.StandardCharsets;
3535
import java.sql.CallableStatement;
3636
import java.sql.PreparedStatement;
3737
import java.sql.ResultSet;
@@ -50,20 +50,7 @@ public class OracleOsonJacksonJdbcType extends OracleJsonJdbcType {
5050

5151
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( OracleOsonJacksonJdbcType.class );
5252

53-
private static final Object osonFactory;
54-
static {
55-
try {
56-
Class osonFactoryKlass = JacksonOsonFormatMapper.class.getClassLoader().loadClass( "oracle.jdbc.provider.oson.OsonFactory" );
57-
osonFactory = osonFactoryKlass.getDeclaredConstructor().newInstance();
58-
}
59-
catch (Exception | LinkageError e) {
60-
// should not happen as OracleOsonJacksonJdbcType is loaded
61-
// only when Oracle OSON JDBC extension is present
62-
// see OracleDialect class.
63-
throw new ExceptionInInitializerError( "OracleOsonJacksonJdbcType class loaded without OSON extension: " + e.getClass()+" "+ e.getMessage());
64-
}
65-
}
66-
53+
private static final OsonFactory osonFactory = new OsonFactory();
6754

6855
private OracleOsonJacksonJdbcType(EmbeddableMappingType embeddableMappingType) {
6956
super( embeddableMappingType );
@@ -106,7 +93,7 @@ private <X> byte[] toOson(X value, JavaType<X> javaType, WrapperOptions options)
10693
}
10794

10895
ByteArrayOutputStream out = new ByteArrayOutputStream();
109-
try (JsonGenerator osonGen = ((JsonFactory)osonFactory).createGenerator( out )) {
96+
try (JsonGenerator osonGen = osonFactory.createGenerator( out )) {
11097
mapper.writeToTarget( value, javaType, osonGen, options );
11198
}
11299
return out.toByteArray();
@@ -176,18 +163,6 @@ private X fromOson(InputStream osonBytes, WrapperOptions options) throws Excepti
176163
}
177164
}
178165

179-
private X doExtraction(byte[] bytes, WrapperOptions options) throws SQLException {
180-
if ( bytes == null ) {
181-
return null;
182-
}
183-
184-
try {
185-
return fromOson( new ByteArrayInputStream(bytes) ,options);
186-
}
187-
catch (Exception e) {
188-
throw new SQLException( e );
189-
}
190-
}
191166
private X doExtraction(OracleJsonDatum datum, WrapperOptions options) throws SQLException {
192167
if ( datum == null ) {
193168
return null;
@@ -209,9 +184,13 @@ protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) thro
209184
} catch (SQLException exc) {
210185
if ( exc.getErrorCode() == DatabaseError.EOJ_INVALID_COLUMN_TYPE) {
211186
// this may happen if we are fetching data from an existing schema
212-
// that use CBLOB for JSON column
187+
// that use CBLOB for JSON column In that case we assume byte are
188+
// UTF-8 bytes (i.e not OSON)
213189
LOG.invalidJSONColumnType( OracleType.CLOB.getName(), OracleType.JSON.getName() );
214-
return doExtraction(rs.getBytes( paramIndex ), options);
190+
return OracleOsonJacksonJdbcType.this.fromString(
191+
new String( rs.getBytes( paramIndex ), StandardCharsets.UTF_8 ),
192+
getJavaType(),
193+
options);
215194
} else {
216195
throw exc;
217196
}
@@ -226,9 +205,13 @@ protected X doExtract(CallableStatement statement, int index, WrapperOptions opt
226205
} catch (SQLException exc) {
227206
if ( exc.getErrorCode() == DatabaseError.EOJ_INVALID_COLUMN_TYPE) {
228207
// this may happen if we are fetching data from an existing schema
229-
// that use CBLOB for JSON column
208+
// that use CBLOB for JSON column. In that case we assume byte are
209+
// UTF-8 bytes (i.e not OSON)
230210
LOG.invalidJSONColumnType( OracleType.CLOB.getName(), OracleType.JSON.getName() );
231-
return doExtraction(statement.getBytes( index ), options);
211+
return OracleOsonJacksonJdbcType.this.fromString(
212+
new String( statement.getBytes( index ), StandardCharsets.UTF_8 ),
213+
getJavaType(),
214+
options);
232215
} else {
233216
throw exc;
234217
}
@@ -244,9 +227,13 @@ protected X doExtract(CallableStatement statement, String name, WrapperOptions o
244227
} catch (SQLException exc) {
245228
if ( exc.getErrorCode() == DatabaseError.EOJ_INVALID_COLUMN_TYPE) {
246229
// this may happen if we are fetching data from an existing schema
247-
// that use CBLOB for JSON column
230+
// that use CBLOB for JSON column In that case we assume byte are
231+
// // UTF-8 bytes (i.e not OSON)
248232
LOG.invalidJSONColumnType( OracleType.CLOB.getName(), OracleType.JSON.getName() );
249-
return doExtraction(statement.getBytes( name ), options);
233+
return OracleOsonJacksonJdbcType.this.fromString(
234+
new String( statement.getBytes( name ), StandardCharsets.UTF_8 ),
235+
getJavaType(),
236+
options);
250237
} else {
251238
throw exc;
252239
}

hibernate-core/src/main/java/org/hibernate/dialect/OracleServerConfiguration.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_APPLICATION_CONTINUITY;
2020
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_AUTONOMOUS_DATABASE;
2121
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_EXTENDED_STRING_SIZE;
22-
import static org.hibernate.cfg.DialectSpecificSettings.ORACLE_OSON_DISABLED;
2322
import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean;
2423

2524
/**
@@ -32,7 +31,6 @@ public class OracleServerConfiguration {
3231
private final boolean autonomous;
3332
private final boolean extended;
3433
private final boolean applicationContinuity;
35-
private final boolean osonDisabled;
3634
private final int driverMajorVersion;
3735
private final int driverMinorVersion;
3836

@@ -48,10 +46,6 @@ public boolean isApplicationContinuity() {
4846
return applicationContinuity;
4947
}
5048

51-
public boolean isOSONEnabled() {
52-
return osonDisabled;
53-
}
54-
5549
public int getDriverMajorVersion() {
5650
return driverMajorVersion;
5751
}
@@ -61,28 +55,26 @@ public int getDriverMinorVersion() {
6155
}
6256

6357
public OracleServerConfiguration(boolean autonomous, boolean extended) {
64-
this( autonomous, extended, false, false, 19, 0 );
58+
this( autonomous, extended, false, 19, 0 );
6559
}
6660

6761
public OracleServerConfiguration(
6862
boolean autonomous,
6963
boolean extended,
7064
int driverMajorVersion,
7165
int driverMinorVersion) {
72-
this( autonomous, extended, false, false, driverMajorVersion, driverMinorVersion );
66+
this( autonomous, extended, false, driverMajorVersion, driverMinorVersion );
7367
}
7468

7569
public OracleServerConfiguration(
7670
boolean autonomous,
7771
boolean extended,
7872
boolean applicationContinuity,
79-
boolean osonDisabled,
8073
int driverMajorVersion,
8174
int driverMinorVersion) {
8275
this.autonomous = autonomous;
8376
this.extended = extended;
8477
this.applicationContinuity = applicationContinuity;
85-
this.osonDisabled = osonDisabled;
8678
this.driverMajorVersion = driverMajorVersion;
8779
this.driverMinorVersion = driverMinorVersion;
8880
}
@@ -94,12 +86,10 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut
9486
final boolean defaultExtended = getBoolean( ORACLE_EXTENDED_STRING_SIZE, configuration, false );
9587
final boolean defaultAutonomous = getBoolean( ORACLE_AUTONOMOUS_DATABASE, configuration, false );
9688
final boolean defaultContinuity = getBoolean( ORACLE_APPLICATION_CONTINUITY, configuration, false );
97-
final boolean defaultOsonDisabled = getBoolean( ORACLE_OSON_DISABLED , configuration, false );
9889

9990
boolean extended;
10091
boolean autonomous;
10192
boolean applicationContinuity;
102-
boolean osonDisabled = defaultOsonDisabled;
10393

10494
int majorVersion;
10595
int minorVersion;
@@ -136,7 +126,7 @@ public static OracleServerConfiguration fromDialectResolutionInfo(DialectResolut
136126
}
137127
}
138128

139-
return new OracleServerConfiguration( autonomous, extended, applicationContinuity, osonDisabled,majorVersion, minorVersion );
129+
return new OracleServerConfiguration( autonomous, extended, applicationContinuity, majorVersion, minorVersion );
140130
}
141131

142132
private static boolean isExtended(Statement statement) {

hibernate-core/src/main/java/org/hibernate/dialect/aggregate/OracleAggregateSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class OracleAggregateSupport extends AggregateSupportImpl {
7272
private final JsonSupport jsonSupport;
7373
private final boolean dateTypesStoreAsString;
7474

75-
OracleAggregateSupport(boolean checkConstraintSupport, JsonSupport jsonSupport, boolean dateTypesStoreAsString) {
75+
private OracleAggregateSupport(boolean checkConstraintSupport, JsonSupport jsonSupport, boolean dateTypesStoreAsString) {
7676
this.checkConstraintSupport = checkConstraintSupport;
7777
this.jsonSupport = jsonSupport;
7878
// this flag tell us if data is serialized/de-serialized as String. As opposed to using OSON

0 commit comments

Comments
 (0)