Client-Side EOGenericRecord Additions

Last modified by David Avendasora on 2009/03/26 09:40


public static EODistributedObjectStore _distributedObjectStore() {
       EOObjectStore objectStore = EOEditingContext.defaultParentObjectStore();
if ((objectStore == null) || (!(objectStore instanceof EODistributedObjectStore))) {
throw new IllegalStateException("Default parent object store needs to be an EODistributedObjectStore");
}
return (EODistributedObjectStore)objectStore;
}

These two methods courtesy Florijan Stamenkovic make it easier to call server-side methods without the client pushing the entire EC (and triggering validation) back to the server.


/**
 * Invokes {@link #invokeStatelessRemoteMethodWithKeyPath(String, String, Class[], Object[])} with "session" as the
 * key path argument.
 */

public static Object invokeStatelessOnSession(String methodName,
                                             Class[] argumentTypes,
                                             Object[] arguments) {

return invokeStatelessRemoteMethodWithKeyPath("session",
                                             methodName,
                                             argumentTypes,
                                             arguments);
}

/**
 * This method invokes a remote method on an object on the server side that can be specified with a key path (no
 * enterprise object) relative to the invocation target of the server side EODistributionContext (for example
 * "session"). The arguments and return values of remote methods invoked through this method cannot be enterprise
 * objects (but global IDs are okay). You can use this method, for example, to load resources from the server or to
 * perform checks in background threads (as long as no enterprise objects are involved).
 * <p>
 * The keyPath argument has special semantics: <ol type="a"}
 * <li>If keyPath is a fully qualified key path (for example, "session"), the key path is followed starting from the
 * invocation target of the EODistributionContext.
 * <li>If keyPath is an empty string, the method is invoked on the invocation target of the EODistributionContext
 * directly (typically a subclass of WOJavaClientComponent).
 * <li>If keyPath is null, the method is invoked on one of the remote method receivers of the server side
 * EODistributionContext. </ol>
 * <p>
 * If an actual key path is specified, the EODistributionContext on the server blocks all invocations sent with this
 * method unless methodName is prefixed with "clientSideRequest" or unless the EODistributionContext's delegate (on
 * the server) implements the right delegate methods to explicitly allow the invocation. "clientSideRequest" methods
 * can be invoked without special delegate methods on the server-side distribution context, on a remote method
 * receiver registered with the distribution context or on the session of the distribution context's invocation
 * target.
 *
 * @param keyPath
 *            the key path identifying the receiver of the method invocation
 * @param methodName
 *            the name of the method to be invoked
 * @param argumentTypes
 *            the types of the arguments of the method to be invoked
 * @param arguments
 *            the arguments of the method to be invoked
 * @return the return value of the remote method invocation
 */

public static Object invokeStatelessRemoteMethodWithKeyPath(String keyPath,
                                                           String methodName,
                                                           Class[] argumentTypes,
                                                           Object[] arguments) {
if (_distributedObjectStore() == null) {
throw new IllegalStateException("Distributed object store is null, can not perform RMI");
}

return _distributedObjectStore().invokeStatelessRemoteMethodWithKeyPath(keyPath,
                                                                       methodName,
                                                                       argumentTypes,
                                                                       arguments);
}

These methods allow you to easily leverage WebObject's Direct To Java Client functionality in any Java Client application to open listings and forms for Entities based on the user.d2wmodel file.


import com.webobjects.eogeneration.EOControllerFactory;
import com.webobjects.eogeneration.EOFormController;
import com.webobjects.eogeneration.EOListController;

public static void formWithEntityName(String entityName,
                               EOGlobalID globalID) {
EOControllerFactory f = EOControllerFactory.sharedControllerFactory();
EOController controller = f.controllerWithSpecification(new NSDictionary(new Object[] { entityName,
                                                                                       EOControllerFactory.FormTask,
                                                                                      EOControllerFactory.TopLevelWindowQuestion },
                                                                        new Object[] { EOControllerFactory.EntitySpecification,
                                                                                      EOControllerFactory.TaskSpecification,
                                                                                      EOControllerFactory.QuestionSpecification }),
                                                       true);
if (controller != null) {
EOFormController formController = (EOFormController) f.controllerWithEntityName(controller,
                                                                               EOControllerFactory.Open.class,
                                                                               entityName);
formController.openObjectWithGlobalID(globalID);
formController.setEditability(EOEditable.AlwaysEditable);
formController.makeVisible();
}
}

public EOGlobalID globalID() {
return editingContext().globalIDForObject(this);
}

public static void listWithEntityName(String entityName,
                               EOFetchSpecification fs) {
EOControllerFactory f = EOControllerFactory.sharedControllerFactory();
EOController controller = f.controllerWithSpecification(new NSDictionary(new Object[] { entityName,
                                                                                      EOControllerFactory.ListTask,
                                                                                      EOControllerFactory.TopLevelWindowQuestion },
                                                                        new Object[] { EOControllerFactory.EntitySpecification,
                                                                                      EOControllerFactory.TaskSpecification,
                                                                                      EOControllerFactory.QuestionSpecification }),
                                                       true);
if (controller != null) {
EOListController listController = (EOListController) f.controllerWithEntityName(controller,
                                                                               EOControllerFactory.List.class,
                                                                               entityName);
listController.listObjectsWithFetchSpecification(fs);
listController.setEditability(EOEditable.NeverEditable);
listController.makeVisible();
}
}

public static void listWithEntityName(String entityName,
                               NSArray arrayOfEOs) {
EOControllerFactory f = EOControllerFactory.sharedControllerFactory();
EOController controller = f.controllerWithSpecification(new NSDictionary(new Object[] { entityName,
                                                                                      EOControllerFactory.ListTask,
                                                                                      EOControllerFactory.TopLevelWindowQuestion },
                                                                        new Object[] { EOControllerFactory.EntitySpecification,
                                                                                      EOControllerFactory.TaskSpecification,
                                                                                      EOControllerFactory.QuestionSpecification }),
                                                       true);
if (controller != null) {
EOListController listController = (EOListController) f.controllerWithEntityName(controller,
                                                                               EOControllerFactory.List.class,
                                                                               entityName);
listController.listObjectsWithGlobalIDs((NSArray) arrayOfEOs.valueForKey("globalID"));
listController.setEditability(EOEditable.NeverEditable);
listController.makeVisible();
}
}