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.spi;
 
 
 import java.util.List;
 import java.util.Map;

Author(s):
Ceki Gücü
 
 public class CyclicBufferTrackerImpl<E> implements CyclicBufferTracker<E> {
 
   int bufferCount = 0;
 
   // 5 minutes
 
 
   boolean isStarted = false;
 
   private Map<StringEntrymap = new HashMap<StringEntry>();
 
   private Entry head// least recently used entries are towards the head
   private Entry tail// most recently used entries are towards the tail
   long lastCheck = 0;
 
 
   public CyclicBufferTrackerImpl() {
      = new Entry(nullnull, 0);
      = ;
   }
 
   public int getBufferSize() {
     return ;
   }
 
   public void setBufferSize(int bufferSize) {
     this. = bufferSize;
   }
 
   public int getMaxNumberOfBuffers() {
     return ;
   }
 
   public void setMaxNumberOfBuffers(int maxNumBuffers) {
     this. = maxNumBuffers;
   }
 
   public CyclicBuffer<E> getOrCreate(String keylong timestamp) {
     Entry existing = .get(key);
     if (existing == null) {
       return processNewEntry(keytimestamp);
     } else {
       existing.setTimestamp(timestamp);
       moveToTail(existing);
       return existing.value;
     }
   }
 
   public void removeBuffer(String key) {
     Entry existing = .get(key);
     if (existing != null) {
       --;
       .remove(key);
       unlink(existing);
       CyclicBuffer<E> cb = existing.value;
       if(cb != null) {
         cb.clear();
       }
     }
   }
 
   private CyclicBuffer<E> processNewEntry(String keylong timestamp) {
     CyclicBuffer<E> cb = new CyclicBuffer<E>();
     Entry entry = new Entry(keycbtimestamp);
     .put(keyentry);
     ++;
     linkBeforeTail(entry);
     if ( >= ) {
       removeHead();
     }
    return cb;
  }
  private void removeHead() {
    CyclicBuffer cb = .;
    if (cb != null) {
      cb.clear();
    }
    .remove(.);
    --;
     = .;
    . = null;
  }
  private void moveToTail(Entry e) {
    unlink(e);
    linkBeforeTail(e);
  }
  private void unlink(Entry e) {
    if (e.prev != null) {
      e.prev.next = e.next;
    }
    if (e.next != null) {
      e.next.prev = e.prev;
    }
    if ( == e) {
       = e.next;
    }
  }
  public synchronized void clearStaleBuffers(long now) {
      return;
    }
     = now;
    while (. != null && isEntryStale(now)) {
      removeHead();
    }
  }
  public int size() {
    return .size();
  }
  private boolean isEntryStale(Entry entrylong now) {
    return ((entry.timestamp + ) < now);
  }
    List<Stringresult = new LinkedList<String>();
    Entry e = ;
    while (e != ) {
      result.add(e.key);
      e = e.next;
    }
    return result;
  }
  private void linkBeforeTail(Entry e) {
    if ( == ) {
       = e;
    }
    Entry preTail = .;
    if (preTail != null) {
      preTail.next = e;
    }
    e.prev = preTail;
    e.next = ;
    . = e;
  }
  // ================================================================
  private class Entry {
    Entry next;
    Entry prev;
    String key;
    CyclicBuffer<E> value;
    long timestamp;
    Entry(String kCyclicBuffer<E> vlong timestamp) {
      this. = k;
      this. = v;
      this. = 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