📄 hourlimiterfilter.java
字号:
// HourLimiterFilter.java// $Id: HourLimiterFilter.java,v 1.4 2000/08/16 21:37:37 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1998.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigsaw.filters;import java.util.Calendar;import java.util.Date;import org.w3c.tools.resources.Attribute;import org.w3c.tools.resources.AttributeHolder;import org.w3c.tools.resources.AttributeRegistry;import org.w3c.tools.resources.BooleanAttribute;import org.w3c.tools.resources.DateAttribute;import org.w3c.tools.resources.FramedResource;import org.w3c.tools.resources.ReplyInterface;import org.w3c.tools.resources.RequestInterface;import org.w3c.tools.resources.ResourceFilter;import org.w3c.tools.resources.ResourceFrame;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.www.http.HTTP;import org.w3c.jigsaw.html.HtmlGenerator;public class HourLimiterFilter extends ResourceFilter { /** * Repeat every day? */ public static int ATTR_DAY_REPEAT = -1; /** * Repeat every week? */ public static int ATTR_WEEK_REPEAT = -1; /** * Repeat every month? */ public static int ATTR_MONTH_REPEAT = -1; /** * Repeat every year? */ public static int ATTR_YEAR_REPEAT = -1; /** * start date */ public static int ATTR_DATE_START = -1; /** * end date */ public static int ATTR_DATE_END = -1; static { Attribute a = null ; Class cls = null ; try { cls = Class.forName("org.w3c.jigsaw.filters.HourLimiterFilter") ; } catch (Exception ex) { ex.printStackTrace() ; System.exit(1) ; } // Declare the day_repeat attribute a = new BooleanAttribute("day_repeat" , Boolean.FALSE , Attribute.EDITABLE) ; ATTR_DAY_REPEAT = AttributeRegistry.registerAttribute(cls, a) ; // Declare the week_repeat attribute a = new BooleanAttribute("week_repeat" , Boolean.FALSE , Attribute.EDITABLE) ; ATTR_WEEK_REPEAT = AttributeRegistry.registerAttribute(cls, a) ; // Declare the day_repeat attribute a = new BooleanAttribute("month_repeat" , Boolean.FALSE , Attribute.EDITABLE) ; ATTR_MONTH_REPEAT = AttributeRegistry.registerAttribute(cls, a) ; // Declare the week_repeat attribute a = new BooleanAttribute("year_repeat" , Boolean.FALSE , Attribute.EDITABLE) ; ATTR_YEAR_REPEAT = AttributeRegistry.registerAttribute(cls, a) ; // Declare the start date a = new DateAttribute("start" , null , Attribute.EDITABLE) ; ATTR_DATE_START = AttributeRegistry.registerAttribute(cls, a) ; // Declare the end date a = new DateAttribute("end" , null , Attribute.EDITABLE) ; ATTR_DATE_END = AttributeRegistry.registerAttribute(cls, a) ; } private int a_year, a_month, a_week, a_day, a_time; private int b_year, b_month, b_week, b_day, b_time; protected boolean getDayRepeat() { return getBoolean(ATTR_DAY_REPEAT, false); } protected boolean getWeekRepeat() { return getBoolean(ATTR_WEEK_REPEAT, false); } protected boolean getMonthRepeat() { return getBoolean(ATTR_MONTH_REPEAT, false); } protected boolean getYearRepeat() { return getBoolean(ATTR_YEAR_REPEAT, false); } /** * We override setValues to compute locally everything we need * @param idx The index of the attribute to modify. * @param value The new attribute value. */ public void setValue(int idx, Object value) { super.setValue(idx, value); if (idx == ATTR_DATE_START) { Calendar cal = Calendar.getInstance(); cal.setTime(new Date(((Long)value).longValue())); a_year = cal.get(Calendar.YEAR); a_month = cal.get(Calendar.MONTH); a_week = cal.get(Calendar.DAY_OF_WEEK); a_day = cal.get(Calendar.DAY_OF_MONTH); a_time = cal.get(Calendar.HOUR_OF_DAY) * 3600 + cal.get(Calendar.MINUTE) * 60 + cal.get(Calendar.SECOND); } else if (idx == ATTR_DATE_END) { Calendar cal = Calendar.getInstance(); cal.setTime(new Date(((Long)value).longValue())); b_year = cal.get(Calendar.YEAR); b_month = cal.get(Calendar.MONTH); b_week = cal.get(Calendar.DAY_OF_WEEK); b_day = cal.get(Calendar.DAY_OF_MONTH); b_time = cal.get(Calendar.HOUR_OF_DAY) * 3600 + cal.get(Calendar.MINUTE) * 60 + cal.get(Calendar.SECOND); } } /** * Initialize the filter. */ public void initialize(Object values[]) { Calendar cal = Calendar.getInstance(); long d = System.currentTimeMillis(); super.initialize(values); cal.setTime(new Date(getLong(ATTR_DATE_START, d))); a_year = cal.get(Calendar.YEAR); a_month = cal.get(Calendar.MONTH); a_week = cal.get(Calendar.DAY_OF_WEEK); a_day = cal.get(Calendar.DAY_OF_MONTH); a_time = cal.get(Calendar.HOUR_OF_DAY) * 3600 + cal.get(Calendar.MINUTE) * 60 + cal.get(Calendar.SECOND); cal.setTime(new Date(getLong(ATTR_DATE_END, d))); b_year = cal.get(Calendar.YEAR); b_month = cal.get(Calendar.MONTH); b_week = cal.get(Calendar.DAY_OF_WEEK); b_day = cal.get(Calendar.DAY_OF_MONTH); b_time = cal.get(Calendar.HOUR_OF_DAY) * 3600 + cal.get(Calendar.MINUTE) * 60 + cal.get(Calendar.SECOND); } /** * We check that the date is in the right values * otherwise, send a NOT_AVAILABLE and fills the right Retry-After header * @return a Reply if blocked, null otherwise */ public synchronized ReplyInterface ingoingFilter(RequestInterface req) { Request request = (Request) req; Reply reply = null; int n_year, n_month, n_week, n_day, n_time; int a, b, n; Calendar cal = Calendar.getInstance(); n_year = cal.get(Calendar.YEAR); n_month = cal.get(Calendar.MONTH); n_week = cal.get(Calendar.DAY_OF_WEEK); n_day = cal.get(Calendar.DAY_OF_MONTH); n_time = cal.get(Calendar.HOUR_OF_DAY) * 3600 + cal.get(Calendar.MINUTE) * 60 + cal.get(Calendar.SECOND); if (getDayRepeat()) { // check it if it is repeated every day if ((n_time < a_time) || (n_time > b_time)) { reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); if (n_time < a_time) reply.setRetryAfter(a_time - n_time); else reply.setRetryAfter(84600 + n_time - a_time); } } else if (getWeekRepeat()) { // check it if it is repeated every week a = a_time + a_week * 86400; b = b_time + b_week * 86400; n = n_time + n_week * 86400; if ((n < a) || (n > b)) { reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); if (n < a) reply.setRetryAfter(a - n); else reply.setRetryAfter(84600*7 + n - a); } } else if (getMonthRepeat()) { // check it if it's repeated every month a = a_time + a_day * 86400; b = b_time + b_day * 86400; n = n_time + n_day * 86400; if ((n < a) || (n > b)) { reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); if (n < a) reply.setRetryAfter(a - n); else { cal.setTime(new Date(getLong(ATTR_DATE_START, -1))); cal.set(Calendar.YEAR, n_year); cal.set(Calendar.MONTH, n_month); cal.roll(Calendar.MONTH, true); reply.setRetryAfter(cal.getTime().getTime()); } } } else if (getYearRepeat()) { // check it if it's repeated every year Calendar c_a = Calendar.getInstance(); Calendar c_b = Calendar.getInstance(); c_a.setTime(new Date(getLong(ATTR_DATE_START, -1))); c_b.setTime(new Date(getLong(ATTR_DATE_END, -1))); c_a.set(Calendar.YEAR, n_year); c_b.set(Calendar.YEAR, n_year); if (cal.before(c_a)) { reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); reply.setRetryAfter(c_a.getTime().getTime()); } else if (cal.after(c_b)) { c_a.roll(Calendar.YEAR, true); reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); reply.setRetryAfter(c_a.getTime().getTime()); } } else { /* no repeat */ Calendar c_a = Calendar.getInstance(); Calendar c_b = Calendar.getInstance(); c_a.setTime(new Date(getLong(ATTR_DATE_START, -1))); c_b.setTime(new Date(getLong(ATTR_DATE_END, -1))); if (cal.before(c_a)) { reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); reply.setRetryAfter(c_a.getTime().getTime()); } else if (cal.after(c_b)) { reply = request.makeReply(HTTP.SERVICE_UNAVAILABLE); } } if (reply != null) { HtmlGenerator g = new HtmlGenerator("Service Unavailable"); g.append("You may retry after the delay or the date given"); reply.setStream(g); } return reply; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -