1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.io;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * An EmulatedFields is an object that represents a set of emulated fields for
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * an object being dumped or loaded. It allows objects to be dumped with a shape
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * different than the fields they were declared to have.
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see ObjectInputStream.GetField
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see ObjectOutputStream.PutField
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see EmulatedFieldsForLoading
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see EmulatedFieldsForDumping
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass EmulatedFields {
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // A slot is a field plus its value
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static class ObjectSlot {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Field descriptor
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectStreamField field;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Actual value this emulated field holds
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object fieldValue;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // If this field has a default value (true) or something has been
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // assigned (false)
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean defaulted = true;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Returns the descriptor for this emulated field.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return the field descriptor
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public ObjectStreamField getField() {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return field;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Returns the value held by this emulated field.
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return the field value
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object getFieldValue() {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return fieldValue;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // The collection of slots the receiver represents
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private ObjectSlot[] slotsToSerialize;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private ObjectStreamField[] declaredFields;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a new instance of EmulatedFields.
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param fields
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            an array of ObjectStreamFields, which describe the fields to
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            be emulated (names, types, etc).
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param declared
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            an array of ObjectStreamFields, which describe the declared
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            fields.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public EmulatedFields(ObjectStreamField[] fields,
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ObjectStreamField[] declared) {
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super();
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // We assume the slots are already sorted in the right shape for dumping
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buildSlots(fields);
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        declaredFields = declared;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Build emulated slots that correspond to emulated fields. A slot is a
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * field descriptor (ObjectStreamField) plus the actual value it holds.
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param fields
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            an array of ObjectStreamField, which describe the fields to be
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            emulated (names, types, etc).
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void buildSlots(ObjectStreamField[] fields) {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slotsToSerialize = new ObjectSlot[fields.length];
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < fields.length; i++) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ObjectSlot s = new ObjectSlot();
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            slotsToSerialize[i] = s;
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            s.field = fields[i];
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // We assume the slots are already sorted in the right shape for dumping
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1063819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Returns {@code true} indicating the field called {@code name} has not had
1073819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * a value explicitly assigned and that it still holds a default value for
1083819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * its type, or {@code false} indicating that the field named has been
1093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * assigned a value explicitly.
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
1123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to test.
1133819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return {@code true} if {@code name} still holds its default value,
1143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         {@code false} otherwise
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
1173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if {@code name} is {@code null}
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean defaulted(String name) throws IllegalArgumentException {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, null);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
122387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no field '" + name + "'");
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted;
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns an ObjectSlot that corresponds to a field named {@code
1293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * fieldName} and type {@code fieldType}. If the field type {@code
1303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * fieldType} corresponds to a primitive type, the field type has to match
1313819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * exactly or {@code null} is returned. If the field type {@code fieldType}
1323819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * corresponds to an object type, the field type has to be compatible in
1333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * terms of assignment, or null is returned. If {@code fieldType} is {@code
1343819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * null}, no such compatibility checking is performed and the slot is
1353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * returned.
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param fieldName
1383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param fieldType
1403819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the type of the field. This will be used to test
1413819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            compatibility. If {@code null}, no testing is done, the
1423819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            corresponding slot is returned.
1433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * @return the object slot, or {@code null} if there is no field with that
1443819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         name, or no compatible field (relative to {@code fieldType})
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private ObjectSlot findSlot(String fieldName, Class<?> fieldType) {
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean isPrimitive = fieldType != null && fieldType.isPrimitive();
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < slotsToSerialize.length; i++) {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ObjectSlot slot = slotsToSerialize[i];
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (slot.field.getName().equals(fieldName)) {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (isPrimitive) {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // Looking for a primitive type field. Types must match
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // *exactly*
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (slot.field.getType() == fieldType) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return slot;
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // Looking for a non-primitive type field.
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (fieldType == null) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return slot; // Null means we take anything
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // Types must be compatible (assignment)
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (slot.field.getType().isAssignableFrom(fieldType)) {
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return slot;
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (declaredFields != null) {
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i = 0; i < declaredFields.length; i++) {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ObjectStreamField field = declaredFields[i];
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (field.getName().equals(fieldName)) {
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (isPrimitive ? field.getType() == fieldType
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            : fieldType == null
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                    || field.getType().isAssignableFrom(
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                            fieldType)) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ObjectSlot slot = new ObjectSlot();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        slot.field = field;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        slot.defaulted = true;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        return slot;
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1913819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the byte value of a given field named {@code name}
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the receiver. If the field has not been assigned any value yet, the
1933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * default value {@code defaultValue} is returned instead.
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
1963819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
1983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
2003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
2033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public byte get(String name, byte defaultValue)
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Byte.TYPE);
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
210387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no byte field '" + name + "'");
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Byte) slot.fieldValue)
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .byteValue();
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the char value of a given field named {@code name} in the
2183819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver. If the field has not been assigned any value yet, the default
2193819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * value {@code defaultValue} is returned instead.
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
2223819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
2243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
2263819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
2293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public char get(String name, char defaultValue)
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Character.TYPE);
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
236387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no char field '" + name + "'");
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Character) slot.fieldValue)
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .charValue();
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2433819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the double value of a given field named {@code name}
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the receiver. If the field has not been assigned any value yet, the
2453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * default value {@code defaultValue} is returned instead.
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
2483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
2503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
2523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
2553819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public double get(String name, double defaultValue)
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Double.TYPE);
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
262387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no double field '" + name + "'");
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Double) slot.fieldValue)
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .doubleValue();
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2693819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the float value of a given field named {@code name} in
2703819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
2713819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * default value {@code defaultValue} is returned instead.
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
2743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
2763819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
2783819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
2813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public float get(String name, float defaultValue)
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Float.TYPE);
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
288387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no float field '" + name + "'");
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Float) slot.fieldValue)
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .floatValue();
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2953819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the int value of a given field named {@code name} in the
2963819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver. If the field has not been assigned any value yet, the default
2973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * value {@code defaultValue} is returned instead.
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
3003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
3023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
3043819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
3073819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int get(String name, int defaultValue)
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Integer.TYPE);
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
314387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no int field '" + name + "'");
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Integer) slot.fieldValue)
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .intValue();
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3213819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the long value of a given field named {@code name} in the
3223819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver. If the field has not been assigned any value yet, the default
3233819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * value {@code defaultValue} is returned instead.
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
3263819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
3283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
3303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
3333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public long get(String name, long defaultValue)
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Long.TYPE);
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
340387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no long field '" + name + "'");
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Long) slot.fieldValue)
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .longValue();
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3473819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the Object value of a given field named {@code name} in
3483819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
3493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * default value {@code defaultValue} is returned instead.
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
3523819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
3543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
3563819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
3593819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Object get(String name, Object defaultValue)
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, null);
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null || slot.field.getType().isPrimitive()) {
366387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no Object field '" + name + "'");
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : slot.fieldValue;
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3723819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the short value of a given field named {@code name} in
3733819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
3743819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * default value {@code defaultValue} is returned instead.
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
3773819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
3793819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
3813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
3843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public short get(String name, short defaultValue)
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Short.TYPE);
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
391387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no short field '" + name + "'");
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Short) slot.fieldValue)
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .shortValue();
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
3983819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Finds and returns the boolean value of a given field named {@code name} in
3993819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * the receiver. If the field has not been assigned any value yet, the
4003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * default value {@code defaultValue} is returned instead.
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
4033819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to find.
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param defaultValue
4053819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            return value in case the field has not been assigned to yet.
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the value of the given field if it has been assigned, the default
4073819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *         value otherwise.
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
4103819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean get(String name, boolean defaultValue)
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws IllegalArgumentException {
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Boolean.TYPE);
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // if not initialized yet, we give the default value
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
417387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no boolean field '" + name + "'");
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slot.defaulted ? defaultValue : ((Boolean) slot.fieldValue)
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .booleanValue();
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
4243819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the byte value of a given field named {@code name} in the
4253819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
4283819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
4303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
4333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, byte value) throws IllegalArgumentException {
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Byte.TYPE);
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
438387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no byte field '" + name + "'");
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Byte.valueOf(value);
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
4453819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the char value of a given field named {@code name} in the
4463819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
4493819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
4513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
4543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, char value) throws IllegalArgumentException {
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Character.TYPE);
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
459387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no char field '" + name + "'");
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Character.valueOf(value);
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
4663819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the double value of a given field named {@code name} in the
4673819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
4703819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
4723819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
4753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, double value) throws IllegalArgumentException {
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Double.TYPE);
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
480387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no double field '" + name + "'");
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Double.valueOf(value);
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
4873819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the float value of a given field named {@code name} in the
4883819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
4913819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
4933819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
4963819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, float value) throws IllegalArgumentException {
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Float.TYPE);
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
501387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no float field '" + name + "'");
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Float.valueOf(value);
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5083819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the int value of a given field named {@code name} in the
5093819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
5123819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
5143819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
5173819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, int value) throws IllegalArgumentException {
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Integer.TYPE);
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
522387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no integer field '" + name + "'");
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Integer.valueOf(value);
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5293819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the long value of a given field named {@code name} in the
5303819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
5333819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
5353819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
5383819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, long value) throws IllegalArgumentException {
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Long.TYPE);
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
543387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no long field '" + name + "'");
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Long.valueOf(value);
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5503819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the Object value of a given field named {@code name} in the
5513819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
5543819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
5563819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
5593819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, Object value) throws IllegalArgumentException {
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Class<?> valueClass = null;
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (value != null) {
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            valueClass = value.getClass();
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, valueClass);
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
568387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no Object field '" + name + "'");
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = value;
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5753819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the short value of a given field named {@code name} in the
5763819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
5793819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
5813819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
5843819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, short value) throws IllegalArgumentException {
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Short.TYPE);
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
589387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no short field '" + name + "'");
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Short.valueOf(value);
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5963819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * Find and set the boolean value of a given field named {@code name} in the
5973819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     * receiver.
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
6003819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            the name of the field to set.
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param value
6023819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *            new value for the field.
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
6053819a76e7c1f49253f0e077bd497f149340c02b8Jesse Wilson     *             if the corresponding field can not be found.
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(String name, boolean value) throws IllegalArgumentException {
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ObjectSlot slot = findSlot(name, Boolean.TYPE);
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (slot == null) {
610387a5041075822ab578065d502ac9e6075864c2eElliott Hughes            throw new IllegalArgumentException("no boolean field '" + name + "'");
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.fieldValue = Boolean.valueOf(value);
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        slot.defaulted = false; // No longer default value
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the array of ObjectSlot the receiver represents.
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return array of ObjectSlot the receiver represents.
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ObjectSlot[] slots() {
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return slotsToSerialize;
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
625