You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2006/06/01 17:45:41 UTC
svn commit: r410877 - in /geronimo/sandbox/gshell/trunk/gshell-core/src:
main/java/org/apache/geronimo/gshell/command/
test/java/org/apache/geronimo/gshell/command/
Author: jdillon
Date: Thu Jun 1 08:45:41 2006
New Revision: 410877
URL: http://svn.apache.org/viewvc?rev=410877&view=rev
Log:
Variables overhaul; added nesting, cloaking, immutability, defaults
Added:
geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java (with props)
Modified:
geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/Variables.java
geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/VariablesMap.java
Modified: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/Variables.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/Variables.java?rev=410877&r1=410876&r2=410877&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/Variables.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/Variables.java Thu Jun 1 08:45:41 2006
@@ -25,13 +25,35 @@
*/
public interface Variables
{
- void set(String name, Object value);
-
+ void set(String name, Object value) throws ImmutableVariableException;
+
+ void set(String name, Object value, boolean mutable) throws ImmutableVariableException;
+
Object get(String name);
-
- void unset(String name);
+
+ Object get(String name, Object _default);
+
+ boolean isMutable(String name);
+
+ boolean isCloaked(String name);
+
+ void unset(String name) throws ImmutableVariableException;
boolean contains(String name);
- Iterator names();
+ Iterator<String> names();
+
+ Variables parent();
+
+ //
+ // Exceptions
+ //
+
+ class ImmutableVariableException
+ extends RuntimeException
+ {
+ public ImmutableVariableException(final String name) {
+ super("Variable is immutable: " + name);
+ }
+ }
}
Modified: geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/VariablesMap.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/VariablesMap.java?rev=410877&r1=410876&r2=410877&view=diff
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/VariablesMap.java (original)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/main/java/org/apache/geronimo/gshell/command/VariablesMap.java Thu Jun 1 08:45:41 2006
@@ -19,6 +19,10 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Collections;
/**
* ???
@@ -28,43 +32,143 @@
public class VariablesMap
implements Variables
{
- private final Map map;
-
- public VariablesMap(final Map map) {
- assert map != null;
-
+ private final Map<String,Object> map;
+
+ private final Variables parent;
+
+ private final Set<String> immutables = new HashSet<String>();
+
+ public VariablesMap(final Map<String,Object> map, final Variables parent) {
+ if (map == null) {
+ throw new IllegalArgumentException("Map is null");
+ }
+ if (parent == null) {
+ throw new IllegalArgumentException("Parent is null");
+ }
+
this.map = map;
+ this.parent = parent;
+ }
+
+ public VariablesMap(final Variables parent) {
+ if (parent == null) {
+ throw new IllegalArgumentException("Parent is null");
+ }
+
+ this.map = new HashMap<String,Object>();
+ this.parent = parent;
}
-
+
+ public VariablesMap(final Map<String,Object> map) {
+ if (map == null) {
+ throw new IllegalArgumentException("Map is null");
+ }
+
+ this.map = map;
+ this.parent = null;
+ }
+
public VariablesMap() {
- this(new HashMap());
+ this(new HashMap<String,Object>());
}
-
+
public void set(final String name, final Object value) {
+ set(name, value, true);
+ }
+
+ public void set(final String name, final Object value, boolean mutable) {
assert name != null;
-
+
+ ensureMutable(name);
+
map.put(name, value);
+
+ if (!mutable) {
+ immutables.add(name);
+ }
}
-
+
public Object get(final String name) {
assert name != null;
-
- return map.get(name);
+
+ Object value = map.get(name);
+ if (value == null && parent != null) {
+ value = parent.get(name);
+ }
+
+ return value;
+ }
+
+ public Object get(final String name, final Object _default) {
+ Object value = get(name);
+ if (value == null) {
+ return _default;
+ }
+
+ return value;
}
-
+
public void unset(final String name) {
assert name != null;
-
+
+ ensureMutable(name);
+
map.remove(name);
}
-
+
public boolean contains(final String name) {
assert name != null;
-
+
return map.containsKey(name);
}
-
- public Iterator names() {
- return map.keySet().iterator();
+
+ public boolean isMutable(final String name) {
+ assert name != null;
+
+ boolean mutable = true;
+
+ // First ask out parent if there is one, if they are immutable, then so are we
+ if (parent != null) {
+ mutable = parent.isMutable(name);
+ }
+
+ if (mutable) {
+ mutable = !immutables.contains(name);
+ }
+
+ return mutable;
+ }
+
+ private void ensureMutable(final String name) {
+ assert name != null;
+
+ if (!isMutable(name)) {
+ throw new ImmutableVariableException(name);
+ }
+ }
+
+ public boolean isCloaked(final String name) {
+ assert name != null;
+
+ int count = 0;
+
+ Variables vars = this;
+ while (vars != null && count < 2) {
+ if (vars.contains(name)) {
+ count++;
+ }
+
+ vars = vars.parent();
+ }
+
+ return count > 1;
+ }
+
+ public Iterator<String> names() {
+ return Collections.unmodifiableSet(map.keySet()).iterator();
+ }
+
+ public Variables parent() {
+ return parent;
}
}
Added: geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java?rev=410877&view=auto
==============================================================================
--- geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java (added)
+++ geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java Thu Jun 1 08:45:41 2006
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * 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 org.apache.geronimo.gshell.command;
+
+import junit.framework.TestCase;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Unit tests for the {@link VariablesMap} class.
+ *
+ * @version $Id$
+ */
+public class VariablesMapTest
+ extends TestCase
+{
+ public void testConstructorArgsNull() throws Exception {
+ try {
+ new VariablesMap((Map<String,Object>)null);
+ fail("Accepted a null value");
+ }
+ catch (IllegalArgumentException expected) {
+ // ignore
+ }
+
+ try {
+ new VariablesMap((Variables)null);
+ fail("Accepted a null value");
+ }
+ catch (IllegalArgumentException expected) {
+ // ignore
+ }
+
+ try {
+ new VariablesMap(new HashMap<String,Object>(), null);
+ fail("Accepted a null value");
+ }
+ catch (IllegalArgumentException expected) {
+ // ignore
+ }
+
+ // Happy day
+ new VariablesMap(new HashMap<String,Object>(), new VariablesMap());
+ }
+
+ /*
+ public void testSetNameIsNull() throws Exception {
+ try {
+ new VariablesMap().set(null, null);
+ fail("Accepted a null value");
+ }
+ catch (IllegalArgumentException expected) {
+ // ignore
+ }
+ }
+ */
+
+ public void testSet() throws Exception {
+ VariablesMap vars = new VariablesMap();
+ String name = "a";
+ Object value = new Object();
+
+ assertFalse(vars.contains(name));
+ vars.set(name, value);
+ assertTrue(vars.contains(name));
+
+ Object obj = vars.get(name);
+ assertEquals(value, obj);
+
+ String str = vars.names().next();
+ assertEquals(name, str);
+ }
+
+ public void testSetAsImmutable() throws Exception {
+ VariablesMap vars = new VariablesMap();
+ String name = "a";
+ Object value = new Object();
+
+ assertTrue(vars.isMutable(name));
+ vars.set(name, value, false);
+ assertFalse(vars.isMutable(name));
+
+ try {
+ vars.set(name, value);
+ fail("Set an immutable variable");
+ }
+ catch (Variables.ImmutableVariableException expected) {
+ // ignore
+ }
+ }
+
+ public void testSetAsImmutableInParent() throws Exception {
+ Variables parent = new VariablesMap();
+ VariablesMap vars = new VariablesMap(parent);
+ String name = "a";
+ Object value = new Object();
+
+ parent.set(name, value, false);
+ assertFalse(parent.isMutable(name));
+ assertFalse(vars.isMutable(name));
+
+ try {
+ vars.set(name, value);
+ fail("Set an immutable variable");
+ }
+ catch (Variables.ImmutableVariableException expected) {
+ // ignore
+ }
+ }
+
+ public void testGet() throws Exception {
+ VariablesMap vars = new VariablesMap();
+ String name = "a";
+ Object value = new Object();
+
+ Object obj1 = vars.get(name);
+ assertNull(obj1);
+
+ vars.set(name, value);
+ Object obj2 = vars.get(name);
+ assertSame(value, obj2);
+ }
+
+ public void testGetUsingDefault() throws Exception {
+ VariablesMap vars = new VariablesMap();
+ String name = "a";
+ Object value = new Object();
+
+ Object obj1 = vars.get(name);
+ assertNull(obj1);
+
+ Object obj2 = vars.get(name, value);
+ assertSame(value, obj2);
+ }
+
+ public void testGetCloaked() throws Exception {
+ Variables parent = new VariablesMap();
+ VariablesMap vars = new VariablesMap(parent);
+ String name = "a";
+ Object value = new Object();
+
+ parent.set(name, value);
+ Object obj1 = vars.get(name);
+ assertEquals(value, obj1);
+
+ Object value2 = new Object();
+ vars.set(name, value2);
+
+ Object obj2 = vars.get(name);
+ assertSame(value2, obj2);
+ assertNotSame(value, obj2);
+ }
+
+ public void testUnsetAsImmutable() throws Exception {
+ VariablesMap vars = new VariablesMap();
+ String name = "a";
+ Object value = new Object();
+
+ assertTrue(vars.isMutable(name));
+ vars.set(name, value, false);
+ assertFalse(vars.isMutable(name));
+
+ try {
+ vars.unset(name);
+ fail("Unset an immutable variable");
+ }
+ catch (Variables.ImmutableVariableException expected) {
+ // ignore
+ }
+ }
+
+ public void testUnsetAsImmutableInParent() throws Exception {
+ Variables parent = new VariablesMap();
+ VariablesMap vars = new VariablesMap(parent);
+ String name = "a";
+ Object value = new Object();
+
+ parent.set(name, value, false);
+ assertFalse(parent.isMutable(name));
+ assertFalse(vars.isMutable(name));
+
+ try {
+ vars.unset(name);
+ fail("Unset an immutable variable");
+ }
+ catch (Variables.ImmutableVariableException expected) {
+ // ignore
+ }
+ }
+
+ public void testCloaking() throws Exception {
+ Variables parent = new VariablesMap();
+ VariablesMap vars = new VariablesMap(parent);
+ String name = "a";
+ Object value = new Object();
+
+ parent.set(name, value);
+ assertFalse(parent.isCloaked(name));
+ assertFalse(vars.isCloaked(name));
+
+ vars.set(name, new Object());
+ assertTrue(vars.isCloaked(name));
+ }
+
+ public void testParent() throws Exception {
+ Variables parent = new VariablesMap();
+ assertNull(parent.parent());
+
+ VariablesMap vars = new VariablesMap(parent);
+ assertNotNull(vars.parent());
+
+ assertEquals(parent, vars.parent());
+ }
+}
Propchange: geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: geronimo/sandbox/gshell/trunk/gshell-core/src/test/java/org/apache/geronimo/gshell/command/VariablesMapTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain