summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap/dcae/collectors/restconf/common/AnyNode.java
blob: 860fecc164f331e529eaade11205115d8bdfbe0b (plain)
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
129
130
131
132
/*-
 * ============LICENSE_START=======================================================
 * org.onap.dcaegen2.collectors.restconf
 * ================================================================================
 * Copyright (C) 2018 Huawei. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

package org.onap.dcae.collectors.restconf.common;

import io.vavr.collection.List;
import io.vavr.collection.Set;
import io.vavr.control.Option;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.stream.StreamSupport;

import static io.vavr.API.Set;

public class AnyNode {
    private static final Logger log = LoggerFactory.getLogger(AnyNode.class);

    private Object obj;

    private AnyNode(Object object) {
        this.obj = object;
    }

    public static AnyNode fromString(String content) {
        return new AnyNode(new JSONObject(content));
    }

    /**
     * Returns key set of underlying object. It is assumed that underlying object is of type org.json.JSONObject.
     *
     * @return key set of underlying objects
     */
    public Set<String> keys() {
        return Set(asJsonObject().keySet().toArray(new String[]{}));
    }

    /**
     * Returns value associated with specified key wrapped with AnyValue object. It is assumed that this is of type
     * org.json.JSONObject.
     *
     * @param key for querying value from jsonobject
     * @return value associated with specified key
     */
    public AnyNode get(String key) {
        return new AnyNode(asJsonObject().get(key));
    }

    /**
     * Returns string representation of this. If it happens to have null, the value is treated as
     * org.json.JSONObject.NULL and "null" string is returned then.
     *
     * @return string representation of this
     */
    public String toString() {
        return this.obj.toString();
    }

    /**
     * Returns optional of object under specified key, wrapped with AnyNode object.
     * If underlying object is not of type org.json.JSONObject
     * or underlying object has no given key
     * or given key is null
     * then Optional.empty will be returned.
     *
     * @param key for querying value from AnyNode object
     * @return optional of object under specified key
     */
    public Option<AnyNode> getAsOption(String key) {
        try {
            AnyNode value = get(key);
            if ("null".equals(value.toString())) {
                return Option.none();
            }
            return Option.some(value);
        } catch (JSONException ex) {
            log.error(ex.getMessage(), ex);
            return Option.none();
        }
    }

    /**
     * Converts underlying object to map representation with map values wrapped with AnyNode object. It is assumed that
     * underlying object is of type org.json.JSONObject.
     *
     * @return converts underlying object to map representation
     */
    public List<AnyNode> toList() {
        return List.ofAll(StreamSupport.stream(((JSONArray) this.obj).spliterator(), false).map(AnyNode::new));
    }

    /**
     * Checks if specified key is present in this. It is assumed that this is of type JSONObject.
     *
     * @param key is used to check presence in anynode object
     * @return true if specified key is present in this
     */
    public boolean has(String key) {
        return !getAsOption(key).isEmpty();
    }

    /**
     * Returns as JSONObject.
     *
     * @return jsonobject
     */
    private JSONObject asJsonObject() {
        return (JSONObject) this.obj;
    }


}