1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An EmulatedFields is an object that represents a set of emulated fields for
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an object being dumped or loaded. It allows objects to be dumped with a shape
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * different than the fields they were declared to have.
24f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectInputStream.GetField
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream.PutField
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see EmulatedFieldsForLoading
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see EmulatedFieldsForDumping
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass EmulatedFields {
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // A slot is a field plus its value
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class ObjectSlot {
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Field descriptor
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectStreamField field;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Actual value this emulated field holds
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object fieldValue;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // If this field has a default value (true) or something has been
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // assigned (false)
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean defaulted = true;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the descriptor for this emulated field.
47f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the field descriptor
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public ObjectStreamField getField() {
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return field;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the value held by this emulated field.
56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the field value
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Object getFieldValue() {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return fieldValue;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // The collection of slots the receiver represents
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ObjectSlot[] slotsToSerialize;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ObjectStreamField[] declaredFields;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of EmulatedFields.
71f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fields
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an array of ObjectStreamFields, which describe the fields to
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            be emulated (names, types, etc).
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param declared
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an array of ObjectStreamFields, which describe the declared
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            fields.
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
7928eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes    public EmulatedFields(ObjectStreamField[] fields, ObjectStreamField[] declared) {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // We assume the slots are already sorted in the right shape for dumping
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buildSlots(fields);
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        declaredFields = declared;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Build emulated slots that correspond to emulated fields. A slot is a
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * field descriptor (ObjectStreamField) plus the actual value it holds.
88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fields
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an array of ObjectStreamField, which describe the fields to be
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            emulated (names, types, etc).
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void buildSlots(ObjectStreamField[] fields) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slotsToSerialize = new ObjectSlot[fields.length];
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < fields.length; i++) {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ObjectSlot s = new ObjectSlot();
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            slotsToSerialize[i] = s;
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            s.field = fields[i];
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // We assume the slots are already sorted in the right shape for dumping
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
104f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Returns {@code true} indicating the field called {@code name} has not had
105f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * a value explicitly assigned and that it still holds a default value for
106f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * its type, or {@code false} indicating that the field named has been
107f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * assigned a value explicitly.
108f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
110f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to test.
111f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @return {@code true} if {@code name} still holds its default value,
112f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         {@code false} otherwise
113f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if {@code name} is {@code null}
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean defaulted(String name) throws IllegalArgumentException {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectSlot slot = findSlot(name, null);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (slot == null) {
120f8ba29b25f7fc2ef93ab39a8ac436c94d55b3984Elliott Hughes            throw new IllegalArgumentException("no field '" + name + "'");
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return slot.defaulted;
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
126f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns an ObjectSlot that corresponds to a field named {@code
127f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * fieldName} and type {@code fieldType}. If the field type {@code
128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * fieldType} corresponds to a primitive type, the field type has to match
129f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * exactly or {@code null} is returned. If the field type {@code fieldType}
130f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * corresponds to an object type, the field type has to be compatible in
131f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * terms of assignment, or null is returned. If {@code fieldType} is {@code
132f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * null}, no such compatibility checking is performed and the slot is
133f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * returned.
134f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fieldName
136f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param fieldType
138f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the type of the field. This will be used to test
139f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            compatibility. If {@code null}, no testing is done, the
140f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            corresponding slot is returned.
141f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @return the object slot, or {@code null} if there is no field with that
142f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         name, or no compatible field (relative to {@code fieldType})
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ObjectSlot findSlot(String fieldName, Class<?> fieldType) {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean isPrimitive = fieldType != null && fieldType.isPrimitive();
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < slotsToSerialize.length; i++) {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ObjectSlot slot = slotsToSerialize[i];
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (slot.field.getName().equals(fieldName)) {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (isPrimitive) {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // Looking for a primitive type field. Types must match
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // *exactly*
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (slot.field.getType() == fieldType) {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return slot;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // Looking for a non-primitive type field.
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (fieldType == null) {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return slot; // Null means we take anything
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // Types must be compatible (assignment)
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (slot.field.getType().isAssignableFrom(fieldType)) {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return slot;
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (declaredFields != null) {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < declaredFields.length; i++) {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ObjectStreamField field = declaredFields[i];
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (field.getName().equals(fieldName)) {
17228eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes                    if (isPrimitive ? fieldType == field.getType() : fieldType == null ||
17328eb98ecd43c27702e85b0561e040e2da10320a6Elliott Hughes                            field.getType().isAssignableFrom(fieldType)) {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        ObjectSlot slot = new ObjectSlot();
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        slot.field = field;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        slot.defaulted = true;
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return slot;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    private ObjectSlot findMandatorySlot(String name, Class<?> type) {
186e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findSlot(name, type);
187e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        if (slot == null || (type == null && slot.field.getType().isPrimitive())) {
188e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes            throw new IllegalArgumentException("no field '" + name + "' of type " + type);
189e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        }
190e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot;
191e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    }
192e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
194f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the byte value of a given field named {@code name}
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the receiver. If the field has not been assigned any value yet, the
196f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * default value {@code defaultValue} is returned instead.
197f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
201f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
203f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
204f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
206f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
208e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public byte get(String name, byte defaultValue) throws IllegalArgumentException {
209e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, byte.class);
210e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Byte) slot.fieldValue).byteValue();
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
214f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the char value of a given field named {@code name} in the
215f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver. If the field has not been assigned any value yet, the default
216f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * value {@code defaultValue} is returned instead.
217f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
219f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
221f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
223f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
224f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
226f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public char get(String name, char defaultValue) throws IllegalArgumentException {
229e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, char.class);
230e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Character) slot.fieldValue).charValue();
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
234f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the double value of a given field named {@code name}
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the receiver. If the field has not been assigned any value yet, the
236f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * default value {@code defaultValue} is returned instead.
237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
239f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
241f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
243f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
244f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
246f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
248e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public double get(String name, double defaultValue) throws IllegalArgumentException {
249e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, double.class);
250e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Double) slot.fieldValue).doubleValue();
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
254f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the float value of a given field named {@code name} in
255f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
256f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * default value {@code defaultValue} is returned instead.
257f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
259f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
261f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
263f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
264f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
266f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
268e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public float get(String name, float defaultValue) throws IllegalArgumentException {
269e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, float.class);
270e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Float) slot.fieldValue).floatValue();
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
274f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the int value of a given field named {@code name} in the
275f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver. If the field has not been assigned any value yet, the default
276f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * value {@code defaultValue} is returned instead.
277f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
279f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
281f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
283f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
284f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
286f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
288e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public int get(String name, int defaultValue) throws IllegalArgumentException {
289e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, int.class);
290e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Integer) slot.fieldValue).intValue();
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
294f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the long value of a given field named {@code name} in the
295f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver. If the field has not been assigned any value yet, the default
296f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * value {@code defaultValue} is returned instead.
297f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
299f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
301f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
303f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
304f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
306f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
308e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public long get(String name, long defaultValue) throws IllegalArgumentException {
309e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, long.class);
310e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Long) slot.fieldValue).longValue();
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
314f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the Object value of a given field named {@code name} in
315f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
316f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * default value {@code defaultValue} is returned instead.
317f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
319f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
321f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
323f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
324f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
326f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
328e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public Object get(String name, Object defaultValue) throws IllegalArgumentException {
329e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, null);
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return slot.defaulted ? defaultValue : slot.fieldValue;
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
334f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the short value of a given field named {@code name} in
335f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
336f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * default value {@code defaultValue} is returned instead.
337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
339f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
341f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
343f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
344f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
346f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
348e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public short get(String name, short defaultValue) throws IllegalArgumentException {
349e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, short.class);
350e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Short) slot.fieldValue).shortValue();
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
354f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Finds and returns the boolean value of a given field named {@code name} in
355f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
356f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * default value {@code defaultValue} is returned instead.
357f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
359f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to find.
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
361f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            return value in case the field has not been assigned to yet.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the given field if it has been assigned, the default
363f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *         value otherwise.
364f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
366f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
368e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes    public boolean get(String name, boolean defaultValue) throws IllegalArgumentException {
369e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, boolean.class);
370e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        return slot.defaulted ? defaultValue : ((Boolean) slot.fieldValue).booleanValue();
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
374f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the byte value of a given field named {@code name} in the
375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
376f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
378f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
381f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
383f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, byte value) throws IllegalArgumentException {
386e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, byte.class);
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Byte.valueOf(value);
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
392f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the char value of a given field named {@code name} in the
393f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
394f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
396f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
398f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
399f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
401f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, char value) throws IllegalArgumentException {
404e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, char.class);
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Character.valueOf(value);
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
410f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the double value of a given field named {@code name} in the
411f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
412f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
414f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
416f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
417f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
419f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, double value) throws IllegalArgumentException {
422e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, double.class);
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Double.valueOf(value);
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
428f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the float value of a given field named {@code name} in the
429f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
430f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
432f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
434f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
435f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
437f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, float value) throws IllegalArgumentException {
440e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, float.class);
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Float.valueOf(value);
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
446f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the int value of a given field named {@code name} in the
447f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
448f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
450f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
452f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
453f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
455f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, int value) throws IllegalArgumentException {
458e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, int.class);
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Integer.valueOf(value);
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
464f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the long value of a given field named {@code name} in the
465f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
466f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
468f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
470f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
471f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
473f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, long value) throws IllegalArgumentException {
476e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, long.class);
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Long.valueOf(value);
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
482f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the Object value of a given field named {@code name} in the
483f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
484f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
486f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
488f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
489f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
491f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, Object value) throws IllegalArgumentException {
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Class<?> valueClass = null;
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (value != null) {
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            valueClass = value.getClass();
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
498e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, valueClass);
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = value;
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
504f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the short value of a given field named {@code name} in the
505f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
506f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
508f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
510f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
511f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
513f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, short value) throws IllegalArgumentException {
516e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, short.class);
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Short.valueOf(value);
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
522f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Find and set the boolean value of a given field named {@code name} in the
523f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * receiver.
524f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
526f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            the name of the field to set.
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
528f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *            new value for the field.
529f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
531f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *             if the corresponding field can not be found.
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void put(String name, boolean value) throws IllegalArgumentException {
534e26ba79900d471d02d656f686926918ef7dc751fElliott Hughes        ObjectSlot slot = findMandatorySlot(name, boolean.class);
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.fieldValue = Boolean.valueOf(value);
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        slot.defaulted = false; // No longer default value
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Return the array of ObjectSlot the receiver represents.
541f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return array of ObjectSlot the receiver represents.
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ObjectSlot[] slots() {
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return slotsToSerialize;
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
548