content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.activemq.management;
  /**
   * A thread-safe class for a Statistic implementation
   */
  public class StatisticImpl implements Statistic, Resettable {
  
      private volatile boolean enabled;
  
      private final String name;
      private final String unit;
      private final String description;
      private volatile long startTime;
      private volatile long lastSampleTime;
      private volatile boolean doReset = true;
  
      public StatisticImpl(String name, String unit, String description) {
          this.name = name;
          this.unit = unit;
          this.description = description;
          this.startTime = System.currentTimeMillis();
          this.lastSampleTime = this.startTime;
      }
  
      protected StatisticImpl(String name, String unit, String description, long startTime, long lastSampleTime) {
          this.name = name;
          this.unit = unit;
          this.description = description;
          this.startTime = startTime;
          this.lastSampleTime = lastSampleTime;
      }
  
      public synchronized void reset() {
          if(isDoReset()) {
              this.startTime = System.currentTimeMillis();
              this.lastSampleTime = this.startTime;
          }
      }
  
      protected synchronized void updateSampleTime() {
          this.lastSampleTime = System.currentTimeMillis();
      }
  
      public String toString() {
          // NOTE: Do not double-lock here as appendFileDescription performs the lock
          StringBuffer buffer = new StringBuffer();
          buffer.append(name);
          buffer.append("{");
          appendFieldDescription(buffer);
          buffer.append(" }");
          return buffer.toString();
      }
  
      public String getName() {
          return this.name;
      }
  
      public String getUnit() {
          return this.unit;
      }
  
      public String getDescription() {
          return this.description;
      }
  
      public synchronized long getStartTime() {
          return this.startTime;
      }
  
      public synchronized long getLastSampleTime() {
          return this.lastSampleTime;
      }
  
      /**
       * @return the enabled
       */
      public boolean isEnabled() {
          return this.enabled;
      }
  
      /**
       * @param enabled the enabled to set
       */
      public void setEnabled(boolean enabled) {
          this.enabled = enabled;
      }
  
      /**
       * @return the doReset
       */
      public boolean isDoReset() {
          return this.doReset;
      }
  
      /**
       * @param doReset the doReset to set
       */
      public void setDoReset(boolean doReset) {
          this.doReset = doReset;
      }
  
      protected synchronized void appendFieldDescription(StringBuffer buffer) {
          buffer.append(" unit: ");
          buffer.append(this.unit);
          buffer.append(" startTime: ");
          // buffer.append(new Date(startTime));
          buffer.append(this.startTime);
          buffer.append(" lastSampleTime: ");
          // buffer.append(new Date(lastSampleTime));
          buffer.append(this.lastSampleTime);
          buffer.append(" description: ");
          buffer.append(this.description);
      }
  }
  