Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Creative commons Attribution-NonCommercial license. http://creativecommons.org/licenses/by-nc/2.5/au/deed.en_GB NO WARRANTY IS GIVEN OR IMPLIED, USE AT YOUR OWN RISK.
  
  package base;
  
 
 import java.util.Date;
 
 public class Throttle {
 
 	private String lockout;
 	private String window;
 	private String attempts;
 
 	private DataSource ds;
 	private Settings settings;

Parameters:
ds
settings
name
lockout How many seconds a lock is held.
attempts How many attempts triggers a lock.
window How many seconds of inactivity results in the attempt count being reset.
 
 	public Throttle(DataSource dsSettings settingsString namelong lockoutlong attemptslong windowthrows IOException {
 		if(ds == null) {
 			throw new IllegalArgumentException("Throttle requires a valid data source parameter.");
 		}
 
 		if(settings == null) {
 			throw new IllegalArgumentException("Throttle requires a valid settings parameter.");
 		}
 
 		this. = ds;
 		this. = settings;
 
 		if(!name.matches("^[a-z][a-z0-9\\\\.]+$")) {
 			throw new IllegalArgumentException("Please specify alphanumeric throttle name.");
 		}
 
 		this. = "throttle." + name + ".lockout";
 		this. = "throttle." + name + ".attempts";
 		this. = "throttle." + name + ".window";
 
 		setup();
 
 		if(settings.get(this.null) == null) {
 			settings.set(this."" + lockout);
 		}
 		if(settings.get(this.null) == null) {
 			settings.set(this."" + attempts);
 		}
 		if(settings.get(this.null) == null) {
 			settings.set(this."" + window);
 		}
 
 	}
 
 	public boolean isThrottled(String keythrows IOException {
 		Connection c = null;
 		PreparedStatement s = null;
 		ResultSet r = null;
 
 		try {
 			c = .getConnection();
 
 			// Clear expired throttle entries
 			s = c.prepareStatement(
 					"delete from throttle " +
 					"where (updated<? and attempts<"+.get()+") or " +
 					"      (updated<? and attempts>="+.get()+")"
 					);
 			s.setTimestamp(1, new java.sql.Timestamp((new Date()).getTime()-Long.parseLong(.get())*1000));
 			s.setTimestamp(2, new java.sql.Timestamp((new Date()).getTime()-Long.parseLong(.get())*1000));
 			s.close();
 			s = null;
 
 			// Check if throttled
 			s = c.prepareStatement("select attempts from throttle where key_value=?");
 			s.setString(1, key);
 			r = s.executeQuery();
 			if(!r.next()) {
 				return false;
 			}
 			return r.getLong(1) >= Long.parseLong(.get());
catch(SQLException e) {
			throw new IOException(e);
finally {
			try { if(r != null) { r.close(); } } catch(Exception e) {}
			try { if(s != null) { s.close(); } } catch(Exception e) {}
			try { if(c != null) { c.close(); } } catch(Exception e) {}
		}
	}
	public void markForThrottling(String keythrows IOException {
		Connection c = null;
		PreparedStatement s = null;
		PreparedStatement s2 = null;
		ResultSet r = null;
		try {
			s = c.prepareStatement("select attempts,updated from throttle where key_value=?");
			s.setString(1, key);
			r = s.executeQuery();
			if(!r.next()) {
				// Insert new throttle
				s2 = c.prepareStatement("insert into throttle (key_value,attempts,updated) values(?,1,?)");
				s2.setString(1, key);
				s2.setTimestamp(2, new java.sql.Timestamp((new Date()).getTime()));
				return;
else {
				if(r.getTimestamp(2).getTime() < (new Date()).getTime()-Long.parseLong(.get())*1000) {
					// Eligible to reset the lockout counter
					s2 = c.prepareStatement("update throttle set attempts=1,updated=? where key_value=?");
					s2.setTimestamp(1, new java.sql.Timestamp(new Date().getTime()));
					s2.setString(2, key);
else {
					s2 = c.prepareStatement("update throttle set attempts=attempts+1 where key_value=?");
					s2.setString(1, key);
					return;
				}
			}
catch(SQLException e) {
			throw new IOException(e);
finally {
			try { if(r != null) { r.close(); } } catch(Exception e) {}
			try { if(s != null) { s.close(); } } catch(Exception e) {}
			try { if(s2 != null) { s2.close(); } } catch(Exception e) {}
			try { if(c != null) { c.close(); } } catch(Exception e) {}
		}
	}
	public void clear(String keythrows IOException {
		Connection c = null;
		PreparedStatement s = null;
		try {
			// Clear expired throttle entries
					"delete from throttle " +
					"where (updated<? and attempts<"+.get()+") or " +
					"      (updated<? and attempts>="+.get()+") or " +
					"      key_value=? "
					);
			s.setTimestamp(1, new java.sql.Timestamp((new Date()).getTime()-Long.parseLong(.get())*1000));
			s.setTimestamp(2, new java.sql.Timestamp((new Date()).getTime()-Long.parseLong(.get())*1000));
			s.setString(3, key);
			s.close();
			s = null;
catch(SQLException e) {
			throw new IOException(e);
finally {
			try { if(s != null) { s.close(); } } catch(Exception e) {}
			try { if(c != null) { c.close(); } } catch(Exception e) {}
		}
	}
	public void wipe() throws IOException {
		Connection c = null;
		PreparedStatement s = null;
		try {
			s = c.prepareStatement("delete from throttle");
			s.close();
			s = null;
catch(SQLException e) {
			throw new IOException(e);
finally {
			try { if(s != null) { s.close(); } } catch(Exception e) {}
			try { if(c != null) { c.close(); } } catch(Exception e) {}
		}
	}
	private void setup() throws IOException {
		Connection c = null;
		PreparedStatement s = null;
		try {
			c.setAutoCommit(false);
				"create table throttle (" +
				"key_value nvarchar2(200) primary key, "+
				"attempts int, " +
				"updated timestamp)");
			s.close();
			s = null;
			c.commit();
			c.close();
			c = null;
catch(SQLException e) {
			// Deliberately ignore when this fails, we expect it to fail most of the time
finally {
			if(s != null) { try { s.close(); } catch(Exception f){} }
			if(c != null) { try { c.close(); } catch(Exception f){} }
		}
		c = null;
		s = null;
		try {
			c.setAutoCommit(false);
				"create table throttle (" +
				"key_value varchar(200), "+
				"attempts int, "+
				"updated long, "+
				"PRIMARY KEY(key_value)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
			s.close();
			s = null;
			c.commit();
			c.close();
			c = null;
catch(SQLException e) {
			// Deliberately ignore when this fails, we expect it to fail most of the time
finally {
			if(s != null) { try { s.close(); } catch(Exception f){} }
			if(c != null) { try { c.close(); } catch(Exception f){} }
		}
	}
New to GrepCode? Check out our FAQ X