AnnotationSetRefList.java revision 57b5423285167163893078ea08830c15d8313a93
1/*
2 * [The "BSD licence"]
3 * Copyright (c) 2009 Ben Gruver
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 *    derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29package org.jf.dexlib;
30
31import org.jf.dexlib.ItemType;
32
33import java.util.ArrayList;
34import java.util.List;
35
36public class AnnotationSetRefList extends OffsettedItem<AnnotationSetRefList> {
37    private final ArrayList<OffsettedItemReference<AnnotationSetItem>> annotationSetReferences =
38            new ArrayList<OffsettedItemReference<AnnotationSetItem>>();
39
40    private final ListSizeField annotationSetCountField;
41    private final FieldListField<OffsettedItemReference<AnnotationSetItem>> annotationSetsListField;
42
43    public AnnotationSetRefList(final DexFile dexFile, int offset) {
44        super(offset);
45
46        fields = new Field[] {
47                annotationSetCountField = new ListSizeField(annotationSetReferences, new IntegerField("size")),
48                annotationSetsListField = new FieldListField<OffsettedItemReference<AnnotationSetItem>>(
49                        annotationSetReferences, "list") {
50                    protected OffsettedItemReference<AnnotationSetItem> make() {
51                        return new OffsettedItemReference<AnnotationSetItem>(dexFile.AnnotationSetsSection,
52                                new IntegerField(null), "annotation_set_ref_item");
53                    }
54                }
55        };
56    }
57
58    public AnnotationSetRefList(final DexFile dexFile, List<AnnotationSetItem> annotationSets) {
59        this(dexFile, -1);
60
61        for (AnnotationSetItem annotationSet: annotationSets) {
62            OffsettedItemReference<AnnotationSetItem> annotationSetReference = annotationSetsListField.make();
63            annotationSetReference.setReference(annotationSet);
64            this.annotationSetReferences.add(annotationSetReference);
65        }
66    }
67
68    protected int getAlignment() {
69        return 4;
70    }
71
72    public ItemType getItemType() {
73        return ItemType.TYPE_ANNOTATION_SET_REF_LIST;
74    }
75
76    public String getConciseIdentity() {
77        return "annotation_set_item @0x" + Integer.toHexString(getOffset());
78    }
79}
80