+
+ public void mergeConfig(Config newValues, boolean merge) {
+
+ for (Map.Entry<String, Object> entry : newValues.getData().entrySet()) {
+
+ String key = entry.getKey();
+ Object nvalue = entry.getValue();
+
+ String mkey = key.indexOf('.') > -1 ? key.substring(key.indexOf('.') + 1) : key;
+ if (merge && allowedMergeKeys.contains(mkey)) {
+
+ // merge multi values
+
+ Object value = _data.get(key);
+
+ if (value == null) {
+ _data.put(key, nvalue);
+ } else if (value instanceof String) {
+ if (nvalue instanceof String) {
+
+ // value is String, nvalue is String
+ _data.put(key, new String[] { (String)value, (String)nvalue });
+
+ } else if (nvalue instanceof String[]) {
+
+ // value is String, nvalue is String[]
+ String[] nvalues = (String[])nvalue;
+ String[] newvalues = new String[nvalues.length+1];
+ newvalues[0] = (String)value;
+ System.arraycopy(nvalues, 0, newvalues, 1, nvalues.length);
+ _data.put(key, newvalues);
+
+ }
+ } else if (value instanceof String[]) {
+ if (nvalue instanceof String) {
+
+ // value is String[], nvalue is String
+ String[] values = (String[])value;
+ String[] newvalues = new String[values.length+1];
+ System.arraycopy(values, 0, newvalues, 0, values.length);
+ newvalues[values.length] = (String)nvalue;
+ _data.put(key, newvalues);
+
+ } else if (nvalue instanceof String[]) {
+
+ // value is String[], nvalue is String[]
+ String[] values = (String[])value;
+ String[] nvalues = (String[])nvalue;
+ String[] newvalues = new String[values.length + nvalues.length];
+ System.arraycopy(values, 0, newvalues, 0, values.length);
+ System.arraycopy(nvalues, 0, newvalues, values.length, newvalues.length);
+ _data.put(key, newvalues);
+
+ }
+ }
+
+ } else if (allowedReplaceKeys.contains(mkey)){
+
+ // replace value
+ _data.put(key, nvalue);
+
+ } else {
+ log.warning("Not merging key '"+key+"' into config");
+ }
+
+ }
+
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<String, Object> entry : getData().entrySet()) {
+ String key = entry.getKey();
+ Object val = entry.getValue();
+ sb.append(key);
+ sb.append("=");
+ if (val instanceof String) {
+ sb.append((String)val);
+ } else if (val instanceof String[]) {
+ sb.append(Arrays.toString((String[])val));
+ } else {
+ sb.append("Value not String or String[]");
+ }
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ public Map<String, Object> getData() {
+ return _data;
+ }