extensions/net.sf.basedb.opengrid/trunk/src/net/sf/basedb/opengrid/config/AbstractLockable.java

Code
Comments
Other
Rev Date Author Line
4254 25 Nov 16 nicklas 1 package net.sf.basedb.opengrid.config;
4126 26 Sep 16 nicklas 2
4257 30 Nov 16 nicklas 3
4126 26 Sep 16 nicklas 4 /**
4254 25 Nov 16 nicklas 5   Handles locking and validation of configuration settings. The
4126 26 Sep 16 nicklas 6   generic parameter must be the subclass iteself
4126 26 Sep 16 nicklas 7   so the the {@link #lock()} method can return the
4126 26 Sep 16 nicklas 8   "this" reference.
4126 26 Sep 16 nicklas 9   
4126 26 Sep 16 nicklas 10   @author nicklas
4126 26 Sep 16 nicklas 11   @since 1.0
4126 26 Sep 16 nicklas 12 */
4126 26 Sep 16 nicklas 13 public abstract class AbstractLockable<T extends AbstractLockable<T>> 
4126 26 Sep 16 nicklas 14 {
4126 26 Sep 16 nicklas 15
4126 26 Sep 16 nicklas 16   private boolean locked;
4254 25 Nov 16 nicklas 17   private boolean valid;
4126 26 Sep 16 nicklas 18   
4126 26 Sep 16 nicklas 19   protected AbstractLockable()
4126 26 Sep 16 nicklas 20   {}
4126 26 Sep 16 nicklas 21   
4126 26 Sep 16 nicklas 22   /**
4254 25 Nov 16 nicklas 23     Check if this configuration is valid or not.
4254 25 Nov 16 nicklas 24   */
4254 25 Nov 16 nicklas 25   public final boolean isValid()
4254 25 Nov 16 nicklas 26   {
4254 25 Nov 16 nicklas 27     if (locked) return valid;
4257 30 Nov 16 nicklas 28     checkValid(false);
4254 25 Nov 16 nicklas 29     valid = true;
4254 25 Nov 16 nicklas 30     return valid;
4254 25 Nov 16 nicklas 31   }
4254 25 Nov 16 nicklas 32   
4254 25 Nov 16 nicklas 33   /**
4254 25 Nov 16 nicklas 34     Check if the configuration settings are valid. The default
4254 25 Nov 16 nicklas 35     implementation does nothing. Subclasses should override
4254 25 Nov 16 nicklas 36     this method to implement their own validation and throw
4254 25 Nov 16 nicklas 37     an exception if the configuration is not valid.
4257 30 Nov 16 nicklas 38     @param forLock If TRUE, the instance will be locked after validation
4254 25 Nov 16 nicklas 39   */
4257 30 Nov 16 nicklas 40   protected void checkValid(boolean forLock)
4254 25 Nov 16 nicklas 41   {}
4254 25 Nov 16 nicklas 42   
4254 25 Nov 16 nicklas 43   /**
4126 26 Sep 16 nicklas 44     Is this instance locked for modifications?
4126 26 Sep 16 nicklas 45   */
4126 26 Sep 16 nicklas 46   public final boolean isLocked()
4126 26 Sep 16 nicklas 47   {
4126 26 Sep 16 nicklas 48     return locked;
4126 26 Sep 16 nicklas 49   }
4126 26 Sep 16 nicklas 50   
4126 26 Sep 16 nicklas 51   /**
4254 25 Nov 16 nicklas 52     Lock this instance for future modifications. The lock will only
4254 25 Nov 16 nicklas 53     succeed if the configuration is valid. 
4126 26 Sep 16 nicklas 54     @return This instance
4126 26 Sep 16 nicklas 55   */
4126 26 Sep 16 nicklas 56   @SuppressWarnings("unchecked")
4126 26 Sep 16 nicklas 57   public final T lock()
4126 26 Sep 16 nicklas 58   {
4257 30 Nov 16 nicklas 59     if (!locked) checkValid(true);
4126 26 Sep 16 nicklas 60     this.locked = true;
4126 26 Sep 16 nicklas 61     return (T)this;
4126 26 Sep 16 nicklas 62   }
4126 26 Sep 16 nicklas 63   
4126 26 Sep 16 nicklas 64   /**
4126 26 Sep 16 nicklas 65     Check the locked status and throw an {@link IllegalStateException}
4254 25 Nov 16 nicklas 66     if this instance has been locked. Calling this method resets the validation 
4254 25 Nov 16 nicklas 67     status of this configuration.
4126 26 Sep 16 nicklas 68     @param method The name of the method that is trying to modify this instance
4126 26 Sep 16 nicklas 69   */
4126 26 Sep 16 nicklas 70   protected final void checkLocked(String method)
4126 26 Sep 16 nicklas 71   {
4126 26 Sep 16 nicklas 72     if (locked)
4126 26 Sep 16 nicklas 73     {
4234 11 Nov 16 nicklas 74       throw new IllegalStateException(method + " not allowed after configuration has been locked.");
4126 26 Sep 16 nicklas 75     }
4254 25 Nov 16 nicklas 76     valid = false;
4126 26 Sep 16 nicklas 77   }
4126 26 Sep 16 nicklas 78
4126 26 Sep 16 nicklas 79 }