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.commons.monitoring.reporting.web.plugin.report.format; 018 019 import org.apache.commons.monitoring.counters.Counter; 020 import org.apache.commons.monitoring.counters.Unit; 021 import org.apache.commons.monitoring.repositories.Repository; 022 023 import java.util.ArrayList; 024 import java.util.Collection; 025 import java.util.Map; 026 import java.util.concurrent.CopyOnWriteArrayList; 027 028 public abstract class MapFormat { 029 protected static final Collection<String> ATTRIBUTES_ORDERED_LIST = buildMetricDataHeader(); 030 031 protected static Collection<String> buildMetricDataHeader() { 032 final Collection<String> list = new CopyOnWriteArrayList<String>(); 033 list.add("Counter"); 034 list.add("Role"); 035 for (final MetricData md : MetricData.values()) { 036 list.add(md.name()); 037 } 038 return list; 039 } 040 041 protected static Unit timeUnit(final Map<String, ?> params) { 042 final Object u = params.get("unit"); 043 if (u != null) { 044 if (String.class.isInstance(u)) { 045 final Unit unit = Unit.get(String.class.cast(u).toLowerCase()); 046 if (unit != null) { 047 return unit; 048 } 049 } 050 if (String[].class.isInstance(u)) { 051 final String[] array = String[].class.cast(u); 052 if (array.length > 0) { 053 final Unit unit = Unit.get(array[0].toLowerCase()); 054 if (unit != null) { 055 return unit; 056 } 057 } 058 } 059 } 060 return Unit.Time.MILLISECOND; 061 } 062 063 protected static Collection<Collection<String>> snapshot(final Unit timeUnit) { 064 final Collection<Collection<String>> data = new ArrayList<Collection<String>>(); 065 for (final Counter counter : Repository.INSTANCE) { 066 final Unit counterUnit = counter.getKey().getRole().getUnit(); 067 final boolean compatible = timeUnit.isCompatible(counterUnit); 068 069 final Collection<String> line = new ArrayList<String>(); 070 data.add(line); 071 072 line.add(counter.getKey().getName()); 073 074 if (compatible) { 075 line.add(counter.getKey().getRole().getName() + " (" + timeUnit.getName() + ")"); 076 } else { 077 line.add(counter.getKey().getRole().getName() + " (" + counterUnit.getName() + ")"); 078 } 079 080 for (final MetricData md : MetricData.values()) { 081 double value = md.value(counter); 082 if (md.isTime() && compatible && timeUnit != counterUnit) { 083 value = timeUnit.convert(value, counterUnit); 084 } 085 line.add(Double.toString(value)); 086 } 087 } 088 return data; 089 } 090 }