001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.management.mbean;
018    
019    /**
020     * Default implementation of {@link Statistic}
021     */
022    public class Statistic {
023    
024        /**
025         * Statistics mode
026         * <ul>
027         * <li>VALUE - A statistic with this update mode is a simple value that is a straight forward
028         * representation of the updated value.</li>
029         * <li>DIFFERENCE - A statistic with this update mode is a value that represents the difference
030         * between the last two recorded values (or the initial value if two updates have
031         * not been recorded).</li>
032         * <li>DELTA - A statistic with this update mode is a value that represents the delta
033         * between the last two recorded values (or the initial value if two updates have
034         * not been recorded). This value can be negative if the delta goes up or down.</li>
035         * <li>COUNTER - A statistic with this update mode interprets updates as increments (positive values)
036         * or decrements (negative values) to the current value.</li>
037         * <li>MAXIMUM - A statistic with this update mode is a value that represents the maximum value
038         * amongst the update values applied to this statistic.</li>
039         * <li>MINIMUM - A statistic with this update mode is a value that represents the minimum value
040         * amongst the update values applied to this statistic.</li>
041         * <ul>
042         */
043        public enum UpdateMode {
044            VALUE, DIFFERENCE, DELTA, COUNTER, MAXIMUM, MINIMUM
045        }
046    
047        private final UpdateMode updateMode;
048        private long lastValue;
049        private long value;
050        private long updateCount;
051    
052        /**
053         * Instantiates a new statistic.
054         *
055         * @param name  name of statistic
056         * @param owner owner
057         * @param updateMode The statistic update mode.
058         */
059        public Statistic(String name, Object owner, UpdateMode updateMode) {
060            this.updateMode = updateMode;
061        }
062    
063        public synchronized void updateValue(long newValue) {
064            switch (this.updateMode) {
065            case COUNTER:
066                this.value += newValue;
067                break;
068            case VALUE:
069                this.value = newValue;
070                break;
071            case DIFFERENCE:
072                this.value -= newValue;
073                if (this.value < 0) {
074                    this.value = -this.value;
075                }
076                break;
077            case DELTA:
078                if (updateCount > 0) {
079                    this.lastValue = this.value;
080                }
081                this.value = newValue;
082                break;
083            case MAXIMUM:
084                // initialize value at first time
085                if (this.updateCount == 0 || this.value < newValue) {
086                    this.value = newValue;
087                }
088                break;
089            case MINIMUM:
090                // initialize value at first time
091                if (this.updateCount == 0 || this.value > newValue) {
092                    this.value = newValue;
093                }
094                break;
095            default:
096            }
097            this.updateCount++;
098        }
099    
100        public synchronized void increment() {
101            updateValue(1);
102        }
103    
104        public synchronized long getValue() {
105            if (updateMode == UpdateMode.DELTA) {
106                if (updateCount == 0) {
107                    return this.value;
108                } else {
109                    return this.value - this.lastValue;
110                }
111            } else {
112                return this.value;
113            }
114        }
115    
116        public synchronized long getUpdateCount() {
117            return this.updateCount;
118        }
119    
120        public synchronized void reset() {
121            this.value = 0;
122            this.lastValue = 0;
123            this.updateCount = 0;
124        }
125    
126        public String toString() {
127            return "" + value;
128        }
129    
130    }