Package er.directtoweb.delegates

Source Code of er.directtoweb.delegates.ERDPickIntermediateDelegate

/**
*
*/
package er.directtoweb.delegates;

import java.util.Enumeration;

import com.webobjects.appserver.WOComponent;
import com.webobjects.directtoweb.NextPageDelegate;
import com.webobjects.eoaccess.EOEntity;
import com.webobjects.eocontrol.EOEditingContext;
import com.webobjects.eocontrol.EOEnterpriseObject;
import com.webobjects.foundation.NSArray;

import er.directtoweb.interfaces.ERDPickPageInterface;
import er.extensions.eof.ERXEOAccessUtilities;
import er.extensions.eof.ERXEOControlUtilities;

/**
* Nextpage delegate that handles creating or deleting an intermediate object when you finished with a pick page.
* This is usefull when you have a to-many that is not flattened, like an invoice with a "lineItem" to-many to
* products. You set this up via:
*
* @author ak
*
*/
public class ERDPickIntermediateDelegate implements NextPageDelegate {
    EOEnterpriseObject eo;
    String relationshipName;
    String pickRelationshipName;
    WOComponent nextPage;

    /**
     * Constructs the delegate
     * @param eo
     * @param relationshipName
     * @param pickRelationshipName
     * @param nextPage
     */
    public ERDPickIntermediateDelegate(EOEnterpriseObject eo, String relationshipName, 
        String pickRelationshipName, WOComponent nextPage) {
        this.eo = eo;
        this.relationshipName = relationshipName;
        this.nextPage = nextPage;
        this.pickRelationshipName = pickRelationshipName;
    }
   
    public WOComponent nextPage(WOComponent sender) {
        EOEditingContext ec = eo.editingContext();
        ec.lock();
        try {
            NSArray selectedObjects;
            if(sender instanceof ERDPickPageInterface) {
              selectedObjects = ((ERDPickPageInterface)sender).selectedObjects();
            } else {
              selectedObjects = (NSArray)sender.valueForKeyPath("selectedObjects");
            }
            NSArray relatedObjects = (NSArray)eo.valueForKeyPath(relationshipName);
            for(Enumeration e = relatedObjects.immutableClone().objectEnumerator(); e.hasMoreElements(); ) {
                EOEnterpriseObject relatedObject = (EOEnterpriseObject)e.nextElement();
                EOEnterpriseObject pickedObject = (EOEnterpriseObject)relatedObject.valueForKey(pickRelationshipName);
                if(!selectedObjects.containsObject(pickedObject)) {
                    eo.removeObjectFromBothSidesOfRelationshipWithKey(relatedObject, relationshipName);
                    ec.deleteObject(relatedObject);
                }
            }
            NSArray pickedObjects = (NSArray)eo.valueForKeyPath(relationshipName +"." + pickRelationshipName +".@unique");
            EOEntity entity = ERXEOAccessUtilities.destinationEntityForKeyPath(ERXEOAccessUtilities.entityForEo(eo), relationshipName);
            for(Enumeration e = selectedObjects.objectEnumerator(); e.hasMoreElements(); ) {
                EOEnterpriseObject selectedObject = (EOEnterpriseObject)e.nextElement();
                if(!pickedObjects.containsObject(selectedObject)) {
                    EOEnterpriseObject relatedObject = ERXEOControlUtilities.createAndInsertObject(ec, entity.name());
                    relatedObject.addObjectToBothSidesOfRelationshipWithKey(selectedObject, pickRelationshipName);
                    eo.addObjectToBothSidesOfRelationshipWithKey(relatedObject, relationshipName);
                }
            }
        } finally {
            ec.unlock();
        }
       
        return nextPage;
    }
}
TOP

Related Classes of er.directtoweb.delegates.ERDPickIntermediateDelegate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.