/* * Copyright (C) NetStruxr, Inc. All rights reserved. * * This software is published under the terms of the NetStruxr * Public Software License version 0.5, a copy of which has been * included with this distribution in the LICENSE.NPL file. */ package er.directtoweb.assignments.delayed; import java.util.Enumeration; import org.apache.log4j.Logger; import com.webobjects.directtoweb.D2WContext; import com.webobjects.directtoweb.Rule; import com.webobjects.eocontrol.EOKeyValueUnarchiver; import com.webobjects.eocontrol.EOQualifierEvaluation; import com.webobjects.foundation.NSArray; /** * DelayedRuleAssignment expects an array of rules as its value. The rules are * evaluated in turn until one returns a non-null result. This is done * every time that the propertyKey is requested thus making the rule system * a lot more dynamic. */ public class ERDDelayedRuleAssignment extends ERDDelayedAssignment { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; public static Object decodeWithKeyValueUnarchiver(EOKeyValueUnarchiver eokeyvalueunarchiver) { return new ERDDelayedRuleAssignment(eokeyvalueunarchiver); } /** Logging support */ public final static Logger log = Logger.getLogger(ERDDelayedRuleAssignment.class); public ERDDelayedRuleAssignment(EOKeyValueUnarchiver u) { super(u); } public ERDDelayedRuleAssignment(String key, Object value) { super(key,value); } // FIXME: this assignment should in theory return all the keys in the LHS of the rule // as the dependent keys!! /** * This method is called whenever the propertyKey is requested, * but the value in the cache is actually a rule. */ @Override public Object fireNow(D2WContext c) { Object result = null; NSArray rules = (NSArray)value(); Enumeration ruleEnumerator = rules.objectEnumerator(); Rule rule; while (ruleEnumerator.hasMoreElements()) { rule = (Rule)ruleEnumerator.nextElement(); EOQualifierEvaluation eval = rule.lhs(); log.debug("Qualifier eval: \n" + eval); if (eval.evaluateWithObject(c)) { result = rule.rhs().value(); log.debug("RHS value: " + result); break; } log.debug(" object.expansionRSF:" + c.valueForKey("object") + c.valueForKeyPath("object.expansionRSF")); if (c.valueForKeyPath("object.expansionRSF") == null) log.debug("It is null"); } return result; } }