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.foundation.NSArray; import com.webobjects.foundation.NSMutableArray; /** * Creates the needed values to have dymamic values in a list page repetition. * Answers on displayPropertyKeys and displayNameForProperty. * @see er.directtoweb.components.relationships.ERD2WDisplayRelationshipFlag for more info * @author ak * */ public class ERDDelayedRelationshipFlagAssignment 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 ERDDelayedRelationshipFlagAssignment(eokeyvalueunarchiver); } /** Logging support */ public final static Logger log = Logger.getLogger(ERDDelayedRelationshipFlagAssignment.class); public ERDDelayedRelationshipFlagAssignment(EOKeyValueUnarchiver u) { super(u); } public ERDDelayedRelationshipFlagAssignment(String key, Object value) { super(key,value); } @Override public Object fireNow(D2WContext c) { String path = keyPath(); if("displayPropertyKeys".equals(path)) { NSArray keys = (NSArray) value(); NSMutableArray result = new NSMutableArray(); for (Enumeration enumerator = keys.objectEnumerator(); enumerator.hasMoreElements();) { String key = (String) enumerator.nextElement(); if(key.startsWith("@")) { key = key.substring(1); c.setPropertyKey(key); String keyPath = (String) c.valueForKey("restrictedChoiceKey"); NSArray objects = NSArray.EmptyArray; String relationshipKey = (String) c.valueForKey("keyWhenRelationship"); if(keyPath != null) { objects = (NSArray) c.valueForKeyPath(keyPath + "." + relationshipKey +".@flatten.@unique"); } if(objects != null) { for (Enumeration e = objects.objectEnumerator(); e.hasMoreElements();) { Object o = e.nextElement(); result.addObject(key + ".@" + o); } } c.setPropertyKey(null); } else { result.addObject(key); } } return result; } else if("displayNameForProperty".equals(path)) { String propertyKey = c.propertyKey(); if(propertyKey != null) { return propertyKey.substring(propertyKey.indexOf("@")+1); } } return null; } }