Changes for page ERRest In Depth

Last modified by Pascal Robert on 2012/06/10 16:01

From version 43.1
edited by Pascal Robert
on 2012/05/02 21:09
Change comment: There is no comment for this version
To version 45.1
edited by Pascal Robert
on 2012/06/10 16:01
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -1,3 +1,155 @@
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 +
83 + protected WOActionResults performHtmlActionNamed(String actionName) throws Exception {
84 + WOActionResults results = null;
85 +
86 + String pageName = pageNameForAction(actionName);
87 + if (_NSUtilities.classWithName(pageName) != null) {
88 + try {
89 + results = pageWithName(pageName);
90 + if (!(results instanceof IERXRouteComponent)) {
91 + log.error(pageName + " does not implement IERXRouteComponent, so it will be ignored.");
92 + results = null;
93 + }
94 + }
95 + catch (WOPageNotFoundException e) {
96 + log.info(pageName + " does not exist, falling back to route controller.");
97 + results = null;
98 + }
99 + }
100 + else {
101 + log.info(pageName + " does not exist, falling back to route controller.");
102 + }
103 +
104 + if (results == null && shouldFailOnMissingHtmlPage()) {
105 + results = performUnknownAction(actionName);
106 + }
107 +
108 + return results;
109 + }
110 +
111 +{{/code}}
112 +
113 +{{code}}
114 +
115 + protected String pageNameForAction(String actionName) {
116 + return entityName() + ERXStringUtilities.capitalize(actionName) + "Page";
117 + }
118 +
119 +{{/code}}
120 +
121 +{{code}}
122 +
123 + protected boolean shouldFailOnMissingHtmlPage() {
124 + return false;
125 + }
126 +
127 +{{/code}}
128 +
129 +ERXRestUtils
130 +
131 +request > route
132 +
133 +{{code}}
134 +
135 +/**
136 + * A NameFormat that behaves like Rails -- plural entities, plural routes, lowercase underscore names
137 + * (names_like_this).
138 + */
139 + public static NameFormat RAILS = new NameFormat(true, true, NameFormat.Case.LowercaseUnderscore);
140 +
141 + /**
142 + * A NameFormat that behaves like WO -- singular entities, singular routes, camel names (NamesLikeThis).
143 + */
144 + public static NameFormat WO = new NameFormat(false, false, NameFormat.Case.CamelCase);
145 +
146 + /**
147 + * A NameFormat that behaves like WO -- singular entities, singular routes, lowercase camel names (namesLikeThis).
148 + */
149 + public static NameFormat WO_LOWER = new NameFormat(false, false, NameFormat.Case.LowerCamelCase);
150 +
151 +{{/code}}
152 +
1 1  * ERXRestContext
2 2  ** contains the editing context and an userInfo dictionnary
3 3  ** will be populated with er.rest.dateFormat, er.rest.timestampFormatter and er.rest.timestampFormat (read only for non-HTML responses)
... ... @@ -46,8 +46,18 @@
46 46  ** er.rest.timestampFormat.secondary
47 47  ** er.rest.timestampFormatter
48 48  ** er.rest.rfcDateFormat
49 -** ERXRest.transactionsEnabled
50 -** ERXRest.maxEventsPerTransaction
201 +** er.rest.jodaTime
202 +** ERXRest.transactionsEnabled (default 'false') ERXRestTransactionRequestAdaptor
203 +** ERXRest.maxEventsPerTransaction (default '50') ERXRestTransactionRequestAdaptor
204 +** ERXRest.accessControlAllowRequestHeaders (ERXRouteController)
205 +** ERXRest.accessControlAllowRequestMethods (ERXRouteController)
206 +** ERXRest.defaultFormat (ERXRouteController)
207 +*** (default "xml") Allow you to set the default format for all of your REST controllers
208 +** ERXRest.allowWindowNameCrossDomainTransport (ERXRouteController)
209 +** ERXRest.accessControlMaxAge (ERXRouteController)
210 +*** (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.
211 +** ERXRest.accessControlAllowOrigin (ERXRouteController)
212 +*** Set the value to '**' to enable all origins. See [[https://developer.mozilla.org/En/HTTP_access_control#Access-Control-Allow-Origin]]**
51 51  * JSON Schema
52 52  ** {{code}}
53 53  /something?schema=true
... ... @@ -61,31 +61,6 @@
61 61  }
62 62  {{/code}}
63 63  
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 -
89 89  Application(ERXApplication).dispatchRequest(WORequest) line: 2051
90 90  ERXRouteRequestHandler(WOActionRequestHandler).//handleRequest(WORequest) line: 221
91 91  ERXRouteRequestHandler.getRequestHandlerPathForRequest(WORequest) line: 782//
... ... @@ -117,13 +117,3 @@
117 117  | ERXRest.strictMode | ERXRest.strictMode
118 118  \\          |
119 119  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