EventCountCircuitBreaker.java 5.19 KB
package org.apache.commons.lang3.concurrent;

import java.util.EnumMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

public class EventCountCircuitBreaker
  extends AbstractCircuitBreaker<Integer>
{
  private static final Map<AbstractCircuitBreaker.State, b> a;
  private final AtomicReference<a> b = new AtomicReference(new a(0, 0L));
  private final int c;
  private final long d;
  private final int e;
  private final long f;
  
  static
  {
    EnumMap localEnumMap = new EnumMap(AbstractCircuitBreaker.State.class);
    localEnumMap.put(AbstractCircuitBreaker.State.CLOSED, new c((byte)0));
    localEnumMap.put(AbstractCircuitBreaker.State.OPEN, new d((byte)0));
    a = localEnumMap;
  }
  
  public EventCountCircuitBreaker(int paramInt, long paramLong, TimeUnit paramTimeUnit)
  {
    this(paramInt, paramLong, paramTimeUnit, paramInt);
  }
  
  public EventCountCircuitBreaker(int paramInt1, long paramLong, TimeUnit paramTimeUnit, int paramInt2)
  {
    this(paramInt1, paramLong, paramTimeUnit, paramInt2, paramLong, paramTimeUnit);
  }
  
  public EventCountCircuitBreaker(int paramInt1, long paramLong1, TimeUnit paramTimeUnit1, int paramInt2, long paramLong2, TimeUnit paramTimeUnit2)
  {
    this.c = paramInt1;
    this.d = paramTimeUnit1.toNanos(paramLong1);
    this.e = paramInt2;
    this.f = paramTimeUnit2.toNanos(paramLong2);
  }
  
  private static b a(AbstractCircuitBreaker.State paramState)
  {
    return (b)a.get(paramState);
  }
  
  private boolean a(int paramInt)
  {
    long l = System.nanoTime();
    AbstractCircuitBreaker.State localState2 = (AbstractCircuitBreaker.State)this.state.get();
    a locala2 = (a)this.b.get();
    a locala1;
    if (a(localState2).a(this, locala2, l))
    {
      locala1 = new a(paramInt, l);
      label54:
      if ((locala2 != locala1) && (!this.b.compareAndSet(locala2, locala1))) {
        break label177;
      }
    }
    label177:
    for (int i = 1; i != 0; i = 0)
    {
      AbstractCircuitBreaker.State localState1 = localState2;
      if (a(localState2).a(this, locala2, locala1))
      {
        localState1 = localState2.oppositeState();
        changeState(localState1);
        this.b.set(new a(0, System.nanoTime()));
      }
      if (isOpen(localState1)) {
        break label182;
      }
      return true;
      if (paramInt != 0)
      {
        locala1 = new a(locala2.a + paramInt, locala2.b);
        break label54;
      }
      locala1 = locala2;
      break label54;
    }
    label182:
    return false;
  }
  
  public boolean checkState()
  {
    return a(0);
  }
  
  public void close()
  {
    super.close();
    this.b.set(new a(0, System.nanoTime()));
  }
  
  public long getClosingInterval()
  {
    return this.f;
  }
  
  public int getClosingThreshold()
  {
    return this.e;
  }
  
  public long getOpeningInterval()
  {
    return this.d;
  }
  
  public int getOpeningThreshold()
  {
    return this.c;
  }
  
  public boolean incrementAndCheckState()
  {
    return incrementAndCheckState(Integer.valueOf(1));
  }
  
  public boolean incrementAndCheckState(Integer paramInteger)
    throws CircuitBreakingException
  {
    return a(1);
  }
  
  public void open()
  {
    super.open();
    this.b.set(new a(0, System.nanoTime()));
  }
  
  static final class a
  {
    final int a;
    final long b;
    
    public a(int paramInt, long paramLong)
    {
      this.a = paramInt;
      this.b = paramLong;
    }
  }
  
  static abstract class b
  {
    protected abstract long a(EventCountCircuitBreaker paramEventCountCircuitBreaker);
    
    public final boolean a(EventCountCircuitBreaker paramEventCountCircuitBreaker, EventCountCircuitBreaker.a parama, long paramLong)
    {
      return paramLong - parama.b > a(paramEventCountCircuitBreaker);
    }
    
    public abstract boolean a(EventCountCircuitBreaker paramEventCountCircuitBreaker, EventCountCircuitBreaker.a parama1, EventCountCircuitBreaker.a parama2);
  }
  
  static final class c
    extends EventCountCircuitBreaker.b
  {
    private c()
    {
      super();
    }
    
    protected final long a(EventCountCircuitBreaker paramEventCountCircuitBreaker)
    {
      return paramEventCountCircuitBreaker.getOpeningInterval();
    }
    
    public final boolean a(EventCountCircuitBreaker paramEventCountCircuitBreaker, EventCountCircuitBreaker.a parama1, EventCountCircuitBreaker.a parama2)
    {
      return parama2.a > paramEventCountCircuitBreaker.getOpeningThreshold();
    }
  }
  
  static final class d
    extends EventCountCircuitBreaker.b
  {
    private d()
    {
      super();
    }
    
    protected final long a(EventCountCircuitBreaker paramEventCountCircuitBreaker)
    {
      return paramEventCountCircuitBreaker.getClosingInterval();
    }
    
    public final boolean a(EventCountCircuitBreaker paramEventCountCircuitBreaker, EventCountCircuitBreaker.a parama1, EventCountCircuitBreaker.a parama2)
    {
      return (parama2.b != parama1.b) && (parama1.a < paramEventCountCircuitBreaker.getClosingThreshold());
    }
  }
}


/* Location:              /home/merong/decompile/hackery-dex2jar.jar!/org/apache/commons/lang3/concurrent/EventCountCircuitBreaker.class
 * Java compiler version: 6 (50.0)
 * JD-Core Version:       0.7.1
 */