package er.modern.directtoweb.assignments;
import com.webobjects.directtoweb.D2WContext;
import com.webobjects.eocontrol.EOKeyValueUnarchiver;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSDictionary;
import er.directtoweb.assignments.ERDAssignment;
import er.directtoweb.pages.ERD2WPage;
import er.extensions.foundation.ERXArrayUtilities;
import er.modern.directtoweb.components.ERMDAjaxNotificationCenter;
/**
* Simple assignment that checks whether a property is to be observed for
* changes or is dependent on another property.
*
* See {@link er.modern.directtoweb.components.ERMDAjaxNotificationCenter}
*
* @d2wKey propertyDependencies
* @d2wKey propertyKey
*
* @author fpeters
*
*/
public class ERMDAjaxUpdateAssignment extends ERDAssignment {
private static final long serialVersionUID = 1L;
/**
* Static constructor required by the EOKeyValueUnarchiver interface. If
* this isn't implemented then the default behavior is to construct the
* first super class that does implement this method. Very lame.
*
* @param eokeyvalueunarchiver
* to be unarchived
* @return decoded assignment of this class
*/
public static Object decodeWithKeyValueUnarchiver(EOKeyValueUnarchiver eokeyvalueunarchiver) {
return new ERMDAjaxUpdateAssignment(eokeyvalueunarchiver);
}
/**
* Public constructor
*
* @param u
* key-value unarchiver used when unarchiving from rule files.
*/
public ERMDAjaxUpdateAssignment(EOKeyValueUnarchiver u) {
super(u);
}
/**
* Public constructor
*
* @param key
* context key
* @param value
* of the assignment
*/
public ERMDAjaxUpdateAssignment(String key, Object value) {
super(key, value);
}
/**
* Implementation of the
* {@link er.directtoweb.assignments.ERDComputingAssignmentInterface}.
*
* @return empty array.
*/
@Override
public NSArray<String> dependentKeys(String keyPath) {
return new NSArray<String>(ERD2WPage.Keys.propertyKey,
ERMDAjaxNotificationCenter.PROPERTY_DEPENDENCIES.key());
}
/**
* Checks whether the current property is declared as to be observed via the
* propertyDependencies key.
*
* @return true if the current property key is to be observed
*/
public Object shouldObserve(D2WContext context) {
boolean shouldObserve = false;
NSDictionary<String, NSArray<String>> propertyDependencies = ERMDAjaxNotificationCenter.PROPERTY_DEPENDENCIES
.valueInObject(context);
if (propertyDependencies != null
&& propertyDependencies.containsKey(context.propertyKey())) {
shouldObserve = true;
}
return shouldObserve;
}
/**
* Checks whether the current property is declared dependent via the
* propertyDependencies key.
*
* @return true if the current property is dependent
*/
public Object isDependent(D2WContext context) {
boolean isDependent = false;
NSDictionary<String, NSArray<String>> propertyDependencies = ERMDAjaxNotificationCenter.PROPERTY_DEPENDENCIES
.valueInObject(context);
if (propertyDependencies != null) {
if (ERXArrayUtilities.flatten(propertyDependencies.allValues()).contains(
context.propertyKey())) {
isDependent = true;
}
}
return isDependent;
}
}