Changes for page ERRest In Depth
Last modified by Pascal Robert on 2012/06/10 16:01
From version 47.2
edited by Pascal Robert
on 2012/06/10 16:01
on 2012/06/10 16:01
Change comment:
Changed document parent to [xwiki:~probert.Home.WebHome].
To version 44.1
edited by Pascal Robert
on 2012/05/02 21:09
on 2012/05/02 21:09
Change comment:
There is no comment for this version
Summary
-
Page properties (2 modified, 0 added, 0 removed)
Details
- Page properties
-
- Parent
-
... ... @@ -1,1 +1,0 @@ 1 -~probert.Home.WebHome - Content
-
... ... @@ -1,156 +149,10 @@ 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 18 - 19 -Calling an action goes like this: 20 - 21 -{{code}} 22 - 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 -RestEntitiesController.indexAction() 30 - 31 -{{/code}} 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 -ERXRestUtils 126 - 127 -request -> route 128 - 129 -{{code}} 130 - 131 -/** 132 - * A NameFormat that behaves like Rails -- plural entities, plural routes, lowercase underscore names 133 - * (names_like_this). 134 - */ 135 - public static NameFormat RAILS = new NameFormat(true, true, NameFormat.Case.LowercaseUnderscore); 136 - 137 - /** 138 - * A NameFormat that behaves like WO -- singular entities, singular routes, camel names (NamesLikeThis). 139 - */ 140 - public static NameFormat WO = new NameFormat(false, false, NameFormat.Case.CamelCase); 141 - 142 - /** 143 - * A NameFormat that behaves like WO -- singular entities, singular routes, lowercase camel names (namesLikeThis). 144 - */ 145 - public static NameFormat WO_LOWER = new NameFormat(false, false, NameFormat.Case.LowerCamelCase); 146 - 147 -{{/code}} 148 - 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}} 4 +*** want to change the time format for a specific controller? 5 + 6 +{{code}} 7 + 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.) 14 + 15 +{{/code}} 16 + 17 +* 18 +** 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.typeKey21 +*** (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) ... ... @@ -188,23 +188,10 @@ 188 188 ** er.rest.timestampFormat.secondary 189 189 ** er.rest.timestampFormatter 190 190 ** er.rest.rfcDateFormat 191 -** er.rest.jodaTime 192 -** ERXRest.transactionsEnabled (default 'false') ERXRestTransactionRequestAdaptor 193 -** ERXRest.maxEventsPerTransaction (default '50') ERXRestTransactionRequestAdaptor 194 -** ERXRest.accessControlAllowRequestHeaders (ERXRouteController) 195 -** ERXRest.accessControlAllowRequestMethods (ERXRouteController) 196 -** ERXRest.defaultFormat (ERXRouteController) 197 -*** (default "xml") Allow you to set the default format for all of your REST controllers 198 -** ERXRest.allowWindowNameCrossDomainTransport (ERXRouteController) 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. 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"]] 49 +** ERXRest.transactionsEnabled 50 +** ERXRest.maxEventsPerTransaction 203 203 * JSON Schema 204 -** 205 - 206 -{{code}} 207 - 52 +** {{code}} 208 208 /something?schema=true 209 209 210 210 public WOActionResults indexAction() { ... ... @@ -214,66 +214,71 @@ 214 214 protected boolean isSchemaRequest() { 215 215 return request().stringFormValueForKey("schema") != null; 216 216 } 217 - 218 218 {{/code}} 219 219 64 +Same Origin policy 65 +Transactions 66 +HTML vs other formats 67 +Response representation 68 +Missing route 69 +Missing object 70 +POJO objects 71 +Headers 72 +Caching 73 +Adding new format 74 +Security 75 +strictMode 76 +Workflow 77 +Query arguments and RXRestFetchSpecification 78 +ERXRestNameRegistry 79 +MapClassDescription / NSDictionaryClassDescription 80 + 81 +ERXRestUtils 82 +Properties 83 +er.rest.dateFormat 84 +er.rest.timestampFormat 85 +er.rest.rfcDateFormat 86 + 87 +request > route 88 + 220 220 Application(ERXApplication).dispatchRequest(WORequest) line: 2051 221 - _handleRequest(WORequest) line: 221222 - 90 +ERXRouteRequestHandler(WOActionRequestHandler).//handleRequest(WORequest) line: 221 91 +ERXRouteRequestHandler.getRequestHandlerPathForRequest(WORequest) line: 782// 223 223 224 -ERXRouteRequestHandler(WOActionRequestHandler). _handleRequest(WORequest) line: 259225 - 226 - 227 - 228 - 229 - 230 - 93 +ERXRouteRequestHandler(WOActionRequestHandler).//handleRequest(WORequest) line: 259 94 +PagesController(ERXRouteController).performActionNamed(String) line: 1328 95 +PagesController(ERXRouteController).performActionNamed(String, boolean) line: 1385 96 +PagesController(ERXRouteController).performRouteActionNamed(String) line: 1510 97 +PagesController(ERXRouteController).performActionWithArguments(Method, Object...) line: 1559 98 +... 99 +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 -))) 103 +| **Properties** 104 +| ERXRest.missingControllerName | (default "ERXMissingRouteController") 105 +\\ 106 +| ERXRest.parseUnknownExtensions | ERXRest.parseUnknownExtensions 107 +\\ 108 +| ERXRest.pluralEntityNames | ERXRest.pluralEntityNames 109 +\\ 110 +| ERXRest.routeCase | ERXRest.routeCase 111 +\\ 112 +| 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 - 116 +| **Properties** 117 +| ERXRest.strictMode | ERXRest.strictMode 118 +\\ | 279 279 ERXRouteController 120 + 121 +Properties 122 + 123 +ERXRest.accessControlAllowRequestHeaders 124 +ERXRest.accessControlAllowRequestMethods 125 +ERXRest.defaultFormat 126 +ERXRest.strictMode 127 +ERXRest.allowWindowNameCrossDomainTransport 128 +ERXRest.accessControlMaxAge 129 +ERXRest.accessControlAllowOrigin