AnnotationItem.java revision f6c387128427e121477c1b32ad35cdcaa5101ba3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.file;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotation;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.AnnotationVisibility;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.NameValuePair;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstAnnotation;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstArray;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstUtf8;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ByteArrayAnnotatedOutput;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Comparator;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Single annotation, which consists of a type and a set of name-value
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element pairs.
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class AnnotationItem extends OffsettedItem {
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** annotation visibility constant: visible at build time only */
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int VISIBILITY_BUILD = 0;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** annotation visibility constant: visible at runtime */
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int VISIBILITY_RUNTIME = 1;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** annotation visibility constant: visible at runtime only to system */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int VISIBILITY_SYSTEM = 2;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** the required alignment for instances of this class */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final int ALIGNMENT = 1;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** non-null; unique instance of {@link #TypeIdSorter} */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final TypeIdSorter TYPE_ID_SORTER = new TypeIdSorter();
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** non-null; the annotation to represent */
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final Annotation annotation;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * null-ok; type reference for the annotation type; set during
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #addContents}
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private TypeIdItem type;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * null-ok; encoded form, ready for writing to a file; set during
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #place0}
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private byte[] encodedForm;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Comparator that sorts (outer) instances by type id index.
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class TypeIdSorter implements Comparator<AnnotationItem> {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /** {@inheritDoc} */
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int compare(AnnotationItem item1, AnnotationItem item2) {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int index1 = item1.type.getIndex();
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int index2 = item2.type.getIndex();
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (index1 < index2) {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return -1;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (index1 > index2) {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return 1;
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sorts an array of instances, in place, by type id index,
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * ignoring all other aspects of the elements. This is only valid
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to use after type id indices are known.
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param array non-null; array to sort
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void sortByTypeIdIndex(AnnotationItem[] array) {
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Arrays.sort(array, TYPE_ID_SORTER);
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance.
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param annotation non-null; annotation to represent
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AnnotationItem(Annotation annotation) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * The write size isn't known up-front because (the variable-lengthed)
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * leb128 type is used to represent some things.
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(ALIGNMENT, -1);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (annotation == null) {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("annotation == null");
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.annotation = annotation;
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.type = null;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.encodedForm = null;
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ItemType itemType() {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ItemType.TYPE_ANNOTATION_ITEM;
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return annotation.hashCode();
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected int compareTo0(OffsettedItem other) {
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AnnotationItem otherAnnotation = (AnnotationItem) other;
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return annotation.compareTo(otherAnnotation.annotation);
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toHuman() {
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return annotation.toHuman();
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addContents(DexFile file) {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        type = file.getTypeIds().intern(annotation.getType());
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ValueEncoder.addContents(file, annotation);
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void place0(Section addedTo, int offset) {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Encode the data and note the size.
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput();
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ValueEncoder encoder = new ValueEncoder(addedTo.getFile(), out);
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        encoder.writeAnnotation(annotation, false);
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        encodedForm = out.toByteArray();
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Add one for the visibility byte in front of the encoded annotation.
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        setWriteSize(encodedForm.length + 1);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Write a (listing file) annotation for this instance to the given
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * output, that consumes no bytes of output. This is for annotating
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * a reference to this instance at the point of the reference.
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param out non-null; where to output to
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param prefix non-null; prefix for each line of output
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void annotateTo(AnnotatedOutput out, String prefix) {
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.annotate(0, prefix + "visibility: " +
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                annotation.getVisibility().toHuman());
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.annotate(0, prefix + "type: " + annotation.getType().toHuman());
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (NameValuePair pair : annotation.getNameValuePairs()) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            CstUtf8 name = pair.getName();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Constant value = pair.getValue();
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(0, prefix + name.toHuman() + ": " +
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    ValueEncoder.constantToHuman(value));
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void writeTo0(DexFile file, AnnotatedOutput out) {
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean annotates = out.annotates();
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AnnotationVisibility visibility = annotation.getVisibility();
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (annotates) {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(0, offsetString() + " annotation");
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(1, "  visibility: VISBILITY_" + visibility);
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (visibility) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case BUILD:   out.writeByte(VISIBILITY_BUILD); break;
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case RUNTIME: out.writeByte(VISIBILITY_RUNTIME); break;
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            case SYSTEM:  out.writeByte(VISIBILITY_SYSTEM); break;
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            default: {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // EMBEDDED shouldn't appear at the top level.
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new RuntimeException("shouldn't happen");
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (annotates) {
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /*
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * The output is to be annotated, so redo the work previously
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * done by place0(), except this time annotations will actually
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * get emitted.
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ValueEncoder encoder = new ValueEncoder(file, out);
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            encoder.writeAnnotation(annotation, true);
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.write(encodedForm);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
221