/*
* 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 java.io;
/**
* An EmulatedFieldsForDumping is an object that represents a set of emulated
* fields for an object being dumped. It is a concrete implementation for
* ObjectOutputStream.PutField
*
*
* @see ObjectOutputStream.PutField
* @see EmulatedFieldsForLoading
*/
class EmulatedFieldsForDumping extends ObjectOutputStream.PutField {
// Record the ObjectOutputStream that created this PutField for checking in 'write'.
private final ObjectOutputStream oos;
// The actual representation, with a more powerful API (set&get)
private EmulatedFields emulatedFields;
/**
* Constructs a new instance of EmulatedFieldsForDumping.
*
* @param streamClass
* a ObjectStreamClass, which describe the fields to be emulated
* (names, types, etc).
*/
EmulatedFieldsForDumping(ObjectOutputStream oos, ObjectStreamClass streamClass) {
this.oos = oos;
this.emulatedFields = new EmulatedFields(streamClass.fields(), (ObjectStreamField[]) null);
}
/**
* Return the actual EmulatedFields instance used by the receiver. We have
* the actual work in a separate class so that the code can be shared. The
* receiver has to be of a subclass of PutField.
*
* @return array of ObjectSlot the receiver represents.
*/
EmulatedFields emulatedFields() {
return emulatedFields;
}
/**
* Find and set the byte value of a given field named name
in
* the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, byte value) {
emulatedFields.put(name, value);
}
/**
* Find and set the char value of a given field named name
in
* the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, char value) {
emulatedFields.put(name, value);
}
/**
* Find and set the double value of a given field named name
* in the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, double value) {
emulatedFields.put(name, value);
}
/**
* Find and set the float value of a given field named name
* in the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, float value) {
emulatedFields.put(name, value);
}
/**
* Find and set the int value of a given field named name
in
* the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, int value) {
emulatedFields.put(name, value);
}
/**
* Find and set the long value of a given field named name
in
* the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, long value) {
emulatedFields.put(name, value);
}
/**
* Find and set the Object value of a given field named name
* in the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, Object value) {
emulatedFields.put(name, value);
}
/**
* Find and set the short value of a given field named name
* in the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, short value) {
emulatedFields.put(name, value);
}
/**
* Find and set the boolean value of a given field named name
* in the receiver.
*
* @param name
* A String, the name of the field to set
* @param value
* New value for the field.
*/
@Override
public void put(String name, boolean value) {
emulatedFields.put(name, value);
}
/**
* Write the field values to the specified ObjectOutput.
*
* @param output
* the ObjectOutput
*
* @throws IOException
* If an IO exception happened when writing the field values.
*/
@Override
@Deprecated
public void write(ObjectOutput output) throws IOException {
if (!output.equals(oos)) {
throw new IllegalArgumentException("Attempting to write to a different stream than the one that created this PutField");
}
for (EmulatedFields.ObjectSlot slot : emulatedFields.slots()) {
Object fieldValue = slot.getFieldValue();
Class> type = slot.getField().getType();
if (type == int.class) {
output.writeInt(fieldValue != null ? ((Integer) fieldValue).intValue() : 0);
} else if (type == byte.class) {
output.writeByte(fieldValue != null ? ((Byte) fieldValue).byteValue() : 0);
} else if (type == char.class) {
output.writeChar(fieldValue != null ? ((Character) fieldValue).charValue() : 0);
} else if (type == short.class) {
output.writeShort(fieldValue != null ? ((Short) fieldValue).shortValue() : 0);
} else if (type == boolean.class) {
output.writeBoolean(fieldValue != null ? ((Boolean) fieldValue).booleanValue() : false);
} else if (type == long.class) {
output.writeLong(fieldValue != null ? ((Long) fieldValue).longValue() : 0);
} else if (type == float.class) {
output.writeFloat(fieldValue != null ? ((Float) fieldValue).floatValue() : 0);
} else if (type == double.class) {
output.writeDouble(fieldValue != null ? ((Double) fieldValue).doubleValue() : 0);
} else {
// Either array or Object
output.writeObject(fieldValue);
}
}
}
}