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>COUNTER - A statistic with this update mode interprets updates as increments (positive values)
033         * or decrements (negative values) to the current value.</li>
034         * <li>MAXIMUM - A statistic with this update mode is a value that represents the maximum value
035         * amongst the update values applied to this statistic.</li>
036         * <li>MINIMUM - A statistic with this update mode is a value that represents the minimum value
037         * amongst the update values applied to this statistic.</li>
038         * <ul>
039         */
040        public enum UpdateMode {
041            VALUE, DIFFERENCE, COUNTER, MAXIMUM, MINIMUM
042        }
043    
044        private final UpdateMode updateMode;
045        private long value;
046        private long updateCount;
047    
048        /**
049         * Instantiates a new statistic.
050         *
051         * @param name  name of statistic
052         * @param owner owner
053         * @param updateMode The statistic update mode.
054         */
055        public Statistic(String name, Object owner, UpdateMode updateMode) {
056            this.updateMode = updateMode;
057        }
058    
059        public synchronized void updateValue(long newValue) {
060            switch (this.updateMode) {
061            case COUNTER:
062                this.value += newValue;
063                break;
064            case VALUE:
065                this.value = newValue;
066                break;
067            case DIFFERENCE:
068                this.value -= newValue;
069                if (this.value < 0) {
070                    this.value = -this.value;
071                }
072                break;
073            case MAXIMUM:
074                // initialize value at first time
075                if (this.updateCount == 0 || this.value < newValue) {
076                    this.value = newValue;
077                }
078                break;
079            case MINIMUM:
080                // initialize value at first time
081                if (this.updateCount == 0 || this.value > newValue) {
082                    this.value = newValue;
083                }
084                break;
085            default:
086            }
087            this.updateCount++;
088        }
089    
090        public synchronized void increment() {
091            updateValue(1);
092        }
093    
094        public synchronized long getValue() {
095            return this.value;
096        }
097    
098        public synchronized long getUpdateCount() {
099            return this.updateCount;
100        }
101    
102        public synchronized void reset() {
103            this.value = 0;
104            this.updateCount = 0;
105        }
106    
107        public String toString() {
108            return "" + value;
109        }
110    
111    }