package org.googlecode.perftrace.stat;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.Semaphore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author zhongfeng
*
*/
public class SecurityDefender {
/**
* logger.
*/
private static final Logger logger = LoggerFactory
.getLogger(SecurityDefender.class);
private static final int DEFAULT_CONTINUE_FAILED_NUM = 10;
private boolean ctrlFlag = false;
private Semaphore available = new Semaphore(1);
private int failNum = 0;
public synchronized DefenderResult checkPass() {
if (!ctrlFlag) {
return DefenderResult.NO_CTRL;
}
if (ctrlFlag && available.tryAcquire()) {
// logger.info("SecurityDefender tryAcquire Pass");
return DefenderResult.CTRL_PASS;
}
return DefenderResult.ACCESS_DENY;
}
public void checkStatus(DefenderResult defenderRet, boolean isFault) {
if (defenderRet.isRelease()) {
release();
}
synchronized (this) {
if (isFault) {
if ((failNum++) > DEFAULT_CONTINUE_FAILED_NUM)
ctrlFlag = true;
} else {
failNum = 0;
ctrlFlag = false;
}
}
}
private void release() {
available.release();
}
public static class DefenderResult {
/**
* 没有开启访问控制,直接通过
*/
public static final DefenderResult NO_CTRL = new DefenderResult(true,
false);
/**
* 开启访问控制,被拒绝
*/
public static final DefenderResult ACCESS_DENY = new DefenderResult(
false, false);
/**
* 开启访问控制,获取访问令牌
*/
public static final DefenderResult CTRL_PASS = new DefenderResult(true,
true);
private boolean isPass = false;
private boolean isRelease = false;
/**
* @param isPass
* @param isRelease
*/
private DefenderResult(boolean isPass, boolean isRelease) {
this.isPass = isPass;
this.isRelease = isRelease;
}
public boolean isPass() {
return isPass;
}
public void setPass(boolean isPass) {
this.isPass = isPass;
}
public boolean isRelease() {
return isRelease;
}
public void setRelease(boolean isRelease) {
this.isRelease = isRelease;
}
}
public static class Hello {
private String msg;
/**
* @param msg
*/
public Hello(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
public static void main(String[] args) throws Exception, ExecutionException {
Semaphore sem = new Semaphore(5);
sem.release(10);
System.out.println(sem.availablePermits());
Callable<String> call = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(5 * 1000);
return new Hello("test").getMsg();
}
};
FutureTask<String> ft = new FutureTask<String>(call);
ft.run();
ft.get();
}
}