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.tool.reports.plugins;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.StringTokenizer;
  
  import org.apache.activemq.tool.reports.PerformanceStatisticsUtil;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  public class CpuReportPlugin implements ReportPlugin {
  
      public static final String NAME_IGNORE_LIST = "$index$timeUnit$r$b$w$swpd$inact$active$free$buff$cache$si$so$in$";
      public static final String NAME_BLOCK_RECV = "bi";
      public static final String NAME_BLOCK_SENT = "bo";
      public static final String NAME_CTX_SWITCH = "cs";
      public static final String NAME_USER_TIME  = "us";
      public static final String NAME_SYS_TIME   = "sy";
      public static final String NAME_IDLE_TIME  = "id";
      public static final String NAME_WAIT_TIME  = "wa";
  
      public static final String KEY_BLOCK_RECV = "BlocksReceived";
      public static final String KEY_BLOCK_SENT = "BlocksSent";
      public static final String KEY_CTX_SWITCH = "ContextSwitches";
      public static final String KEY_USER_TIME  = "UserTime";
      public static final String KEY_SYS_TIME   = "SystemTime";
      public static final String KEY_IDLE_TIME  = "IdleTime";
      public static final String KEY_WAIT_TIME  = "WaitingTime";
  
      public static final String KEY_AVE_BLOCK_RECV = "AveBlocksReceived";
      public static final String KEY_AVE_BLOCK_SENT = "AveBlocksSent";
      public static final String KEY_AVE_CTX_SWITCH = "AveContextSwitches";
      public static final String KEY_AVE_USER_TIME  = "AveUserTime";
      public static final String KEY_AVE_SYS_TIME   = "AveSystemTime";
      public static final String KEY_AVE_IDLE_TIME  = "AveIdleTime";
      public static final String KEY_AVE_WAIT_TIME  = "AveWaitingTime";
  
      private static final Logger LOG = LoggerFactory.getLogger(CpuReportPlugin.class);
  
      protected List<Long> blockRecv = new ArrayList<Long>();
      protected List<Long> blockSent = new ArrayList<Long>();
      protected List<Long> ctxSwitch = new ArrayList<Long>();
      protected List<Long> userTime  = new ArrayList<Long>();
      protected List<Long> sysTime   = new ArrayList<Long>();
      protected List<Long> idleTime  = new ArrayList<Long>();
      protected List<Long> waitTime  = new ArrayList<Long>();
  
      public void handleCsvData(String csvData) {
          StringTokenizer tokenizer = new StringTokenizer(csvData, ",");
          String data;
          String key;
          String val;
          while (tokenizer.hasMoreTokens()) {
              data = tokenizer.nextToken();
              key  = data.substring(0, data.indexOf("="));
              val  = data.substring(data.indexOf("=") + 1);
  
              addToCpuList(key, val);
          }
      }
  
      public Map<String, String> getSummary() {
          long val;
  
          Map<String, String> summary = new HashMap<String, String>();
  
          if (blockRecv.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(blockRecv);
              summary.put(KEY_BLOCK_RECV, String.valueOf(val));
              summary.put(KEY_AVE_BLOCK_RECV, String.valueOf((double)val / (double)blockRecv.size()));
          }
  
          if (blockSent.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(blockSent);
              summary.put(KEY_BLOCK_SENT, String.valueOf(val));
              summary.put(KEY_AVE_BLOCK_SENT, String.valueOf((double)val / (double)blockSent.size()));
          }
  
          if (ctxSwitch.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(ctxSwitch);
              summary.put(KEY_CTX_SWITCH, String.valueOf(val));
              summary.put(KEY_AVE_CTX_SWITCH, String.valueOf((double)val / (double)ctxSwitch.size()));
          }
  
          if (userTime.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(userTime);
              summary.put(KEY_USER_TIME, String.valueOf(val));
              summary.put(KEY_AVE_USER_TIME, String.valueOf((double)val / (double)userTime.size()));
          }
  
          if (sysTime.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(sysTime);
              summary.put(KEY_SYS_TIME, String.valueOf(val));
              summary.put(KEY_AVE_SYS_TIME, String.valueOf((double)val / (double)sysTime.size()));
          }
  
          if (idleTime.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(idleTime);
              summary.put(KEY_IDLE_TIME, String.valueOf(val));
              summary.put(KEY_AVE_IDLE_TIME, String.valueOf((double)val / (double)idleTime.size()));
          }
  
          if (waitTime.size() > 0) {
              val = PerformanceStatisticsUtil.getSum(waitTime);
              summary.put(KEY_WAIT_TIME, String.valueOf(val));
              summary.put(KEY_AVE_WAIT_TIME, String.valueOf((double)val / (double)waitTime.size()));
          }
  
          if (summary.size() > 0) {
              return summary;
          } else {
              return null;
          }
      }
  
      protected void addToCpuList(String key, String val) {
          if (key.equals(NAME_BLOCK_RECV)) {
              blockRecv.add(Long.valueOf(val));
          } else if (key.equals(NAME_BLOCK_SENT)) {
              blockSent.add(Long.valueOf(val));
          } else if (key.equals(NAME_CTX_SWITCH)) {
              ctxSwitch.add(Long.valueOf(val));
          } else if (key.equals(NAME_USER_TIME)) {
              userTime.add(Long.valueOf(val));
          } else if (key.equals(NAME_SYS_TIME)) {
              sysTime.add(Long.valueOf(val));
          } else if (key.equals(NAME_IDLE_TIME)) {
              idleTime.add(Long.valueOf(val));
          } else if (key.equals(NAME_WAIT_TIME)) {
              waitTime.add(Long.valueOf(val));
          } else if (NAME_IGNORE_LIST.indexOf("$" + key + "$") != -1) {
              // Ignore key
          } else {
              LOG.warn("Unrecognized CPU data. " + key + "=" + val);
          }
      }
  }
  