Skip to content

Commit 7c29329

Browse files
committed
HHH-17404 : refactor OSON formatMapper to align on JSON one.
1 parent d10180b commit 7c29329

File tree

3 files changed

+125
-125
lines changed

3 files changed

+125
-125
lines changed

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import com.fasterxml.jackson.core.JsonParser;
1010
import oracle.jdbc.OracleType;
1111
import oracle.sql.json.OracleJsonDatum;
12+
import oracle.sql.json.OracleJsonFactory;
13+
import oracle.sql.json.OracleJsonGenerator;
14+
import oracle.sql.json.OracleJsonParser;
1215
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
1316
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
1417
import org.hibernate.type.descriptor.ValueBinder;
@@ -19,9 +22,12 @@
1922
import org.hibernate.type.descriptor.jdbc.BasicBinder;
2023
import org.hibernate.type.descriptor.jdbc.BasicExtractor;
2124
import org.hibernate.type.format.FormatMapper;
25+
import org.hibernate.type.format.ObjectArrayOsonDocumentHandler;
26+
import org.hibernate.type.format.ObjectArrayOsonDocumentWriter;
2227
import org.hibernate.type.format.jackson.JacksonOsonFormatMapper;
2328

2429
import java.io.ByteArrayOutputStream;
30+
import java.nio.ByteBuffer;
2531
import java.sql.CallableStatement;
2632
import java.sql.PreparedStatement;
2733
import java.sql.ResultSet;
@@ -83,7 +89,12 @@ private <X> byte[] toOson(X value, JavaType<X> javaType, WrapperOptions options)
8389
FormatMapper mapper = options.getSession().getSessionFactory().getFastSessionServices().getJsonFormatMapper();
8490

8591
if (getEmbeddableMappingType()!= null) {
86-
return ((JacksonOsonFormatMapper)mapper).fromObjectArray(value,javaType,options,getEmbeddableMappingType());
92+
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();
97+
return out.toByteArray();
8798
}
8899

89100
ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -137,8 +148,14 @@ private X fromOson(byte[] osonBytes, WrapperOptions options) throws Exception {
137148
// an array of objects. We use JsonParser to fetch values
138149
// and build the array.(as opposed to let Jackson do it as we do not
139150
// have a proper object definition at that stage).
140-
return ((JacksonOsonFormatMapper)mapper).toObjectArray(
141-
getEmbeddableMappingType(), osonBytes, options );
151+
OracleJsonParser osonParser = new OracleJsonFactory().createJsonBinaryParser( ByteBuffer.wrap( osonBytes ) );
152+
153+
ObjectArrayOsonDocumentHandler handler = new ObjectArrayOsonDocumentHandler( getEmbeddableMappingType(),
154+
options);
155+
156+
OsonHelper.consumeOsonTokens(osonParser, osonParser.next(), handler);
157+
158+
return (X) handler.getObjectArray();
142159
}
143160

