summaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main/java/com/yahoo/data/access/Inspector.java
blob: 5bf8016aad3065ab9465e00b2303d2cfe5361300 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.data.access;


import java.util.Map;

/**
 * This is a generic API for accessing structured, generic, schemaless data.
 * An inspector is a handle to a value that has one of 8 specific types:
 * EMPTY, the 5 scalar types BOOL, LONG, DOUBLE, STRING, or DATA, the
 * simple list-like ARRAY container and the struct-like OBJECT container.
 * Instrospection methods are available, but you can also use accessors
 * with a default value if you expect a certain type and just want your
 * default value if some field doesn't exist or was of the wrong type.
 **/
public interface Inspector extends Inspectable {

    /**
     * Check if the inspector is valid.
     * If you try to access a field or array entry that does not exist,
     * you will get an invalid Inspector returned.
     */
    public boolean valid();

    /** Get the type of an inspector */
    public Type type();

    /** Get the number of entries in an ARRAY (always returns 0 for non-arrays) */
    public int entryCount();

    /** Get the number of fields in an OBJECT (always returns 0 for non-objects) */
    public int fieldCount();

    /** Access the inspector's value if it's a BOOLEAN; otherwise throws exception */
    public boolean asBool();

    /** Access the inspector's value if it's a LONG (or DOUBLE); otherwise throws exception */
    public long asLong();

    /** Access the inspector's value if it's a DOUBLE (or LONG); otherwise throws exception */
    public double asDouble();

    /** Access the inspector's value if it's a STRING; otherwise throws exception */
    public String asString();

    /**
     * Access the inspector's value (in utf-8 representation) if it's
     * a STRING; otherwise throws exception
     **/
    public byte[] asUtf8();

    /** Access the inspector's value if it's DATA; otherwise throws exception */
    public byte[] asData();

    /** Get the inspector's value (or the supplied default), never throws */
    public boolean asBool(boolean defaultValue);

    /** Get the inspector's value (or the supplied default), never throws */
    public long asLong(long defaultValue);

    /** Get the inspector's value (or the supplied default), never throws */
    public double asDouble(double defaultValue);

    /** Get the inspector's value (or the supplied default), never throws */
    public String asString(String defaultValue);

    /** Get the inspector's value (or the supplied default), never throws */
    public byte[] asUtf8(byte[] defaultValue);

    /** Get the inspector's value (or the supplied default), never throws */
    public byte[] asData(byte[] defaultValue);

    /**
     * Traverse an array value, performing callbacks for each entry.
     *
     * If the current Inspector is connected to an array value,
     * perform callbacks to the given traverser for each entry
     * contained in the array.  Otherwise a no-op.
     * @param at traverser callback object.
     **/
    @SuppressWarnings("overloads")
    public void traverse(ArrayTraverser at);

    /**
     * Traverse an object value, performing callbacks for each field.
     *
     * If the current Inspector is connected to an object value,
     * perform callbacks to the given traverser for each field
     * contained in the object.  Otherwise a no-op.
     * @param ot traverser callback object.
     **/
    @SuppressWarnings("overloads")
    public void traverse(ObjectTraverser ot);

    /**
     * Access an array entry.
     *
     * If the current Inspector doesn't connect to an array value,
     * or the given array index is out of bounds, the returned
     * Inspector will be invalid.
     * @param idx array index.
     * @return a new Inspector for the entry value.
     **/
    public Inspector entry(int idx);

    /**
     * Access an field in an object.
     *
     * If the current Inspector doesn't connect to an object value, or
     * the object value does not contain a field with the given symbol
     * name, the returned Inspector will be invalid.
     * @param name symbol name.
     * @return a new Inspector for the field value.
     **/
    public Inspector field(String name);

    /**
     * Convert an array to an iterable list.  Other types will just
     * return an empty list.
     **/
    public Iterable<Inspector> entries();

    /**
     * Convert an object to an iterable list of (name, value) pairs.
     * Other types will just return an empty list.
     **/
    public Iterable<Map.Entry<String,Inspector>> fields();
}