/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ package org.apache.solr.common.cloud; import org.apache.solr.common.util.Utils; import org.noggit.JSONUtil; import org.noggit.JSONWriter; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; /** * ZkNodeProps contains generic immutable properties. */ public class ZkNodeProps implements JSONWriter.Writable { protected final Map<String,Object> propMap; /** * Construct ZKNodeProps from map. */ public ZkNodeProps(Map<String,Object> propMap) { this.propMap = propMap; // TODO: store an unmodifiable map, but in a way that guarantees not to wrap more than once. // Always wrapping introduces a memory leak. } public ZkNodeProps plus(String key , Object val) { return plus(Collections.singletonMap(key,val)); } public ZkNodeProps plus(Map<String, Object> newVals) { LinkedHashMap<String, Object> copy = new LinkedHashMap<>(propMap); if (newVals == null || newVals.isEmpty()) return new ZkNodeProps(copy); copy.putAll(newVals); return new ZkNodeProps(copy); } /** * Constructor that populates the from array of Strings in form key1, value1, * key2, value2, ..., keyN, valueN */ public ZkNodeProps(String... keyVals) { this( Utils.makeMap((Object[]) keyVals) ); } public static ZkNodeProps fromKeyVals(Object... keyVals) { return new ZkNodeProps( Utils.makeMap(keyVals) ); } /** * Get property keys. */ public Set<String> keySet() { return propMap.keySet(); } /** * Get all properties as map. */ public Map<String, Object> getProperties() { return propMap; } /** Returns a shallow writable copy of the properties */ public Map<String,Object> shallowCopy() { return new LinkedHashMap<>(propMap); } /** * Create Replica from json string that is typically stored in zookeeper. */ public static ZkNodeProps load(byte[] bytes) { Map<String, Object> props = (Map<String, Object>) Utils.fromJSON(bytes); return new ZkNodeProps(props); } @Override public void write(JSONWriter jsonWriter) { jsonWriter.write(propMap); } /** * Get a string property value. */ public String getStr(String key) { Object o = propMap.get(key); return o == null ? null : o.toString(); } /** * Get a string property value. */ public Integer getInt(String key, Integer def) { Object o = propMap.get(key); return o == null ? def : Integer.valueOf(o.toString()); } /** * Get a string property value. */ public String getStr(String key,String def) { Object o = propMap.get(key); return o == null ? def : o.toString(); } public Object get(String key) { return propMap.get(key); } @Override public String toString() { return JSONUtil.toJSON(this); /*** StringBuilder sb = new StringBuilder(); Set<Entry<String,Object>> entries = propMap.entrySet(); for(Entry<String,Object> entry : entries) { sb.append(entry.getKey() + "=" + entry.getValue() + "\n"); } return sb.toString(); ***/ } /** * Check if property key exists. */ public boolean containsKey(String key) { return propMap.containsKey(key); } public boolean getBool(String key, boolean b) { Object o = propMap.get(key); if(o==null) return b; return Boolean.parseBoolean(o.toString()); } @Override public boolean equals(Object that) { return that instanceof ZkNodeProps && ((ZkNodeProps)that).propMap.equals(this.propMap); } }