144161
JavaType <X> type = getJavaType();
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.dialect;
6+
7+
import oracle.sql.json.OracleJsonParser;
8+
import org.hibernate.Internal;
9+
import org.hibernate.type.format.JsonDocumentHandler;
10+
import org.hibernate.type.format.ObjectArrayOsonDocumentHandler;
11+
12+
import java.io.IOException;
13+
14+
/**
15+
* A Helper for handling OSON events
16+
*/
17+
@Internal
18+
public class OsonHelper {
19+
20+
/**
21+
* Process OSON parser tokens.
22+
* This method consumes one by one event coming from an OSON parser and uses the given JsonDocumentHandler
23+
* to populate values into Object array
24+
* @param osonParser the OSON parser
25+
* @param currentEvent the current of the parser
26+
* @throws IOException error while reading from underlying parser
27+
*/
28+
public static void consumeOsonTokens(OracleJsonParser osonParser, OracleJsonParser.Event currentEvent, JsonDocumentHandler handler)
29+
throws IOException {
30+
31+
OracleJsonParser.Event event = currentEvent;
32+
33+
while ( event != null ) {
34+
switch ( event ) {
35+
case OracleJsonParser.Event.KEY_NAME:
36+
handler.onObjectKey( osonParser.getString() );
37+
break;
38+
case OracleJsonParser.Event.START_ARRAY:
39+
handler.onStartArray();
40+
break;
41+
case OracleJsonParser.Event.END_ARRAY:
42+
handler.onEndArray();
43+
break;
44+
case OracleJsonParser.Event.VALUE_DATE:
45+
case OracleJsonParser.Event.VALUE_TIMESTAMP:
46+
((ObjectArrayOsonDocumentHandler)handler).onOsonDateValue(
47+
osonParser.getLocalDateTime());
48+
break;
49+
case OracleJsonParser.Event.VALUE_TIMESTAMPTZ:
50+
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
51+
osonParser.getOffsetDateTime());
52+
break;
53+
case OracleJsonParser.Event.VALUE_INTERVALDS:
54+
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
55+
osonParser.getDuration());
56+
break;
57+
case OracleJsonParser.Event.VALUE_INTERVALYM:
58+
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
59+
osonParser.getPeriod());
60+
break;
61+
case OracleJsonParser.Event.VALUE_STRING:
62+
handler.onStringValue( osonParser.getString() );
63+
break;
64+
case OracleJsonParser.Event.VALUE_TRUE:
65+
handler.onBooleanValue( true );
66+
break;
67+
case OracleJsonParser.Event.VALUE_FALSE:
68+
handler.onBooleanValue( false );
69+
break;
70+
case OracleJsonParser.Event.VALUE_NULL:
71+
handler.onNullValue();
72+
break;
73+
case OracleJsonParser.Event.VALUE_DECIMAL:
74+
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
75+
osonParser.getBigDecimal());
76+
break;
77+
case OracleJsonParser.Event.VALUE_DOUBLE:
78+
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
79+
osonParser.getDouble());
80+
break;
81+
case OracleJsonParser.Event.VALUE_FLOAT:
82+
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
83+
osonParser.getFloat());
84+
break;
85+
case OracleJsonParser.Event.VALUE_BINARY:
86+
((ObjectArrayOsonDocumentHandler)handler).onOsonBinaryValue(
87+
osonParser.getBytes());
88+
break;
89+
case OracleJsonParser.Event.START_OBJECT:
90+
handler.onStartObject();
91+
break;
92+
case OracleJsonParser.Event.END_OBJECT:
93+
handler.onEndObject();
94+
break;
95+
default:
96+
throw new IOException( "Unknown OSON event " + event );
97+
98+
}
99+
event = osonParser.hasNext() ? osonParser.next() : null;
100+
}
101+
102+
}
103+
104+
}

hibernate-core/src/main/java/org/hibernate/type/format/jackson/JacksonOsonFormatMapper.java

Lines changed: 1 addition & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
import com.fasterxml.jackson.core.JsonGenerator;
88
import com.fasterxml.jackson.core.JsonParser;
99
import com.fasterxml.jackson.databind.Module;
10-
import com.fasterxml.jackson.databind.ObjectWriter;
1110
import com.fasterxml.jackson.databind.SerializationFeature;
1211
import oracle.sql.json.OracleJsonFactory;
1312
import oracle.sql.json.OracleJsonGenerator;
14-
import oracle.sql.json.OracleJsonParser;
1513
import org.hibernate.dialect.JsonHelper;
1614
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
1715
import org.hibernate.type.descriptor.WrapperOptions;
@@ -20,13 +18,10 @@
2018
import org.hibernate.type.descriptor.jdbc.AggregateJdbcType;
2119
import org.hibernate.type.descriptor.jdbc.JdbcType;
2220
import org.hibernate.type.descriptor.jdbc.JsonJdbcType;
23-
import org.hibernate.type.format.JsonDocumentHandler;
24-
import org.hibernate.type.format.ObjectArrayOsonDocumentHandler;
2521
import org.hibernate.type.format.ObjectArrayOsonDocumentWriter;
2622

2723
import java.io.ByteArrayOutputStream;
2824
import java.io.IOException;
29-
import java.nio.ByteBuffer;
3025

3126

