Skip to content

Commit 067775f

Browse files
committed
HHH-17404 : applies some review comments
1 parent 7c29329 commit 067775f

File tree

7 files changed

+86
-86
lines changed

7 files changed

+86
-86
lines changed

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -242,15 +242,7 @@ else if ( attributeMapping instanceof EmbeddedAttributeMapping ) {
242242
}
243243
final EmbeddableMappingType mappingType = (EmbeddableMappingType) attributeMapping.getMappedType();
244244
final SelectableMapping aggregateMapping = mappingType.getAggregateMapping();
245-
if ( mappingType.shouldSelectAggregateMapping()) {
246-
final String name = aggregateMapping.getSelectableName();
247-
appender.append( separator );
248-
appender.append( '"' );
249-
appender.append( name );
250-
appender.append( "\":" );
251-
toString( mappingType, values[i], options, appender );
252-
}
253-
else {
245+
if ( aggregateMapping == null) {
254246
toString(
255247
mappingType,
256248
options,
@@ -259,6 +251,14 @@ else if ( attributeMapping instanceof EmbeddedAttributeMapping ) {
259251
separator
260252
);
261253
}
254+
else {
255+
final String name = aggregateMapping.getSelectableName();
256+
appender.append( separator );
257+
appender.append( '"' );
258+
appender.append( name );
259+
appender.append( "\":" );
260+
toString( mappingType, values[i], options, appender );
261+
}
262262
}
263263
else {
264264
throw new UnsupportedOperationException( "Support for attribute mapping type not yet implemented: " + attributeMapping.getClass().getName() );

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

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,27 @@
66

77
import com.fasterxml.jackson.core.JsonFactory;
88
import com.fasterxml.jackson.core.JsonParser;
9+
import oracle.jdbc.OracleType;
910
import oracle.sql.json.OracleJsonDatum;
11+
import oracle.sql.json.OracleJsonFactory;
12+
import oracle.sql.json.OracleJsonGenerator;
13+
14+
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
1015
import org.hibernate.type.descriptor.ValueBinder;
1116
import org.hibernate.type.descriptor.ValueExtractor;
1217
import org.hibernate.type.descriptor.WrapperOptions;
18+
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
1319
import org.hibernate.type.descriptor.java.JavaType;
20+
import org.hibernate.type.descriptor.jdbc.AggregateJdbcType;
1421
import org.hibernate.type.descriptor.jdbc.BasicBinder;
1522
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
1623
import org.hibernate.type.descriptor.jdbc.JdbcType;
24+
import org.hibernate.type.descriptor.jdbc.JsonJdbcType;
1725
import org.hibernate.type.format.FormatMapper;
26+
import org.hibernate.type.format.OsonDocumentWriter;
1827
import org.hibernate.type.format.jackson.JacksonOsonFormatMapper;
1928

20-
import java.io.ByteArrayInputStream;
21-
import java.io.InputStream;
29+
import java.io.ByteArrayOutputStream;
2230
import java.sql.CallableStatement;
2331
import java.sql.PreparedStatement;
2432
import java.sql.ResultSet;
@@ -67,15 +75,38 @@ public <X> ValueBinder<X> getBinder(JavaType<X> javaType) {
6775

6876
return new BasicBinder<>( javaType, this ) {
6977

70-
private <X> InputStream toOsonStream(X value, JavaType<X> javaType, WrapperOptions options) throws Exception {
71-
FormatMapper mapper = options.getSession().getSessionFactory().getFastSessionServices().getJsonFormatMapper();
72-
return new ByteArrayInputStream(((JacksonOsonFormatMapper)mapper).arrayToOson(value, javaType,getElementJdbcType(),options));
78+
private <X> byte[] toOsonStream(X value, JavaType<X> javaType, WrapperOptions options) throws Exception {
79+
final Object[] domainObjects = javaType.unwrap( value, Object[].class, options );
80+
81+
ByteArrayOutputStream out = new ByteArrayOutputStream();
82+
try (OracleJsonGenerator generator = new OracleJsonFactory().createJsonBinaryGenerator( out )) {
83+
OsonDocumentWriter writer = new OsonDocumentWriter( generator );
84+
85+
if ( getElementJdbcType() instanceof JsonJdbcType jsonElementJdbcType ) {
86+
final EmbeddableMappingType embeddableMappingType = jsonElementJdbcType.getEmbeddableMappingType();
87+
JsonHelper.serializeArray( embeddableMappingType, domainObjects, options, writer );
88+
}
89+
else {
90+
assert !( getElementJdbcType() instanceof AggregateJdbcType );
91+
final JavaType<?> elementJavaType = ( (BasicPluralJavaType<?>) javaType ).getElementJavaType();
92+
JsonHelper.serializeArray(
93+
elementJavaType,
94+
getElementJdbcType(),
95+
domainObjects,
96+
options,
97+
writer
98+
);
99+
}
100+
generator.close();
101+
return out.toByteArray();
102+
}
103+
73104
}
74105
@Override
75106
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
76107
throws SQLException {
77108
try {
78-
st.setBinaryStream( index, toOsonStream( value, getJavaType(), options ) );
109+
st.setObject( index, toOsonStream( value, getJavaType(), options ), OracleType.JSON );
79110
}
80111
catch (Exception e) {
81112
throw new SQLException( e );
@@ -86,7 +117,7 @@ protected void doBind(PreparedStatement st, X value, int index, WrapperOptions o
86117
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
87118
throws SQLException {
88119
try {
89-
st.setBinaryStream( name, toOsonStream( value, getJavaType(), options ) );
120+
st.setObject( name, toOsonStream( value, getJavaType(), options ) , OracleType.JSON);
90121
}
91122
catch (Exception e) {
92123
throw new SQLException( e );

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
2424
import org.hibernate.type.format.FormatMapper;
2525
import org.hibernate.type.format.ObjectArrayOsonDocumentHandler;
26-
import org.hibernate.type.format.ObjectArrayOsonDocumentWriter;
26+
import org.hibernate.type.format.OsonDocumentWriter;
2727
import org.hibernate.type.format.jackson.JacksonOsonFormatMapper;
2828

2929
import java.io.ByteArrayOutputStream;
@@ -88,12 +88,13 @@ private <X> byte[] toOson(X value, JavaType<X> javaType, WrapperOptions options)
8888

8989
FormatMapper mapper = options.getSession().getSessionFactory().getFastSessionServices().getJsonFormatMapper();
9090

91-
if (getEmbeddableMappingType()!= null) {
91+
if (getEmbeddableMappingType() != null) {
9292
ByteArrayOutputStream out = new ByteArrayOutputStream();
93-
OracleJsonGenerator generator = new OracleJsonFactory().createJsonBinaryGenerator( out );
94-
ObjectArrayOsonDocumentWriter writer = new ObjectArrayOsonDocumentWriter(generator);
95-
JsonHelper.serialize( getEmbeddableMappingType(), value,options,writer);
96-
generator.close();
93+
// OracleJsonFactory is used and not OracleOsonFactory as Jackson is not involved here
94+
try (OracleJsonGenerator generator = new OracleJsonFactory().createJsonBinaryGenerator( out )) {
95+
OsonDocumentWriter writer = new OsonDocumentWriter( generator);
96+
JsonHelper.serialize( getEmbeddableMappingType(), value,options,writer);
97+
}
9798
return out.toByteArray();
9899
}
99100

hibernate-core/src/main/java/org/hibernate/type/format/ObjectArrayOsonDocumentHandler.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.type.format;
66

7+
import org.hibernate.internal.util.collections.StandardStack;
78
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
89
import org.hibernate.metamodel.mapping.SelectableMapping;
910
import org.hibernate.type.BasicPluralType;
@@ -18,7 +19,7 @@
1819
import java.time.ZoneId;
1920
import java.util.ArrayList;
2021
import java.util.List;
21-
import java.util.Stack;
22+
2223

2324
/**
2425
* Implementation of <code>JsonDocumentHandler</code> for OSON document.
@@ -42,11 +43,11 @@ public class ObjectArrayOsonDocumentHandler implements JsonDocumentHandler {
4243
// Each mapping definition may contain sub mappings (sub embeddable mapping)
4344
// This stack is used to keep a pointer on the current mapping to be used to assign correct types.
4445
// see onStartObject()/onEndObject() methods
45-
Stack<EmbeddableMappingType> embeddableMappingTypes = new Stack<>();
46+
StandardStack<EmbeddableMappingType> embeddableMappingTypes = new StandardStack<>();
4647
// As for mapping definitions, when "sub embeddable" is encountered, the array
4748
// that needs to be filled with Objects is the one we allocate in the final result array slot.
4849
// We use a stack to keep track of array ref
49-
Stack<Object[]> objectArrays = new Stack<>();
50+
StandardStack<Object[]> objectArrays = new StandardStack<>();
5051

5152

5253
WrapperOptions wrapperOptions;
@@ -75,18 +76,20 @@ public void onStartObject() {
7576
// We are dealing with a sub-object, allocate space for it then,
7677
// otherwise, we have nothing to do.
7778
// Push the new (sub)mapping definition.
78-
this.currentSelectableIndexInResultArray = embeddableMappingTypes.peek().getSelectableIndex( currentKeyName );
79+
assert embeddableMappingTypes.getCurrent() != null;
80+
this.currentSelectableIndexInResultArray = embeddableMappingTypes.getCurrent().getSelectableIndex( currentKeyName );
7981
assert currentSelectableIndexInResultArray != -1: "Cannot get index of " + currentKeyName;
8082

81-
final SelectableMapping selectable = embeddableMappingTypes.peek().getJdbcValueSelectable(
83+
final SelectableMapping selectable = embeddableMappingTypes.getCurrent().getJdbcValueSelectable(
8284
currentSelectableIndexInResultArray );
8385
final AggregateJdbcType aggregateJdbcType = (AggregateJdbcType) selectable.getJdbcMapping()
8486
.getJdbcType();
8587
final EmbeddableMappingType subMappingType = aggregateJdbcType.getEmbeddableMappingType();
86-
this.objectArrays.peek()[currentSelectableIndexInResultArray] =
88+
assert this.objectArrays.getCurrent() != null;
89+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] =
8790
new Object[subMappingType.getJdbcValueCount()];
8891
this.embeddableMappingTypes.push( subMappingType );
89-
this.objectArrays.push( (Object[]) this.objectArrays.peek()[currentSelectableIndexInResultArray] );
92+
this.objectArrays.push( (Object[]) this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] );
9093
}
9194
}
9295

@@ -113,7 +116,7 @@ public void onStartArray() {
113116
public void onEndArray() {
114117
assert (subArrayObjectList != null && subArrayObjectTypes != null) : "onEndArray called before onStartArray";
115118
// flush array values
116-
this.objectArrays.peek()[currentSelectableIndexInResultArray] = subArrayObjectTypes.getJdbcJavaType().wrap( subArrayObjectList, wrapperOptions );
119+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] = subArrayObjectTypes.getJdbcJavaType().wrap( subArrayObjectList, wrapperOptions );
117120
// reset until we encounter next array element
118121
subArrayObjectList = null;
119122
subArrayObjectTypes = null;
@@ -123,17 +126,17 @@ public void onEndArray() {
123126
public void onObjectKey(String key) {
124127
this.currentKeyName = key;
125128

126-
currentSelectableIndexInResultArray = embeddableMappingTypes.peek().getSelectableIndex( currentKeyName );
129+
currentSelectableIndexInResultArray = embeddableMappingTypes.getCurrent().getSelectableIndex( currentKeyName );
127130
if ( currentSelectableIndexInResultArray >= 0 ) {
128131
// we may not have a selectable mapping for that key
129-
currentSelectableMapping = embeddableMappingTypes.peek().getJdbcValueSelectable( currentSelectableIndexInResultArray );
132+
currentSelectableMapping = embeddableMappingTypes.getCurrent().getJdbcValueSelectable( currentSelectableIndexInResultArray );
130133
}
131134
else {
132135
throw new IllegalArgumentException(
133136
String.format(
134137
"Could not find selectable [%s] in embeddable type [%s] for JSON processing.",
135138
currentKeyName,
136-
embeddableMappingTypes.peek().getMappedJavaType().getJavaTypeClass().getName()
139+
embeddableMappingTypes.getCurrent().getMappedJavaType().getJavaTypeClass().getName()
137140
)
138141
);
139142
}
@@ -146,7 +149,7 @@ public void onNullValue() {
146149
subArrayObjectList.add( null );
147150
}
148151
else {
149-
this.objectArrays.peek()[currentSelectableIndexInResultArray] = null;
152+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] = null;
150153
}
151154
}
152155

@@ -157,7 +160,7 @@ public void onBooleanValue(boolean value) {
157160
subArrayObjectList.add( value?Boolean.TRUE:Boolean.FALSE);
158161
}
159162
else {
160-
this.objectArrays.peek()[currentSelectableIndexInResultArray] = value?Boolean.TRUE:Boolean.FALSE;
163+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] = value?Boolean.TRUE:Boolean.FALSE;
161164
}
162165
}
163166

@@ -169,7 +172,7 @@ public void onStringValue(String value) {
169172
subArrayObjectTypes.getElementType().getJdbcJavaType().fromEncodedString( value ,0,value.length()) );
170173
}
171174
else {
172-
this.objectArrays.peek()[currentSelectableIndexInResultArray] =
175+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] =
173176
currentSelectableMapping.getJdbcMapping().getJdbcJavaType().fromEncodedString( value,0,value.length());
174177
}
175178
}
@@ -190,7 +193,7 @@ public <T> void onOsonValue(T value) {
190193
subArrayObjectList.add( value );
191194
}
192195
else {
193-
this.objectArrays.peek()[currentSelectableIndexInResultArray] =
196+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] =
194197
currentSelectableMapping.getJdbcMapping().convertToDomainValue(
195198
currentSelectableMapping.getJdbcMapping().getJdbcJavaType()
196199
.wrap( value, wrapperOptions ) );
@@ -223,7 +226,7 @@ public void onOsonBinaryValue(byte[] bytes) {
223226
subArrayObjectList.add( theOneToBeUsed );
224227
}
225228
else {
226-
this.objectArrays.peek()[currentSelectableIndexInResultArray] = theOneToBeUsed;
229+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] = theOneToBeUsed;
227230
}
228231
}
229232

@@ -270,7 +273,7 @@ else if ( java.util.Date.class.isAssignableFrom( underlyingType ) ) {
270273
subArrayObjectList.add( theOneToBeUsed );
271274
}
272275
else {
273-
this.objectArrays.peek()[currentSelectableIndexInResultArray] = theOneToBeUsed;
276+
this.objectArrays.getCurrent()[currentSelectableIndexInResultArray] = theOneToBeUsed;
274277
}
275278
}
276279
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
*
3737
* @author Emmanuel Jannetti
3838
*/
39-
public class ObjectArrayOsonDocumentWriter implements JsonDocumentWriter {
39+
public class OsonDocumentWriter implements JsonDocumentWriter {
4040

4141

4242
private final OracleJsonGenerator generator;
@@ -45,7 +45,7 @@ public class ObjectArrayOsonDocumentWriter implements JsonDocumentWriter {
4545
* Creates a new OSON document writer
4646
* @param generator the JSON generator.
4747
*/
48-
public ObjectArrayOsonDocumentWriter(OracleJsonGenerator generator) {
48+
public OsonDocumentWriter(OracleJsonGenerator generator) {
4949
this.generator = generator;
5050
}
5151

hibernate-core/src/main/java/org/hibernate/type/format/StringJsonDocumentWriter.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.type.format;
66

77
import org.hibernate.dialect.JsonHelper;
8+
import org.hibernate.internal.util.collections.StandardStack;
89
import org.hibernate.type.SqlTypes;
910
import org.hibernate.type.descriptor.WrapperOptions;
1011
import org.hibernate.type.descriptor.java.BooleanJavaType;
@@ -16,7 +17,7 @@
1617

1718
import java.time.OffsetDateTime;
1819
import java.time.format.DateTimeFormatter;
19-
import java.util.Stack;
20+
2021

2122
/**
2223
* Implementation of <code>JsonDocumentWriter</code> for String based OSON document.
@@ -48,7 +49,7 @@ private enum PROCESSING_STATE {
4849
ENDING_ARRAY, // we are ending an array
4950
ARRAY // we are piling array values
5051
}
51-
private Stack<PROCESSING_STATE> processingStates = new Stack<>();
52+
private StandardStack<PROCESSING_STATE> processingStates = new StandardStack<>();
5253

5354
/**
5455
* Creates a new StringJsonDocumentWriter.
@@ -65,13 +66,13 @@ public StringJsonDocumentWriter(JsonHelper.JsonAppender appender) {
6566
@Override
6667
public void startObject() {
6768
// Note: startArray and startObject must not call moveProcessingStateMachine()
68-
if (this.processingStates.peek() == PROCESSING_STATE.STARTING_ARRAY) {
69+
if (this.processingStates.getCurrent() == PROCESSING_STATE.STARTING_ARRAY) {
6970
// are we building an array of objects?
7071
// i.e, [{},...]
7172
// move to PROCESSING_STATE.ARRAY first
7273
this.processingStates.push( PROCESSING_STATE.ARRAY);
7374
}
74-
else if (this.processingStates.peek() == PROCESSING_STATE.ARRAY) {
75+
else if (this.processingStates.getCurrent() == PROCESSING_STATE.ARRAY) {
7576
// That means that we ae building an array of object ([{},...])
7677
// JSON object hee are treat as array item.
7778
// -> add the marker first
@@ -115,7 +116,7 @@ public void endArray() {
115116

116117
@Override
117118
public void objectKey(String key) {
118-
if (this.processingStates.peek().equals( PROCESSING_STATE.OBJECT )) {
119+
if (this.processingStates.getCurrent().equals( PROCESSING_STATE.OBJECT )) {
119120
// we have started an object, and we are adding an item key: we do add a separator.
120121
this.appender.append( SEPARATOR_MARKER );
121122
}
@@ -132,7 +133,7 @@ public void objectKey(String key) {
132133
* Separator is to separate array items or key/value pairs in an object.
133134
*/
134135
private void addItemsSeparator() {
135-
if (this.processingStates.peek().equals( PROCESSING_STATE.ARRAY )) {
136+
if (this.processingStates.getCurrent().equals( PROCESSING_STATE.ARRAY )) {
136137
// We started to serialize an array and already added item to it:add a separator anytime.
137138
this.appender.append( SEPARATOR_MARKER );
138139
}
@@ -161,7 +162,7 @@ private void addItemsSeparator() {
161162
*
162163
*/
163164
private void moveProcessingStateMachine() {
164-
switch (this.processingStates.peek()) {
165+
switch (this.processingStates.getCurrent()) {
165166
case STARTING_OBJECT:
166167
//after starting an object, we start adding key/value pairs
167168
this.processingStates.push( PROCESSING_STATE.OBJECT );
@@ -177,7 +178,7 @@ private void moveProcessingStateMachine() {
177178
// first pop ENDING_ARRAY
178179
this.processingStates.pop();
179180
// if we have ARRAY, so that's not an empty array. pop that state
180-
if (this.processingStates.peek().equals( PROCESSING_STATE.ARRAY ))
181+
if (this.processingStates.getCurrent().equals( PROCESSING_STATE.ARRAY ))
181182
this.processingStates.pop();
182183
assert this.processingStates.pop().equals( PROCESSING_STATE.STARTING_ARRAY );
183184
break;
@@ -188,7 +189,7 @@ private void moveProcessingStateMachine() {
188189
// first pop ENDING_OBJECT
189190
this.processingStates.pop();
190191
// if we have OBJECT, so that's not an empty object. pop that state
191-
if (this.processingStates.peek().equals( PROCESSING_STATE.OBJECT ))
192+
if (this.processingStates.getCurrent().equals( PROCESSING_STATE.OBJECT ))
192193
this.processingStates.pop();
193194
assert this.processingStates.pop().equals( PROCESSING_STATE.STARTING_OBJECT );
194195
break;

0 commit comments

Comments
 (0)