This project has retired. For details please refer to its Attic page.
CallContextImpl xref
View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * Implementation of the {@link CallContext} interface.
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          // CMIS version
57          if (cmisVersion == null) {
58              throw new IllegalArgumentException("CMIS version must be set!");
59          }
60          put(CallContext.CMIS_VERSION, cmisVersion);
61  
62          // servlet context and HTTP servlet request and response
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                     // invalid Range header must be ignored
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 }