Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Logback: the reliable, generic, fast and flexible logging framework. Copyright (C) 1999-2011, QOS.ch. All rights reserved. This program and the accompanying materials are dual-licensed under either the terms of the Eclipse Public License v1.0 as published by the Eclipse Foundation or (per the licensee's choosing) under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation.
 
 package ch.qos.logback.core.sift;
 
 import java.util.List;
 import java.util.Map;
 
Track appenders by a key. When an appender is not used for longer than THRESHOLD, stop it.

Author(s):
Ceki Gulcu
 
 public class AppenderTrackerImpl<E> implements AppenderTracker<E> {
 
   Map<StringEntrymap = new HashMap<StringEntry>();
  
   Entry head// least recently used entries are towards the head
   Entry tail// most recently used entries are towards the tail
 
   long lastCheck = 0;
 
      = new Entry(nullnull, 0);
      = ;
   }
 
 
   public synchronized void put(String keyAppender<E> valuelong timestamp) {
     Entry entry = .get(key);
     if (entry == null) {
       entry = new Entry(keyvaluetimestamp);
       .put(keyentry);
     }
     moveToTail(entry);
   }
 
   public synchronized Appender<E> get(String keylong timestamp) {
     Entry existing = .get(key);
     if (existing == null) {
       return null;
     } else {
       existing.setTimestamp(timestamp);
       moveToTail(existing);
       return existing.value;
     }
   }
 
   
   public synchronized void stopStaleAppenders(long now) {
     if ( + . > now) {
       return;
     }
      = now;
     while (. != null && isEntryStale(,now)) {
       Appender<E> appender = .;
       appender.stop();
       removeHead();
     }
   } 

  

Parameters:
key
Since:
0.9.19
 
   public synchronized void stopAndRemoveNow(String key) {
     Entry e = ;
     Entry found = null;
     while (e != ) {
       if(key.equals(e.key)) {
         found = e;
         break;
       }
       e = e.next;
     }
     if(found != null) {
       rearrangePreexistingLinks(e);
       .remove(key);
       Appender<E> appender = e.value;
       appender.stop();
     }
   }
   
   public List<StringkeyList() {
    List<Stringresult = new LinkedList<String>();
    Entry e = ;
    while (e != ) {
      result.add(e.key);
      e = e.next;
    }
    return result;
  }
  
  
  private boolean isEntryStale(Entry entrylong now) {
    // stopped or improperly started appenders are considered stale
    // see also http://jira.qos.ch/browse/LBCLASSIC-316
    if(!entry.value.isStarted())
      return true;
    // unused appenders are also considered stale
    return ((entry.timestamp + ) < now);
  }
  
  private void removeHead() {
    // System.out.println("RemoveHead called");
    .remove(.);
     = .;
    . = null;
  }
  private void moveToTail(Entry e) {
  }
  private void rearrangePreexistingLinks(Entry e) {
    if (e.prev != null) {
      e.prev.next = e.next;
    }
    if (e.next != null) {
      e.next.prev = e.prev;
    }
    if ( == e) {
       = e.next;
    }
  }
  private void rearrangeTailLinks(Entry e) {
    if ( == ) {
       = e;
    }
    Entry preTail = .;
    if (preTail != null) {
      preTail.next = e;
    }
    e.prev = preTail;
    e.next = ;
    . = e;
  }
  public void dump() {
    Entry e = ;
    ..print("N:");
    while (e != null) {
      // System.out.print(e+"->");
      ..print(e.key + ", ");
      e = e.next;
    }
    ..println();
  }
  public List<Appender<E>> valueList() {
    List<Appender<E>> result = new LinkedList<Appender<E>>();
    Entry e = ;
    while (e != ) {
      result.add(e.value);
      e = e.next;
    }
    return result;
  }
  
  // ================================================================
  private class Entry {
    Entry next;
    Entry prev;
    String key;
    Appender<E> value;
    long timestamp;
    Entry(String kAppender<E> vlong timestamp) {
      this. = k;
      this. = v;
      this. = timestamp;
    }
//    public long getTimestamp() {
//      return timestamp;
//    }
    public void setTimestamp(long timestamp) {
      this. = timestamp;
    }
    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + (( == null) ? 0 : .hashCode());
      return result;
    }
    @Override
    public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      final Entry other = (Entryobj;
      if ( == null) {
        if (other.key != null)
          return false;
      } else if (!.equals(other.key))
        return false;
      if ( == null) {
        if (other.value != null)
          return false;
      } else if (!.equals(other.value))
        return false;
      return true;
    }
    @Override
    public String toString() {
      return "(" +  + ", " +  + ")";
    }
  }
New to GrepCode? Check out our FAQ X