summaryrefslogtreecommitdiff
path: root/java/common/src/main/java/org/apache/qpid/configuration/Accessor.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/common/src/main/java/org/apache/qpid/configuration/Accessor.java')
-rw-r--r--java/common/src/main/java/org/apache/qpid/configuration/Accessor.java160
1 files changed, 157 insertions, 3 deletions
diff --git a/java/common/src/main/java/org/apache/qpid/configuration/Accessor.java b/java/common/src/main/java/org/apache/qpid/configuration/Accessor.java
index dc5b69dc89..d154f70339 100644
--- a/java/common/src/main/java/org/apache/qpid/configuration/Accessor.java
+++ b/java/common/src/main/java/org/apache/qpid/configuration/Accessor.java
@@ -26,6 +26,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -36,6 +37,8 @@ public interface Accessor
public Integer getInt(String name);
public Long getLong(String name);
public String getString(String name);
+ public Map getMap(String name);
+ public List getList(String name);
static class SystemPropertyAccessor implements Accessor
{
@@ -58,6 +61,10 @@ public interface Accessor
{
return System.getProperty(name);
}
+
+ public Map getMap(String name){ throw new UnsupportedOperationException("Not supported by system properties"); }
+
+ public List getList(String name){ throw new UnsupportedOperationException("Not supported by system properties"); }
}
static class MapAccessor implements Accessor
@@ -144,6 +151,31 @@ public interface Accessor
return null;
}
}
+
+ public Map getMap(String name)
+ {
+ if (source != null && source.containsKey(name) && source.get(name) instanceof Map)
+ {
+ return (Map)source.get(name);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public List getList(String name)
+ {
+ if (source != null && source.containsKey(name) && source.get(name) instanceof List)
+ {
+ return (List)source.get(name);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
}
static class PropertyFileAccessor extends MapAccessor
@@ -163,6 +195,12 @@ public interface Accessor
}
source = props;
}
+
+ @Override
+ public Map getMap(String name){ throw new UnsupportedOperationException("Not supported by property file"); }
+
+ @Override
+ public List getList(String name){ throw new UnsupportedOperationException("Not supported by property file"); }
}
static class CombinedAccessor implements Accessor
@@ -190,7 +228,7 @@ public interface Accessor
{
for (Accessor accessor: accessors)
{
- if (accessor.getBoolean(name) != null)
+ if (accessor.getInt(name) != null)
{
return accessor.getInt(name);
}
@@ -202,7 +240,7 @@ public interface Accessor
{
for (Accessor accessor: accessors)
{
- if (accessor.getBoolean(name) != null)
+ if (accessor.getLong(name) != null)
{
return accessor.getLong(name);
}
@@ -214,13 +252,37 @@ public interface Accessor
{
for (Accessor accessor: accessors)
{
- if (accessor.getBoolean(name) != null)
+ if (accessor.getString(name) != null)
{
return accessor.getString(name);
}
}
return null;
}
+
+ public Map getMap(String name)
+ {
+ for (Accessor accessor: accessors)
+ {
+ if (accessor.getMap(name) != null && accessor.getMap(name) instanceof Map)
+ {
+ return accessor.getMap(name);
+ }
+ }
+ return null;
+ }
+
+ public List getList(String name)
+ {
+ for (Accessor accessor: accessors)
+ {
+ if (accessor.getMap(name) != null && accessor.getList(name) instanceof List)
+ {
+ return accessor.getList(name);
+ }
+ }
+ return null;
+ }
}
static class ValidationAccessor implements Accessor
@@ -269,5 +331,97 @@ public interface Accessor
}
return v;
}
+
+ public Map getMap(String name){ throw new UnsupportedOperationException("Validator interface does not support maps"); }
+
+ public List getList(String name){ throw new UnsupportedOperationException("Validator interface does not support maps"); }
}
+
+ /**
+ * Property names as passed in the form
+ * level_1_prop/level_2_prop/.../level_n_prop
+ * All property name upto level_n-1_prop should return
+ * a map or null
+ */
+ static class NestedMapAccessor implements Accessor
+ {
+ protected Map<Object,Object> baseMap;
+
+ public NestedMapAccessor(Map<Object,Object> map)
+ {
+ baseMap = map;
+ }
+
+ private String getKey(String name)
+ {
+ if (name.lastIndexOf("/") > -1)
+ {
+ return name.substring(name.lastIndexOf("/")+1);
+ }
+ else
+ {
+ return name;
+ }
+ }
+
+ private MapAccessor mapIterator(String name)
+ {
+ if (name.lastIndexOf("/") == -1)
+ {
+ return new MapAccessor(baseMap);
+ }
+
+ String[] paths = name.substring(0,name.lastIndexOf("/")).split("/");
+ Map map = baseMap == null ? Collections.EMPTY_MAP : baseMap;
+
+ for (String path:paths)
+ {
+
+ Object obj = map.get(path);
+ if (obj == null)
+ {
+ return new MapAccessor(null);
+ }
+ else if (obj instanceof Map)
+ {
+ map = (Map)obj;
+ }
+ else
+ {
+ throw new IllegalArgumentException(path + " doesn't retrieve another map");
+ }
+ }
+ return new MapAccessor(map);
+ }
+
+ public Boolean getBoolean(String name)
+ {
+ return mapIterator(name).getBoolean(getKey(name));
+ }
+
+ public Integer getInt(String name)
+ {
+ return mapIterator(name).getInt(getKey(name));
+ }
+
+ public Long getLong(String name)
+ {
+ return mapIterator(name).getLong(getKey(name));
+ }
+
+ public String getString(String name)
+ {
+ return mapIterator(name).getString(getKey(name));
+ }
+
+ public Map getMap(String name)
+ {
+ return mapIterator(name).getMap(getKey(name));
+ }
+
+ public List getList(String name)
+ {
+ return mapIterator(name).getList(getKey(name));
+ }
+ }
}