import org.onap.aaf.misc.env.TransStore;\r
\r
public abstract class AbsTrans<ENV extends Env> implements TransStore {\r
- private static final float[] EMPTYF = new float[0];\r
- private static final Object[] EMPTYO = new Object[0];\r
- \r
- protected ENV delegate;\r
- protected List<TimeTaken> trail = new ArrayList<TimeTaken>(30);\r
- private Object[] state;\r
- \r
- \r
+ private static final float[] EMPTYF = new float[0];\r
+ private static final Object[] EMPTYO = new Object[0];\r
+ \r
+ protected ENV delegate;\r
+ protected List<TimeTaken> trail = new ArrayList<>(30);\r
+ private Object[] state;\r
+ \r
+ \r
public AbsTrans(ENV delegate) {\r
- this.delegate = delegate;\r
- state = delegate instanceof StoreImpl?((StoreImpl) delegate).newTransState():EMPTYO;\r
- }\r
-\r
- // @Override\r
- public LogTarget fatal() {\r
- return delegate.fatal();\r
- }\r
-\r
-// @Override\r
- public LogTarget error() {\r
- return delegate.error();\r
- }\r
-\r
-// @Override\r
- public LogTarget audit() {\r
- return delegate.audit();\r
- }\r
-\r
-// @Override\r
- public LogTarget init() {\r
- return delegate.init();\r
- }\r
-\r
-// @Override\r
- public LogTarget warn() {\r
- return delegate.warn();\r
- }\r
-\r
-// @Override\r
- public LogTarget info() {\r
- return delegate.info();\r
- }\r
-\r
-// @Override\r
- public LogTarget debug() {\r
- return delegate.debug();\r
- }\r
-\r
-// @Override\r
- public LogTarget trace() {\r
- return delegate.trace();\r
- }\r
-\r
- /**\r
- * Let the final Trans Implementation choose the exact kind of TimeTaken to use\r
- * @param name\r
- * @param flag\r
- * @return\r
- */\r
- protected abstract TimeTaken newTimeTaken(String name, int flag);\r
- \r
-// @Override\r
- public final TimeTaken start(String name, int flag) {\r
- TimeTaken tt = newTimeTaken(name,flag);\r
- trail.add(tt);\r
- return tt;\r
- }\r
- \r
-// @Override\r
- public final void checkpoint(String name) {\r
- TimeTaken tt = newTimeTaken(name,CHECKPOINT);\r
- tt.done();\r
- trail.add(tt);\r
- }\r
-\r
- public final void checkpoint(String name, int additionalFlag) {\r
- TimeTaken tt = newTimeTaken(name,CHECKPOINT|additionalFlag);\r
- trail.add(tt);\r
- tt.done();\r
- }\r
-\r
- @Override\r
- public Metric auditTrail(int indent, StringBuilder sb, int ... flags) {\r
- return auditTrail(info(),indent,sb,flags);\r
- }\r
- \r
- @Override\r
- public Metric auditTrail(LogTarget lt, int indent, StringBuilder sb, int ... flags) {\r
- Metric metric = new Metric();\r
- int last = (metric.entries = trail.size()) -1;\r
- metric.buckets = flags.length==0?EMPTYF:new float[flags.length];\r
- if(last>=0) {\r
- TimeTaken first = trail.get(0);\r
- // If first entry is sub, then it's actually the last "end" as well\r
- // otherwise, check end\r
- //long end = (first.flag&SUB)==SUB?first.end():trail.get(last).end();\r
- long end = trail.get(last).end();\r
- metric.total = (end - first.start) / 1000000f;\r
- }\r
- \r
- if(sb==null) {\r
- for(TimeTaken tt : trail) {\r
- float ms = tt.millis();\r
- for(int i=0;i<flags.length;++i) {\r
- if(tt.flag == flags[i]) metric.buckets[i]+=ms;\r
- }\r
- }\r
- } else if(!lt.isLoggable()) {\r
- boolean first = true;\r
- for(TimeTaken tt : trail) {\r
- float ms = tt.millis();\r
- for(int i=0;i<flags.length;++i) {\r
- if(tt.flag == flags[i]) metric.buckets[i]+=ms;\r
- }\r
- if((tt.flag&ALWAYS)==ALWAYS) {\r
- if(first) first = false;\r
- else sb.append('/');\r
- sb.append(tt.name);\r
- }\r
- } \r
- } else {\r
- Stack<Long> stack = new Stack<Long>();\r
- for(TimeTaken tt : trail) {\r
- // Create Indentation based on SUB\r
- while(!stack.isEmpty() && tt.end()>stack.peek()) {\r
- --indent;\r
- stack.pop();\r
- }\r
- for(int i=0;i<indent;++i) {\r
- sb.append(" ");\r
- }\r
- tt.output(sb);\r
- sb.append('\n');\r
- if((tt.flag&SUB)==SUB) {\r
- stack.push(tt.end());\r
- ++indent;\r
- }\r
- \r
- // Add time values to Metric\r
- float ms = tt.millis();\r
- for(int i=0;i<flags.length;++i) {\r
- if(tt.flag == flags[i]) metric.buckets[i]+=ms;\r
- }\r
- }\r
- }\r
- return metric;\r
- }\r
-\r
- /**\r
- * Put data into the Trans State at the right slot \r
- */\r
-// @Override\r
- public void put(Slot slot, Object value) {\r
- slot.put(state, value);\r
- }\r
-\r
- /**\r
- * Get data from the Trans State from the right slot\r
- * \r
- * This will do a cast to the expected type derived from Default\r
- */\r
-// @Override\r
- @SuppressWarnings("unchecked")\r
- public<T> T get(Slot slot, T deflt) {\r
- Object o;\r
- try {\r
- o = slot.get(state);\r
- } catch(ArrayIndexOutOfBoundsException e) {\r
- // Env State Size has changed because of dynamic Object creation... Rare event, but needs to be covered\r
- Object[] temp = ((StoreImpl) delegate).newTransState();\r
- System.arraycopy(state, 0, temp, 0, state.length);\r
- state = temp;\r
- o=null;\r
- }\r
- return o==null?deflt:(T)o;\r
- }\r
+ this.delegate = delegate;\r
+ state = delegate instanceof StoreImpl?((StoreImpl) delegate).newTransState():EMPTYO;\r
+ }\r
+\r
+ // @Override\r
+ public LogTarget fatal() {\r
+ return delegate.fatal();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget error() {\r
+ return delegate.error();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget audit() {\r
+ return delegate.audit();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget init() {\r
+ return delegate.init();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget warn() {\r
+ return delegate.warn();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget info() {\r
+ return delegate.info();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget debug() {\r
+ return delegate.debug();\r
+ }\r
+\r
+// @Override\r
+ public LogTarget trace() {\r
+ return delegate.trace();\r
+ }\r
+\r
+ /**\r
+ * Let the final Trans Implementation choose the exact kind of TimeTaken to use\r
+ * @param name\r
+ * @param flag\r
+ * @return\r
+ */\r
+ protected abstract TimeTaken newTimeTaken(String name, int flag);\r
+ \r
+// @Override\r
+ public final TimeTaken start(String name, int flag) {\r
+ TimeTaken tt = newTimeTaken(name,flag);\r
+ trail.add(tt);\r
+ return tt;\r
+ }\r
+ \r
+// @Override\r
+ public final void checkpoint(String name) {\r
+ TimeTaken tt = newTimeTaken(name,CHECKPOINT);\r
+ tt.done();\r
+ trail.add(tt);\r
+ }\r
+\r
+ public final void checkpoint(String name, int additionalFlag) {\r
+ TimeTaken tt = newTimeTaken(name,CHECKPOINT|additionalFlag);\r
+ trail.add(tt);\r
+ tt.done();\r
+ }\r
+\r
+ @Override\r
+ public Metric auditTrail(int indent, StringBuilder sb, int ... flags) {\r
+ return auditTrail(info(),indent,sb,flags);\r
+ }\r
+ \r
+ @Override\r
+ public Metric auditTrail(LogTarget lt, int indent, StringBuilder sb, int ... flags) {\r
+ Metric metric = new Metric();\r
+ int last = (metric.entries = trail.size()) -1;\r
+ metric.buckets = flags.length==0?EMPTYF:new float[flags.length];\r
+ if (last>=0) {\r
+ TimeTaken first = trail.get(0);\r
+ // If first entry is sub, then it's actually the last "end" as well\r
+ // otherwise, check end\r
+ //long end = (first.flag&SUB)==SUB?first.end():trail.get(last).end();\r
+ long end = trail.get(last).end();\r
+ metric.total = (end - first.start) / 1000000f;\r
+ }\r
+ \r
+ if (sb==null) {\r
+ for (TimeTaken tt : trail) {\r
+ float ms = tt.millis();\r
+ for (int i=0;i<flags.length;++i) {\r
+ if (tt.flag == flags[i]) metric.buckets[i]+=ms;\r
+ }\r
+ }\r
+ } else if (!lt.isLoggable()) {\r
+ boolean first = true;\r
+ for (TimeTaken tt : trail) {\r
+ float ms = tt.millis();\r
+ for (int i=0;i<flags.length;++i) {\r
+ if (tt.flag == flags[i]) metric.buckets[i]+=ms;\r
+ }\r
+ if ((tt.flag&ALWAYS)==ALWAYS) {\r
+ if (first) first = false;\r
+ else sb.append('/');\r
+ sb.append(tt.name);\r
+ }\r
+ } \r
+ } else {\r
+ Stack<Long> stack = new Stack<Long>();\r
+ for (TimeTaken tt : trail) {\r
+ // Create Indentation based on SUB\r
+ while (!stack.isEmpty() && tt.end()>stack.peek()) {\r
+ --indent;\r
+ stack.pop();\r
+ }\r
+ for (int i=0;i<indent;++i) {\r
+ sb.append(" ");\r
+ }\r
+ tt.output(sb);\r
+ sb.append('\n');\r
+ if ((tt.flag&SUB)==SUB) {\r
+ stack.push(tt.end());\r
+ ++indent;\r
+ }\r
+ \r
+ // Add time values to Metric\r
+ float ms = tt.millis();\r
+ for (int i=0;i<flags.length;++i) {\r
+ if (tt.flag == flags[i]) metric.buckets[i]+=ms;\r
+ }\r
+ }\r
+ }\r
+ return metric;\r
+ }\r
+\r
+ /**\r
+ * Put data into the Trans State at the right slot \r
+ */\r
+// @Override\r
+ public void put(Slot slot, Object value) {\r
+ slot.put(state, value);\r
+ }\r
+\r
+ /**\r
+ * Get data from the Trans State from the right slot\r
+ * \r
+ * This will do a cast to the expected type derived from Default\r
+ */\r
+// @Override\r
+ @SuppressWarnings("unchecked")\r
+ public<T> T get(Slot slot, T deflt) {\r
+ Object o;\r
+ try {\r
+ o = slot.get(state);\r
+ } catch (ArrayIndexOutOfBoundsException e) {\r
+ // Env State Size has changed because of dynamic Object creation... Rare event, but needs to be covered\r
+ Object[] temp = ((StoreImpl) delegate).newTransState();\r
+ System.arraycopy(state, 0, temp, 0, state.length);\r
+ state = temp;\r
+ o=null;\r
+ }\r
+ return o==null?deflt:(T)o;\r
+ }\r
\r
\r
}\r