1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions 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.search.Field;
34  import com.liferay.portal.kernel.search.Hits;
35  import com.liferay.portal.kernel.search.SearchEngineUtil;
36  import com.liferay.portal.kernel.util.FileUtil;
37  import com.liferay.portal.kernel.util.StringPool;
38  import com.liferay.portal.kernel.util.StringUtil;
39  import com.liferay.portal.kernel.util.Validator;
40  import com.liferay.portal.search.lucene.LuceneUtil;
41  import com.liferay.portal.util.PropsValues;
42  
43  import java.io.File;
44  import java.io.IOException;
45  import java.io.InputStream;
46  
47  import org.apache.lucene.index.Term;
48  import org.apache.lucene.search.BooleanClause;
49  import org.apache.lucene.search.BooleanQuery;
50  import org.apache.lucene.search.TermQuery;
51  
52  /**
53   * <a href="DLLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
54   *
55   * @author Brian Wing Shun Chan
56   *
57   */
58  public class DLLocalServiceImpl implements DLLocalService {
59  
60      public void addFile(
61              long companyId, String portletId, long groupId, long repositoryId,
62              String fileName, String properties, String[] tagsEntries,
63              InputStream is)
64          throws PortalException, SystemException {
65  
66          validate(fileName, is);
67  
68          Hook hook = HookFactory.getInstance();
69  
70          hook.addFile(
71              companyId, portletId, groupId, repositoryId, fileName, properties,
72              tagsEntries, is);
73      }
74  
75      public void checkRoot(long companyId) throws SystemException {
76          Hook hook = HookFactory.getInstance();
77  
78          hook.checkRoot(companyId);
79      }
80  
81      public InputStream getFileAsStream(
82              long companyId, long repositoryId, String fileName)
83          throws PortalException, SystemException {
84  
85          Hook hook = HookFactory.getInstance();
86  
87          return hook.getFileAsStream(companyId, repositoryId, fileName);
88      }
89  
90      public InputStream getFileAsStream(
91              long companyId, long repositoryId, String fileName,
92              double versionNumber)
93          throws PortalException, SystemException {
94  
95          Hook hook = HookFactory.getInstance();
96  
97          return hook.getFileAsStream(
98              companyId, repositoryId, fileName, versionNumber);
99      }
100 
101     public boolean hasFile(
102             long companyId, long repositoryId, String fileName,
103             double versionNumber)
104         throws PortalException, SystemException {
105 
106         Hook hook = HookFactory.getInstance();
107 
108         return hook.hasFile(companyId, repositoryId, fileName, versionNumber);
109     }
110 
111     public void move(String srcDir, String destDir) throws SystemException {
112         Hook hook = HookFactory.getInstance();
113 
114         hook.move(srcDir, destDir);
115     }
116 
117     public Hits search(
118             long companyId, String portletId, long groupId,
119             long[] repositoryIds, String keywords, int start, int end)
120         throws SystemException {
121 
122         try {
123             BooleanQuery contextQuery = new BooleanQuery();
124 
125             LuceneUtil.addRequiredTerm(
126                 contextQuery, Field.PORTLET_ID, portletId);
127 
128             if (groupId > 0) {
129                 LuceneUtil.addRequiredTerm(
130                     contextQuery, Field.GROUP_ID, groupId);
131             }
132 
133             if ((repositoryIds != null) && (repositoryIds.length > 0)) {
134                 BooleanQuery repositoryIdsQuery = new BooleanQuery();
135 
136                 for (int i = 0; i < repositoryIds.length; i++) {
137                     Term term = new Term(
138                         "repositoryId", String.valueOf(repositoryIds[i]));
139                     TermQuery termQuery = new TermQuery(term);
140 
141                     repositoryIdsQuery.add(
142                         termQuery, BooleanClause.Occur.SHOULD);
143                 }
144 
145                 contextQuery.add(repositoryIdsQuery, BooleanClause.Occur.MUST);
146             }
147 
148             BooleanQuery searchQuery = new BooleanQuery();
149 
150             if (Validator.isNotNull(keywords)) {
151                 LuceneUtil.addTerm(searchQuery, Field.CONTENT, keywords);
152                 LuceneUtil.addTerm(searchQuery, Field.PROPERTIES, keywords);
153                 LuceneUtil.addTerm(searchQuery, Field.TAGS_ENTRIES, keywords);
154             }
155 
156             BooleanQuery fullQuery = new BooleanQuery();
157 
158             fullQuery.add(contextQuery, BooleanClause.Occur.MUST);
159 
160             if (searchQuery.clauses().size() > 0) {
161                 fullQuery.add(searchQuery, BooleanClause.Occur.MUST);
162             }
163 
164             return SearchEngineUtil.search(
165                 companyId, fullQuery.toString(), start, end);
166         }
167         catch (Exception e) {
168             throw new SystemException(e);
169         }
170     }
171 
172     public void updateFile(
173             long companyId, String portletId, long groupId, long repositoryId,
174             String fileName, double versionNumber, String sourceFileName,
175             String properties, String[] tagsEntries, InputStream is)
176         throws PortalException, SystemException {
177 
178         validate(fileName, sourceFileName, is);
179 
180         Hook hook = HookFactory.getInstance();
181 
182         hook.updateFile(
183             companyId, portletId, groupId, repositoryId, fileName,
184             versionNumber, sourceFileName, properties, tagsEntries, is);
185     }
186 
187     public void validate(String fileName, File file) throws PortalException {
188         validate(fileName);
189 
190         if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
191             ((file == null) ||
192              (file.length() > PropsValues.DL_FILE_MAX_SIZE))) {
193 
194             throw new FileSizeException(fileName);
195         }
196     }
197 
198     public void validate(String fileName, byte[] bytes) throws PortalException {
199         validate(fileName);
200 
201         if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
202             ((bytes == null) ||
203              (bytes.length > PropsValues.DL_FILE_MAX_SIZE))) {
204 
205             throw new FileSizeException(fileName);
206         }
207     }
208 
209     public void validate(String fileName, InputStream is)
210         throws PortalException {
211 
212         validate(fileName);
213 
214         // LEP-4851
215 
216         try {
217             if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
218                 ((is == null) ||
219                  (is.available() > PropsValues.DL_FILE_MAX_SIZE))) {
220 
221                 throw new FileSizeException(fileName);
222             }
223         }
224         catch (IOException ioe) {
225             throw new FileSizeException(ioe.getMessage());
226         }
227     }
228 
229     public void validate(String fileName) throws PortalException {
230         if ((fileName.indexOf("\\\\") != -1) ||
231             (fileName.indexOf("//") != -1) ||
232             (fileName.indexOf(":") != -1) ||
233             (fileName.indexOf("*") != -1) ||
234             (fileName.indexOf("?") != -1) ||
235             (fileName.indexOf("\"") != -1) ||
236             (fileName.indexOf("<") != -1) ||
237             (fileName.indexOf(">") != -1) ||
238             (fileName.indexOf("|") != -1) ||
239             (fileName.indexOf("&") != -1) ||
240             (fileName.indexOf("[") != -1) ||
241             (fileName.indexOf("]") != -1) ||
242             (fileName.indexOf("'") != -1)) {
243 
244             throw new FileNameException(fileName);
245         }
246 
247         boolean validFileExtension = false;
248 
249         String[] fileExtensions = PropsValues.DL_FILE_EXTENSIONS;
250 
251         if (!PropsValues.WEBDAV_LITMUS) {
252             for (int i = 0; i < fileExtensions.length; i++) {
253                 if (StringPool.STAR.equals(fileExtensions[i]) ||
254                     StringUtil.endsWith(fileName, fileExtensions[i])) {
255 
256                     validFileExtension = true;
257 
258                     break;
259                 }
260             }
261 
262             if (!validFileExtension) {
263                 throw new FileNameException(fileName);
264             }
265         }
266     }
267 
268     public void validate(String fileName, String sourceFileName, InputStream is)
269         throws PortalException {
270 
271         String fileNameExtension = FileUtil.getExtension(fileName);
272         String sourceFileNameExtension = FileUtil.getExtension(sourceFileName);
273 
274         if (!PropsValues.WEBDAV_LITMUS) {
275             if (Validator.isNull(fileNameExtension) ||
276                 !fileNameExtension.equalsIgnoreCase(sourceFileNameExtension)) {
277 
278                 throw new SourceFileNameException(sourceFileName);
279             }
280         }
281 
282         if (is == null) {
283             throw new FileSizeException(fileName);
284         }
285     }
286 
287 }