EncodedValueRewriter.java revision 4357de47e313869f6566b7468712c29e403c8c24
1/*
2 * Copyright 2014, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 *     * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *     * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 *     * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32package org.jf.dexlib2.rewriter;
33
34import org.jf.dexlib2.ValueType;
35import org.jf.dexlib2.base.value.*;
36import org.jf.dexlib2.iface.AnnotationElement;
37import org.jf.dexlib2.iface.reference.FieldReference;
38import org.jf.dexlib2.iface.reference.MethodReference;
39import org.jf.dexlib2.iface.value.*;
40
41import javax.annotation.Nonnull;
42import java.util.List;
43import java.util.Set;
44
45public class EncodedValueRewriter implements Rewriter<EncodedValue> {
46    @Nonnull protected final Rewriters rewriters;
47
48    public EncodedValueRewriter(@Nonnull Rewriters rewriters) {
49        this.rewriters = rewriters;
50    }
51
52    @Nonnull @Override public EncodedValue rewrite(@Nonnull EncodedValue encodedValue) {
53        switch (encodedValue.getValueType()) {
54            case ValueType.TYPE:
55                return new RewrittenTypeEncodedValue((TypeEncodedValue)encodedValue);
56            case ValueType.FIELD:
57                return new RewrittenFieldEncodedValue((FieldEncodedValue)encodedValue);
58            case ValueType.METHOD:
59                return new RewrittenMethodEncodedValue((MethodEncodedValue)encodedValue);
60            case ValueType.ENUM:
61                return new RewrittenEnumEncodedValue((EnumEncodedValue)encodedValue);
62            case ValueType.ARRAY:
63                return new RewrittenArrayEncodedValue((ArrayEncodedValue)encodedValue);
64            case ValueType.ANNOTATION:
65                return new RewrittenAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
66            default:
67                return encodedValue;
68        }
69    }
70
71    protected class RewrittenTypeEncodedValue extends BaseTypeEncodedValue {
72        @Nonnull protected TypeEncodedValue typeEncodedValue;
73
74        public RewrittenTypeEncodedValue(@Nonnull TypeEncodedValue typeEncodedValue) {
75            this.typeEncodedValue = typeEncodedValue;
76        }
77
78        @Override @Nonnull public String getValue() {
79            return rewriters.getTypeRewriter().rewrite(typeEncodedValue.getValue());
80        }
81    }
82
83    protected class RewrittenFieldEncodedValue extends BaseFieldEncodedValue {
84        @Nonnull protected FieldEncodedValue fieldEncodedValue;
85
86        public RewrittenFieldEncodedValue(@Nonnull FieldEncodedValue fieldEncodedValue) {
87            this.fieldEncodedValue = fieldEncodedValue;
88        }
89
90        @Override @Nonnull public FieldReference getValue() {
91            return rewriters.getFieldReferenceRewriter().rewrite(fieldEncodedValue.getValue());
92        }
93    }
94
95    protected class RewrittenEnumEncodedValue extends BaseEnumEncodedValue {
96        @Nonnull protected EnumEncodedValue enumEncodedValue;
97
98        public RewrittenEnumEncodedValue(@Nonnull EnumEncodedValue enumEncodedValue) {
99            this.enumEncodedValue = enumEncodedValue;
100        }
101
102        @Override @Nonnull public FieldReference getValue() {
103            return rewriters.getFieldReferenceRewriter().rewrite(enumEncodedValue.getValue());
104        }
105    }
106
107    protected class RewrittenMethodEncodedValue extends BaseMethodEncodedValue {
108        @Nonnull protected MethodEncodedValue methodEncodedValue;
109
110        public RewrittenMethodEncodedValue(@Nonnull MethodEncodedValue methodEncodedValue) {
111            this.methodEncodedValue = methodEncodedValue;
112        }
113
114        @Override @Nonnull public MethodReference getValue() {
115            return rewriters.getMethodReferenceRewriter().rewrite(methodEncodedValue.getValue());
116        }
117    }
118
119    protected class RewrittenArrayEncodedValue extends BaseArrayEncodedValue {
120        @Nonnull protected ArrayEncodedValue arrayEncodedValue;
121
122        public RewrittenArrayEncodedValue(@Nonnull ArrayEncodedValue arrayEncodedValue) {
123            this.arrayEncodedValue = arrayEncodedValue;
124        }
125
126        @Override @Nonnull public List<? extends EncodedValue> getValue() {
127            return RewriterUtils.rewriteList(EncodedValueRewriter.this, arrayEncodedValue.getValue());
128        }
129    }
130
131    protected class RewrittenAnnotationEncodedValue extends BaseAnnotationEncodedValue {
132        @Nonnull protected AnnotationEncodedValue annotationEncodedValue;
133
134        public RewrittenAnnotationEncodedValue(@Nonnull AnnotationEncodedValue annotationEncodedValue) {
135            this.annotationEncodedValue = annotationEncodedValue;
136        }
137
138        @Nonnull @Override public String getType() {
139            return rewriters.getTypeRewriter().rewrite(annotationEncodedValue.getType());
140        }
141
142        @Nonnull @Override public Set<? extends AnnotationElement> getElements() {
143            return RewriterUtils.rewriteSet(rewriters.getAnnotationElementRewriter(),
144                    annotationEncodedValue.getElements());
145        }
146    }
147}
148