3227
/**
@@ -67,121 +62,6 @@ public JacksonOsonFormatMapper() {
6762
objectMapper.disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
6863
}
6964

70-
/**
71-
* Process OSON parser tokens.
72-
* This method consume one by one event coming from an OSON parser and use the given JsonDocumentHandler
73-
* to populate values into Object array
74-
* @param osonParser the OSON parser
75-
* @param currentEvent the current of the parser
76-
* @throws IOException error while reading from underlying parser
77-
*/
78-
private void consumeOsonTokens(OracleJsonParser osonParser, OracleJsonParser.Event currentEvent, JsonDocumentHandler handler)
79-
throws IOException {
80-
81-
OracleJsonParser.Event event = currentEvent;
82-
83-
while ( event != null ) {
84-
switch ( event ) {
85-
case OracleJsonParser.Event.KEY_NAME:
86-
handler.onObjectKey( osonParser.getString() );
87-
break;
88-
case OracleJsonParser.Event.START_ARRAY:
89-
handler.onStartArray();
90-
break;
91-
case OracleJsonParser.Event.END_ARRAY:
92-
handler.onEndArray();
93-
break;
94-
case OracleJsonParser.Event.VALUE_DATE:
95-
case OracleJsonParser.Event.VALUE_TIMESTAMP:
96-
((ObjectArrayOsonDocumentHandler)handler).onOsonDateValue(
97-
osonParser.getLocalDateTime());
98-
break;
99-
case OracleJsonParser.Event.VALUE_TIMESTAMPTZ:
100-
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
101-
osonParser.getOffsetDateTime());
102-
break;
103-
case OracleJsonParser.Event.VALUE_INTERVALDS:
104-
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
105-
osonParser.getDuration());
106-
break;
107-
case OracleJsonParser.Event.VALUE_INTERVALYM:
108-
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
109-
osonParser.getPeriod());
110-
break;
111-
case OracleJsonParser.Event.VALUE_STRING:
112-
handler.onStringValue( osonParser.getString() );
113-
break;
114-
case OracleJsonParser.Event.VALUE_TRUE:
115-
handler.onBooleanValue( true );
116-
break;
117-
case OracleJsonParser.Event.VALUE_FALSE:
118-
handler.onBooleanValue( false );
119-
break;
120-
case OracleJsonParser.Event.VALUE_NULL:
121-
handler.onNullValue();
122-
break;
123-
case OracleJsonParser.Event.VALUE_DECIMAL:
124-
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
125-
osonParser.getBigDecimal());
126-
break;
127-
case OracleJsonParser.Event.VALUE_DOUBLE:
128-
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
129-
osonParser.getDouble());
130-
break;
131-
case OracleJsonParser.Event.VALUE_FLOAT:
132-
((ObjectArrayOsonDocumentHandler)handler).onOsonValue(
133-
osonParser.getFloat());
134-
break;
135-
case OracleJsonParser.Event.VALUE_BINARY:
136-
((ObjectArrayOsonDocumentHandler)handler).onOsonBinaryValue(
137-
osonParser.getBytes());
138-
break;
139-
case OracleJsonParser.Event.START_OBJECT:
140-
handler.onStartObject();
141-
break;
142-
case OracleJsonParser.Event.END_OBJECT:
143-
handler.onEndObject();
144-
break;
145-
default:
146-
throw new IOException( "Unknown OSON event " + event );
147-
148-
}
149-
event = osonParser.hasNext() ? osonParser.next() : null;
150-
}
151-
152-
}
153-
154-
155-
/**
156-
* Consumes OSON bytes and populate an Object array as described in the embeddable mapping definitions.
157-
* @param embeddableMappingType the embeddable mapping definitions
158-
* @param source the OSON bytes as <code>byte[]</code>
159-
* @param options the wrapping options
160-
* @return the Object array
161-
* @param <T> return type i.e., object array
162-
* @throws IOException OSON parsing has failed
163-
*/
164-
public <T> T toObjectArray(EmbeddableMappingType embeddableMappingType, Object source, WrapperOptions options) throws IOException {
165-
166-
OracleJsonParser osonParser = new OracleJsonFactory().createJsonBinaryParser( ByteBuffer.wrap( (byte[])source ) );
167-
168-
ObjectArrayOsonDocumentHandler handler = new ObjectArrayOsonDocumentHandler( embeddableMappingType,
169-
options);
170-
171-
consumeOsonTokens(osonParser, osonParser.next(), handler);
172-
173-
return (T)handler.getObjectArray();
174-
}
175-
176-
public <X>byte[] fromObjectArray(X value, JavaType<X> javaType, WrapperOptions options,EmbeddableMappingType embeddableMappingType)
177-
throws IOException {
178-
ByteArrayOutputStream out = new ByteArrayOutputStream();
179-
OracleJsonGenerator generator = new OracleJsonFactory().createJsonBinaryGenerator( out );
180-
ObjectArrayOsonDocumentWriter writer = new ObjectArrayOsonDocumentWriter(generator);
181-
JsonHelper.serialize( embeddableMappingType, value,options,writer);
182-
generator.close();
183-
return out.toByteArray();
184-
}
18565

18666
public <X>byte[] arrayToOson(X value,
18767
JavaType<X> javaType,
@@ -211,8 +91,7 @@ public <X>byte[] arrayToOson(X value,
21191
@Override
21292
public <T> void writeToTarget(T value, JavaType<T> javaType, Object target, WrapperOptions options)
21393
throws IOException {
214-
ObjectWriter writer = objectMapper.writerFor( objectMapper.constructType( javaType.getJavaType() ) );
215-
writer.writeValue( (JsonGenerator) target, value);
94+
objectMapper.writerFor( objectMapper.constructType( javaType.getJavaType() ) ).writeValue( (JsonGenerator) target, value);
21695

21796
}
21897

0 commit comments

Comments
 (0)