Changes for page ERRest In Depth
Last modified by Pascal Robert on 2012/06/10 16:01
From version 46.1
edited by Pascal Robert
on 2012/06/10 16:01
on 2012/06/10 16:01
Change comment:
Migrated to Confluence 4.0
To 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
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,130 +1,38 @@ 1 1 General architecture 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 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 (StringactionName, false throwExceptions)->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 -> 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 - 125 125 ERXRestUtils 126 126 127 -request -> route35 +request > route 128 128 129 129 {{code}} 130 130 ... ... @@ -149,8 +149,10 @@ 149 149 * ERXRestContext 150 150 ** contains the editing context and an userInfo dictionnary 151 151 ** will be populated with er.rest.dateFormat, er.rest.timestampFormatter and er.rest.timestampFormat (read only for non-HTML responses) 152 -*** want to change the time format for a specific controller? 153 -** {{code}} 60 +*** want to change the time format for a specific controller? 61 + 62 +{{code}} 63 + 154 154 protected ERXRestContext createRestContext() { 155 155 ERXRestContext restContext = new ERXRestContext(editingContext()); 156 156 restContext.setUserInfoForKey("yyyy-MM-dd", "er.rest.dateFormat"); ... ... @@ -157,10 +157,14 @@ 157 157 restContext.setUserInfoForKey("yyyy-MM-dd", "er.rest.timestampFormat"); 158 158 return restContext; 159 159 } 160 -{{/code}}you just need to override createRestContext() in your controller if you want to add other stuff to the context (a user, etc.) 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.) 161 161 * Properties 162 162 ** ERXRest.idKey (ERXRestFormatDelegate) 163 -*** (default "id") Override this property if you want to use a different key for the 'id' attribute ~*~* ERXRest.typeKey77 +*** (default "id") Override this property if you want to use a different key for the 'id' attribute** ERXRest.typeKey** 164 164 ** ERXRest.nilKey (ERXRestFormatDelegate) 165 165 ** ERXRest.writeNilKey (ERXRestFormatDelegate) 166 166 ** ERXRest.pluralEntityNames (ERXRestFormatDelegate) ... ... @@ -197,14 +197,11 @@ 197 197 *** (default "xml") Allow you to set the default format for all of your REST controllers 198 198 ** ERXRest.allowWindowNameCrossDomainTransport (ERXRouteController) 199 199 ** ERXRest.accessControlMaxAge (ERXRouteController) 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. 114 +*** (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. 201 201 ** ERXRest.accessControlAllowOrigin (ERXRouteController) 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"]]116 +*** Set the value to '**' to enable all origins. See [[https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Origin]]** 203 203 * JSON Schema 204 -** 205 - 206 -{{code}} 207 - 118 +** {{code}} 208 208 /something?schema=true 209 209 210 210 public WOActionResults indexAction() { ... ... @@ -214,66 +214,36 @@ 214 214 protected boolean isSchemaRequest() { 215 215 return request().stringFormValueForKey("schema") != null; 216 216 } 217 - 218 218 {{/code}} 219 219 220 220 Application(ERXApplication).dispatchRequest(WORequest) line: 2051 221 - _handleRequest(WORequest) line: 221222 - 131 +ERXRouteRequestHandler(WOActionRequestHandler).//handleRequest(WORequest) line: 221 132 +ERXRouteRequestHandler.getRequestHandlerPathForRequest(WORequest) line: 782// 223 223 224 -ERXRouteRequestHandler(WOActionRequestHandler). _handleRequest(WORequest) line: 259225 - 226 - 227 - 228 - 229 - 230 - 134 +ERXRouteRequestHandler(WOActionRequestHandler).//handleRequest(WORequest) line: 259 135 +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// 231 231 232 232 == ERXRouteRequestHandler == 233 233 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 -))) 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 266 266 267 267 ERXMissingRouteController is the controller that is used when no route can be found. It's "missing" action is loaded. 268 268 269 -|((( 270 -**Properties** 271 -))) 272 -|((( 273 -ERXRest.strictMode 274 -)))|((( 275 -ERXRest.strictMode 276 - 277 -))) 278 - 157 +| **Properties** 158 +| ERXRest.strictMode | ERXRest.strictMode 159 +\\ | 279 279 ERXRouteController