Framework Provisions

Dependent Properties

The target property has a number of dependent properties. A Property is also a PropertyChangeListener whose implementation is set via a delegate using the method setPropertyChangeListenerDelegate(PropertyChangeListener). When a target property value changes, it fires itw own delegate and the delegates of its dependent properties in turn. This provide enough opportunity to place controller code either in one place at the delegate of the target property or have it distributed over delegates of dependent properties. In the latter case, the target property name (which is UID) should be used to identify the event source.

 

 SomeJob
SomeJob
SomeJob(){
  Property prop1 = ... create property
  Property prop2 = ... create property // prop2 depends on prop1
  
  prop2.addDependent(prop1); // binds prop2 to prop1. Listing1
  
  prop2.setPropertyChangeListenerDelegate(new PropertyChangeListener() {

   @Override
   public void propertyChange(PropertyChangeEvent evt) {

       if (!evt.getPropertyName().equals("prop-1")) return; // property name is an UID
       
       String newValue = (String) evt.getNewValue();
       prop2.setValue(newValue);
       
   }
  });
}
 Listing1-PropertyImpl
Listing1-PropertyImpl
 // PropertyImpl implements Property
 @Override
 public final boolean hasDependencies() {
     return !dependencies.isEmpty();
 }

 @Override
 public void addDependent(final Property<?> dependentProperty) {

     addPropertyChangeListener(dependentProperty);
     dependencies.add(dependentProperty);
 }
 
 // active property fires property change
 @Override
 public void setActive(final boolean status) {

     final boolean oldValue = active;
     active = status;
     firePropertyChange(name, oldValue, active);
 }
 Listing2-JobNode
Listing2-JobNode
 @Override
 protected Sheet createSheet() {
  // add properties, inactives in comboProp are skipped
  for (final ComboProperty comboProp : job.getComboProperties()) {
      properties.addAll(comboProp.getProperties());
  }
  
  // create nb_prop from prop
  ...
  
  // add update hook for dependent properties
  if (first_time_create_sheet && prop.hasDependencies()) { 
      // first_time_create_sheet:  a flag that makes sure update-hook is added only once
      prop.addPropertyChangeListener(new PropertyChangeListener() {

          @Override
          public void propertyChange(final PropertyChangeEvent evt) {
              updateSheet(); // which is: setSheet(createSheet());
          }

      });
  }
  
 }

Console and GUI Properties

GUI properties let the user interact with job properties by changing the default values. User-friendly controls are provided to aid in this process. However, every GUI property is a wrapper around one or more console properties. Moreover, multiple GUI properties may work together to modify a set of console properties. Eventually, the user interaction leads to a set of console properties that runs the job. That set of console properties will also run the job from a console. The GUI helps in creating these console properties in a consistent manner. This relieves the user from being familiear with the underlying libraries and framework conventions. The framework provides support for communication between GUI and Console properties. The key areas are discussed below.

Silent Properties

Silent properties do not have any corresponding GUI part but are essential for the console properties. As such, their default value is not edited.  Thus they are included in

ComboProperty.getConsoleProps() but skipped in ComboProperty.getGUIProps(). Use cases include 1) supplying the builder delegate classes 2) dummy values for some builders.  Method ComboProperty.addSilentProperty(String key, String value) can be used to add ey and values for the silent property.

Builders

Delegates

Integration of external Property Editors (JIDE etc)