This project has retired. For details please refer to its
Attic page.
CallContextImpl xref
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.chemistry.opencmis.server.impl;
20
21 import java.io.File;
22 import java.io.Serializable;
23 import java.math.BigInteger;
24 import java.util.HashMap;
25 import java.util.Locale;
26 import java.util.Map;
27
28 import javax.servlet.ServletContext;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31
32 import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
33 import org.apache.chemistry.opencmis.commons.server.CallContext;
34 import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
35 import org.apache.chemistry.opencmis.commons.server.MutableCallContext;
36 import org.apache.chemistry.opencmis.server.shared.TempStoreOutputStreamFactory;
37
38
39
40
41 public class CallContextImpl implements MutableCallContext, Serializable {
42
43 private static final long serialVersionUID = 1L;
44
45 private final String binding;
46 private final boolean objectInfoRequired;
47 private final Map<String, Object> parameter = new HashMap<String, Object>();
48
49 public CallContextImpl(String binding, CmisVersion cmisVersion, String repositoryId, ServletContext servletContext,
50 HttpServletRequest request, HttpServletResponse response, CmisServiceFactory factory,
51 TempStoreOutputStreamFactory streamFactory) {
52 this.binding = binding;
53 this.objectInfoRequired = BINDING_ATOMPUB.equals(binding);
54 put(REPOSITORY_ID, repositoryId);
55
56
57 if (cmisVersion == null) {
58 throw new IllegalArgumentException("CMIS version must be set!");
59 }
60 put(CallContext.CMIS_VERSION, cmisVersion);
61
62
63 put(CallContext.SERVLET_CONTEXT, servletContext);
64 put(CallContext.HTTP_SERVLET_REQUEST, request);
65 put(CallContext.HTTP_SERVLET_RESPONSE, response);
66
67 if (factory != null) {
68 put(TEMP_DIR, factory.getTempDirectory());
69 put(MEMORY_THRESHOLD, factory.getMemoryThreshold());
70 put(MAX_CONTENT_SIZE, factory.getMaxContentSize());
71 put(ENCRYPT_TEMP_FILE, factory.encryptTempFiles());
72 put(STREAM_FACTORY, streamFactory);
73 }
74 }
75
76 public void setRange(String rangeHeader) {
77 if (rangeHeader == null) {
78 return;
79 }
80
81 remove(OFFSET);
82 remove(LENGTH);
83
84 rangeHeader = rangeHeader.replaceAll("\\s", "").toLowerCase(Locale.ENGLISH);
85
86 if (rangeHeader.length() > 6 && rangeHeader.startsWith("bytes=") && rangeHeader.indexOf(',') == -1
87 && rangeHeader.charAt(6) != '-') {
88 BigInteger offset = null;
89 BigInteger length = null;
90
91 int ds = rangeHeader.indexOf('-');
92 if (ds > 6) {
93 try {
94 String firstBytePosStr = rangeHeader.substring(6, ds);
95 if (firstBytePosStr.length() > 0) {
96 offset = new BigInteger(firstBytePosStr);
97 }
98
99 if (!rangeHeader.endsWith("-")) {
100 String lastBytePosStr = rangeHeader.substring(ds + 1);
101 if (offset == null) {
102 length = (new BigInteger(lastBytePosStr)).add(BigInteger.ONE);
103 } else {
104 length = (new BigInteger(lastBytePosStr)).subtract(offset).add(BigInteger.ONE);
105 }
106 }
107
108 if (offset != null) {
109 put(OFFSET, offset);
110 }
111 if (length != null) {
112 put(LENGTH, length);
113 }
114 } catch (NumberFormatException e) {
115
116 }
117 }
118 }
119 }
120
121 public void setAcceptLanguage(String acceptLanguageHeader) {
122 if (acceptLanguageHeader == null) {
123 return;
124 }
125
126 remove(LOCALE_ISO639_LANGUAGE);
127 remove(LOCALE_ISO3166_COUNTRY);
128 remove(LOCALE);
129
130 double lastQ = 0;
131 String language = null;
132 String country = null;
133
134 String[] languageHeader = acceptLanguageHeader.split(",");
135 for (String languageRange : languageHeader) {
136 String langRange = languageRange.trim();
137 double currentQ = 0;
138
139 int x = langRange.indexOf(';');
140 if (x > -1) {
141 String qStr = langRange.substring(x + 1).replaceAll("\\s", "").toLowerCase(Locale.ENGLISH);
142 if (!qStr.startsWith("q=") && qStr.length() < 3) {
143 continue;
144 }
145 currentQ = Double.parseDouble(qStr.substring(2));
146 langRange = langRange.substring(0, x);
147 } else {
148 currentQ = 1;
149 }
150
151 if (currentQ <= lastQ) {
152 continue;
153 } else {
154 lastQ = currentQ;
155 }
156
157 String[] locale = langRange.split("-");
158 String locale0 = locale[0].trim();
159
160 language = null;
161 country = null;
162
163 if (!locale0.equals("*")) {
164 language = locale0;
165 if (locale.length > 1) {
166 String locale1 = locale[1].trim();
167 if (!locale1.equals("*")) {
168 country = locale1;
169 }
170 }
171 }
172
173 if (currentQ >= 1) {
174 break;
175 }
176 }
177
178 if (language != null) {
179 put(LOCALE_ISO639_LANGUAGE, language);
180 put(LOCALE, language);
181 }
182
183 if (country != null) {
184 put(LOCALE_ISO3166_COUNTRY, country);
185 put(LOCALE, language + "-" + country);
186 }
187 }
188
189 @Override
190 public String getBinding() {
191 return binding;
192 }
193
194 @Override
195 public boolean isObjectInfoRequired() {
196 return objectInfoRequired;
197 }
198
199 @Override
200 public Object get(String key) {
201 return parameter.get(key);
202 }
203
204 @Override
205 public CmisVersion getCmisVersion() {
206 return (CmisVersion) get(CMIS_VERSION);
207 }
208
209 @Override
210 public String getRepositoryId() {
211 return (String) get(REPOSITORY_ID);
212 }
213
214 @Override
215 public String getUsername() {
216 return (String) get(USERNAME);
217 }
218
219 @Override
220 public String getPassword() {
221 return (String) get(PASSWORD);
222 }
223
224 @Override
225 public String getLocale() {
226 return (String) get(LOCALE);
227 }
228
229 @Override
230 public BigInteger getOffset() {
231 return (BigInteger) get(OFFSET);
232 }
233
234 @Override
235 public BigInteger getLength() {
236 return (BigInteger) get(LENGTH);
237 }
238
239 @Override
240 public File getTempDirectory() {
241 return (File) get(TEMP_DIR);
242 }
243
244 @Override
245 public boolean encryptTempFiles() {
246 return Boolean.TRUE.equals(get(ENCRYPT_TEMP_FILE));
247 }
248
249 @Override
250 public int getMemoryThreshold() {
251 return (Integer) get(MEMORY_THRESHOLD);
252 }
253
254 @Override
255 public long getMaxContentSize() {
256 return (Long) get(MAX_CONTENT_SIZE);
257 }
258
259 @Override
260 public final void put(String key, Object value) {
261 parameter.put(key, value);
262 }
263
264 @Override
265 public final Object remove(String key) {
266 return parameter.remove(key);
267 }
268 }