\r
\r
public class StoreImpl implements Store {\r
- /*\r
- * The re-adjustment factor for growing the Static State array. \r
- */\r
- private static final int growSize = 10;\r
- \r
- /*\r
- * The index reference for Slot assignment.\r
- */\r
- private int local;\r
- \r
- /*\r
- * The index reference for StaticSlot assignment. \r
- */\r
- private int stat;\r
- \r
- /*\r
- * The name/slot map for local (transaction specific) State.\r
- */\r
- private HashMap<String, Slot> localMap;\r
- \r
- /*\r
- * The name/slot map for Static State.\r
- */\r
- private HashMap<String, StaticSlot> staticMap;\r
-\r
- private Object[] staticState;\r
- \r
- public StoreImpl() {\r
- staticState = new Object[growSize];\r
- staticMap = new HashMap<>();\r
- localMap = new HashMap<>();\r
- }\r
- \r
- public StoreImpl(String tag) {\r
- staticState = new Object[growSize];\r
- staticMap = new HashMap<>();\r
- localMap = new HashMap<>();\r
- }\r
-\r
- \r
- public StoreImpl(String tag, String[] args) {\r
- staticState = new Object[growSize];\r
- staticMap = new HashMap<>();\r
- localMap = new HashMap<>();\r
-\r
- if(tag!=null) {\r
- String tequals = tag + '=';\r
- for(String arg : args) {\r
- if(arg.startsWith(tequals) && !arg.equals(tequals)) { // needs to have something after =\r
- Properties props = new Properties();\r
- for(String f : Split.split(File.pathSeparatorChar,arg.substring(tequals.length()))) {\r
- moreProps(new File(f),props);\r
- }\r
- for(Entry<Object, Object> es : props.entrySet()) {\r
- put(staticSlot(es.getKey().toString()),es.getValue());\r
- }\r
- }\r
- }\r
- }\r
-\r
- // Make sure properties on command line override those in Props\r
- propsFromArgs(tag,args);\r
- }\r
- \r
- public StoreImpl(String tag, Properties props) {\r
- staticState = new Object[growSize];\r
- staticMap = new HashMap<>();\r
- localMap = new HashMap<>();\r
- \r
- if(tag!=null) {\r
- String fname = props.getProperty(tag);\r
- if(fname!=null) {\r
- for(String f : Split.split(File.pathSeparatorChar,fname)) {\r
- if(!moreProps(new File(f),props)) {\r
- System.err.println("Unable to load Properties from " + f); \r
- }\r
- }\r
- }\r
- }\r
-\r
- for(Entry<Object, Object> es : props.entrySet()) {\r
- put(staticSlot(es.getKey().toString()),es.getValue());\r
- }\r
- }\r
-\r
- public void propsFromArgs(String tag, String[] args) {\r
- if(tag!=null) {\r
- for(String arg : args) {\r
- String sarg[] = Split.split('=',arg);\r
- if(sarg.length==2) {\r
- if(tag.equals(sarg[0])) {\r
- for(String fname : Split.split(File.pathSeparatorChar,sarg[1])) {\r
- moreProps(new File(fname),null /* no target */);\r
- }\r
- }\r
- put(staticSlot(sarg[0]),sarg[1]);\r
- }\r
- }\r
- }\r
- }\r
-\r
- private boolean moreProps(File f, Properties target) {\r
- if(f.exists()) {\r
- Properties props = new Properties();\r
- try {\r
- FileInputStream fis = new FileInputStream(f);\r
- try {\r
- props.load(fis);\r
- if(target!=null) {\r
- target.load(fis);\r
- }\r
- } finally {\r
- fis.close();\r
- }\r
- } catch(IOException e) {\r
- System.err.println(e);\r
- }\r
- for(Entry<Object, Object> es : props.entrySet()) {\r
- put(staticSlot(es.getKey().toString()),es.getValue());\r
- }\r
- return true;\r
- } else {\r
- return false;\r
- }\r
- }\r
-\r
- public Object[] newTransState() {\r
- return new Object[local];\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see com.att.env.Store#slot(java.lang.String)\r
- */\r
- public synchronized Slot slot(String name) {\r
- name = name == null ? "" : name.trim();\r
- Slot slot = localMap.get(name);\r
- if (slot == null) {\r
- slot = new Slot(local++, name);\r
- localMap.put(name, slot);\r
- }\r
- return slot;\r
- }\r
- \r
- \r
- /* (non-Javadoc)\r
- * @see com.att.env.Store#existingSlot(java.lang.String)\r
- */\r
- public Slot existingSlot(String name) {\r
- return localMap.get(name);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see com.att.env.Store#existingSlotNames()\r
- */\r
- public List<String> existingSlotNames() {\r
- return new ArrayList<>(localMap.keySet());\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see com.att.env.Store#staticSlot(java.lang.String)\r
- */\r
- public synchronized StaticSlot staticSlot(String name) {\r
- name = name == null ? "" : name.trim();\r
- StaticSlot slot = staticMap.get(name);\r
- if (slot == null) {\r
- if (stat%growSize == 0) {\r
- Object[] temp = staticState;\r
- staticState = new Object[temp.length+growSize];\r
- System.arraycopy(temp, 0, staticState, 0, temp.length);\r
- }\r
- slot = new StaticSlot(stat++, name);\r
- staticMap.put(name, slot);\r
- }\r
- return slot;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see com.att.env.Store#put(com.att.env.StaticSlot, java.lang.Object)\r
- */\r
- public void put(StaticSlot slot, Object value) {\r
- staticState[slot.slot] = value;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see com.att.env.Store#get(com.att.env.StaticSlot T defaultObject)\r
- */\r
- @SuppressWarnings("unchecked")\r
- public<T> T get(StaticSlot sslot,T dflt) {\r
- T t = (T)staticState[sslot.slot];\r
- return t==null?dflt:t;\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- public <T> T get(StaticSlot sslot) {\r
- return (T)staticState[sslot.slot];\r
- }\r
-\r
- public List<String> existingStaticSlotNames() {\r
- return new ArrayList<>(staticMap.keySet());\r
- }\r
+ /*\r
+ * The re-adjustment factor for growing the Static State array. \r
+ */\r
+ private static final int growSize = 10;\r
+ \r
+ /*\r
+ * The index reference for Slot assignment.\r
+ */\r
+ private int local;\r
+ \r
+ /*\r
+ * The index reference for StaticSlot assignment. \r
+ */\r
+ private int stat;\r
+ \r
+ /*\r
+ * The name/slot map for local (transaction specific) State.\r
+ */\r
+ private HashMap<String, Slot> localMap;\r
+ \r
+ /*\r
+ * The name/slot map for Static State.\r
+ */\r
+ private HashMap<String, StaticSlot> staticMap;\r
+\r
+ private Object[] staticState;\r
+ \r
+ public StoreImpl() {\r
+ staticState = new Object[growSize];\r
+ staticMap = new HashMap<>();\r
+ localMap = new HashMap<>();\r
+ }\r
+ \r
+ public StoreImpl(String tag) {\r
+ staticState = new Object[growSize];\r
+ staticMap = new HashMap<>();\r
+ localMap = new HashMap<>();\r
+ }\r
+\r
+ \r
+ public StoreImpl(String tag, String[] args) {\r
+ staticState = new Object[growSize];\r
+ staticMap = new HashMap<>();\r
+ localMap = new HashMap<>();\r
+\r
+ if(tag!=null) {\r
+ String tequals = tag + '=';\r
+ for(String arg : args) {\r
+ if(arg.startsWith(tequals) && !arg.equals(tequals)) { // needs to have something after =\r
+ Properties props = new Properties();\r
+ for(String f : Split.split(File.pathSeparatorChar,arg.substring(tequals.length()))) {\r
+ moreProps(new File(f),props);\r
+ }\r
+ for(Entry<Object, Object> es : props.entrySet()) {\r
+ put(staticSlot(es.getKey().toString()),es.getValue());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // Make sure properties on command line override those in Props\r
+ propsFromArgs(tag,args);\r
+ }\r
+ \r
+ public StoreImpl(String tag, Properties props) {\r
+ staticState = new Object[growSize];\r
+ staticMap = new HashMap<>();\r
+ localMap = new HashMap<>();\r
+ \r
+ if(tag!=null) {\r
+ String fname = props.getProperty(tag);\r
+ if(fname!=null) {\r
+ for(String f : Split.split(File.pathSeparatorChar,fname)) {\r
+ if(!moreProps(new File(f),props)) {\r
+ System.err.println("Unable to load Properties from " + f); \r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ for(Entry<Object, Object> es : props.entrySet()) {\r
+ put(staticSlot(es.getKey().toString()),es.getValue());\r
+ }\r
+ }\r
+\r
+ public void propsFromArgs(String tag, String[] args) {\r
+ if(tag!=null) {\r
+ for(String arg : args) {\r
+ String sarg[] = Split.split('=',arg);\r
+ if(sarg.length==2) {\r
+ if(tag.equals(sarg[0])) {\r
+ for(String fname : Split.split(File.pathSeparatorChar,sarg[1])) {\r
+ moreProps(new File(fname),null /* no target */);\r
+ }\r
+ }\r
+ put(staticSlot(sarg[0]),sarg[1]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private boolean moreProps(File f, Properties target) {\r
+ if(f.exists()) {\r
+ Properties props = new Properties();\r
+ try {\r
+ FileInputStream fis = new FileInputStream(f);\r
+ try {\r
+ props.load(fis);\r
+ if(target!=null) {\r
+ target.load(fis);\r
+ }\r
+ } finally {\r
+ fis.close();\r
+ }\r
+ } catch(IOException e) {\r
+ System.err.println(e);\r
+ }\r
+ for(Entry<Object, Object> es : props.entrySet()) {\r
+ put(staticSlot(es.getKey().toString()),es.getValue());\r
+ }\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public Object[] newTransState() {\r
+ return new Object[local];\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see com.att.env.Store#slot(java.lang.String)\r
+ */\r
+ public synchronized Slot slot(String name) {\r
+ name = name == null ? "" : name.trim();\r
+ Slot slot = localMap.get(name);\r
+ if (slot == null) {\r
+ slot = new Slot(local++, name);\r
+ localMap.put(name, slot);\r
+ }\r
+ return slot;\r
+ }\r
+ \r
+ \r
+ /* (non-Javadoc)\r
+ * @see com.att.env.Store#existingSlot(java.lang.String)\r
+ */\r
+ public Slot existingSlot(String name) {\r
+ return localMap.get(name);\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see com.att.env.Store#existingSlotNames()\r
+ */\r
+ public List<String> existingSlotNames() {\r
+ return new ArrayList<>(localMap.keySet());\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see com.att.env.Store#staticSlot(java.lang.String)\r
+ */\r
+ public synchronized StaticSlot staticSlot(String name) {\r
+ name = name == null ? "" : name.trim();\r
+ StaticSlot slot = staticMap.get(name);\r
+ if (slot == null) {\r
+ if (stat%growSize == 0) {\r
+ Object[] temp = staticState;\r
+ staticState = new Object[temp.length+growSize];\r
+ System.arraycopy(temp, 0, staticState, 0, temp.length);\r
+ }\r
+ slot = new StaticSlot(stat++, name);\r
+ staticMap.put(name, slot);\r
+ }\r
+ return slot;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see com.att.env.Store#put(com.att.env.StaticSlot, java.lang.Object)\r
+ */\r
+ public void put(StaticSlot slot, Object value) {\r
+ staticState[slot.slot] = value;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see com.att.env.Store#get(com.att.env.StaticSlot T defaultObject)\r
+ */\r
+ @SuppressWarnings("unchecked")\r
+ public<T> T get(StaticSlot sslot,T dflt) {\r
+ T t = (T)staticState[sslot.slot];\r
+ return t==null?dflt:t;\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ public <T> T get(StaticSlot sslot) {\r
+ return (T)staticState[sslot.slot];\r
+ }\r
+\r
+ public List<String> existingStaticSlotNames() {\r
+ return new ArrayList<>(staticMap.keySet());\r
+ }\r
}\r
\r