1 /* 2 * Zed Attack Proxy (ZAP) and its related class files. 3 * 4 * ZAP is an HTTP/HTTPS proxy for assessing web application security. 5 * 6 * Copyright 2016 The ZAP Development Team 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 package org.zaproxy.zap.extension.stats; 21 22 import java.util.ArrayList; 23 import java.util.Collections; 24 import java.util.HashMap; 25 import java.util.List; 26 import java.util.Map; 27 import java.util.Map.Entry; 28 import org.zaproxy.zap.utils.Statistics; 29 import org.zaproxy.zap.utils.StatsListener; 30 31 public class InMemoryStats implements StatsListener { 32 33 private Statistics stats = new Statistics(); 34 private Map<String, Statistics> siteStats = new HashMap<>(); 35 getStatistics(String site)36 private Statistics getStatistics(String site) { 37 if (site == null) { 38 // Its a global stat 39 return stats; 40 } 41 if (!siteStats.containsKey(site)) { 42 synchronized (siteStats) { 43 if (!siteStats.containsKey(site)) { 44 siteStats.put(site, new Statistics()); 45 } 46 } 47 } 48 return siteStats.get(site); 49 } 50 51 @Override counterInc(String key)52 public void counterInc(String key) { 53 counterInc(null, key); 54 } 55 56 @Override counterInc(String site, String key)57 public void counterInc(String site, String key) { 58 getStatistics(site).incCounter(key); 59 } 60 61 @Override counterInc(String key, long inc)62 public void counterInc(String key, long inc) { 63 counterInc(null, key, inc); 64 } 65 66 @Override counterInc(String site, String key, long inc)67 public void counterInc(String site, String key, long inc) { 68 getStatistics(site).incCounter(key, inc); 69 } 70 71 @Override counterDec(String key)72 public void counterDec(String key) { 73 counterDec(null, key); 74 } 75 76 @Override counterDec(String site, String key)77 public void counterDec(String site, String key) { 78 getStatistics(site).decCounter(key); 79 } 80 81 @Override counterDec(String key, long dec)82 public void counterDec(String key, long dec) { 83 counterDec(null, key, dec); 84 } 85 86 @Override counterDec(String site, String key, long dec)87 public void counterDec(String site, String key, long dec) { 88 getStatistics(site).decCounter(key, dec); 89 } 90 91 @Override highwaterMarkSet(String key, long value)92 public void highwaterMarkSet(String key, long value) { 93 highwaterMarkSet(null, key, value); 94 } 95 96 @Override highwaterMarkSet(String site, String key, long value)97 public void highwaterMarkSet(String site, String key, long value) { 98 getStatistics(site).setHighwaterMark(key, value); 99 } 100 101 @Override lowwaterMarkSet(String key, long value)102 public void lowwaterMarkSet(String key, long value) { 103 lowwaterMarkSet(null, key, value); 104 } 105 106 @Override lowwaterMarkSet(String site, String key, long value)107 public void lowwaterMarkSet(String site, String key, long value) { 108 getStatistics(site).setLowwaterMark(key, value); 109 } 110 111 @Override allCleared()112 public void allCleared() { 113 stats.clearAll(); 114 for (Statistics st : siteStats.values()) { 115 st.clearAll(); 116 } 117 siteStats.clear(); 118 } 119 120 @Override allCleared(String site)121 public void allCleared(String site) { 122 getStatistics(site).clearAll(); 123 } 124 125 @Override cleared(String keyPrefix)126 public void cleared(String keyPrefix) { 127 stats.clear(keyPrefix); 128 for (Statistics st : siteStats.values()) { 129 st.clear(keyPrefix); 130 } 131 } 132 133 @Override cleared(String site, String keyPrefix)134 public void cleared(String site, String keyPrefix) { 135 getStatistics(site).clear(keyPrefix); 136 } 137 getStat(String key)138 public Long getStat(String key) { 139 return stats.getStat(key); 140 } 141 getStat(String site, String key)142 public Long getStat(String site, String key) { 143 if (site == null || siteStats.containsKey(site)) { 144 return getStatistics(site).getStat(key); 145 } 146 return null; 147 } 148 getStats(String keyPrefix)149 public Map<String, Long> getStats(String keyPrefix) { 150 return stats.getStats(keyPrefix); 151 } 152 getAllSiteStats(String keyPrefix)153 public Map<String, Map<String, Long>> getAllSiteStats(String keyPrefix) { 154 Map<String, Map<String, Long>> allStats = new HashMap<>(); 155 for (Entry<String, Statistics> st : siteStats.entrySet()) { 156 allStats.put(st.getKey(), st.getValue().getStats(keyPrefix)); 157 } 158 return allStats; 159 } 160 getSiteStats(String site, String keyPrefix)161 public Map<String, Long> getSiteStats(String site, String keyPrefix) { 162 if (siteStats.containsKey(site)) { 163 return getStatistics(site).getStats(keyPrefix); 164 } 165 return new HashMap<>(); 166 } 167 getSites()168 public List<String> getSites() { 169 List<String> sites = new ArrayList<>(siteStats.keySet()); 170 Collections.sort(sites); 171 return sites; 172 } 173 } 174