Changes for page ERRest In Depth
Last modified by Pascal Robert on 2012/06/10 16:01
From version 42.1
edited by Pascal Robert
on 2012/06/10 15:08
on 2012/06/10 15:08
Change comment:
There is no comment for this version
To version 47.1
edited by Pascal Robert
on 2012/06/10 16:01
on 2012/06/10 16:01
Change comment:
Migrated to Confluence 5.3
Summary
-
Page properties (2 modified, 0 added, 0 removed)
Details
- Page properties
-
- Parent
-
... ... @@ -1,0 +1,1 @@ 1 +Home - Content
-
... ... @@ -1,38 +1,130 @@ 1 1 General architecture 2 -Same Origin policy 3 -Transactions 4 -HTML vs other formats 5 -Response representation 6 -Missing route 7 -Missing object 8 -POJO objects 9 -Headers 10 -Caching 11 -Adding new format 12 -Security 13 -strictMode 14 -Workflow 15 -Query arguments and RXRestFetchSpecification 16 -ERXRestNameRegistry 17 -MapClassDescription / NSDictionaryClassDescription 2 + Same Origin policy 3 + Transactions 4 + HTML vs other formats 5 + Response representation 6 + Missing route 7 + Missing object 8 + POJO objects 9 + Headers 10 + Caching 11 + Adding new format 12 + Security 13 + strictMode 14 + Workflow 15 + Query arguments and RXRestFetchSpecification 16 + ERXRestNameRegistry 17 + MapClassDescription / NSDictionaryClassDescription 18 18 19 19 Calling an action goes like this: 20 20 21 21 {{code}} 22 22 23 -Application.dispatchRequest -> 24 -ERXRouteRequestHandler.handleRequest -> 25 -ERXRouteRequestHandler._handleRequest -> 26 -RestEntitiesController(ERXRouteController).performActionNamed -> 27 -RestEntitiesController(ERXRouteController).performRouteActionNamed -> RestEntitiesController(ERXRouteController).performActionWithArguments(Method, Object...) -> 28 -Method.invoke -> ... 23 +Application.dispatchRequest -> 24 +ERXRouteRequestHandler.handleRequest -> 25 +ERXRouteRequestHandler._handleRequest -> 26 +RestEntitiesController(ERXRouteController).performActionNamed(String actionName, false throwExceptions) -> 27 +RestEntitiesController(ERXRouteController).performRouteActionNamed -> RestEntitiesController(ERXRouteController).performActionWithArguments(Method, Object...) -> 28 +Method.invoke -> ... 29 29 RestEntitiesController.indexAction() 30 30 31 31 {{/code}} 32 32 33 +performActionNamed: 34 + 35 +{{code}} 36 + 37 +if (transactionAdaptor.transactionsEnabled() && !transactionAdaptor.isExecutingTransaction(context(), request())) { 38 + if (!transactionAdaptor.willHandleRequest(context(), request())) { 39 + if (transactionAdaptor.didHandleRequest(context(), request())) { 40 + results = stringResponse("Transaction request enqueued."); 41 + } else { 42 + results = stringResponse("Transaction executed."); 43 + } 44 + } 45 +} 46 + 47 +if (results == null) { 48 + checkAccess(); 49 +} 50 + 51 +if (results == null && isAutomaticHtmlRoutingEnabled() && format() == ERXRestFormat.html()) { 52 + results = performHtmlActionNamed(actionName); 53 +} 54 + 55 +if (results == null) { 56 + results = performRouteActionNamed(actionName); 57 +} 58 + 59 +if (results == null) { 60 + results = response(null, ERXKeyFilter.filterWithAttributes()); 61 +} 62 +else if (results instanceof IERXRouteComponent) { 63 + _takeRouteParametersFromRequest(results); 64 +} 65 + 66 +{{/code}} 67 + 68 +ERXRouteController.checkAccess() 69 + 70 +Will do nothing by default. Override it to check for security. 71 + 72 +{{code}} 73 + 74 +protected void checkAccess() throws SecurityException { 75 +} 76 + 77 +{{/code}} 78 + 79 +ERXRouteController.performHtmlActionNamed 80 + 81 +{{code}} 82 + protected WOActionResults performHtmlActionNamed(String actionName) throws Exception { 83 + WOActionResults results = null; 84 + 85 + String pageName = pageNameForAction(actionName); 86 + if (_NSUtilities.classWithName(pageName) != null) { 87 + try { 88 + results = pageWithName(pageName); 89 + if (!(results instanceof IERXRouteComponent)) { 90 + log.error(pageName + " does not implement IERXRouteComponent, so it will be ignored."); 91 + results = null; 92 + } 93 + } 94 + catch (WOPageNotFoundException e) { 95 + log.info(pageName + " does not exist, falling back to route controller."); 96 + results = null; 97 + } 98 + } 99 + else { 100 + log.info(pageName + " does not exist, falling back to route controller."); 101 + } 102 + 103 + if (results == null && shouldFailOnMissingHtmlPage()) { 104 + results = performUnknownAction(actionName); 105 + } 106 + 107 + return results; 108 + } 109 +{{/code}} 110 + 111 +{{code}} 112 + protected String pageNameForAction(String actionName) { 113 + return entityName() + ERXStringUtilities.capitalize(actionName) + "Page"; 114 + } 115 +{{/code}} 116 + 117 +{{code}} 118 + 119 + protected boolean shouldFailOnMissingHtmlPage() { 120 + return false; 121 + } 122 + 123 +{{/code}} 124 + 33 33 ERXRestUtils 34 34 35 -request > route 127 +request -> route 36 36 37 37 {{code}} 38 38 ... ... @@ -57,10 +57,8 @@ 57 57 * ERXRestContext 58 58 ** contains the editing context and an userInfo dictionnary 59 59 ** will be populated with er.rest.dateFormat, er.rest.timestampFormatter and er.rest.timestampFormat (read only for non-HTML responses) 60 -*** want to change the time format for a specific controller? 61 - 62 -{{code}} 63 - 152 +*** want to change the time format for a specific controller? 153 +** {{code}} 64 64 protected ERXRestContext createRestContext() { 65 65 ERXRestContext restContext = new ERXRestContext(editingContext()); 66 66 restContext.setUserInfoForKey("yyyy-MM-dd", "er.rest.dateFormat"); ... ... @@ -67,14 +67,10 @@ 67 67 restContext.setUserInfoForKey("yyyy-MM-dd", "er.rest.timestampFormat"); 68 68 return restContext; 69 69 } 70 - 71 -{{/code}} 72 - 73 -* 74 -** you just need to override createRestContext() in your controller if you want to add other stuff to the context (a user, etc.) 160 +{{/code}}you just need to override createRestContext() in your controller if you want to add other stuff to the context (a user, etc.) 75 75 * Properties 76 76 ** ERXRest.idKey (ERXRestFormatDelegate) 77 -*** (default "id") Override this property if you want to use a different key for the 'id' attribute** ERXRest.typeKey **163 +*** (default "id") Override this property if you want to use a different key for the 'id' attribute~*~* ERXRest.typeKey 78 78 ** ERXRest.nilKey (ERXRestFormatDelegate) 79 79 ** ERXRest.writeNilKey (ERXRestFormatDelegate) 80 80 ** ERXRest.pluralEntityNames (ERXRestFormatDelegate) ... ... @@ -111,11 +111,14 @@ 111 111 *** (default "xml") Allow you to set the default format for all of your REST controllers 112 112 ** ERXRest.allowWindowNameCrossDomainTransport (ERXRouteController) 113 113 ** ERXRest.accessControlMaxAge (ERXRouteController) 114 -*** (default 1728000) This header indicates how long the results of a preflight request can be cached. 200 +*** (default 1728000) This header indicates how long the results of a preflight request can be cached. For an example of a preflight request, see the above examples. 115 115 ** ERXRest.accessControlAllowOrigin (ERXRouteController) 116 -*** Set the value to '* *' to enable all origins. See [[https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Origin]]**202 +*** Set the value to '*' to enable all origins. See [[https:~~/~~/developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Origin>>url:https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Origin||shape="rect"]] 117 117 * JSON Schema 118 -** {{code}} 204 +** 205 + 206 +{{code}} 207 + 119 119 /something?schema=true 120 120 121 121 public WOActionResults indexAction() { ... ... @@ -125,36 +125,66 @@ 125 125 protected boolean isSchemaRequest() { 126 126 return request().stringFormValueForKey("schema") != null; 127 127 } 217 + 128 128 {{/code}} 129 129 130 130 Application(ERXApplication).dispatchRequest(WORequest) line: 2051 131 -ERXRouteRequestHandler(WOActionRequestHandler). //handleRequest(WORequest) line: 221132 -ERXRouteRequestHandler.getRequestHandlerPathForRequest(WORequest) line: 782 //221 + ERXRouteRequestHandler(WOActionRequestHandler)._handleRequest(WORequest) line: 221 222 + ERXRouteRequestHandler.getRequestHandlerPathForRequest(WORequest) line: 782 133 133 134 -ERXRouteRequestHandler(WOActionRequestHandler). //handleRequest(WORequest) line: 259135 -PagesController(ERXRouteController).performActionNamed(String) line: 1328 136 -PagesController(ERXRouteController).performActionNamed(String, boolean) line: 1385 137 -PagesController(ERXRouteController).performRouteActionNamed(String) line: 1510 138 -PagesController(ERXRouteController).performActionWithArguments(Method, Object...) line: 1559 139 -... 140 -PagesController.mainPageAction() line: 20 //224 +ERXRouteRequestHandler(WOActionRequestHandler)._handleRequest(WORequest) line: 259 225 + PagesController(ERXRouteController).performActionNamed(String) line: 1328 226 + PagesController(ERXRouteController).performActionNamed(String, boolean) line: 1385 227 + PagesController(ERXRouteController).performRouteActionNamed(String) line: 1510 228 + PagesController(ERXRouteController).performActionWithArguments(Method, Object...) line: 1559 229 + ... 230 + PagesController.mainPageAction() line: 20 141 141 142 142 == ERXRouteRequestHandler == 143 143 144 -| **Properties** 145 -| ERXRest.missingControllerName | (default "ERXMissingRouteController") 146 -\\ 147 -| ERXRest.parseUnknownExtensions | ERXRest.parseUnknownExtensions 148 -\\ 149 -| ERXRest.pluralEntityNames | ERXRest.pluralEntityNames 150 -\\ 151 -| ERXRest.routeCase | ERXRest.routeCase 152 -\\ 153 -| ERXRest.lowercaseEntityNames | ERXRest.lowercaseEntityNames 234 +|((( 235 +**Properties** 236 +))) 237 +|((( 238 +ERXRest.missingControllerName 239 +)))|((( 240 +(default "ERXMissingRouteController") 241 + 242 +))) 243 +|((( 244 +ERXRest.parseUnknownExtensions 245 +)))|((( 246 +ERXRest.parseUnknownExtensions 247 + 248 +))) 249 +|((( 250 +ERXRest.pluralEntityNames 251 +)))|((( 252 +ERXRest.pluralEntityNames 253 + 254 +))) 255 +|((( 256 +ERXRest.routeCase 257 +)))|((( 258 +ERXRest.routeCase 259 + 260 +))) 261 +|((( 262 +ERXRest.lowercaseEntityNames 263 +)))|((( 264 +ERXRest.lowercaseEntityNames 265 +))) 154 154 155 155 ERXMissingRouteController is the controller that is used when no route can be found. It's "missing" action is loaded. 156 156 157 -| **Properties** 158 -| ERXRest.strictMode | ERXRest.strictMode 159 -\\ | 269 +|((( 270 +**Properties** 271 +))) 272 +|((( 273 +ERXRest.strictMode 274 +)))|((( 275 +ERXRest.strictMode 276 + 277 +))) 278 + 160 160 ERXRouteController