1 /*
   2  * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 
  27 package com.sun.org.glassfish.external.statistics.impl;
  28 import com.sun.org.glassfish.external.statistics.Statistic;
  29 import java.lang.reflect.Method;
  30 import java.lang.reflect.Modifier;
  31 import java.util.Map;
  32 import java.util.concurrent.ConcurrentHashMap;
  33 
  34 /**
  35  * @author Sreenivas Munnangi
  36  */
  37 public abstract class StatisticImpl implements Statistic {
  38 
  39     private final String statisticName;
  40     private final String statisticUnit;
  41     private final String statisticDesc;
  42     protected long sampleTime = -1L;
  43     private long startTime;
  44     public static final String UNIT_COUNT = "count";
  45     public static final String UNIT_SECOND = "second";
  46     public static final String UNIT_MILLISECOND = "millisecond";
  47     public static final String UNIT_MICROSECOND = "microsecond";
  48     public static final String UNIT_NANOSECOND = "nanosecond";
  49     public static final String START_TIME = "starttime";
  50     public static final String LAST_SAMPLE_TIME = "lastsampletime";
  51 
  52     protected final Map<String, Object> statMap = new ConcurrentHashMap<String, Object> ();
  53 
  54     protected static final String NEWLINE = System.getProperty( "line.separator" );
  55 
  56     protected StatisticImpl(String name, String unit, String desc,
  57                           long start_time, long sample_time) {
  58 
  59         if (isValidString(name)) {
  60             statisticName = name;
  61         } else {
  62             statisticName = "name";
  63         }
  64 
  65         if (isValidString(unit)) {
  66             statisticUnit = unit;
  67         } else {
  68             statisticUnit = "unit";
  69         }
  70 
  71         if (isValidString(desc)) {
  72             statisticDesc = desc;
  73         } else {
  74             statisticDesc = "description";
  75         }
  76 
  77         startTime = start_time;
  78         sampleTime = sample_time;
  79     }
  80 
  81     protected StatisticImpl(String name, String unit, String desc) {
  82         this(name, unit, desc, System.currentTimeMillis(), System.currentTimeMillis());
  83     }
  84 
  85     public synchronized Map getStaticAsMap() {
  86         if (isValidString(statisticName)) {
  87             statMap.put("name", statisticName);
  88         }
  89         if (isValidString(statisticUnit)) {
  90             statMap.put("unit", statisticUnit);
  91         }
  92         if (isValidString(statisticDesc)) {
  93             statMap.put("description", statisticDesc);
  94         }
  95         statMap.put(StatisticImpl.START_TIME, startTime);
  96         statMap.put(StatisticImpl.LAST_SAMPLE_TIME, sampleTime);
  97         return statMap;
  98     }
  99 
 100     public String getName() {
 101         return this.statisticName;
 102     }
 103 
 104     public String getDescription() {
 105         return this.statisticDesc;
 106     }
 107 
 108     public String getUnit() {
 109         return this.statisticUnit;
 110     }
 111 
 112     public synchronized long getLastSampleTime() {
 113         return sampleTime;
 114     }
 115 
 116     public synchronized long getStartTime() {
 117         return startTime;
 118     }
 119 
 120     public synchronized void reset() {
 121         startTime = System.currentTimeMillis();
 122     }
 123 
 124     public synchronized String toString() {
 125         return "Statistic " + getClass().getName() + NEWLINE +
 126             "Name: " + getName() + NEWLINE +
 127             "Description: " + getDescription() + NEWLINE +
 128             "Unit: " + getUnit() + NEWLINE +
 129             "LastSampleTime: " + getLastSampleTime() + NEWLINE +
 130             "StartTime: " + getStartTime();
 131     }
 132 
 133     protected static boolean isValidString(String str) {
 134         return (str!=null && str.length()>0);
 135     }
 136 
 137     protected void checkMethod(Method method) {
 138         if (method == null || method.getDeclaringClass() == null
 139                 || !Statistic.class.isAssignableFrom(method.getDeclaringClass())
 140                 || Modifier.isStatic(method.getModifiers())) {
 141             throw new RuntimeException("Invalid method on invoke");
 142         }
 143     }
 144 
 145 }