1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.documentlibrary.service.impl;
24  
25  import com.liferay.documentlibrary.FileNameException;
26  import com.liferay.documentlibrary.FileSizeException;
27  import com.liferay.documentlibrary.SourceFileNameException;
28  import com.liferay.documentlibrary.service.DLLocalService;
29  import com.liferay.documentlibrary.util.Hook;
30  import com.liferay.documentlibrary.util.HookFactory;
31  import com.liferay.portal.PortalException;
32  import com.liferay.portal.SystemException;
33  import com.liferay.portal.kernel.annotation.BeanReference;
34  import com.liferay.portal.kernel.search.BooleanClauseOccur;
35  import com.liferay.portal.kernel.search.BooleanQuery;
36  import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
37  import com.liferay.portal.kernel.search.Field;
38  import com.liferay.portal.kernel.search.Hits;
39  import com.liferay.portal.kernel.search.SearchEngineUtil;
40  import com.liferay.portal.kernel.search.TermQuery;
41  import com.liferay.portal.kernel.search.TermQueryFactoryUtil;
42  import com.liferay.portal.kernel.util.FileUtil;
43  import com.liferay.portal.kernel.util.PropsKeys;
44  import com.liferay.portal.kernel.util.StringPool;
45  import com.liferay.portal.kernel.util.StringUtil;
46  import com.liferay.portal.kernel.util.Validator;
47  import com.liferay.portal.model.Group;
48  import com.liferay.portal.service.GroupLocalService;
49  import com.liferay.portal.util.PrefsPropsUtil;
50  import com.liferay.portal.util.PropsValues;
51  import com.liferay.portlet.documentlibrary.model.DLFileEntry;
52  import com.liferay.portlet.documentlibrary.service.DLFolderService;
53  
54  import java.io.File;
55  import java.io.IOException;
56  import java.io.InputStream;
57  
58  import java.util.Date;
59  
60  /**
61   * <a href="DLLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
62   *
63   * @author Brian Wing Shun Chan
64   */
65  public class DLLocalServiceImpl implements DLLocalService {
66  
67      public void addFile(
68              long companyId, String portletId, long groupId, long repositoryId,
69              String fileName, long fileEntryId, String properties,
70              Date modifiedDate, String[] tagsCategories, String[] tagsEntries,
71              InputStream is)
72          throws PortalException, SystemException {
73  
74          validate(fileName, is);
75  
76          Hook hook = HookFactory.getInstance();
77  
78          hook.addFile(
79              companyId, portletId, groupId, repositoryId, fileName, fileEntryId,
80              properties, modifiedDate, tagsCategories, tagsEntries, is);
81      }
82  
83      public void checkRoot(long companyId) throws SystemException {
84          Hook hook = HookFactory.getInstance();
85  
86          hook.checkRoot(companyId);
87      }
88  
89      public InputStream getFileAsStream(
90              long companyId, long repositoryId, String fileName)
91          throws PortalException, SystemException {
92  
93          Hook hook = HookFactory.getInstance();
94  
95          return hook.getFileAsStream(companyId, repositoryId, fileName);
96      }
97  
98      public InputStream getFileAsStream(
99              long companyId, long repositoryId, String fileName,
100             double versionNumber)
101         throws PortalException, SystemException {
102 
103         Hook hook = HookFactory.getInstance();
104 
105         return hook.getFileAsStream(
106             companyId, repositoryId, fileName, versionNumber);
107     }
108 
109     public boolean hasFile(
110             long companyId, long repositoryId, String fileName,
111             double versionNumber)
112         throws PortalException, SystemException {
113 
114         Hook hook = HookFactory.getInstance();
115 
116         return hook.hasFile(companyId, repositoryId, fileName, versionNumber);
117     }
118 
119     public void move(String srcDir, String destDir) throws SystemException {
120         Hook hook = HookFactory.getInstance();
121 
122         hook.move(srcDir, destDir);
123     }
124 
125     public Hits search(
126             long companyId, String portletId, long groupId,
127             long userId, long[] repositoryIds, String keywords, int start,
128             int end)
129         throws SystemException {
130 
131         try {
132             BooleanQuery contextQuery = BooleanQueryFactoryUtil.create();
133 
134             contextQuery.addRequiredTerm(Field.PORTLET_ID, portletId);
135 
136             if (groupId > 0) {
137                 Group group = groupLocalService.getGroup(groupId);
138 
139                 if (group.isLayout()) {
140                     contextQuery.addRequiredTerm(Field.SCOPE_GROUP_ID, groupId);
141 
142                     groupId = group.getParentGroupId();
143                 }
144 
145                 contextQuery.addRequiredTerm(Field.GROUP_ID, groupId);
146             }
147 
148             if ((repositoryIds != null) && (repositoryIds.length > 0)) {
149                 BooleanQuery repositoryIdsQuery =
150                     BooleanQueryFactoryUtil.create();
151 
152                 for (long repositoryId : repositoryIds) {
153                     try {
154                         if (userId > 0) {
155                             try {
156                                 dlFolderService.getFolder(repositoryId);
157                             }
158                             catch (Exception e) {
159                                 continue;
160                             }
161                         }
162 
163                         TermQuery termQuery = TermQueryFactoryUtil.create(
164                             "repositoryId", repositoryId);
165 
166                         repositoryIdsQuery.add(
167                             termQuery, BooleanClauseOccur.SHOULD);
168                     }
169                     catch (Exception e) {
170                     }
171                 }
172 
173                 contextQuery.add(repositoryIdsQuery, BooleanClauseOccur.MUST);
174             }
175 
176             BooleanQuery searchQuery = BooleanQueryFactoryUtil.create();
177 
178             if (Validator.isNotNull(keywords)) {
179                 searchQuery.addTerm(Field.CONTENT, keywords);
180                 searchQuery.addTerm(Field.PROPERTIES, keywords);
181                 searchQuery.addTerm(Field.TAGS_ENTRIES, keywords, true);
182             }
183 
184             BooleanQuery fullQuery = BooleanQueryFactoryUtil.create();
185 
186             fullQuery.add(contextQuery, BooleanClauseOccur.MUST);
187 
188             if (searchQuery.clauses().size() > 0) {
189                 fullQuery.add(searchQuery, BooleanClauseOccur.MUST);
190             }
191 
192             return SearchEngineUtil.search(
193                 companyId, groupId, userId, DLFileEntry.class.getName(),
194                 fullQuery, start, end);
195         }
196         catch (Exception e) {
197             throw new SystemException(e);
198         }
199     }
200 
201     public void updateFile(
202             long companyId, String portletId, long groupId, long repositoryId,
203             String fileName, double versionNumber, String sourceFileName,
204             long fileEntryId, String properties, Date modifiedDate,
205             String[] tagsCategories, String[] tagsEntries, InputStream is)
206         throws PortalException, SystemException {
207 
208         validate(fileName, sourceFileName, is);
209 
210         Hook hook = HookFactory.getInstance();
211 
212         hook.updateFile(
213             companyId, portletId, groupId, repositoryId, fileName,
214             versionNumber, sourceFileName, fileEntryId, properties,
215             modifiedDate, tagsCategories, tagsEntries, is);
216     }
217 
218     public void validate(String fileName, File file)
219         throws PortalException, SystemException {
220 
221         validate(fileName);
222 
223         if (((PropsValues.WEBDAV_LITMUS) ||
224              (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
225             ((file == null) ||
226              (file.length() >
227                 PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
228 
229             throw new FileSizeException(fileName);
230         }
231     }
232 
233     public void validate(String fileName, byte[] bytes)
234         throws PortalException, SystemException {
235 
236         validate(fileName);
237 
238         if (((PropsValues.WEBDAV_LITMUS) ||
239             (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
240             ((bytes == null) ||
241             (bytes.length >
242                  PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
243 
244             throw new FileSizeException(fileName);
245         }
246     }
247 
248     public void validate(String fileName, InputStream is)
249         throws PortalException, SystemException {
250 
251         validate(fileName);
252 
253         // LEP-4851
254 
255         try {
256             if (((PropsValues.WEBDAV_LITMUS) ||
257                 (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
258                 ((is == null) ||
259                 (is.available() >
260                      PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
261 
262                 throw new FileSizeException(fileName);
263             }
264         }
265         catch (IOException ioe) {
266             throw new FileSizeException(ioe.getMessage());
267         }
268     }
269 
270     public void validate(String fileName)
271         throws PortalException, SystemException {
272 
273         if ((fileName.indexOf("\\\\") != -1) ||
274             (fileName.indexOf("//") != -1) ||
275             (fileName.indexOf(":") != -1) ||
276             (fileName.indexOf("*") != -1) ||
277             (fileName.indexOf("?") != -1) ||
278             (fileName.indexOf("\"") != -1) ||
279             (fileName.indexOf("<") != -1) ||
280             (fileName.indexOf(">") != -1) ||
281             (fileName.indexOf("|") != -1) ||
282             (fileName.indexOf("&") != -1) ||
283             (fileName.indexOf("[") != -1) ||
284             (fileName.indexOf("]") != -1) ||
285             (fileName.indexOf("'") != -1)) {
286 
287             throw new FileNameException(fileName);
288         }
289 
290         boolean validFileExtension = false;
291 
292         String[] fileExtensions = PrefsPropsUtil.getStringArray(
293             PropsKeys.DL_FILE_EXTENSIONS, StringPool.COMMA);
294 
295         if (!PropsValues.WEBDAV_LITMUS) {
296             for (int i = 0; i < fileExtensions.length; i++) {
297                 if (StringPool.STAR.equals(fileExtensions[i]) ||
298                     StringUtil.endsWith(fileName, fileExtensions[i])) {
299 
300                     validFileExtension = true;
301 
302                     break;
303                 }
304             }
305 
306             if (!validFileExtension) {
307                 throw new FileNameException(fileName);
308             }
309         }
310     }
311 
312     public void validate(String fileName, String sourceFileName, InputStream is)
313         throws PortalException {
314 
315         String fileNameExtension = FileUtil.getExtension(fileName);
316         String sourceFileNameExtension = FileUtil.getExtension(sourceFileName);
317 
318         if (!PropsValues.WEBDAV_LITMUS) {
319             if (Validator.isNull(fileNameExtension) ||
320                 !fileNameExtension.equalsIgnoreCase(sourceFileNameExtension)) {
321 
322                 throw new SourceFileNameException(sourceFileName);
323             }
324         }
325 
326         if (is == null) {
327             throw new FileSizeException(fileName);
328         }
329     }
330 
331     @BeanReference(name = _GROUP_LOCAL_SERVICE)
332     protected GroupLocalService groupLocalService;
333 
334     @BeanReference(name = _DL_FOLDER_SERVICE)
335     protected DLFolderService dlFolderService;
336 
337     private static final String _GROUP_LOCAL_SERVICE =
338         "com.liferay.portal.service.GroupLocalService.impl";
339 
340     private static final String _DL_FOLDER_SERVICE =
341         "com.liferay.portlet.documentlibrary.service.DLFolderService.impl";
342 
343 }