1c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver/*
2c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Copyright 2012, Google Inc.
3c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * All rights reserved.
4c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
5c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Redistribution and use in source and binary forms, with or without
6c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * modification, are permitted provided that the following conditions are
7c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * met:
8c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
9c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Redistributions of source code must retain the above copyright
10c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * notice, this list of conditions and the following disclaimer.
11c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Redistributions in binary form must reproduce the above
12c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * in the documentation and/or other materials provided with the
14c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * distribution.
15c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * contributors may be used to endorse or promote products derived from
17c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * this software without specific prior written permission.
18c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
19c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver */
31c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
32c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverpackage org.jf.dexlib2;
33c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
349057764c22f050848748aac0ab31921d334c3e16Ben Gruverimport org.jf.dexlib2.iface.reference.*;
359057764c22f050848748aac0ab31921d334c3e16Ben Gruverimport org.jf.util.ExceptionWithContext;
369057764c22f050848748aac0ab31921d334c3e16Ben Gruver
3785b31462241daf1d5d5e7b5e94ca926e46dff971Ben Gruverpublic final class ReferenceType {
3870aa787967e18fd782f47a0b5508271637577c30Ben Gruver    public static final int STRING = 0;
3970aa787967e18fd782f47a0b5508271637577c30Ben Gruver    public static final int TYPE = 1;
4070aa787967e18fd782f47a0b5508271637577c30Ben Gruver    public static final int FIELD = 2;
4170aa787967e18fd782f47a0b5508271637577c30Ben Gruver    public static final int METHOD = 3;
4270aa787967e18fd782f47a0b5508271637577c30Ben Gruver    public static final int NONE = 4;
4385b31462241daf1d5d5e7b5e94ca926e46dff971Ben Gruver
44f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver    public static String toString(int referenceType) {
45f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver        switch (referenceType) {
46f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver            case STRING:
47f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver                return "string";
48f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver            case TYPE:
49f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver                return "type";
50f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver            case FIELD:
51f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver                return "field";
52f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver            case METHOD:
53f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver                return "method";
54f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver            default:
559057764c22f050848748aac0ab31921d334c3e16Ben Gruver                throw new InvalidReferenceTypeException(referenceType);
569057764c22f050848748aac0ab31921d334c3e16Ben Gruver        }
579057764c22f050848748aac0ab31921d334c3e16Ben Gruver    }
589057764c22f050848748aac0ab31921d334c3e16Ben Gruver
599057764c22f050848748aac0ab31921d334c3e16Ben Gruver    public static int getReferenceType(Reference reference) {
609057764c22f050848748aac0ab31921d334c3e16Ben Gruver        if (reference instanceof StringReference) {
619057764c22f050848748aac0ab31921d334c3e16Ben Gruver            return STRING;
629057764c22f050848748aac0ab31921d334c3e16Ben Gruver        } else if (reference instanceof TypeReference) {
639057764c22f050848748aac0ab31921d334c3e16Ben Gruver            return TYPE;
649057764c22f050848748aac0ab31921d334c3e16Ben Gruver        } else if (reference instanceof FieldReference) {
659057764c22f050848748aac0ab31921d334c3e16Ben Gruver            return FIELD;
669057764c22f050848748aac0ab31921d334c3e16Ben Gruver        } else if (reference instanceof MethodReference) {
679057764c22f050848748aac0ab31921d334c3e16Ben Gruver            return METHOD;
689057764c22f050848748aac0ab31921d334c3e16Ben Gruver        } else {
699057764c22f050848748aac0ab31921d334c3e16Ben Gruver            throw new IllegalStateException("Invalid reference");
709057764c22f050848748aac0ab31921d334c3e16Ben Gruver        }
719057764c22f050848748aac0ab31921d334c3e16Ben Gruver    }
729057764c22f050848748aac0ab31921d334c3e16Ben Gruver
739057764c22f050848748aac0ab31921d334c3e16Ben Gruver    /**
749057764c22f050848748aac0ab31921d334c3e16Ben Gruver     * Validate a specific reference type. Note that the NONE placeholder is specifically not considered valid here.
759057764c22f050848748aac0ab31921d334c3e16Ben Gruver     *
769057764c22f050848748aac0ab31921d334c3e16Ben Gruver     * @throws InvalidReferenceTypeException
779057764c22f050848748aac0ab31921d334c3e16Ben Gruver     */
789057764c22f050848748aac0ab31921d334c3e16Ben Gruver    public static void validateReferenceType(int referenceType) {
799057764c22f050848748aac0ab31921d334c3e16Ben Gruver        if (referenceType < 0 || referenceType > 3) {
809057764c22f050848748aac0ab31921d334c3e16Ben Gruver            throw new InvalidReferenceTypeException(referenceType);
819057764c22f050848748aac0ab31921d334c3e16Ben Gruver        }
829057764c22f050848748aac0ab31921d334c3e16Ben Gruver    }
839057764c22f050848748aac0ab31921d334c3e16Ben Gruver
849057764c22f050848748aac0ab31921d334c3e16Ben Gruver    public static class InvalidReferenceTypeException extends ExceptionWithContext {
859057764c22f050848748aac0ab31921d334c3e16Ben Gruver        private final int referenceType;
869057764c22f050848748aac0ab31921d334c3e16Ben Gruver
879057764c22f050848748aac0ab31921d334c3e16Ben Gruver        public InvalidReferenceTypeException(int referenceType) {
889057764c22f050848748aac0ab31921d334c3e16Ben Gruver            super("Invalid reference type: %d", referenceType);
899057764c22f050848748aac0ab31921d334c3e16Ben Gruver            this.referenceType = referenceType;
909057764c22f050848748aac0ab31921d334c3e16Ben Gruver        }
919057764c22f050848748aac0ab31921d334c3e16Ben Gruver
929057764c22f050848748aac0ab31921d334c3e16Ben Gruver        public InvalidReferenceTypeException(int referenceType, String message, Object... formatArgs) {
939057764c22f050848748aac0ab31921d334c3e16Ben Gruver            super(message, formatArgs);
949057764c22f050848748aac0ab31921d334c3e16Ben Gruver            this.referenceType = referenceType;
959057764c22f050848748aac0ab31921d334c3e16Ben Gruver        }
969057764c22f050848748aac0ab31921d334c3e16Ben Gruver
979057764c22f050848748aac0ab31921d334c3e16Ben Gruver        public int getReferenceType() {
989057764c22f050848748aac0ab31921d334c3e16Ben Gruver            return referenceType;
99f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver        }
100f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver    }
101f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver
10285b31462241daf1d5d5e7b5e94ca926e46dff971Ben Gruver    private ReferenceType() {}
103c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver}