1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
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   * Simulate use of AppenderTracker by HoardAppender.
25   * 
26   * @author ceki
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  }