-
Notifications
You must be signed in to change notification settings - Fork 51
Expand file tree
/
Copy pathRequestFactoryImpl.java
More file actions
148 lines (133 loc) · 4.98 KB
/
RequestFactoryImpl.java
File metadata and controls
148 lines (133 loc) · 4.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* Copyright (c) restSQL Project Contributors. Licensed under MIT. */
package org.restsql.core.impl;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.restsql.core.Factory;
import org.restsql.core.HttpRequestAttributes;
import org.restsql.core.InvalidRequestException;
import org.restsql.core.RequestValue;
import org.restsql.core.Request;
import org.restsql.core.RequestLogger;
import org.restsql.core.RequestUtil;
import org.restsql.core.SqlResource;
import org.restsql.core.SqlResourceException;
import org.restsql.core.Factory.RequestFactory;
import org.restsql.core.Factory.SqlResourceFactoryException;
import org.restsql.core.Request.Type;
/**
* Creates requests.
*
* @author Mark Sawers
*/
public class RequestFactoryImpl implements RequestFactory {
@Override
public Request getChildRequest(final Request parentRequest) {
final RequestImpl childRequest = new RequestImpl(parentRequest.getHttpRequestAttributes(),
parentRequest.getType(), parentRequest.getSqlResource(),
parentRequest.getResourceIdentifiers(), null, null, parentRequest.getLogger());
childRequest.setParent(parentRequest);
return childRequest;
}
/**
* Builds request from URI. Assumes pattern
* <code>res/{resourceName}/{resId1}/{resId2}?{param1}={value1}&{param2}={value2}</code>. Used by the test harness,
* Java API clients and perhaps a straight servlet implementation.
*/
@Override
public Request getRequest(final HttpRequestAttributes httpAttributes) throws InvalidRequestException,
SqlResourceFactoryException, SqlResourceException {
int elements = 0;
String resName = null, path, query = null;
List<RequestValue> resIds = null;
List<RequestValue> params = null;
String uri;
try {
uri = URLDecoder.decode(httpAttributes.getUri(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
throw new InvalidRequestException("Problem decoding uri: " + httpAttributes.getUri() + " - "
+ exception.getMessage());
}
final int queryIndex = uri.indexOf('?');
if (queryIndex > 0) {
query = uri.substring(queryIndex + 1);
path = uri.substring(0, queryIndex);
} else {
path = uri;
}
// Parse path params
StringTokenizer tokenizer = new StringTokenizer(path, "/");
String[] resIdValues = null;
while (tokenizer.hasMoreElements()) {
elements++;
final String element = (String) tokenizer.nextElement();
if (elements == 2) {
resName = element;
} else if (elements > 2) {
if (resIdValues == null) {
resIdValues = new String[4];
}
resIdValues[elements - 2] = element;
}
}
if (resIdValues != null) {
final SqlResource sqlResource = Factory.getSqlResource(resName);
resIds = RequestUtil.getResIds(sqlResource, resIdValues);
}
// Parse query params
if (query != null) {
tokenizer = new StringTokenizer(query, "&");
while (tokenizer.hasMoreElements()) {
final String element = (String) tokenizer.nextElement();
if (params == null) {
params = new ArrayList<RequestValue>(4);
}
final int equalsIndex = element.indexOf('=');
String name = element.substring(0, equalsIndex);
String value = "";
if (element.length() > equalsIndex + 1) {
value = element.substring(equalsIndex + 1);
}
params.add(new RequestValue(name, value));
}
}
RequestUtil.checkForInvalidMultipleParameters(params);
final String responseMediaType = RequestUtil.getResponseMediaType(params,
httpAttributes.getRequestMediaType(), httpAttributes.getResponseMediaType());
httpAttributes.setResponseMediaType(responseMediaType);
final RequestLogger requestLogger = Factory.getRequestLogger();
final Request.Type type = Request.Type.fromHttpMethod(httpAttributes.getMethod());
return new RequestImpl(httpAttributes, type, resName, resIds, params, null, requestLogger);
}
/**
* Returns request object with pre-parsed data from the URI. Used by service and possibly Java API clients.
*/
@Override
public Request getRequest(final HttpRequestAttributes httpAttributes, final Type type,
final String sqlResource, final List<RequestValue> resIds, final List<RequestValue> params,
final List<List<RequestValue>> childrenParams, final RequestLogger requestLogger)
throws InvalidRequestException {
// Verify expectations
if (sqlResource == null) {
throw new InvalidRequestException(InvalidRequestException.MESSAGE_SQLRESOURCE_REQUIRED);
}
switch (type) {
case INSERT:
if (params == null && childrenParams == null) {
throw new InvalidRequestException(InvalidRequestException.MESSSAGE_INSERT_MISSING_PARAMS);
}
break;
case UPDATE:
if (params == null && childrenParams == null) {
throw new InvalidRequestException(InvalidRequestException.MESSSAGE_UPDATE_MISSING_PARAMS);
}
break;
default:
}
RequestUtil.checkForInvalidMultipleParameters(params);
return new RequestImpl(httpAttributes, type, sqlResource, resIds, params, childrenParams,
requestLogger);
}
}