import com.sun.jdi.request.DuplicateRequestException; import java.awt.event.KeyEvent; import java.io.Serializable; import java.util.ArrayList; public class Middleware implements Serializable { public static ArrayList allOldCode = new ArrayList(); public static ArrayList allNewCode = new ArrayList(); public final int oldCode; public final int newCode; public boolean isDestroyed = false; Middleware(int oldCode, int newCode) { // if (!canCreate(oldCode, newCode)) { // TODO: replace with more appropriate exception // throw new DuplicateRequestException(); // } allOldCode.add(oldCode); allNewCode.add(newCode); this.oldCode = oldCode; this.newCode = newCode; } public boolean canIntercept(KeyEvent e) { return e.getKeyCode() == newCode && !isDestroyed; } public KeyEvent interceptKey(KeyEvent e) { e.setKeyCode(oldCode); return e; } public void destroy() { allOldCode.remove(oldCode); allNewCode.remove(newCode); isDestroyed = true; } public static boolean canCreate(int oldCode, int newCode) { return (!allOldCode.contains(oldCode) && !allNewCode.contains(newCode)); } @Override public boolean equals(Object o) { try { Middleware m = (Middleware)o; // duck typing equals check // if it has the same oldCode, assume it is the same; this is because oldCodes should be unique // also makes some corner cases easier return this.oldCode == m.oldCode || this.newCode == m.newCode; } catch (ClassCastException e) { return false; } } }