test/jdk/javax/management/remote/rest/json/JSONTest.java
author hb
Mon, 25 Dec 2017 20:42:05 +0530
branchjmx-rest-api
changeset 55994 9721e36abeb0
permissions -rw-r--r--
Implementation of GET for new APIs Implemented paging and filtering for GET
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     1
/*
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     2
 * To change this license header, choose License Headers in Project Properties.
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     3
 * To change this template file, choose Tools | Templates
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     4
 * and open the template in the editor.
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     5
 */
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     6
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     7
import com.oracle.jmx.remote.rest.json.parser.JSONParser;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     8
import com.oracle.jmx.remote.rest.json.parser.ParseException;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     9
import java.util.ArrayList;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    10
import java.util.Iterator;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    11
import java.util.LinkedHashMap;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    12
import java.util.LinkedList;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    13
import java.util.List;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    14
import java.util.Random;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    15
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    16
/**
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    17
 * @test @modules java.management.rest
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    18
 * @run main JSONTest
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    19
 */
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    20
public class JSONTest {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    21
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    22
    public static void main(String[] args) throws ParseException {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    23
        JSONGraphGenerator graphGen = new JSONGraphGenerator(50);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    24
        JSONElement jElem = graphGen.generateJsonGraph(20000);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    25
        System.out.println("Graph Generated");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    26
        String str = jElem.toJsonString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    27
        System.out.println(str);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    28
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    29
        JSONParser parser = new JSONParser(str);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    30
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    31
        com.oracle.jmx.remote.rest.json.JSONElement parse = parser.parse();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    32
        String resultJson = parse.toJsonString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    33
        System.out.println(resultJson);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    34
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    35
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    36
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    37
interface JSONElement {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    38
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    39
    String toJsonString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    40
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    41
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    42
interface Visitable {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    43
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    44
    public void accept(NodeVisitor visitor);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    45
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    46
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    47
interface NodeVisitor {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    48
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    49
    public void visit(Node node);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    50
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    51
    //visit other concrete items
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    52
    public void visit(Digit19 digit12);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    53
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    54
    public void visit(Digits dvd);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    55
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    56
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    57
class Node implements Visitable {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    58
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    59
    final private String label;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    60
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    61
    public Node(String label) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    62
        children = new LinkedList<>();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    63
        this.label = label;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    64
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    65
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    66
    public Node() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    67
        this("");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    68
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    69
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    70
    public void add(Node node) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    71
        if (!children.contains(node)) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    72
            children.add(node);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    73
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    74
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    75
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    76
    public String getLabel() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    77
        return label;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    78
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    79
    List<Node> children;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    80
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    81
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    82
    public void accept(NodeVisitor visitor) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    83
        visitor.visit(this);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    84
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    85
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    86
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    87
class Digit19 extends Node {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    88
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    89
    Random rnd = new Random();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    90
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    91
    public Digit19() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    92
        super();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    93
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    94
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    95
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    96
    public String getLabel() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    97
        return "" + (rnd.nextInt(9) + 1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    98
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    99
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   100
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   101
class Digits extends Node {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   102
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   103
    Random rnd = new Random();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   104
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   105
    public Digits() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   106
        super();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   107
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   108
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   109
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   110
    public String getLabel() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   111
        return "" + (rnd.nextInt(10));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   112
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   113
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   114
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   115
class JSONNumberGenerator {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   116
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   117
    private final static Node root;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   118
    Number num;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   119
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   120
    static {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   121
        root = new Node("R");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   122
        Node minus1 = new Node("-");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   123
        Node zero = new Node("0");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   124
        Node digit19 = new Digit19();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   125
        Node digits1 = new Digits();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   126
        Node dot = new Node(".");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   127
        Node digits2 = new Digits();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   128
        Node e = new Node("e");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   129
        Node E = new Node("E");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   130
        Node plus = new Node("+");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   131
        Node minus2 = new Node("-");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   132
        Node digits3 = new Digits();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   133
        Node terminal = new Node("T");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   134
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   135
        root.add(zero);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   136
        root.add(minus1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   137
        root.add(digit19);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   138
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   139
        minus1.add(zero);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   140
        minus1.add(digit19);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   141
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   142
        zero.add(dot);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   143
//        zero.add(e);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   144
//        zero.add(E);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   145
        zero.add(terminal);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   146
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   147
        digit19.add(dot);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   148
        digit19.add(digits1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   149
//        digit19.add(e);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   150
//        digit19.add(E);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   151
        digit19.add(terminal);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   152
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   153
        digits1.add(dot);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   154
        digits1.add(digits1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   155
//        digits1.add(e);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   156
//        digits1.add(E);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   157
        digits1.add(terminal);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   158
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   159
        dot.add(digits2);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   160
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   161
        digits2.add(digits2);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   162
        digits2.add(e);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   163
        digits2.add(E);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   164
        digits2.add(terminal);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   165
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   166
        e.add(plus);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   167
        e.add(minus2);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   168
        e.add(digits3);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   169
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   170
        E.add(plus);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   171
        E.add(minus2);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   172
        E.add(digits3);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   173
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   174
        plus.add(digits3);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   175
        minus2.add(digits3);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   176
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   177
        digits3.add(digits3);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   178
        digits3.add(terminal);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   179
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   180
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   181
    private static class NumberNodeVisitor implements NodeVisitor {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   182
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   183
        private final StringBuilder sbuf = new StringBuilder();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   184
        Random rnd = new Random();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   185
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   186
        public NumberNodeVisitor() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   187
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   188
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   189
        @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   190
        public void visit(Node node) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   191
            if (!node.getLabel().equals("R")) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   192
                sbuf.append(node.getLabel());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   193
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   194
            if (node.children.size() > 0) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   195
                Node child = node.children.get(rnd.nextInt(node.children.size()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   196
                if (!child.getLabel().equals("T")) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   197
                    visit(child);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   198
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   199
            } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   200
                System.out.println("Found node " + node.getLabel() + " with children : " + node.children.size());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   201
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   202
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   203
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   204
        @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   205
        public void visit(Digit19 digit12) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   206
            sbuf.append(digit12.getLabel());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   207
            Node child = digit12.children.get(rnd.nextInt(digit12.children.size()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   208
            if (!child.getLabel().equals("T")) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   209
                visit(child);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   210
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   211
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   212
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   213
        @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   214
        public void visit(Digits digits) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   215
            sbuf.append(digits.getLabel());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   216
            Node child = digits.children.get(rnd.nextInt(digits.children.size()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   217
            if (!child.getLabel().equals("T")) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   218
                visit(child);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   219
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   220
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   221
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   222
        public String getNumber() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   223
            return sbuf.toString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   224
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   225
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   226
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   227
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   228
    public String generate() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   229
        NumberNodeVisitor visitor = new NumberNodeVisitor();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   230
        visitor.visit(root);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   231
        // System.out.println(visitor.getNumber());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   232
//        Double.parseDouble(visitor.getNumber());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   233
        return visitor.getNumber();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   234
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   235
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   236
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   237
class TestJsonObject extends LinkedHashMap<String, JSONElement> implements JSONElement {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   238
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   239
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   240
    public String toJsonString() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   241
        if (isEmpty()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   242
            return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   243
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   244
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   245
        StringBuilder sbuild = new StringBuilder();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   246
        sbuild.append("{");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   247
        keySet().forEach((elem) -> {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   248
            sbuild.append(elem).append(": ").
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   249
                    append((get(elem) != null) ? get(elem).toJsonString() : "null").append(",");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   250
        });
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   251
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   252
        sbuild.deleteCharAt(sbuild.lastIndexOf(","));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   253
        sbuild.append("}");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   254
        return sbuild.toString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   255
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   256
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   257
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   258
class TestJsonArray extends ArrayList<JSONElement> implements JSONElement {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   259
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   260
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   261
    public String toJsonString() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   262
        if (isEmpty()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   263
            return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   264
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   265
        StringBuilder sbuild = new StringBuilder();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   266
        sbuild.append("[");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   267
        Iterator<JSONElement> itr = iterator();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   268
        while (itr.hasNext()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   269
            JSONElement val = itr.next();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   270
            if (val != null) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   271
                sbuild.append(val.toJsonString()).append(", ");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   272
            } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   273
                sbuild.append("null").append(", ");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   274
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   275
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   276
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   277
        sbuild.deleteCharAt(sbuild.lastIndexOf(","));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   278
        sbuild.append("]");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   279
        return sbuild.toString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   280
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   281
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   282
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   283
class TestJsonPrimitive implements JSONElement {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   284
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   285
    private final String s;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   286
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   287
    public TestJsonPrimitive(String s) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   288
        this.s = s;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   289
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   290
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   291
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   292
    public String toJsonString() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   293
        return s;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   294
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   295
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   296
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   297
class JSONStringGenerator {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   298
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   299
    private static final int minStringLength = 0;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   300
    private static final int maxStringLength = 10;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   301
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   302
    private final Random rnd = new Random(System.currentTimeMillis());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   303
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   304
    private static final String specials = "\b" + "\f" + "\n" + "\r" + "\t" + "\\" + "\"";    // TODO: Special characters '/', '\', '"', "\\uxxxx"
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   305
    private static final String alphanums = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   306
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   307
    public String generate() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   308
        char ch;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   309
        StringBuilder sbuf = new StringBuilder();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   310
        int len = minStringLength + rnd.nextInt(maxStringLength - minStringLength + 1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   311
        sbuf.append("\"");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   312
        for (int i = 0; i < len; i++) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   313
            if (rnd.nextInt(10) == 1) { // 1/10 chances of a control character
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   314
                ch = specials.charAt(rnd.nextInt(specials.length()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   315
            } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   316
//                ch = alphanums.charAt(rnd.nextInt(alphanums.length()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   317
                ch = (char) rnd.nextInt(Character.MAX_VALUE + 1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   318
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   319
            switch (ch) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   320
                case '\"':
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   321
                case '\\':
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   322
                    sbuf.append('\\');
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   323
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   324
            sbuf.append(ch);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   325
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   326
        sbuf.append("\"");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   327
        return sbuf.toString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   328
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   329
}
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   330
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   331
class JSONGraphGenerator {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   332
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   333
    JSONStringGenerator stringGen;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   334
    JSONNumberGenerator numGen;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   335
    private final int maxChildPerNode;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   336
    static Random rnd = new Random(System.currentTimeMillis());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   337
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   338
    public JSONGraphGenerator(int maxChildPerNode) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   339
        this.maxChildPerNode = maxChildPerNode;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   340
        stringGen = new JSONStringGenerator();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   341
        numGen = new JSONNumberGenerator();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   342
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   343
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   344
    private TestJsonPrimitive generatePrimitiveData() {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   345
        int primitiveTypre = rnd.nextInt(10) + 1;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   346
        switch (primitiveTypre) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   347
            case 1:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   348
            case 2:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   349
            case 3:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   350
            case 4:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   351
                return new TestJsonPrimitive(stringGen.generate());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   352
            case 5:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   353
            case 6:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   354
            case 7:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   355
            case 8:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   356
                return new TestJsonPrimitive(numGen.generate());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   357
            case 9:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   358
                return new TestJsonPrimitive(Boolean.toString(rnd.nextBoolean()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   359
            case 10:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   360
                return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   361
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   362
        return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   363
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   364
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   365
    public TestJsonObject generateJsonObject(int size) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   366
        TestJsonObject jobj = new TestJsonObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   367
        if (size <= maxChildPerNode) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   368
            for (int i = 0; i < size; i++) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   369
                jobj.put(stringGen.generate(), generatePrimitiveData());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   370
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   371
        } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   372
            int newSize = size;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   373
            do {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   374
                int childSize = rnd.nextInt(newSize);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   375
                jobj.put(stringGen.generate(), generateJsonGraph(childSize));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   376
                newSize = newSize - childSize;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   377
            } while (newSize > maxChildPerNode);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   378
            jobj.put(stringGen.generate(), generateJsonGraph(newSize));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   379
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   380
        return jobj;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   381
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   382
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   383
    public TestJsonArray generateJsonArray(int size) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   384
        TestJsonArray array = new TestJsonArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   385
        if (size <= maxChildPerNode) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   386
            for (int i = 0; i < size; i++) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   387
                array.add(generatePrimitiveData());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   388
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   389
        } else if (size >= maxChildPerNode) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   390
            int newSize = size;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   391
            do {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   392
                int childSize = rnd.nextInt(newSize);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   393
                array.add(generateJsonGraph(childSize));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   394
                newSize = newSize - childSize;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   395
            } while (newSize > maxChildPerNode);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   396
            array.add(generateJsonGraph(newSize));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   397
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   398
        return array;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   399
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   400
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   401
    public JSONElement generateJsonGraph(int size) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   402
        if (rnd.nextBoolean()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   403
            return generateJsonArray(size);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   404
        } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   405
            return generateJsonObject(size);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   406
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   407
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   408
}