/* * Copyright 2016 Nabarun Mondal * 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. * */ package com.noga.njexl.lang; import java.util.HashMap; import java.util.Map; /** * Wraps a map in a context. * <p>Each entry in the map is considered a variable name, value pair.</p> */ public class MapContext implements JexlContext { public static final String CURRENT = "__current__" ; /** * The wrapped variable map. */ protected final Map<String, Object> map; /** * Creates a MapContext on an automatically allocated underlying HashMap. */ public MapContext() { this(null); } /** * Creates a MapContext wrapping an existing user provided map. * @param vars the variable map */ public MapContext(Map<String, Object> vars) { super(); map = vars == null ? new HashMap<String, Object>() : vars; map.put(CURRENT, this); } /** {@inheritDoc} */ public boolean has(String name) { return map.containsKey(name); } /** {@inheritDoc} */ public Object get(String name) { return map.get(name); } /** {@inheritDoc} */ public void set(String name, Object value) { map.put(name, value); } /** {@inheritDoc} */ public void remove(String name) { if ( map.containsKey(name)){ map.remove(name); } } /** {@inheritDoc} */ @Override public synchronized JexlContext copy() { HashMap<String,Object> copy = new HashMap(map); copy.put(PARENT_CONTEXT, this); return new MapContext(copy); } /** {@inheritDoc} */ public void clear() { map.clear(); } @Override public String toString(){ StringBuffer buf = new StringBuffer(); buf.append("{"); if ( map!= null ){ for ( String key : map.keySet() ){ buf.append("'" + key +"'" ).append(" : "); if ( key.equals(CURRENT ) ){ buf.append("'.'"); continue; } buf.append("'" + map.get(key ) + "'" ); buf.append(",\n"); } } buf.setCharAt(buf.lastIndexOf(","), ' '); buf.append("}"); return buf.toString(); } }