Package er.directtoweb.assignments

Source Code of er.directtoweb.assignments.ERDSortedManyToManyAssignment

//
//  ERDSortedManyToManyAssignment.java
//  ERDirectToWeb
//
//  Created by Patrice Gautier on Fri Sep 13 2002.
//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
//

package er.directtoweb.assignments;

import java.util.Enumeration;

import com.webobjects.directtoweb.D2WContext;
import com.webobjects.eoaccess.EOEntity;
import com.webobjects.eoaccess.EORelationship;
import com.webobjects.eocontrol.EOKeyValueUnarchiver;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSMutableArray;

import er.extensions.foundation.ERXValueUtilities;

public class ERDSortedManyToManyAssignment extends ERDAssignment {
  /**
   * 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;

    /** holds the array of dependent keys */
    public static final NSArray _DEPENDENT_KEYS=new NSArray(new String[] { "object.entityName", "propertyKey" });

    /** User info key that specifies if a given relationship is a sorted join */
    public static final String SortedJoinRelationshipUserInfoKey = "SortedJoinRelationship";
   
    /**
    * Static constructor required by the EOKeyValueUnarchiver
     * interface. If this isn't implemented then the default
     * behavior is to construct the first super class that does
     * implement this method. Very lame.
     * @param eokeyvalueunarchiver to be unarchived
     * @return decoded assignment of this class
     */
    // CHECKME: Pretty sure we only need one of these ever created.
    public static Object decodeWithKeyValueUnarchiver(EOKeyValueUnarchiver eokeyvalueunarchiver)  {
        return new ERDSortedManyToManyAssignment(eokeyvalueunarchiver);
    }

    /**
        * Public constructor
     * @param key context key
     * @param value of the assignment
     */
    public ERDSortedManyToManyAssignment (String key, Object value) { super(key,value); }

    /**
        * Public constructor
     * @param unarchiver key-value unarchiver used when unarchiving
     *    from rule files.
     */
    public ERDSortedManyToManyAssignment(EOKeyValueUnarchiver unarchiver) { super(unarchiver); }

    /**
        * Implementation of the {@link er.directtoweb.assignments.ERDComputingAssignmentInterface}. This
     * assignment depends upon the context keys: "propertyKey" and
     * "keyWhenRelationship". This array of keys is used when constructing the
     * significant keys for the passed in keyPath.
     * @param keyPath to compute significant keys for.
     * @return array of context keys this assignment depends upon.
     */
    public NSArray dependentKeys(String keyPath) { return null; }

    /**
        * Called when firing this assignment with the key-path:
     * <b>keyWhenRelationship</b>.
     * @return the current propertyKey + "." + the current value for
     *    keyWhenRelationship.
     */
    public Object keyWhenRelationship(D2WContext context) {
        EOEntity joinEntity=context.entity();
        NSArray relationships=joinRelationshipsForJoinEntity(joinEntity);
       
        EORelationship destinationRelationship=null;
        String originEntityName=(String)context.valueForKeyPath("object.entityName");
        for (Enumeration e=relationships.objectEnumerator(); e.hasMoreElements();) {
            EORelationship r=(EORelationship)e.nextElement();
            if (!originEntityName.equals(r.destinationEntity().name())) {
                destinationRelationship=r;
                break;
            }
        }
        return (destinationRelationship!=null ? (destinationRelationship.name()+".") : "") + "userPresentableDescription";
    }

    /**
     * Calculates the join relationships for a given join entity.
     * @param entity to find join relationships
     * @return array containing two join relationships
     */
    public static NSArray joinRelationshipsForJoinEntity(EOEntity entity) {
        NSArray joinRelationships = null;
        if (entity.relationships() == null || entity.relationships().count() < 2) {
            throw new RuntimeException("Join entity: " + entity + " does not have any relationships!");
        } else if (entity.relationships().count() == 2) {
            joinRelationships = entity.relationships();
        } else {
            NSMutableArray relationshipCache = new NSMutableArray();
            for (Enumeration e = entity.relationships().objectEnumerator(); e.hasMoreElements();) {
                EORelationship relationship = (EORelationship)e.nextElement();
                if (relationship.userInfo() != null
                    && ERXValueUtilities.booleanValue(relationship.userInfo().objectForKey(SortedJoinRelationshipUserInfoKey))) {
                    relationshipCache.addObject(relationship);
                }
            }
            if (relationshipCache.count() != 2)
                throw new RuntimeException("Did not find two relationships with user info entries: " +
                                           SortedJoinRelationshipUserInfoKey + " found: " + relationshipCache.valueForKey("name")
                                           + " for entity: " + entity.name());
            joinRelationships = relationshipCache;
        }
        return joinRelationships;
    }
}
   
TOP

Related Classes of er.directtoweb.assignments.ERDSortedManyToManyAssignment

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.