
org.datanucleus.store.json.fieldmanager.FetchFieldManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of datanucleus-json Show documentation
Show all versions of datanucleus-json Show documentation
DataNucleus plugin providing persistence to JSON-based datastores.
This includes Amazon S3 and GoogleStorage.
The newest version!
/**********************************************************************
Copyright (c) 2008 Erik Bengtson and others. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Contributors:
...
**********************************************************************/
package org.datanucleus.store.json.fieldmanager;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.datanucleus.ClassLoaderResolver;
import org.datanucleus.ExecutionContext;
import org.datanucleus.exceptions.NucleusDataStoreException;
import org.datanucleus.exceptions.NucleusException;
import org.datanucleus.exceptions.NucleusObjectNotFoundException;
import org.datanucleus.exceptions.NucleusUserException;
import org.datanucleus.identity.IdentityUtils;
import org.datanucleus.metadata.AbstractClassMetaData;
import org.datanucleus.metadata.AbstractMemberMetaData;
import org.datanucleus.metadata.FieldPersistenceModifier;
import org.datanucleus.metadata.FieldRole;
import org.datanucleus.metadata.JdbcType;
import org.datanucleus.metadata.MetaDataUtils;
import org.datanucleus.metadata.RelationType;
import org.datanucleus.query.QueryUtils;
import org.datanucleus.state.ObjectProvider;
import org.datanucleus.store.StoreManager;
import org.datanucleus.store.fieldmanager.AbstractFetchFieldManager;
import org.datanucleus.store.fieldmanager.FieldManager;
import org.datanucleus.store.json.CloudStorageUtils;
import org.datanucleus.store.json.orgjson.JSONArray;
import org.datanucleus.store.json.orgjson.JSONException;
import org.datanucleus.store.json.orgjson.JSONObject;
import org.datanucleus.store.schema.table.MemberColumnMapping;
import org.datanucleus.store.schema.table.Table;
import org.datanucleus.store.types.SCOUtils;
import org.datanucleus.store.types.converters.MultiColumnConverter;
import org.datanucleus.store.types.converters.TypeConverter;
import org.datanucleus.store.types.converters.TypeConverterHelper;
import org.datanucleus.util.ClassUtils;
import org.datanucleus.util.NucleusLogger;
import org.datanucleus.util.TypeConversionHelper;
/**
* FieldManager for fetching from JSON.
*/
public class FetchFieldManager extends AbstractFetchFieldManager
{
protected final Table table;
protected final JSONObject jsonobj;
protected final StoreManager storeMgr;
public FetchFieldManager(ExecutionContext ec, AbstractClassMetaData cmd, JSONObject jsonobj, Table table)
{
super(ec, cmd);
this.jsonobj = jsonobj;
this.storeMgr = ec.getStoreManager();
this.table = table;
}
public FetchFieldManager(ObjectProvider op, JSONObject jsonobj, Table table)
{
super(op);
this.jsonobj = jsonobj;
this.storeMgr = ec.getStoreManager();
this.table = table;
}
protected MemberColumnMapping getColumnMapping(int fieldNumber)
{
return table.getMemberColumnMappingForMember(cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber));
}
public boolean fetchBooleanField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return false;
}
try
{
return jsonobj.getBoolean(memberName);
}
catch (JSONException e)
{
//ignore
return false;
}
}
public byte fetchByteField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
String str = jsonobj.getString(memberName);
return Byte.valueOf(str).byteValue();
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public char fetchCharField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
return jsonobj.getString(memberName).charAt(0);
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public double fetchDoubleField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
return jsonobj.getDouble(memberName);
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public float fetchFloatField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
return (float) jsonobj.getDouble(memberName);
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public int fetchIntField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
return jsonobj.getInt(memberName);
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public long fetchLongField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
return jsonobj.getLong(memberName);
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public short fetchShortField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return 0;
}
try
{
return (short) jsonobj.getInt(memberName);
}
catch (JSONException e)
{
//ignore
return 0;
}
}
public String fetchStringField(int fieldNumber)
{
String memberName = getColumnMapping(fieldNumber).getColumn(0).getName();
if (jsonobj.isNull(memberName))
{
return null;
}
try
{
return jsonobj.getString(memberName);
}
catch (JSONException e)
{
//ignore
return null;
}
}
public Object fetchObjectField(int fieldNumber)
{
AbstractMemberMetaData mmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
if (mmd.getPersistenceModifier() != FieldPersistenceModifier.PERSISTENT)
{
return op.provideField(fieldNumber);
}
ClassLoaderResolver clr = ec.getClassLoaderResolver();
RelationType relationType = mmd.getRelationType(clr);
if (relationType != RelationType.NONE && MetaDataUtils.getInstance().isMemberEmbedded(ec.getMetaDataManager(), clr, mmd, relationType, null))
{
// Embedded field
try
{
return fetchObjectFieldEmbedded(fieldNumber, mmd, clr, relationType);
}
catch (JSONException e)
{
throw new NucleusException(e.getMessage(), e);
}
}
try
{
return fetchObjectFieldInternal(fieldNumber, mmd, clr, relationType);
}
catch (JSONException e)
{
throw new NucleusException(e.getMessage(), e);
}
}
protected Object fetchObjectFieldEmbedded(int fieldNumber, AbstractMemberMetaData mmd, ClassLoaderResolver clr, RelationType relationType)
throws JSONException
{
// Embedded field
if (RelationType.isRelationSingleValued(relationType))
{
// Can be stored nested in the JSON doc, or flat
boolean nested = CloudStorageUtils.isMemberNested(mmd);
AbstractClassMetaData embCmd = ec.getMetaDataManager().getMetaDataForClass(mmd.getType(), clr);
List embMmds = new ArrayList();
embMmds.add(mmd);
if (nested)
{
// Nested embedded object. JSONObject stored under this name
MemberColumnMapping mapping = getColumnMapping(fieldNumber);
String name = (mapping != null ? mapping.getColumn(0).getName() : mmd.getName());
if (jsonobj.isNull(name))
{
return null;
}
JSONObject embobj = jsonobj.getJSONObject(name);
NucleusLogger.PERSISTENCE.warn("Member " + mmd.getFullFieldName() + " marked as embedded NESTED; This is experimental : " + embobj);
ObjectProvider embOP = ec.getNucleusContext().getObjectProviderFactory().newForEmbedded(ec, embCmd, op, fieldNumber);
FieldManager fetchEmbFM = new FetchEmbeddedFieldManager(embOP, embobj, embMmds, table);
embOP.replaceFields(embCmd.getAllMemberPositions(), fetchEmbFM);
return embOP.getObject();
}
// Flat embedded. Stored as multiple properties in the owner object
// TODO Null detection
ObjectProvider embOP = ec.getNucleusContext().getObjectProviderFactory().newForEmbedded(ec, embCmd, op, fieldNumber);
FieldManager fetchEmbFM = new FetchEmbeddedFieldManager(embOP, jsonobj, embMmds, table);
embOP.replaceFields(embCmd.getAllMemberPositions(), fetchEmbFM);
return embOP.getObject();
}
else if (RelationType.isRelationMultiValued(relationType))
{
// TODO Support nested embedding in JSON object
throw new NucleusUserException("Dont support embedded multi-valued field at " + mmd.getFullFieldName() + " with Excel");
}
return null;
}
protected Object fetchObjectFieldInternal(int fieldNumber, AbstractMemberMetaData mmd, ClassLoaderResolver clr, RelationType relationType)
throws JSONException
{
boolean optional = false;
if (Optional.class.isAssignableFrom(mmd.getType()))
{
if (relationType != RelationType.NONE)
{
relationType = RelationType.ONE_TO_ONE_UNI;
}
optional = true;
}
MemberColumnMapping mapping = getColumnMapping(fieldNumber);
if (relationType == RelationType.NONE)
{
Object returnValue = null;
if (mapping.getTypeConverter() != null)
{
TypeConverter conv = mapping.getTypeConverter();
if (mapping.getNumberOfColumns() > 1)
{
boolean isNull = true;
Object valuesArr = null;
Class[] colTypes = ((MultiColumnConverter)conv).getDatastoreColumnTypes();
if (colTypes[0] == int.class)
{
valuesArr = new int[mapping.getNumberOfColumns()];
}
else if (colTypes[0] == long.class)
{
valuesArr = new long[mapping.getNumberOfColumns()];
}
else if (colTypes[0] == double.class)
{
valuesArr = new double[mapping.getNumberOfColumns()];
}
else if (colTypes[0] == float.class)
{
valuesArr = new double[mapping.getNumberOfColumns()];
}
else if (colTypes[0] == String.class)
{
valuesArr = new String[mapping.getNumberOfColumns()];
}
// TODO Support other types
else
{
valuesArr = new Object[mapping.getNumberOfColumns()];
}
for (int i=0;i
Collection
© 2015 - 2025 Weber Informatics LLC | Privacy Policy