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