/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * Copyright 2016 ZAP development team * * Licensed 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.zaproxy.zap.extension.stats; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.zaproxy.zap.utils.Statistics; import org.zaproxy.zap.utils.StatsListener; public class InMemoryStats implements StatsListener { private Statistics stats = new Statistics(); private Map<String, Statistics> siteStats = new HashMap<String, Statistics>(); private Statistics getStatistics(String site) { if (site == null) { // Its a global stat return stats; } if (! siteStats.containsKey(site)) { synchronized (siteStats) { if (! siteStats.containsKey(site)) { siteStats.put(site, new Statistics()); } } } return siteStats.get(site); } @Override public void counterInc(String key) { counterInc (null, key); } @Override public void counterInc(String site, String key) { getStatistics(site).incCounter(key); } @Override public void counterInc(String key, long inc) { counterInc(null, key, inc); } @Override public void counterInc(String site, String key, long inc) { getStatistics(site).incCounter(key, inc); } @Override public void counterDec(String key) { counterDec(null, key); } @Override public void counterDec(String site, String key) { getStatistics(site).decCounter(key); } @Override public void counterDec(String key, long dec) { counterDec(null, key, dec); } @Override public void counterDec(String site, String key, long dec) { getStatistics(site).decCounter(key, dec); } @Override public void highwaterMarkSet(String key, long value) { highwaterMarkSet(null, key, value); } @Override public void highwaterMarkSet(String site, String key, long value) { getStatistics(site).setHighwaterMark(key, value); } @Override public void lowwaterMarkSet(String key, long value) { lowwaterMarkSet(null, key, value); } @Override public void lowwaterMarkSet(String site, String key, long value) { getStatistics(site).setLowwaterMark(key, value); } @Override public void allCleared() { stats.clearAll(); for (Statistics st : siteStats.values()) { st.clearAll(); } siteStats.clear(); } @Override public void allCleared(String site) { getStatistics(site).clearAll(); } @Override public void cleared(String keyPrefix) { stats.clear(keyPrefix); for (Statistics st : siteStats.values()) { st.clear(keyPrefix); } } @Override public void cleared(String site, String keyPrefix) { getStatistics(site).clear(keyPrefix); } public Long getStat(String key) { return stats.getStat(key); } public Long getStat(String site, String key) { if (site == null || siteStats.containsKey(site)) { return getStatistics(site).getStat(key); } return null; } public Map<String, Long> getStats(String keyPrefix) { return stats.getStats(keyPrefix); } public Map<String, Map<String, Long>> getAllSiteStats(String keyPrefix) { Map<String, Map<String, Long>> allStats = new HashMap<String, Map<String, Long>>(); for (Entry<String, Statistics> st : siteStats.entrySet()) { allStats.put(st.getKey(), st.getValue().getStats(keyPrefix)); } return allStats; } public Map<String, Long> getSiteStats(String site, String keyPrefix) { if (siteStats.containsKey(site)) { return getStatistics(site).getStats(keyPrefix); } return new HashMap<String, Long>(); } public List<String> getSites() { List<String> sites = new ArrayList<String>(siteStats.keySet()); Collections.sort(sites); return sites; } }