1
2
3
4
5
6
7
8
9
10 package ch.qos.logback.core.sift;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Random;
17
18 import ch.qos.logback.core.Appender;
19 import ch.qos.logback.core.appender.NOPAppender;
20 import ch.qos.logback.core.sift.tracker.AppenderTrackerTImpl;
21 import ch.qos.logback.core.sift.tracker.SimulationEvent;
22
23
24
25
26
27
28
29 public class Simulator {
30
31 AppenderTrackerImpl<Object> appenderTracker = new AppenderTrackerImpl<Object>();
32 AppenderTrackerTImpl t_appenderTracker = new AppenderTrackerTImpl();
33
34 List<String> keySpace = new ArrayList<String>();
35 List<SimulationEvent> scenario = new ArrayList<SimulationEvent>();
36 Random randomKeyGen = new Random(100);
37
38 Random random = new Random(11234);
39
40 final int maxTimestampInc;
41 long timestamp = 30000;
42
43 Simulator(int keySpaceLen, int maxTimestampInc) {
44 this.maxTimestampInc = maxTimestampInc;
45 Map<String, String> checkMap = new HashMap<String, String>();
46 for (int i = 0; i < keySpaceLen; i++) {
47 String k = getRandomKeyStr();
48 if (checkMap.containsKey(k)) {
49 System.out.println("random key collision occured");
50 k += "" + i;
51 }
52 keySpace.add(k);
53 checkMap.put(k, k);
54 }
55
56 }
57
58 private String getRandomKeyStr() {
59 int ri = randomKeyGen.nextInt();
60 String s = String.format("%X", ri);
61 return s;
62 }
63
64 void buildScenario(int simLen) {
65 int keySpaceLen = keySpace.size();
66 for (int i = 0; i < simLen; i++) {
67 int index = random.nextInt(keySpaceLen);
68 timestamp += random.nextInt(maxTimestampInc);
69 String key = keySpace.get(index);
70 scenario.add(new SimulationEvent(key, timestamp));
71 }
72 }
73
74 public void simulate() {
75 for (SimulationEvent simeEvent : scenario) {
76 play(simeEvent, appenderTracker);
77 play(simeEvent, t_appenderTracker);
78 }
79 }
80
81 void play(SimulationEvent simulationEvent,
82 AppenderTracker<Object> appenderTracker) {
83 String mdcValue = simulationEvent.key;
84 long timestamp = simulationEvent.timestamp;
85 Appender<Object> appender = appenderTracker.get(mdcValue, timestamp);
86 if (appender == null) {
87 appender = new NOPAppender<Object>();
88 appenderTracker.put(mdcValue, appender, timestamp);
89 }
90 appenderTracker.stopStaleAppenders(timestamp);
91 }
92 }