package er.directtoweb.components.buttons; import org.apache.log4j.Logger; import com.webobjects.appserver.WOComponent; import com.webobjects.appserver.WOContext; import com.webobjects.directtoweb.D2W; import com.webobjects.eoaccess.EODatabaseDataSource; import com.webobjects.eoaccess.EOEntity; import com.webobjects.foundation.NSArray; import er.directtoweb.delegates.ERDPickIntermediateDelegate; import er.directtoweb.interfaces.ERDPickPageInterface; import er.extensions.eof.ERXEOAccessUtilities; import er.extensions.foundation.ERXStringUtilities; import er.extensions.localization.ERXLocalizer; /** * Action button that lets you pick the setup of a non-flattened to-many relationship and creates * the intermediate objects, like when you have an invoice with line items and a relationship to articles. * * @binding pickRelationshipName name of the relationship keypath (eg: items.article) * @binding pickConfigurationName name of the page configuration to use (optional) * @binding pickButtonLabel label for the button (optional) * * @author ak on 07.11.05 */ public class ERDPickIntermediateButton extends ERDActionButton { /** * 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 */ private static final Logger log = Logger.getLogger(ERDPickIntermediateButton.class); /** * Public constructor * @param context the context */ public ERDPickIntermediateButton(WOContext context) { super(context); } public String pickButtonLabel() { String pickButtonLabel = (String) valueForBinding("pickButtonLabel"); if(pickButtonLabel == null) { pickButtonLabel = "Select"; } return ERXLocalizer.currentLocalizer().localizedStringForKeyWithDefault(pickButtonLabel); } public WOComponent pickAction() { WOComponent nextPage = context().page(); String keyPath = (String) valueForBinding("pickRelationshipName"); String relationshipName = ERXStringUtilities.keyPathWithoutLastProperty(keyPath); String pickRelationshipName = ERXStringUtilities.lastPropertyKeyInKeyPath(keyPath); EOEntity entity = ERXEOAccessUtilities.entityForEo(object()); EOEntity pickEntity = ERXEOAccessUtilities.destinationEntityForKeyPath(entity, keyPath); String pickConfigurationName = (String) valueForBinding("pickConfigurationName"); if(pickConfigurationName == null) { pickConfigurationName = "Pick" + pickEntity.name(); } ERDPickPageInterface epi= (ERDPickPageInterface)D2W.factory().pageForConfigurationNamed(pickConfigurationName, session()); epi.setDataSource(new EODatabaseDataSource(object().editingContext(), pickEntity.name())); epi.setSelectedObjects(((NSArray)object().valueForKeyPath(keyPath + ".@unique")).mutableClone()); epi.setNextPageDelegate( new ERDPickIntermediateDelegate(object(), relationshipName, pickRelationshipName, context().page())); nextPage = (WOComponent)epi; return nextPage; } }