2 * ============LICENSE_START====================================================
\r
4 * ===========================================================================
\r
5 * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
\r
6 * ===========================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END====================================================
\r
22 package org.onap.aaf.misc.env.impl;
\r
24 import java.util.ArrayList;
\r
25 import java.util.List;
\r
26 import java.util.Stack;
\r
28 import org.onap.aaf.misc.env.Env;
\r
29 import org.onap.aaf.misc.env.LogTarget;
\r
30 import org.onap.aaf.misc.env.Slot;
\r
31 import org.onap.aaf.misc.env.StoreImpl;
\r
32 import org.onap.aaf.misc.env.TimeTaken;
\r
33 import org.onap.aaf.misc.env.TransStore;
\r
35 public abstract class AbsTrans<ENV extends Env> implements TransStore {
\r
36 private static final float[] EMPTYF = new float[0];
\r
37 private static final Object[] EMPTYO = new Object[0];
\r
39 protected ENV delegate;
\r
40 protected List<TimeTaken> trail = new ArrayList<>(30);
\r
41 private Object[] state;
\r
44 public AbsTrans(ENV delegate) {
\r
45 this.delegate = delegate;
\r
46 state = delegate instanceof StoreImpl?((StoreImpl) delegate).newTransState():EMPTYO;
\r
50 public LogTarget fatal() {
\r
51 return delegate.fatal();
\r
55 public LogTarget error() {
\r
56 return delegate.error();
\r
60 public LogTarget audit() {
\r
61 return delegate.audit();
\r
65 public LogTarget init() {
\r
66 return delegate.init();
\r
70 public LogTarget warn() {
\r
71 return delegate.warn();
\r
75 public LogTarget info() {
\r
76 return delegate.info();
\r
80 public LogTarget debug() {
\r
81 return delegate.debug();
\r
85 public LogTarget trace() {
\r
86 return delegate.trace();
\r
90 * Let the final Trans Implementation choose the exact kind of TimeTaken to use
\r
95 protected abstract TimeTaken newTimeTaken(String name, int flag, Object ... values);
\r
98 public final TimeTaken start(String name, int flag, Object ... values) {
\r
99 TimeTaken tt = newTimeTaken(name,flag, values);
\r
105 public final void checkpoint(String name) {
\r
106 TimeTaken tt = newTimeTaken(name,CHECKPOINT);
\r
112 public final void checkpoint(String name, int additionalFlag) {
\r
113 TimeTaken tt = newTimeTaken(name,CHECKPOINT|additionalFlag);
\r
118 public Metric auditTrail(int indent, StringBuilder sb, int ... flags) {
\r
119 return auditTrail(info(),indent,sb,flags);
\r
123 public Metric auditTrail(LogTarget lt, int indent, StringBuilder sb, int ... flags) {
\r
124 Metric metric = new Metric();
\r
125 metric.entries = trail.size();
\r
126 int last = (metric.entries) -1;
\r
127 metric.buckets = flags.length==0?EMPTYF:new float[flags.length];
\r
129 TimeTaken first = trail.get(0);
\r
130 // If first entry is sub, then it's actually the last "end" as well
\r
131 // otherwise, check end
\r
132 //long end = (first.flag&SUB)==SUB?first.end():trail.get(last).end();
\r
134 for(int i=last;end==0L && i>=0;--i) {
\r
135 end= trail.get(i).end();
\r
137 metric.total = (end - first.start) / 1000000f;
\r
143 for (TimeTaken tt : trail) {
\r
144 float ms = tt.millis();
\r
145 for (int i=0;i<flags.length;++i) {
\r
146 if (tt.flag == flags[i]) metric.buckets[i]+=ms;
\r
149 } else if (!lt.isLoggable()) {
\r
150 boolean first = true;
\r
151 for (TimeTaken tt : trail) {
\r
152 float ms = tt.millis();
\r
153 for (int i=0;i<flags.length;++i) {
\r
154 if (tt.flag == flags[i]) metric.buckets[i]+=ms;
\r
156 if ((tt.flag&ALWAYS)==ALWAYS) {
\r
157 if (first) first = false;
\r
158 else sb.append('/');
\r
159 sb.append(tt.name);
\r
163 Stack<Long> stack = new Stack<>();
\r
164 for (TimeTaken tt : trail) {
\r
165 // Create Indentation based on SUB
\r
166 while (!stack.isEmpty() && tt.end()>stack.peek()) {
\r
170 for (int i=0;i<indent;++i) {
\r
173 if((tt.flag & CHECKPOINT)==CHECKPOINT) {
\r
177 float ms=tt.millis();
\r
178 // Add time values to Metric
\r
179 for (int i=0;i<flags.length;++i) {
\r
180 if ((tt.flag & flags[i]) == flags[i]) {
\r
181 metric.buckets[i]+=ms;
\r
187 if ((tt.flag&SUB)==SUB) {
\r
188 stack.push(tt.end());
\r
198 * Put data into the Trans State at the right slot
\r
201 public void put(Slot slot, Object value) {
\r
202 slot.put(state, value);
\r
206 * Get data from the Trans State from the right slot
\r
208 * This will do a cast to the expected type derived from Default
\r
211 @SuppressWarnings("unchecked")
\r
212 public<T> T get(Slot slot, T deflt) {
\r
215 o = slot.get(state);
\r
216 } catch (ArrayIndexOutOfBoundsException e) {
\r
217 // Env State Size has changed because of dynamic Object creation... Rare event, but needs to be covered
\r
218 Object[] temp = ((StoreImpl) delegate).newTransState();
\r
219 System.arraycopy(state, 0, temp, 0, state.length);
\r
223 return o==null?deflt:(T)o;
\r