/* * 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.eocontrol.EOKeyValueUnarchiver; import com.webobjects.eocontrol.EOQualifier; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSDictionary; import er.directtoweb.assignments.ERDComputingAssignmentInterface; public class ERDDelayedSwitchAssignment extends ERDDelayedAssignment implements ERDComputingAssignmentInterface { /** * 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; /** logging support */ public final static Logger log = Logger.getLogger("er.directtoweb.rules.ERDDelayedSwitchAssignment"); public static Object decodeWithKeyValueUnarchiver(EOKeyValueUnarchiver eokeyvalueunarchiver) { return new ERDDelayedSwitchAssignment(eokeyvalueunarchiver); } public ERDDelayedSwitchAssignment(EOKeyValueUnarchiver u) { super(u); } public ERDDelayedSwitchAssignment(String key, Object value) { super(key,value); } public NSArray _dependentKeys; public NSArray dependentKeys(String keyPath) { if (_dependentKeys==null) { NSDictionary conditionAssignment = (NSDictionary)value(); String qualFormat = (String)conditionAssignment.objectForKey("qualifierFormat"); NSArray args = (NSArray)conditionAssignment.objectForKey("args"); if (log.isDebugEnabled()) log.debug("parsing "+qualFormat); EOQualifier qualifier = EOQualifier.qualifierWithQualifierFormat(qualFormat, args); if (log.isDebugEnabled()) log.debug("Qualifier keys: " + qualifier.allQualifierKeys()); _dependentKeys=qualifier.allQualifierKeys().allObjects(); } return _dependentKeys; } @Override public Object fireNow(D2WContext c) { Object result = null; NSDictionary conditionAssignment = (NSDictionary)value(); String qualFormat = (String)conditionAssignment.objectForKey("qualifierFormat"); NSDictionary switchDictionary = (NSDictionary)conditionAssignment.objectForKey("switch"); NSArray args = (NSArray)conditionAssignment.objectForKey("args"); if (log.isDebugEnabled()) { log.debug("Entity: " + c.entity().name()); log.debug("Object " + c.valueForKey("object")); log.debug("qualifierFormat "+qualFormat); log.debug("args "+args); log.debug("switchDictionary " + switchDictionary); } for(Enumeration e = switchDictionary.allKeys().objectEnumerator(); e.hasMoreElements();){ String switchKey = (String)e.nextElement(); String completedQualFormat = NSArray.componentsSeparatedByString( qualFormat, "@@").componentsJoinedByString(switchKey); EOQualifier qualifier = EOQualifier.qualifierWithQualifierFormat(completedQualFormat, args); if (log.isDebugEnabled()) { System.err.println("Qualifier keys: " + qualifier.allQualifierKeys()); System.err.println("Qualifier : " + qualifier); } if (log.isDebugEnabled()) log.debug("DelayedConditonalQualifier: " + qualifier); if (qualifier.evaluateWithObject(c)) { result = switchDictionary.valueForKey(switchKey); log.debug("result = " + result); break; } } if(result == null){ result = switchDictionary.valueForKey("defaultValueForAssignement"); } return result; } }