2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data;
25 import java.io.IOException;
26 import java.nio.file.Files;
27 import org.json.JSONArray;
28 import org.json.JSONException;
29 import org.json.JSONObject;
30 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
34 public abstract class HtUserdataManagerBase implements HtUserdataManager {
36 private static final Logger LOG = LoggerFactory.getLogger(HtUserdataManagerBase.class);
38 private static final String USERDATA_DEFAULTS_FILENAME = "etc/userdata-defaults.json";
39 private static final JSONObject USERDATA_DEFAULTS_CONTENT = loadDefaults();
41 protected static JSONObject loadDefaults() {
42 File f = new File(USERDATA_DEFAULTS_FILENAME);
47 content = Files.readString(f.toPath());
48 o = new JSONObject(content);
49 } catch (IOException e) {
50 LOG.warn("problem loading defaults: ", e);
51 } catch (JSONException e) {
52 LOG.warn("problem parsing defaults: ", e);
58 protected abstract String readUserdata(String username, String defaultValue);
61 public String getUserdata(String username) {
62 String json = this.readUserdata(username, "{}");
63 if (USERDATA_DEFAULTS_CONTENT != null) {
64 JSONObject merge = mergeData(new JSONObject(json), USERDATA_DEFAULTS_CONTENT);
65 json = merge.toString();
71 public String getUserdata(String username, String key) {
72 final String EMPTY_JSON_OBJECT = "{}";
73 JSONObject o = new JSONObject(this.getUserdata(username));
74 if(key==null || !key.contains("."))
75 return o.has(key) ? o.get(key).toString() : EMPTY_JSON_OBJECT;
76 final String[] keys = key.split("\\.");
78 for (int i=0;i<keys.length-1;i++){
80 return EMPTY_JSON_OBJECT;
83 if(!(tmp instanceof JSONObject)) {
84 return EMPTY_JSON_OBJECT;
88 tmp= o.has(keys[keys.length-1])? o.get(keys[keys.length-1]):EMPTY_JSON_OBJECT;
89 if(tmp instanceof JSONObject){
90 return ((JSONObject)tmp).toString();
92 if(tmp instanceof JSONArray){
93 return ((JSONArray)tmp).toString();
95 if( tmp instanceof String){
96 return String.format("\"%s\"",tmp);
98 return String.valueOf(tmp);
102 public boolean setUserdata(String username, String key, String data) {
103 if(key == null || data == null){
106 JSONObject o = new JSONObject(this.getUserdata(username));
107 if(!key.contains(".")) {
108 o.put(key, new JSONObject(data));
111 final String[] keys = key.split("\\.");
114 for(int i=0;i<keys.length-1;i++){
115 if(!tmp.has(keys[i])){
116 tmp.put(keys[i], new JSONObject());
118 tmpObject = tmp.get(keys[i]);
119 if(!(tmpObject instanceof JSONObject)){
122 tmp = (JSONObject) tmpObject;
124 if(data.startsWith("{")){
125 tmp.put(keys[keys.length-1], new JSONObject(data));
127 else if (data.startsWith("[")){
128 tmp.put(keys[keys.length-1], new JSONArray(data));
130 else if(data.startsWith("\"") && data.endsWith("\"")){
131 tmp.put(keys[keys.length-1],data.substring(1,data.length()-1));
133 else if("true".equals(data) || "false".equals(data)){
134 tmp.put(keys[keys.length-1],"true".equals(data));
138 tmp.put(keys[keys.length - 1], Double.parseDouble(data));
139 } catch (NumberFormatException e) {
144 return this.setUserdata(username, o.toString());
148 public boolean removeUserdata(String username, String key) {
152 JSONObject o = new JSONObject(this.getUserdata(username));
153 if(!key.contains(".")) {
156 return this.setUserdata(username, o.toString());
160 final String[] keys = key.split("\\.");
163 for(int i=0;i<keys.length-1;i++){
164 if(!tmp.has(keys[i])){
167 tmpObject = tmp.get(keys[i]);
168 if(!(tmpObject instanceof JSONObject)){
171 tmp = (JSONObject) tmpObject;
173 if(!tmp.has(keys[keys.length-1])){
176 tmp.remove(keys[keys.length-1]);
177 return this.setUserdata(username, o.toString());
183 protected static JSONObject mergeData(JSONObject o, String key, JSONObject subObject) {
185 o.put(key, subObject);
187 JSONObject tmp = new JSONObject();
188 tmp.put(key, subObject);
189 o = mergeData(tmp, o);
194 protected static JSONObject mergeData(JSONObject source, JSONObject target) throws JSONException {
195 String[] keys = JSONObject.getNames(source);
199 for (String key : keys) {
200 Object value = source.get(key);
201 if (!target.has(key)) {
202 // new value for "key":
203 target.put(key, value);
205 // existing value for "key" - recursively deep merge:
206 if (value instanceof JSONObject) {
207 JSONObject valueJson = (JSONObject) value;
208 mergeData(valueJson, target.getJSONObject(key));
210 target.put(key, value);