blob: b9d6e3339b998de6172e22458b1e944f6dd1ede8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.
*/
package org.apache.geode.pdx.internal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.geode.pdx.PdxUnreadFields;
import org.apache.geode.pdx.internal.AutoSerializableManager.AutoClassInfo;
import org.apache.geode.pdx.internal.AutoSerializableManager.PdxFieldWrapper;
/**
* Used to track what fields are actually read by the user's code. We want to know what fields are
* not read so that we can preserve them.
*
* @since GemFire 6.6
*/
public class TrackingPdxReaderImpl implements InternalPdxReader {
/**
* The PdxReaderImpl that we wrap. Every method needs to be forwarded to this method.
*/
private final PdxReaderImpl pdxReader;
private final TypeRegistry tr;
private final Class<?> pdxClass;
private final ArrayList<String> readFields = new ArrayList<String>();
public TrackingPdxReaderImpl(PdxReaderImpl pdxReader, TypeRegistry tr, Class<?> pdxClass) {
this.pdxReader = pdxReader;
this.tr = tr;
this.pdxClass = pdxClass;
}
@Override
public char readChar(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readChar(fieldName);
}
@Override
public boolean readBoolean(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readBoolean(fieldName);
}
@Override
public byte readByte(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readByte(fieldName);
}
@Override
public short readShort(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readShort(fieldName);
}
@Override
public int readInt(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readInt(fieldName);
}
@Override
public long readLong(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readLong(fieldName);
}
@Override
public float readFloat(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readFloat(fieldName);
}
@Override
public double readDouble(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readDouble(fieldName);
}
@Override
public String readString(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readString(fieldName);
}
@Override
public Object readObject(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readObject(fieldName);
}
@Override
public char[] readCharArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readCharArray(fieldName);
}
@Override
public boolean[] readBooleanArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readBooleanArray(fieldName);
}
@Override
public byte[] readByteArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readByteArray(fieldName);
}
@Override
public short[] readShortArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readShortArray(fieldName);
}
@Override
public int[] readIntArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readIntArray(fieldName);
}
@Override
public long[] readLongArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readLongArray(fieldName);
}
@Override
public float[] readFloatArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readFloatArray(fieldName);
}
@Override
public double[] readDoubleArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readDoubleArray(fieldName);
}
@Override
public String[] readStringArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readStringArray(fieldName);
}
@Override
public Object[] readObjectArray(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readObjectArray(fieldName);
}
@Override
public byte[][] readArrayOfByteArrays(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readArrayOfByteArrays(fieldName);
}
@Override
public Date readDate(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readDate(fieldName);
}
@Override
public boolean hasField(String fieldName) {
return this.pdxReader.hasField(fieldName);
}
@Override
public Object readField(String fieldName) {
this.readFields.add(fieldName);
return this.pdxReader.readField(fieldName);
}
@Override
public boolean isIdentityField(String fieldName) {
return this.pdxReader.isIdentityField(fieldName);
}
/**
* Returns the indexes of the fields not read during deserialization.
*
* @return the indexes of the unread fields
*/
private int[] generateUnreadDataFieldIndexes() {
PdxType blobType = this.pdxReader.getPdxType();
List<Integer> unreadFields = blobType.getUnreadFieldIndexes(this.readFields);
int[] unreadFieldIndexes = new int[unreadFields.size()];
if (!unreadFields.isEmpty()) {
int i = 0;
for (int fieldIndex : unreadFields) {
unreadFieldIndexes[i] = fieldIndex;
i++;
}
}
return unreadFieldIndexes;
}
@Override
public PdxUnreadFields readUnreadFields() {
return this.pdxReader.readUnreadFields();
}
PdxUnreadData internalReadUnreadFields(PdxUnreadData ud) {
int[] unreadIndexes = generateUnreadDataFieldIndexes();
if (unreadIndexes.length > 0) {
UnreadPdxType unreadLocalPdxType =
new UnreadPdxType(this.pdxReader.getPdxType(), unreadIndexes);
this.tr.defineUnreadType(this.pdxClass, unreadLocalPdxType);
ud.initialize(unreadLocalPdxType, this.pdxReader);
return ud;
} else {
// Remember that this type does not have any unread data.
UnreadPdxType unreadLocalPdxType = new UnreadPdxType(this.pdxReader.getPdxType(), null);
this.tr.defineUnreadType(this.pdxClass, unreadLocalPdxType);
return null;
}
}
@Override
public PdxField getPdxField(String fieldName) {
return this.pdxReader.getPdxField(fieldName);
}
@Override
public char readChar(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readChar(f);
}
@Override
public boolean readBoolean(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readBoolean(f);
}
@Override
public byte readByte(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readByte(f);
}
@Override
public short readShort(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readShort(f);
}
@Override
public int readInt(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readInt(f);
}
@Override
public long readLong(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readLong(f);
}
@Override
public float readFloat(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readFloat(f);
}
@Override
public double readDouble(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readDouble(f);
}
@Override
public String readString(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readString(f);
}
@Override
public Object readObject(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readObject(f);
}
@Override
public char[] readCharArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readCharArray(f);
}
@Override
public boolean[] readBooleanArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readBooleanArray(f);
}
@Override
public byte[] readByteArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readByteArray(f);
}
@Override
public short[] readShortArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readShortArray(f);
}
@Override
public int[] readIntArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readIntArray(f);
}
@Override
public long[] readLongArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readLongArray(f);
}
@Override
public float[] readFloatArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readFloatArray(f);
}
@Override
public double[] readDoubleArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readDoubleArray(f);
}
@Override
public String[] readStringArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readStringArray(f);
}
@Override
public Object[] readObjectArray(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readObjectArray(f);
}
@Override
public byte[][] readArrayOfByteArrays(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readArrayOfByteArrays(f);
}
@Override
public Date readDate(PdxField f) {
this.readFields.add(f.getFieldName());
return this.pdxReader.readDate(f);
}
@Override
public char readChar() {
return this.pdxReader.readChar();
}
@Override
public boolean readBoolean() {
return this.pdxReader.readBoolean();
}
@Override
public byte readByte() {
return this.pdxReader.readByte();
}
@Override
public short readShort() {
return this.pdxReader.readShort();
}
@Override
public int readInt() {
return this.pdxReader.readInt();
}
@Override
public long readLong() {
return this.pdxReader.readLong();
}
@Override
public float readFloat() {
return this.pdxReader.readFloat();
}
@Override
public double readDouble() {
return this.pdxReader.readDouble();
}
@Override
public String readString() {
return this.pdxReader.readString();
}
@Override
public Object readObject() {
return this.pdxReader.readObject();
}
@Override
public char[] readCharArray() {
return this.pdxReader.readCharArray();
}
@Override
public boolean[] readBooleanArray() {
return this.pdxReader.readBooleanArray();
}
@Override
public byte[] readByteArray() {
return this.pdxReader.readByteArray();
}
@Override
public short[] readShortArray() {
return this.pdxReader.readShortArray();
}
@Override
public int[] readIntArray() {
return this.pdxReader.readIntArray();
}
@Override
public long[] readLongArray() {
return this.pdxReader.readLongArray();
}
@Override
public float[] readFloatArray() {
return this.pdxReader.readFloatArray();
}
@Override
public double[] readDoubleArray() {
return this.pdxReader.readDoubleArray();
}
@Override
public String[] readStringArray() {
return this.pdxReader.readStringArray();
}
@Override
public Object[] readObjectArray() {
return this.pdxReader.readObjectArray();
}
@Override
public byte[][] readArrayOfByteArrays() {
return this.pdxReader.readArrayOfByteArrays();
}
@Override
public Date readDate() {
return this.pdxReader.readDate();
}
@Override
public PdxType getPdxType() {
return this.pdxReader.getPdxType();
}
@Override
public void orderedDeserialize(Object obj, AutoClassInfo ci) {
this.pdxReader.orderedDeserialize(obj, ci);
for (PdxFieldWrapper f : ci.getFields()) {
this.readFields.add(f.getName());
}
}
}