blob: 9297087b90ee1c6059aa1927e9c564e5b2f4af57 [file] [log] [blame]
/*
* Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Denise Smith - 2.6 - initial implementation
package org.eclipse.persistence.oxm.record;
import java.math.BigDecimal;
import java.math.BigInteger;
import jakarta.json.stream.JsonGenerator;
import javax.xml.namespace.QName;
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
import org.eclipse.persistence.internal.oxm.ConversionManager;
public class JsonGeneratorRecord extends JsonRecord<JsonRecord.Level> {
private JsonGenerator jsonGenerator;
private String rootKeyName;
public JsonGeneratorRecord(JsonGenerator generator, String rootKeyName){
super();
this.jsonGenerator = generator;
this.rootKeyName = rootKeyName;
}
@Override
protected void startRootObject(){
super.startRootObject();
position.setKeyName(rootKeyName);
setComplex(position, true);
}
@Override
protected void finishLevel(){
if(!(position.isCollection && position.isEmptyCollection() && position.getKeyName() == null)){
jsonGenerator.writeEnd();
}
super.finishLevel();
}
@Override
protected void startRootLevelCollection(){
if(rootKeyName != null){
jsonGenerator.writeStartArray(rootKeyName);
}else{
jsonGenerator.writeStartArray();
}
}
@Override
public void endCollection() {
finishLevel();
}
@Override
protected void setComplex(Level level, boolean complex){
boolean isAlreadyComplex = level.isComplex;
super.setComplex(level, complex);
if(complex && !isAlreadyComplex){
Level parentLevel = level.parentLevel;
if(parentLevel != null && parentLevel.isCollection && parentLevel.isEmptyCollection()){
parentLevel.setEmptyCollection(false);
}
if((parentLevel != null && parentLevel.isCollection && !parentLevel.isEmptyCollection()) || level.keyName == null){
jsonGenerator.writeStartObject();
}else{
jsonGenerator.writeStartObject(level.keyName);
}
}
}
@Override
protected void startEmptyCollection(){
if (position.parentLevel != null && position.parentLevel.getSkipCount() > 0) {
jsonGenerator.writeStartArray();
} else {
jsonGenerator.writeStartArray(position.keyName);
}
}
@Override
protected void writeEmptyCollection(Level level, String keyName){
jsonGenerator.writeStartArray(keyName);
jsonGenerator.writeEnd();
}
@Override
protected void addValueToObject(Level level, String keyName, Object value, QName schemaType){
if(value == NULL){
jsonGenerator.writeNull(keyName);
}else if(value instanceof Integer){
jsonGenerator.write(keyName, (Integer)value);
}else if(value instanceof BigDecimal){
jsonGenerator.write(keyName, (BigDecimal)value);
}else if(value instanceof BigInteger){
jsonGenerator.write(keyName, (BigInteger)value);
}else if(value instanceof Boolean){
jsonGenerator.write(keyName, (Boolean)value);
}else if(value instanceof Character){
jsonGenerator.write(keyName, (Character)value);
}else if(value instanceof Double){
jsonGenerator.write(keyName, (Double)value);
}else if(value instanceof Float){
jsonGenerator.write(keyName, (Float)value);
}else if(value instanceof Long){
jsonGenerator.write(keyName, (Long)value);
}else if(value instanceof String){
jsonGenerator.write(keyName, (String)value);
}else{
ConversionManager conversionManager = getConversionManager();
String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
Class<Object> theClass = conversionManager.javaType(schemaType);
if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
//if it's still a number and falls through the cracks we dont want "" around the value
BigDecimal convertedNumberValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType);
jsonGenerator.write(keyName, convertedNumberValue);
}else{
jsonGenerator.write(keyName, convertedValue);
}
}
}
@Override
protected void addValueToArray(Level level, Object value, QName schemaType){
if(value == NULL){
jsonGenerator.writeNull();
}else if(value instanceof Integer){
jsonGenerator.write((Integer)value);
}else if(value instanceof BigDecimal){
jsonGenerator.write((BigDecimal)value);
}else if(value instanceof BigInteger){
jsonGenerator.write((BigInteger)value);
}else if(value instanceof Boolean){
jsonGenerator.write((Boolean)value);
}else if(value instanceof Character){
jsonGenerator.write((Character)value);
}else if(value instanceof Double){
jsonGenerator.write((Double)value);
}else if(value instanceof Float){
jsonGenerator.write((Float)value);
}else if(value instanceof Long){
jsonGenerator.write((Long)value);
}else if(value instanceof String){
jsonGenerator.write((String)value);
}else{
ConversionManager conversionManager = getConversionManager();
String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
Class<Object> theClass = conversionManager.javaType(schemaType);
if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
//if it's still a number and falls through the cracks we dont want "" around the value
BigDecimal convertedNumberValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType);
jsonGenerator.write(convertedNumberValue);
}else{
jsonGenerator.write(convertedValue);
}
}
}
}