From: <an...@us...> - 2009-03-07 23:55:16
|
Revision: 9020 http://wonder.svn.sourceforge.net/wonder/?rev=9020&view=rev Author: anjo Date: 2009-03-07 23:55:05 +0000 (Sat, 07 Mar 2009) Log Message: ----------- d2rest working (mostly, kinda) Modified Paths: -------------- trunk/Wonder/Examples/Misc/RestExample/.classpath trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Application.java trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Session.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestEntityDelegate.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestResponseWriter.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDefaultRestDelegate.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDenyRestEntityDelegate.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestKey.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestHandler.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestDelegate.java trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestEntityDelegate.java trunk/Wonder/Frameworks/Misc/ERDirectToRest/.classpath trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERDirectToRest.java Added Paths: ----------- trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel.txt trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestSecurityDelegate.java trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel.txt trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDefaultEntityDelegate.java trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDelegate.java trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestAllowSecurityDelegate.java trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestDefaultSecurityDelegate.java trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestDenySecurityDelegate.java Removed Paths: ------------- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestAction.java Modified: trunk/Wonder/Examples/Misc/RestExample/.classpath =================================================================== --- trunk/Wonder/Examples/Misc/RestExample/.classpath 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Examples/Misc/RestExample/.classpath 2009-03-07 23:55:05 UTC (rev 9020) @@ -19,5 +19,6 @@ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="WOFramework/ERDirectToRest"/> <classpathentry kind="con" path="WOFramework/JavaMemoryAdaptor"/> + <classpathentry kind="con" path="WOFramework/ERRest"/> <classpathentry kind="output" path="bin"/> </classpath> Modified: trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel =================================================================== --- trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel 2009-03-07 23:55:05 UTC (rev 9020) @@ -1,13 +1,10 @@ { - rules = ( - { - class = com.webobjects.directtoweb.Rule; - author = 100; - rhs = { - class = com.webobjects.directtoweb.Assignment; - keyPath = look; - value = "NeutralLook"; - }; - } - ); -} + "rules" = ( + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "fetchLimit"; "value" = "20"; }; }, + {"author" = "10"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.BooleanAssignment"; "keyPath" = "restCanView"; "value" = "false"; }; }, + {"author" = "100"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "look"; "value" = "NeutralLook"; }; }, + {"author" = "100"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "entity.name"; "selectorName" = "isEqualTo"; "value" = "ServerPost"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "restEntityAliasName"; "value" = "Post"; }; }, + {"author" = "100"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "restEntityAlias"; "selectorName" = "isEqualTo"; "value" = "Topic"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "restEntityName"; "value" = "ServerTopic"; }; }, + {"author" = "100"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "entity.name"; "selectorName" = "isEqualTo"; "value" = "ServerTopic"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "restEntityAliasName"; "value" = "Topics"; }; } + ); +} \ No newline at end of file Added: trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel.txt =================================================================== --- trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel.txt (rev 0) +++ trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel.txt 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,8 @@ +( + 0 : *true* => fetchLimit = 20 [com.webobjects.directtoweb.Assignment], + 10 : *true* => restCanView = false [com.webobjects.directtoweb.BooleanAssignment], + 100 : *true* => look = NeutralLook [com.webobjects.directtoweb.Assignment], + 100 : entity.name = 'ServerPost' => restEntityAliasName = Post [com.webobjects.directtoweb.Assignment], + 100 : restEntityAlias = 'Topic' => restEntityName = ServerTopic [com.webobjects.directtoweb.Assignment], + 100 : entity.name = 'ServerTopic' => restEntityAliasName = Topics [com.webobjects.directtoweb.Assignment] +) \ No newline at end of file Property changes on: trunk/Wonder/Examples/Misc/RestExample/Resources/user.d2wmodel.txt ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Application.java =================================================================== --- trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Application.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Application.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -1,16 +1,20 @@ package er.restexample.server; // Generated by the WOLips Templateengine Plug-in at 04.03.2009 23:02:26 -import com.webobjects.eoaccess.EOUtilities; import com.webobjects.eocontrol.EOEditingContext; -import com.webobjects.eocontrol.EOEnterpriseObject; -import com.webobjects.eocontrol.EOGenericRecord; -import com.webobjects.eocontrol.EORelationshipManipulation; import com.webobjects.foundation.NSLog; import com.webobjects.foundation.NSMutableArray; +import er.directtorest.ERD2RestDelegate; import er.extensions.appserver.ERXApplication; import er.extensions.eof.ERXEC; +import er.rest.ERXDefaultRestDelegate; +import er.rest.ERXJSONRestResponseWriter; +import er.rest.ERXRestContext; +import er.rest.ERXRestRequestHandler; +import er.rest.ERXXmlRestRequestParser; +import er.rest.ERXXmlRestResponseWriter; +import er.rest.IERXRestAuthenticationDelegate; public class Application extends ERXApplication { public static void main(String argv[]) { @@ -72,5 +76,18 @@ EOEditingContext ec = ERXEC.newEditingContext(); new DataCreator().run(ec); ec.saveChanges(); + + ERXDefaultRestDelegate restDelegate = new ERD2RestDelegate(); + + IERXRestAuthenticationDelegate authenticationDelegate = new IERXRestAuthenticationDelegate() { + + public boolean authenticate(ERXRestContext context) { + return context.context().hasSession() && ((Session)context.context().session()).isLoggedIn() || true; + } + + }; + //registerRequestHandler(new ERXRestRequestHandler(authenticationDelegate, restDelegate, new ERXJSONRestResponseWriter(), new ERXXmlRestRequestParser()), "json"); + registerRequestHandler(new ERXRestRequestHandler(authenticationDelegate, restDelegate, new ERXXmlRestResponseWriter(), new ERXXmlRestRequestParser()), "rest"); + } } \ No newline at end of file Modified: trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Session.java =================================================================== --- trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Session.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Examples/Misc/RestExample/Sources/er/restexample/server/Session.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -4,6 +4,12 @@ import er.extensions.appserver.ERXSession; public class Session extends ERXSession { + public Session() { + } + + public boolean isLoggedIn() { + return true; + } } \ No newline at end of file Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestEntityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestEntityDelegate.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestEntityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -22,7 +22,9 @@ import er.extensions.eof.ERXEOGlobalIDUtilities; import er.extensions.eof.ERXFetchSpecification; import er.extensions.eof.ERXGuardedObjectInterface; +import er.extensions.eof.ERXKey; import er.extensions.eof.ERXQ; +import er.extensions.foundation.ERXProperties; import er.extensions.foundation.ERXStringUtilities; /** @@ -609,7 +611,7 @@ } public void updateArrayFromDocument(EOEntity parentEntity, EOEnterpriseObject parentObject, String attributeName, EOEntity entity, NSArray currentObjects, NSArray toManyNodes, ERXRestContext context) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { - IERXRestEntityDelegate parentEntityDelegate = context.delegate().entityDelegate(entity); + IERXRestSecurityDelegate parentEntityDelegate = context.delegate().entityDelegate(entity); if (parentObject != null && !parentEntityDelegate.canUpdateObject(parentEntity, parentObject, context)) { throw new ERXRestSecurityException("You are not allowed to update this " + entity.name() + " object."); } @@ -679,6 +681,84 @@ updated(entity, parentObject, context); } + + public static String cascadingValue(ERXRestKey result, String propertyPrefix, String propertySuffix, String defaultValue) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + // System.out.println("ERXAbstractRestResponseWriter.cascadingValue: Checking " + result); + ERXRestKey cascadingKey = result.firstKey(); + String propertyValue = _cascadingValue(cascadingKey, propertyPrefix, propertySuffix); + if (propertyValue == null) { + propertyValue = defaultValue; + } + // System.out.println("ERXAbstractRestResponseWriter.cascadingValue: == " + propertyValue); + return propertyValue; + } + + public static String _cascadingValue(ERXRestKey cascadingKey, String propertyPrefix, String propertySuffix) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + String propertyValue = null; + EOEntity entity = cascadingKey.entity(); + while (entity != null && propertyValue == null) { + ERXRestKey entityCascadingKey = cascadingKey.cloneKeyWithNewEntity(entity, true, true); + // System.out.println("ERXAbstractRestResponseWriter._cascadingValue: keys " + cascadingKey + "vs" + + // entityCascadingKey); + String keypathWithoutGIDs = entityCascadingKey.path(true); + String propertyName = propertyPrefix + keypathWithoutGIDs.replace('/', '.') + propertySuffix; + propertyValue = ERXProperties.stringForKey(propertyName); + // System.out.println("ERXAbstractRestResponseWriter._cascadingValue: checking " + entity + " + entity + " + // + propertyName + "=>" + propertyValue); + if (propertyValue == null) { + entity = entity.parentEntity(); + } + } + if (propertyValue == null && cascadingKey.nextKey() != null) { + propertyValue = _cascadingValue(cascadingKey.nextKey(), propertyPrefix, propertySuffix); + } + return propertyValue; + } + + public static boolean _displayDetailsFromProperties(ERXRestKey result) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + boolean displayDetails; + String displayDetailsStr = cascadingValue(result, IERXRestResponseWriter.REST_PREFIX, IERXRestResponseWriter.DETAILS_PREFIX, null); + if (displayDetailsStr == null) { + displayDetails = result.previousKey() == null && (result.key() == null || result.isKeyGID()); + } + else { + displayDetails = Boolean.valueOf(displayDetailsStr).booleanValue(); + } + return displayDetails; + } + + public static String[] _displayPropertiesFromProperties(ERXRestKey result, boolean displayAllProperties, boolean displayAllToMany) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + String[] displayPropertyNames; + String displayPropertyNamesStr = cascadingValue(result, IERXRestResponseWriter.REST_PREFIX, IERXRestResponseWriter.DETAILS_PROPERTIES_PREFIX, null); + if (displayPropertyNamesStr == null) { + if (displayAllProperties) { + NSArray allPropertyNames = ERXUnsafeRestEntityDelegate.allPropertyNames(result.nextEntity(), displayAllToMany); + displayPropertyNames = new String[allPropertyNames.count()]; + for (int propertyNum = 0; propertyNum < displayPropertyNames.length; propertyNum++) { + displayPropertyNames[propertyNum] = (String) allPropertyNames.objectAtIndex(propertyNum); + } + } + else { + displayPropertyNames = null; + } + } + else { + displayPropertyNames = displayPropertyNamesStr.split(","); + } + return displayPropertyNames; + } + + public String[] displayProperties(ERXRestKey key, boolean allProperties, boolean allToMany) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + String[] displayProperties = _displayPropertiesFromProperties(key, allProperties, allToMany); + return displayProperties; + } + + + public boolean displayDetails(ERXRestKey key) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + return _displayDetailsFromProperties(key); + } + + /** * Called after performing the user's requested updates. This provides support for subclasses to extend and perform * "automatic" updates. For instance, if you wanted to set a last modified date, or a modified-by-user field, you Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestResponseWriter.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestResponseWriter.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXAbstractRestResponseWriter.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -174,7 +174,9 @@ protected boolean displayDetails(ERXRestContext context, ERXRestKey key) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { boolean displayDetails; if (_filter == null) { - displayDetails = _displayDetailsFromProperties(key) || ERXProperties.booleanForKey(IERXRestResponseWriter.REST_PREFIX + "details"); + String entityName = key.entity().name(); + EOEntity entity = ERXRestUtils.getEntityNamed(context, entityName); + displayDetails = context.delegate().entityDelegate(entity).displayDetails(key); } else { ERXKeyFilter filter = _filter; @@ -206,7 +208,9 @@ protected String[] displayProperties(ERXRestContext context, ERXRestKey key) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { String[] displayProperties; if (_filter == null) { - displayProperties = _displayPropertiesFromProperties(key, _displayAllProperties, _displayAllToMany); + String entityName = key.entity().name(); + EOEntity entity = ERXRestUtils.getEntityNamed(context, entityName); + displayProperties = context.delegate().entityDelegate(entity).displayProperties(key, _displayAllProperties, _displayAllToMany); } else { ERXKeyFilter filter = _filter; @@ -355,72 +359,6 @@ } } - public static String cascadingValue(ERXRestKey result, String propertyPrefix, String propertySuffix, String defaultValue) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { - // System.out.println("ERXAbstractRestResponseWriter.cascadingValue: Checking " + result); - ERXRestKey cascadingKey = result.firstKey(); - String propertyValue = _cascadingValue(cascadingKey, propertyPrefix, propertySuffix); - if (propertyValue == null) { - propertyValue = defaultValue; - } - // System.out.println("ERXAbstractRestResponseWriter.cascadingValue: == " + propertyValue); - return propertyValue; - } - - public static String _cascadingValue(ERXRestKey cascadingKey, String propertyPrefix, String propertySuffix) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { - String propertyValue = null; - EOEntity entity = cascadingKey.entity(); - while (entity != null && propertyValue == null) { - ERXRestKey entityCascadingKey = cascadingKey.cloneKeyWithNewEntity(entity, true, true); - // System.out.println("ERXAbstractRestResponseWriter._cascadingValue: keys " + cascadingKey + "vs" + - // entityCascadingKey); - String keypathWithoutGIDs = entityCascadingKey.path(true); - String propertyName = propertyPrefix + keypathWithoutGIDs.replace('/', '.') + propertySuffix; - propertyValue = ERXProperties.stringForKey(propertyName); - // System.out.println("ERXAbstractRestResponseWriter._cascadingValue: checking " + entity + " + entity + " - // + propertyName + "=>" + propertyValue); - if (propertyValue == null) { - entity = entity.parentEntity(); - } - } - if (propertyValue == null && cascadingKey.nextKey() != null) { - propertyValue = _cascadingValue(cascadingKey.nextKey(), propertyPrefix, propertySuffix); - } - return propertyValue; - } - - public static boolean _displayDetailsFromProperties(ERXRestKey result) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { - boolean displayDetails; - String displayDetailsStr = cascadingValue(result, IERXRestResponseWriter.REST_PREFIX, IERXRestResponseWriter.DETAILS_PREFIX, null); - if (displayDetailsStr == null) { - displayDetails = result.previousKey() == null && (result.key() == null || result.isKeyGID()); - } - else { - displayDetails = Boolean.valueOf(displayDetailsStr).booleanValue(); - } - return displayDetails; - } - - public static String[] _displayPropertiesFromProperties(ERXRestKey result, boolean displayAllProperties, boolean displayAllToMany) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { - String[] displayPropertyNames; - String displayPropertyNamesStr = cascadingValue(result, IERXRestResponseWriter.REST_PREFIX, IERXRestResponseWriter.DETAILS_PROPERTIES_PREFIX, null); - if (displayPropertyNamesStr == null) { - if (displayAllProperties) { - NSArray allPropertyNames = ERXUnsafeRestEntityDelegate.allPropertyNames(result.nextEntity(), displayAllToMany); - displayPropertyNames = new String[allPropertyNames.count()]; - for (int propertyNum = 0; propertyNum < displayPropertyNames.length; propertyNum++) { - displayPropertyNames[propertyNum] = (String) allPropertyNames.objectAtIndex(propertyNum); - } - } - else { - displayPropertyNames = null; - } - } - else { - displayPropertyNames = displayPropertyNamesStr.split(","); - } - return displayPropertyNames; - } - /** * Writes the given array of objects to the response. Permissions have already been checked by the time this method * is called. Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDefaultRestDelegate.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDefaultRestDelegate.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDefaultRestDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -104,6 +104,10 @@ return restResult; } + public ERXRestKey view(ERXRestRequest restRequest, ERXRestContext restContext) { + return restRequest.key(); + } + public ERXRestKey insert(ERXRestRequest insertRequest, ERXRestContext context) throws ERXRestException, ERXRestSecurityException, ERXRestNotFoundException { ERXRestKey insertResult; Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDenyRestEntityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDenyRestEntityDelegate.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXDenyRestEntityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -143,4 +143,12 @@ public EOEntity nextEntity(EOEntity entity, String key) { return null; } + + public boolean displayDetails(ERXRestKey key) { + return false; + } + + public String[] displayProperties(ERXRestKey key, boolean allProperties, boolean allToMany) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + return new String[0]; + } } \ No newline at end of file Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestKey.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestKey.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestKey.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -348,7 +348,7 @@ * @throws ERXRestException * if a general error occurs */ - protected EOEntity nextEntity() throws ERXRestException { + public EOEntity nextEntity() throws ERXRestException { EOEntity nextEntity = _nextEntity; if (_nextEntity == null) { if (_value instanceof EOEnterpriseObject) { Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestHandler.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestHandler.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestHandler.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -441,8 +441,10 @@ ERXRestRequest restRequest = requestParser.parseRestRequest(restContext, request, path); String method = request.method(); if ("GET".equalsIgnoreCase(method)) { + ERXRestKey responseKey = _delegate.view(restRequest, restContext); + IERXRestResponseWriter restResponseWriter = responseWriterForType(type); - restResponseWriter.appendToResponse(restContext, new ERXWOResponseResponseWriter(response), restRequest.key()); + restResponseWriter.appendToResponse(restContext, new ERXWOResponseResponseWriter(response), responseKey); editingContext.saveChanges(); } else if ("DELETE".equalsIgnoreCase(method)) { Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestDelegate.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestDelegate.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -8,7 +8,20 @@ * @author mschrag */ public interface IERXRestDelegate { + /** + * Views the object defined by the incoming url. + * + * @param restRequest the incoming viewing request. + * @param context the rest context + * @return the actual result as an ERXRestResult + * @throws ERXRestException if there is a general failure + * @throws ERXRestSecurityException if the user attempts to insert or updates objects that he/she is not permitted to + * @throws ERXRestNotFoundException if one of the requested objects does not exist + */ + public ERXRestKey view(ERXRestRequest restRequest, ERXRestContext restContext); + + /** * Inserts or updates the objects defined by the XML document. * * @param restRequest the incoming inserts or updates @@ -72,5 +85,4 @@ * @return the per-entity rest delegate */ public IERXRestEntityDelegate entityDelegate(EOEntity entity); - } Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestEntityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestEntityDelegate.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestEntityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -18,7 +18,7 @@ * * @author mschrag */ -public interface IERXRestEntityDelegate { +public interface IERXRestEntityDelegate extends IERXRestSecurityDelegate { /** * Called by the rest delegate for each entity that gets requested. This is called every time, so your entity * delegate should manage only executing one time if necessary. @@ -324,128 +324,6 @@ public void preprocess(EOEntity entity, NSArray objects, ERXRestContext context) throws ERXRestException; /** - * Returns whether or not the caller is allowed to insert a new object of the given entity. This variant is called - * if the caller tries to insert an object without traversing a keypath -- that is, a top level insert. You can - * return false from this without implying that canInsertObject(..., parentObject, parentKey ..) returns false -- - * the two are mutually exclusive. - * - * @param entity - * the entity of the object to insert - * @param context - * the rest context - * @return whether or not a new object can be inserted - */ - public boolean canInsertObject(EOEntity entity, ERXRestContext context); - - /** - * Returns whether or not a new object can be inserted into the specified relationship of an existing object. - * - * @param parentEntity - * the entity of the parent - * @param parentObject - * the parent - * @param parentKey - * the name of the relationship on the parent - * @param entity - * the entity of the object to insert - * @param context - * the rest context - * @return whether or not a new object can be inserted - */ - public boolean canInsertObject(EOEntity parentEntity, Object parentObject, String parentKey, EOEntity entity, ERXRestContext context); - - /** - * Returns whether or not the given property can be set during an insert. This is only called if canInsertObject has - * returned true. - * - * @param entity - * the entity of the object - * @param eo - * the object - * @param propertyName - * the property name to check - * @param context - * the rest context - * @return whether or not the given property can be set during an insert - */ - public boolean canInsertProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context); - - /** - * Returns whether or not the given object can be updated. This is called prior to calling canUpdateProperty on any - * properties and acts as a first line of defenese to completely cut-off access to an object for update - * - * @param entity - * the entity of the object - * @param eo - * the object to check - * @param context - * the rest context - * @return whether or not the given object can be updated - */ - public boolean canUpdateObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context); - - /** - * Returns whether or not the given property can be set during an update. This is only called if canUpdateObject has - * returned true. - * - * @param entity - * the entity of the object - * @param eo - * the object - * @param propertyName - * the property name to check - * @param context - * the rest context - * @return whether or not the given property can be set during an update - */ - public boolean canUpdateProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context); - - /** - * Returns whether or not the given object can be deleted. This is called prior to calling canDeleteProperty on any - * properties and acts as a first line of defenese to completely cut-off access to an object for delete. Note that - * the actual meaning of "delete" can be defined in your delete method, so returning true for this does not - * *necessarily* mean the object will be deleted. Instead it just means you will allow access to the delete method. - * - * @param entity - * the entity of the object - * @param eo - * the object to check - * @param context - * the rest context - * @return whether or not the given object can be deleted - */ - public boolean canDeleteObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context); - - /** - * Returns whether or not the given object can be seen. This is called prior to calling canViewProperty on any - * properties and acts as a first line of defenese to completely cut-off access to an object. - * - * @param entity - * the entity of the object - * @param eo - * the object to check - * @param context - * the rest context - * @return whether or not the given object can be seen - */ - public boolean canViewObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context); - - /** - * Returns whether or not the given property can be seen. This is only called if canViewObject has returned true. - * - * @param entity - * the entity of the object - * @param obj - * the object - * @param propertyName - * the property name to check - * @param context - * the rest context - * @return whether or not the given property can be seen - */ - public boolean canViewProperty(EOEntity entity, Object obj, String propertyName, ERXRestContext context); - - /** * Given an array, this method filters the array based on the callers permission level. This method should never * return null. To cut off access to the array entirely, return NSArray.EmptyArray. This method is only called after * having verified access to the specified key on the parent object. @@ -511,4 +389,10 @@ * @return the primary key */ public Object idForEO(EOEntity entity, EOEnterpriseObject eo); + + + public String[] displayProperties(ERXRestKey key, boolean allProperties, boolean allToMany) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException; + + public boolean displayDetails(ERXRestKey key) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException; + } Added: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestSecurityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestSecurityDelegate.java (rev 0) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/IERXRestSecurityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,134 @@ +package er.rest; + +import com.webobjects.eoaccess.EOEntity; +import com.webobjects.eocontrol.EOEnterpriseObject; + +/** + * Handles allowed actions. + * + */ +public interface IERXRestSecurityDelegate { + + /** + * Returns whether or not the caller is allowed to insert a new object of the given entity. This variant is called + * if the caller tries to insert an object without traversing a keypath -- that is, a top level insert. You can + * return false from this without implying that canInsertObject(..., parentObject, parentKey ..) returns false -- + * the two are mutually exclusive. + * + * @param entity + * the entity of the object to insert + * @param context + * the rest context + * @return whether or not a new object can be inserted + */ + public abstract boolean canInsertObject(EOEntity entity, ERXRestContext context); + + /** + * Returns whether or not a new object can be inserted into the specified relationship of an existing object. + * + * @param parentEntity + * the entity of the parent + * @param parentObject + * the parent + * @param parentKey + * the name of the relationship on the parent + * @param entity + * the entity of the object to insert + * @param context + * the rest context + * @return whether or not a new object can be inserted + */ + public abstract boolean canInsertObject(EOEntity parentEntity, Object parentObject, String parentKey, EOEntity entity, ERXRestContext context); + + /** + * Returns whether or not the given property can be set during an insert. This is only called if canInsertObject has + * returned true. + * + * @param entity + * the entity of the object + * @param eo + * the object + * @param propertyName + * the property name to check + * @param context + * the rest context + * @return whether or not the given property can be set during an insert + */ + public abstract boolean canInsertProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context); + + /** + * Returns whether or not the given object can be updated. This is called prior to calling canUpdateProperty on any + * properties and acts as a first line of defenese to completely cut-off access to an object for update + * + * @param entity + * the entity of the object + * @param eo + * the object to check + * @param context + * the rest context + * @return whether or not the given object can be updated + */ + public abstract boolean canUpdateObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context); + + /** + * Returns whether or not the given property can be set during an update. This is only called if canUpdateObject has + * returned true. + * + * @param entity + * the entity of the object + * @param eo + * the object + * @param propertyName + * the property name to check + * @param context + * the rest context + * @return whether or not the given property can be set during an update + */ + public abstract boolean canUpdateProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context); + + /** + * Returns whether or not the given object can be deleted. This is called prior to calling canDeleteProperty on any + * properties and acts as a first line of defenese to completely cut-off access to an object for delete. Note that + * the actual meaning of "delete" can be defined in your delete method, so returning true for this does not + * *necessarily* mean the object will be deleted. Instead it just means you will allow access to the delete method. + * + * @param entity + * the entity of the object + * @param eo + * the object to check + * @param context + * the rest context + * @return whether or not the given object can be deleted + */ + public abstract boolean canDeleteObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context); + + /** + * Returns whether or not the given object can be seen. This is called prior to calling canViewProperty on any + * properties and acts as a first line of defenese to completely cut-off access to an object. + * + * @param entity + * the entity of the object + * @param eo + * the object to check + * @param context + * the rest context + * @return whether or not the given object can be seen + */ + public abstract boolean canViewObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context); + + /** + * Returns whether or not the given property can be seen. This is only called if canViewObject has returned true. + * + * @param entity + * the entity of the object + * @param obj + * the object + * @param propertyName + * the property name to check + * @param context + * the rest context + * @return whether or not the given property can be seen + */ + public abstract boolean canViewProperty(EOEntity entity, Object obj, String propertyName, ERXRestContext context); + +} \ No newline at end of file Modified: trunk/Wonder/Frameworks/Misc/ERDirectToRest/.classpath =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/.classpath 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/.classpath 2009-03-07 23:55:05 UTC (rev 9020) @@ -14,5 +14,6 @@ <classpathentry kind="con" path="WOFramework/JavaXML"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="WOFramework/ERDirectToWeb"/> + <classpathentry kind="con" path="WOFramework/ERRest"/> <classpathentry kind="output" path="bin"/> </classpath> Added: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel (rev 0) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,17 @@ +{ + "rules" = ( + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "fetchLimit"; "value" = "20"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.BooleanAssignment"; "keyPath" = "restCanView"; "value" = "false"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.BooleanAssignment"; "keyPath" = "restCanDelete"; "value" = "false"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.BooleanAssignment"; "keyPath" = "restCanInsert"; "value" = "false"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "com.webobjects.directtoweb.BooleanAssignment"; "keyPath" = "restCanUpdate"; "value" = "false"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "pageConfiguration"; "selectorName" = "isLike"; "value" = "RestView*"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "task"; "value" = "view"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "pageConfiguration"; "selectorName" = "isLike"; "value" = "RestDelete*"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "task"; "value" = "delete"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "pageConfiguration"; "selectorName" = "isLike"; "value" = "RestInsert*"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "task"; "value" = "insert"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "pageConfiguration"; "selectorName" = "isLike"; "value" = "RestUpdate*"; }; "rhs" = {"class" = "com.webobjects.directtoweb.Assignment"; "keyPath" = "task"; "value" = "update"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "er.directtoweb.assignments.ERDKeyValueAssignment"; "keyPath" = "restPropertyKeys"; "value" = "displayPropertyKeys"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "er.directtoweb.assignments.delayed.ERDDelayedKeyValueAssignment"; "keyPath" = "restEntityAliasName"; "value" = "entity.name"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "lhs" = {"class" = "com.webobjects.eocontrol.EOKeyValueQualifier"; "key" = "task"; "selectorName" = "isEqualTo"; "value" = "view"; }; "rhs" = {"class" = "com.webobjects.directtoweb.DefaultAssignment"; "keyPath" = "displayPropertyKeys"; "value" = "defaultPropertyKeysFromEntityWithoutRelationships"; }; }, + {"author" = "0"; "class" = "com.webobjects.directtoweb.Rule"; "rhs" = {"class" = "er.directtoweb.assignments.delayed.ERDDelayedObjectCreationAssignment"; "keyPath" = "restEntityDelegate"; "value" = {"className" = "er.directtorest.ERD2RestDefaultEntityDelegate"; }; }; } + ); +} \ No newline at end of file Added: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel.txt =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel.txt (rev 0) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel.txt 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,16 @@ +( + 0 : *true* => fetchLimit = 20 [com.webobjects.directtoweb.Assignment], + 0 : *true* => restCanView = false [com.webobjects.directtoweb.BooleanAssignment], + 0 : *true* => restCanDelete = false [com.webobjects.directtoweb.BooleanAssignment], + 0 : *true* => restCanInsert = false [com.webobjects.directtoweb.BooleanAssignment], + 0 : *true* => restCanUpdate = false [com.webobjects.directtoweb.BooleanAssignment], + 0 : pageConfiguration like 'RestView*' => task = view [com.webobjects.directtoweb.Assignment], + 0 : pageConfiguration like 'RestDelete*' => task = delete [com.webobjects.directtoweb.Assignment], + 0 : pageConfiguration like 'RestInsert*' => task = insert [com.webobjects.directtoweb.Assignment], + 0 : pageConfiguration like 'RestUpdate*' => task = update [com.webobjects.directtoweb.Assignment], + 0 : *true* => restPropertyKeys = displayPropertyKeys [er.directtoweb.assignments.ERDKeyValueAssignment], + 0 : *true* => restEntityAliasName = entity.name [er.directtoweb.assignments.delayed.ERDDelayedKeyValueAssignment], + 0 : task = 'view' => displayPropertyKeys = defaultPropertyKeysFromEntityWithoutRelationships [com.webobjects.directtoweb.DefaultAssignment], + 0 : *true* => restEntityDelegate = {"className" = "er.directtorest.ERD2RestDefaultEntityDelegate"; +} [er.directtoweb.assignments.delayed.ERDDelayedObjectCreationAssignment] +) \ No newline at end of file Property changes on: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Resources/d2w.d2wmodel.txt ___________________________________________________________________ Added: svn:eol-style + native Deleted: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestAction.java =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestAction.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestAction.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -1,17 +0,0 @@ -package er.directtorest; - -import com.webobjects.appserver.WORequest; - -import er.directtoweb.ERD2WDirectAction; - -public class ERD2RestAction extends ERD2WDirectAction { - - public ERD2RestAction(WORequest r) { - super(r); - } - - @Override - protected boolean allowPageConfiguration(String pageConfiguration) { - return true; - } -} Added: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDefaultEntityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDefaultEntityDelegate.java (rev 0) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDefaultEntityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,146 @@ +package er.directtorest; + +import com.webobjects.directtoweb.D2WContext; +import com.webobjects.eoaccess.EOEntity; +import com.webobjects.eocontrol.EOEnterpriseObject; +import com.webobjects.eocontrol.EOFetchSpecification; +import com.webobjects.foundation.NSArray; + +import er.directtorest.security.ERD2RestAllowSecurityDelegate; +import er.directtorest.security.ERD2RestDenySecurityDelegate; +import er.extensions.eof.ERXEOAccessUtilities; +import er.extensions.eof.ERXFetchSpecification; +import er.extensions.foundation.ERXValueUtilities; +import er.rest.ERXAbstractRestEntityDelegate; +import er.rest.ERXRestContext; +import er.rest.ERXRestException; +import er.rest.ERXRestKey; +import er.rest.ERXRestNotFoundException; +import er.rest.ERXRestSecurityException; +import er.rest.IERXRestSecurityDelegate; + +public class ERD2RestDefaultEntityDelegate extends ERXAbstractRestEntityDelegate { + + private IERXRestSecurityDelegate _securityHandler = new ERD2RestAllowSecurityDelegate(); + + @Override + public void inserted(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) throws ERXRestException, ERXRestSecurityException { + // nothing + } + + @Override + public void updated(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) throws ERXRestException, ERXRestSecurityException { + // nothing + } + + public String[] displayProperties(ERXRestKey key, boolean allProperties, boolean allToMany) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + NSArray<String> props = (NSArray<String>) d2wContext().valueForKey("displayPropertyKeys"); + if(props != null) { + return props.toArray(new String[0]); + } + return super.displayProperties(key, allProperties, allToMany); + } + + + public boolean displayDetails(ERXRestKey key) throws ERXRestException, ERXRestNotFoundException, ERXRestSecurityException { + return true; + } + + + /** + * Returns entityName; + * + * @return entityName + */ + public String entityAliasForEntityNamed(String entityName) { + d2wContext().setEntity(ERXEOAccessUtilities.entityNamed(null, entityName)); + String result = (String) d2wContext().valueForKey("restEntityAliasName"); + if(result == null) { + result = entityName; + } + return result; + } + + /** + * Returns propertyAlias. + * + * @return propertyAlias + */ + public String propertyNameForPropertyAlias(EOEntity entity, String propertyAlias) { + if(entity.classPropertyNames().containsObject(propertyAlias)) { + return propertyAlias; + } + return propertyAlias; + } + + /** + * Returns propertyName. + * + * @return propertyName + */ + public String propertyAliasForPropertyNamed(EOEntity entity, String propertyName) { + return propertyName; + } + + + public EOEntity nextEntity(EOEntity entity, String key) { + return null; + } + + protected int intValue(String key, int defaultValue) { + return ERXValueUtilities.intValueWithDefault(d2wContext().valueForKeyPath(key), defaultValue); + } + + private D2WContext d2wContext() { + return ERDirectToRest.d2wContext(); + } + + public NSArray objectsForEntity(EOEntity entity, ERXRestContext context) throws ERXRestException, ERXRestSecurityException { + EOFetchSpecification fs = new ERXFetchSpecification<EOEnterpriseObject>(entity.name(), null, null); + fs.setFetchLimit(intValue("fetchLimit", 0)); + NSArray objects = context.editingContext().objectsWithFetchSpecification(fs); + return objects; + } + + public NSArray visibleObjects(EOEntity parentEntity, Object parentObject, String parentKey, EOEntity entity, NSArray objects, ERXRestContext context) throws ERXRestException, + ERXRestSecurityException, ERXRestNotFoundException { + return objects; + } + + public IERXRestSecurityDelegate securityHandler() { + return _securityHandler; + } + + public boolean canDeleteObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) { + return securityHandler().canDeleteObject(entity, eo, context); + } + + public final boolean canInsertObject(EOEntity entity, ERXRestContext context) { + return securityHandler().canInsertObject(entity, context); + } + + public final boolean canInsertObject(EOEntity parentEntity, Object parentObject, String parentKey, EOEntity entity, ERXRestContext context) { + return securityHandler().canInsertObject(parentEntity, parentObject, parentKey, entity, context); + } + + public final boolean canInsertProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context) { + return securityHandler().canInsertProperty(entity, eo, propertyName, context); + } + + public final boolean canUpdateObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) { + return securityHandler().canUpdateObject(entity, eo, context); + } + + public final boolean canUpdateProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context) { + return securityHandler().canUpdateProperty(entity, eo, propertyName, context); + } + + public boolean canViewObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) { + return securityHandler().canViewObject(entity, eo, context); + } + + public boolean canViewProperty(EOEntity entity, Object obj, String propertyName, ERXRestContext context) { + return securityHandler().canViewProperty(entity, obj, propertyName, context); + } + +} Added: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDelegate.java =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDelegate.java (rev 0) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERD2RestDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,111 @@ +package er.directtorest; + +import com.webobjects.directtoweb.D2WContext; +import com.webobjects.directtoweb.ERD2WContext; +import com.webobjects.eoaccess.EOEntity; +import com.webobjects.foundation.NSMutableDictionary; + +import er.extensions.foundation.ERXMutableDictionary; +import er.extensions.foundation.ERXThreadStorage; +import er.rest.ERXDefaultRestDelegate; +import er.rest.ERXDenyRestEntityDelegate; +import er.rest.ERXRestContext; +import er.rest.ERXRestException; +import er.rest.ERXRestKey; +import er.rest.ERXRestNotFoundException; +import er.rest.ERXRestRequest; +import er.rest.ERXRestSecurityException; +import er.rest.IERXRestEntityDelegate; + +public class ERD2RestDelegate extends ERXDefaultRestDelegate { + + private IERXRestEntityDelegate _defaultDelegate; + + /** + * Constructs an ERXDefaultRestDelegate with an ERXDenyRestEntityDelegate as the default entity delegate. + */ + public ERD2RestDelegate() { + super(new ERXDenyRestEntityDelegate(), true); + _defaultDelegate = new ERXDenyRestEntityDelegate(); + } + + public String entityNameForAlias(String entityAlias) { + d2wContext().takeValueForKey(entityAlias, "restEntityAlias"); + String entityName = (String) d2wContext().valueForKeyPath("restEntityName"); + if (entityName == null) { + entityName = entityAlias; + } + return entityName; + } + + @SuppressWarnings("unchecked") + public IERXRestEntityDelegate entityDelegate(EOEntity entity) { + String entityName = entity.name(); + IERXRestEntityDelegate entityDelegate = (IERXRestEntityDelegate) ERXThreadStorage.valueForKey("restEntityDelegate." + entityName); + if (entityDelegate == null) { + entityDelegate = (IERXRestEntityDelegate) d2wContext().valueForKey("restEntityDelegate"); + if (entityDelegate == null) { + entityDelegate = _defaultDelegate; + } + ERXThreadStorage.takeValueForKey(entityDelegate, "restEntityDelegate." + entityName); + } + d2wContext().setEntity(entity); + entityDelegate.initializeEntityNamed(entityName); + return entityDelegate; + } + + /** + * Call this method to register an entity-specific delegate for a particular entity name. + * + * @param entityDelegate + * the entity delegate + * @param entityName + * the entity name to associate the delegate with + */ + public void addDelegateForEntityNamed(IERXRestEntityDelegate entityDelegate, String entityName) { + throw new IllegalStateException("Can't addDelegateForEntityNamed, is handled by d2wContext."); + } + + /** + * Removes the delegate for the given entity name. + * + * @param entityName + * the name of the entity + */ + public void removeDelegateForEntityNamed(String entityName) { + throw new IllegalStateException("Can't removeDelegateForEntityNamed, is handled by d2wContext."); + } + + + protected void updateDynamicPage(String task, ERXRestRequest restRequest, ERXRestContext restContext) { + d2wContext().setDynamicPage("Rest" + task + restRequest.key().entity().name()); + } + + private D2WContext d2wContext() { + return ERDirectToRest.d2wContext(); + } + + @Override + public ERXRestKey view(ERXRestRequest restRequest, ERXRestContext restContext) { + updateDynamicPage("View", restRequest, restContext); + return super.view(restRequest, restContext); + } + + @Override + public ERXRestKey insert(ERXRestRequest restRequest, ERXRestContext restContext) { + updateDynamicPage("Insert", restRequest, restContext); + return super.view(restRequest, restContext); + } + + @Override + public void update(ERXRestRequest restRequest, ERXRestContext restContext) throws ERXRestException, ERXRestSecurityException, ERXRestNotFoundException { + updateDynamicPage("Update", restRequest, restContext); + super.update(restRequest, restContext); + } + + @Override + public void delete(ERXRestRequest restRequest, ERXRestContext restContext) throws ERXRestException, ERXRestSecurityException, ERXRestNotFoundException { + updateDynamicPage("Delete", restRequest, restContext); + super.delete(restRequest, restContext); + } +} Modified: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERDirectToRest.java =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERDirectToRest.java 2009-03-05 19:05:28 UTC (rev 9019) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/ERDirectToRest.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -3,11 +3,14 @@ import com.webobjects.appserver.WOApplication; import com.webobjects.appserver.WORequest; import com.webobjects.appserver._private.WODirectActionRequestHandler; +import com.webobjects.directtoweb.D2WContext; +import com.webobjects.directtoweb.ERD2WContext; import com.webobjects.foundation.NSArray; import er.directtoweb.ERDirectToWeb; import er.extensions.ERXExtensions; import er.extensions.ERXFrameworkPrincipal; +import er.extensions.foundation.ERXThreadStorage; public class ERDirectToRest extends ERXFrameworkPrincipal { @@ -17,16 +20,21 @@ setUpFrameworkPrincipalClass(ERDirectToRest.class); } + /** + * @return the threads d2w context + */ + public static D2WContext d2wContext() { + D2WContext result = (D2WContext) ERXThreadStorage.valueForKey("ERD2Rest.d2wContext"); + if(result == null) { + result = ERD2WContext.newContext(); + ERXThreadStorage.takeValueForKey(result, "ERD2Rest.d2wContext"); + } + return result; + } + @Override public void finishInitialization() { - WOApplication.application().registerRequestHandler(new WODirectActionRequestHandler() { - public NSArray getRequestHandlerPathForRequest(WORequest worequest) { - NSArray nsarray = new NSArray(ERD2RestAction.class.getName()); - return nsarray.arrayByAddingObject(worequest.requestHandlerPath()); - } - - }, "d2r"); - + } } Added: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestAllowSecurityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestAllowSecurityDelegate.java (rev 0) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestAllowSecurityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,43 @@ +package er.directtorest.security; + +import com.webobjects.eoaccess.EOEntity; +import com.webobjects.eocontrol.EOEnterpriseObject; + +import er.rest.ERXRestContext; +import er.rest.IERXRestSecurityDelegate; + +public class ERD2RestAllowSecurityDelegate implements IERXRestSecurityDelegate { + + public boolean canDeleteObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) { + return true; + } + + public boolean canInsertObject(EOEntity entity, ERXRestContext context) { + return true; + } + + public boolean canInsertObject(EOEntity parentEntity, Object parentObject, String parentKey, EOEntity entity, ERXRestContext context) { + return true; + } + + public boolean canInsertProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context) { + return true; + } + + public boolean canUpdateObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) { + return true; + } + + public boolean canUpdateProperty(EOEntity entity, EOEnterpriseObject eo, String propertyName, ERXRestContext context) { + return true; + } + + public boolean canViewObject(EOEntity entity, EOEnterpriseObject eo, ERXRestContext context) { + return true; + } + + public boolean canViewProperty(EOEntity entity, Object obj, String propertyName, ERXRestContext context) { + return true; + } + +} Added: trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestDefaultSecurityDelegate.java =================================================================== --- trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestDefaultSecurityDelegate.java (rev 0) +++ trunk/Wonder/Frameworks/Misc/ERDirectToRest/Sources/er/directtorest/security/ERD2RestDefaultSecurityDelegate.java 2009-03-07 23:55:05 UTC (rev 9020) @@ -0,0 +1,54 @@ +package er.directtorest.security; + +import com.webobjects.directtoweb.D2WContext; +import com.webobjects.eoaccess.EOEntity; +import com.webobjects.eocontrol.EOEnterpriseObject; + +import er.directtorest.ERDirectToRest; +import er.extensions.foundation.ERXValueUtilities; +import er.rest.ERXRestContext; +import er.rest.IERXRestSecurityDelegate; + +public class ERD2RestDefaultSecurityDelegate implements IERXRestSecurityDelegate { + + protected boolean booleanValueForKey(String key, String propertyKey, EOEnterpriseObject eo) { + D2WContext context = ERDirectToRest.d2wContext(); + context.setPropertyKey(propertyKey); + context.takeValueForKey(eo, "object"); + return ERXValueUtilities.booleanValue(context.valueForKey(key)); + } + + public boolean canDeleteObject(EOEntity entity... [truncated message content] |