org.argouml.cognitive.critics
Class Agency

java.lang.Object
  extended byjava.util.Observable
      extended byorg.argouml.cognitive.critics.Agency

public class Agency
extends java.util.Observable

Agency manages Critics. Since classes are not really first class objects in java, a singleton instance of Agency is made and passed around as needed. The Agency keeps a registry of all Critics that should be applied to each type of design material. When a design material instance is critiqued it asks Agency to apply all registered Critic's. In the current scheme there is a thread that proactively, continuously critiques the Design at hand, even if the user is idle! This is simple and it works. The disadvantage is that _all_ active critics related to a given design material are applied, regardless of the reason for the critiquing and a lot of CPU time is basically wasted.

TODO: I am moving toward a more reactionary scheme in which specific design manipulations in the editor cause critics relevant to those manipulations to be applied. This transition is still half done. Trigger's are the critiquing requests. The code for triggers is currently dormant (latent?).


Field Summary
protected static java.util.Hashtable _cachedCritics
           
private  ControlMech _controlMech
          The main control mechanism for determining which critics should be active.
private static java.util.Hashtable _criticRegistry
          A registery of all critics that are currently loaded into the design environment.
private static java.util.Vector _critics
           
static int _numCriticsApplied
           
private static java.util.Hashtable _singletonCritics
           
protected static org.apache.log4j.Logger cat
           
 
Fields inherited from class java.util.Observable
 
Constructor Summary
Agency()
          Contruct a new Agency instance and use a StandardCM as the main control mechanism for determining which critics should be active.
Agency(ControlMech cm)
          Contruct a new Agency instance with the given ControlMech as the main control mechanism for determining which critics should be active.
 
Method Summary
protected static void addCritic(Critic cr)
           
static void addStaticObserver(java.util.Observer obs)
          Let some object recieve notifications when the Agency changes state.
static void applyAllCritics(java.lang.Object dm, Designer d)
           
static void applyAllCritics(java.lang.Object dm, Designer d, long reasonCode)
          Apply all critics that can be applied to the given design material instance as appropriate for the given Designer.
static void applyCritics(java.lang.Object dm, Designer d, java.util.Collection critics, long reasonCode)
           
static java.util.Collection criticsForClass(java.lang.Class clazz)
          Return a Vector of all critics that can be applied to the design material subclass, including inherited critics.
protected static java.util.Vector criticsForSpecificClass(java.lang.Class clazz)
          Return a Vector of all critics that are directly associated with the given design material subclass.
 void determineActiveCritics(Designer d)
          Compute which critics should be active (i.e., they can be applied by applyAllCritics) for a given Designer.
private static java.util.Hashtable getCriticRegistry()
          Reply the registery.
static java.util.Vector getCritics()
           
private static java.util.Collection getCritics(java.lang.Class clazz)
           
static void notifyStaticObservers(java.lang.Object o)
          When the agency changes, notify observers.
static void register(Critic cr, java.lang.Class clazz)
          Register a critic in the global table of critics that have been loaded.
static void register(java.lang.String crClassName, java.lang.String dmClassName)
           
static Agency theAgency()
          Since Java does not really suport classes as first class objects, there is one instance of Agency that is passed around as needed.
 
Methods inherited from class java.util.Observable
addObserver, clearChanged, countObservers, deleteObserver, deleteObservers, hasChanged, notifyObservers, notifyObservers, setChanged
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

cat

protected static org.apache.log4j.Logger cat

_criticRegistry

private static java.util.Hashtable _criticRegistry
A registery of all critics that are currently loaded into the design environment.


_critics

private static java.util.Vector _critics

_controlMech

private ControlMech _controlMech
The main control mechanism for determining which critics should be active.


_numCriticsApplied

public static int _numCriticsApplied

_singletonCritics

private static java.util.Hashtable _singletonCritics

_cachedCritics

protected static java.util.Hashtable _cachedCritics
Constructor Detail

Agency

public Agency(ControlMech cm)
Contruct a new Agency instance with the given ControlMech as the main control mechanism for determining which critics should be active.


Agency

public Agency()
Contruct a new Agency instance and use a StandardCM as the main control mechanism for determining which critics should be active.

Method Detail

theAgency

public static Agency theAgency()
Since Java does not really suport classes as first class objects, there is one instance of Agency that is passed around as needed. theAgency is actually stored in Designer.theDesigner().

See Also:
Designer.theDesigner(org.argouml.cognitive.Designer)

getCriticRegistry

private static java.util.Hashtable getCriticRegistry()
Reply the registery.


getCritics

public static java.util.Vector getCritics()

addCritic

protected static void addCritic(Critic cr)

register

public static void register(java.lang.String crClassName,
                            java.lang.String dmClassName)

register

public static void register(Critic cr,
                            java.lang.Class clazz)
Register a critic in the global table of critics that have been loaded. Critics are associated with one or more design material classes. One way to do registration is in a static initializer of the design material class. But additional (after-market) critics could added thorugh a menu command in some control panel...


criticsForClass

public static java.util.Collection criticsForClass(java.lang.Class clazz)
Return a Vector of all critics that can be applied to the design material subclass, including inherited critics.


getCritics

private static java.util.Collection getCritics(java.lang.Class clazz)

criticsForSpecificClass

protected static java.util.Vector criticsForSpecificClass(java.lang.Class clazz)
Return a Vector of all critics that are directly associated with the given design material subclass.


applyAllCritics

public static void applyAllCritics(java.lang.Object dm,
                                   Designer d,
                                   long reasonCode)
Apply all critics that can be applied to the given design material instance as appropriate for the given Designer.

I would call this critique, but it causes a compilation error because it conflicts with the instance method critique!


applyAllCritics

public static void applyAllCritics(java.lang.Object dm,
                                   Designer d)

applyCritics

public static void applyCritics(java.lang.Object dm,
                                Designer d,
                                java.util.Collection critics,
                                long reasonCode)

determineActiveCritics

public void determineActiveCritics(Designer d)
Compute which critics should be active (i.e., they can be applied by applyAllCritics) for a given Designer.

TODO: I am setting global data, the isEnabled bit in each critic, based on the needs of one designer. I don't really support more than one Designer.


addStaticObserver

public static void addStaticObserver(java.util.Observer obs)
Let some object recieve notifications when the Agency changes state. Static observers are normal Observers on the singleton instance of this class.


notifyStaticObservers

public static void notifyStaticObservers(java.lang.Object o)
When the agency changes, notify observers.



ArgoUML © 1996-2004 (20040316)ArgoUML HomepageArgoUML Developers' pageArgoUML Cookbook