/** * 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.tajo.util; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.gson.annotations.Expose; import org.apache.tajo.ConfigKey; import org.apache.tajo.SessionVars; import org.apache.tajo.common.ProtoObject; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.json.CommonGsonHelper; import org.apache.tajo.json.GsonObject; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueProto; import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueSetProto; public class KeyValueSet implements ProtoObject<KeyValueSetProto>, Cloneable, GsonObject { public static final String TRUE_STR = "true"; public static final String FALSE_STR = "false"; @Expose private Map<String,String> keyVals; public KeyValueSet() { keyVals = new HashMap<>(); } public KeyValueSet(Map<String, String> keyVals) { this(); putAll(keyVals); } public KeyValueSet(KeyValueSetProto proto) { this.keyVals = new HashMap<>(); for(KeyValueProto keyval : proto.getKeyvalList()) { this.keyVals.put(keyval.getKey(), keyval.getValue()); } } public KeyValueSet(KeyValueSet keyValueSet) { this(); this.keyVals.putAll(keyValueSet.keyVals); } public static KeyValueSet create() { return new KeyValueSet(); } public static KeyValueSet create(KeyValueSet keyValueSet) { return new KeyValueSet(keyValueSet); } public int size() { return keyVals.size(); } public void putAll(Map<String, String> keyValues) { if (keyValues != null) { this.keyVals.putAll(keyValues); } } public void putAll(KeyValueSet keyValueSet) { if (keyValueSet != null) { this.keyVals.putAll(keyValueSet.keyVals); } } public Map<String,String> getAllKeyValus() { return keyVals; } public boolean containsKey(String key) { return this.keyVals.containsKey(key); } public void set(String key, String val) { Preconditions.checkNotNull(key); Preconditions.checkNotNull(val); this.keyVals.put(key, val); } public String get(String key, String defaultVal) { if(keyVals.containsKey(key)) { return keyVals.get(key); } else if (defaultVal != null) { return defaultVal; } else { throw new IllegalArgumentException("No such config key: " + key); } } public String get(String key) { return get(key, null); } public boolean isTrue(String key) { return getBool(key, false); } public void setBool(String key, boolean val) { set(key, val ? TRUE_STR : FALSE_STR); } public boolean getBool(String key, Boolean defaultVal) { if (containsKey(key)) { String strVal = get(key, null); return strVal != null && strVal.equalsIgnoreCase(TRUE_STR); } else if (defaultVal != null) { return defaultVal; } else { return false; } } public boolean getBool(String key) { return getBool(key, null); } public boolean getBool(ConfigKey key) { String keyName = key.keyname(); if (key instanceof SessionVars) { return getBool(keyName, ((SessionVars) key).getConfVars().defaultBoolVal); } else if (key instanceof TajoConf.ConfVars) { return getBool(keyName, ((TajoConf.ConfVars) key).defaultBoolVal); } return getBool(keyName); } public void setInt(String key, int val) { set(key, String.valueOf(val)); } public int getInt(String key, Integer defaultVal) { if (containsKey(key)) { String strVal = get(key, null); return Integer.parseInt(strVal); } else if (defaultVal != null) { return defaultVal; } else { throw new IllegalArgumentException("No such a config key: " + key); } } public int getInt(String key) { return getInt(key, null); } public int getInt(ConfigKey key) { String keyName = key.keyname(); if (key instanceof SessionVars) { return getInt(keyName, ((SessionVars) key).getConfVars().defaultIntVal); } else if (key instanceof TajoConf.ConfVars) { return getInt(keyName, ((TajoConf.ConfVars) key).defaultIntVal); } return getInt(keyName); } public void setLong(String key, long val) { set(key, String.valueOf(val)); } public long getLong(String key, Long defaultVal) { if (containsKey(key)) { String strVal = get(key, null); return Long.parseLong(strVal); } else if (defaultVal != null) { return defaultVal; } else { throw new IllegalArgumentException("No such a config key: " + key); } } public long getLong(String key) { return getLong(key, null); } public long getLong(ConfigKey key) { String keyName = key.keyname(); if (key instanceof SessionVars) { return getLong(keyName, ((SessionVars) key).getConfVars().defaultLongVal); } else if (key instanceof TajoConf.ConfVars) { return getLong(keyName, ((TajoConf.ConfVars) key).defaultLongVal); } return getLong(keyName); } public void setFloat(String key, float val) { set(key, String.valueOf(val)); } public float getFloat(String key, Float defaultVal) { if (containsKey(key)) { String strVal = get(key, null); try { if (Float.MAX_VALUE < Double.parseDouble(strVal)) { throw new IllegalStateException("Parsed value is overflow in float type"); } return Float.parseFloat(strVal); } catch (NumberFormatException nfe) { throw new IllegalArgumentException("No such a config key: " + key); } } else if (defaultVal != null) { return defaultVal; } else { throw new IllegalArgumentException("No such a config key: " + key); } } public float getFloat(String key) { return getFloat(key, null); } public float getFloat(ConfigKey key) { String keyName = key.keyname(); if (key instanceof SessionVars) { return getFloat(keyName, ((SessionVars) key).getConfVars().defaultFloatVal); } else if (key instanceof TajoConf.ConfVars) { return getFloat(keyName, ((TajoConf.ConfVars) key).defaultFloatVal); } return getFloat(keyName); } public String remove(String key) { return keyVals.remove(key); } @Override public int hashCode() { return Objects.hashCode(keyVals); } @Override public boolean equals(Object object) { if(object instanceof KeyValueSet) { KeyValueSet other = (KeyValueSet)object; for(Entry<String, String> entry : other.keyVals.entrySet()) { if(!keyVals.containsKey(entry.getKey()) || !keyVals.get(entry.getKey()).equals(entry.getValue())) return false; } return true; } return false; } @Override public Object clone() throws CloneNotSupportedException { KeyValueSet keyValueSet = (KeyValueSet) super.clone(); keyValueSet.keyVals = keyVals != null ? new HashMap<>(keyVals) : null; return keyValueSet; } @Override public KeyValueSetProto getProto() { KeyValueSetProto.Builder builder = KeyValueSetProto.newBuilder(); KeyValueProto.Builder kvBuilder = KeyValueProto.newBuilder(); if(this.keyVals != null) { for(Entry<String,String> kv : keyVals.entrySet()) { kvBuilder.setKey(kv.getKey()); kvBuilder.setValue(kv.getValue()); builder.addKeyval(kvBuilder.build()); kvBuilder.clear(); } } return builder.build(); } public String toJson() { return CommonGsonHelper.toJson(this, KeyValueSet.class); } }