001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.synapse.statistics.impl;
020:
021: import org.apache.synapse.statistics.StatisticsStack;
022: import org.apache.synapse.statistics.StatisticsCollector;
023:
024: import java.util.ArrayList;
025: import java.util.Iterator;
026: import java.util.List;
027:
028: /**
029: * The data structure to hold statistics related to Sequences
030: *
031: */
032:
033: public class SequenceStatisticsStack implements StatisticsStack {
034:
035: /** The list to hold SequenceStatistics */
036: private List sequenceStatisticsList = new ArrayList();
037:
038: /**
039: * To put a statistics
040: *
041: * @param sequenceName - The name of the sequence
042: * @param initTime
043: * @param isInFlow
044: * @param isStatisticsEnable
045: * @param isFault
046: */
047: public void put(String sequenceName, long initTime,
048: boolean isInFlow, boolean isStatisticsEnable,
049: boolean isFault) {
050: sequenceStatisticsList.add(new SequenceStatistics(sequenceName,
051: initTime, isInFlow, isStatisticsEnable, isFault));
052: }
053:
054: /**
055: * This method used to report the latest statistics to the StatisticsCollector
056: *
057: * @param statisticsCollector
058: * @param isFault
059: */
060: public void reportToStatisticsCollector(
061: StatisticsCollector statisticsCollector, boolean isFault) {
062: int top = sequenceStatisticsList.size();
063: if (top > 0) {
064: popSequenceStatistics(sequenceStatisticsList.size() - 1,
065: statisticsCollector);
066: }
067: }
068:
069: public void reportToStatisticsCollector(
070: StatisticsCollector statisticsCollector, boolean isFault,
071: String name) {
072: if (!sequenceStatisticsList.isEmpty()) {
073: List tobeRemoved = new ArrayList();
074: for (Iterator seqIterator = sequenceStatisticsList
075: .iterator(); seqIterator.hasNext();) {
076: SequenceStatistics sequenceStatistics = (SequenceStatistics) seqIterator
077: .next();
078: if (sequenceStatistics != null) {
079: if (sequenceStatistics.isStatisticsEnable
080: && sequenceStatistics.sequenceName != null
081: && sequenceStatistics.sequenceName
082: .equals(name)) {
083: statisticsCollector.reportForSequence(
084: sequenceStatistics.sequenceName,
085: !sequenceStatistics.isInFlow,
086: sequenceStatistics.initTime, System
087: .currentTimeMillis(),
088: sequenceStatistics.isFault);
089: }
090: tobeRemoved.add(sequenceStatistics);
091: }
092: }
093: sequenceStatisticsList.removeAll(tobeRemoved);
094: }
095: }
096:
097: /**
098: * This method used to unreported all statistics to the StatisticsCollector
099: *
100: * @param statisticsCollector
101: * @param isFault
102: */
103: public void reportAllToStatisticsCollector(
104: StatisticsCollector statisticsCollector, boolean isFault) {
105: int i = sequenceStatisticsList.size() - 1;
106: for (; i >= 0; i--) {
107: popSequenceStatistics(i, statisticsCollector);
108: }
109: }
110:
111: /**
112: * A helper method to pop a SequenceStatistics
113: * @param index
114: * @param statisticsCollector
115: */
116: private void popSequenceStatistics(int index,
117: StatisticsCollector statisticsCollector) {
118: if (index >= 0) {
119: SequenceStatistics sequenceStatistics = (SequenceStatistics) sequenceStatisticsList
120: .get(index);
121: if (sequenceStatistics != null) {
122: if (sequenceStatistics.isStatisticsEnable
123: && sequenceStatistics.sequenceName != null) {
124: statisticsCollector.reportForSequence(
125: sequenceStatistics.sequenceName,
126: !sequenceStatistics.isInFlow,
127: sequenceStatistics.initTime, System
128: .currentTimeMillis(),
129: sequenceStatistics.isFault);
130: }
131: sequenceStatisticsList.remove(index);
132: }
133: }
134: }
135:
136: /**
137: * The SequenceStatistics data structure
138: */
139: class SequenceStatistics {
140:
141: /** The name of the Sequence */
142: String sequenceName;
143: /** The time which starts to collect statistics */
144: long initTime;
145: /** To check whether IN message flow or not */
146: boolean isInFlow;
147: /** To check whether statistics is enabled or not */
148: boolean isStatisticsEnable;
149: /** To indicate whether this is fault or not*/
150: private boolean isFault;
151:
152: public SequenceStatistics(String sequenceName, long initTime,
153: boolean inFlow, boolean statisticsEnable,
154: boolean isFault) {
155: this .sequenceName = sequenceName;
156: this .initTime = initTime;
157: isInFlow = inFlow;
158: isStatisticsEnable = statisticsEnable;
159: this .isFault = isFault;
160: }
161:
162: public boolean equals(Object o) {
163: if (this == o)
164: return true;
165: if (o == null || getClass() != o.getClass())
166: return false;
167:
168: final SequenceStatistics that = (SequenceStatistics) o;
169:
170: if (!sequenceName.equals(that.sequenceName))
171: return false;
172:
173: return true;
174: }
175:
176: public int hashCode() {
177: return sequenceName.hashCode();
178: }
179: }
180:
181: }
|