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.Hits;
34  import com.liferay.portal.kernel.util.StringPool;
35  import com.liferay.portal.kernel.util.StringUtil;
36  import com.liferay.portal.kernel.util.Validator;
37  import com.liferay.portal.lucene.LuceneFields;
38  import com.liferay.portal.lucene.LuceneUtil;
39  import com.liferay.portal.util.PropsValues;
40  import com.liferay.util.FileUtil;
41  import com.liferay.util.lucene.HitsImpl;
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.Searcher;
51  import org.apache.lucene.search.TermQuery;
52  
53  /**
54   * <a href="DLLocalServiceImpl.java.html"><b><i>View Source</i></b></a>
55   *
56   * @author Brian Wing Shun Chan
57   *
58   */
59  public class DLLocalServiceImpl implements DLLocalService {
60  
61      public void addFile(
62              long companyId, String portletId, long groupId, long repositoryId,
63              String fileName, String properties, String[] tagsEntries,
64              InputStream is)
65          throws PortalException, SystemException {
66  
67          validate(fileName, is);
68  
69          Hook hook = HookFactory.getInstance();
70  
71          hook.addFile(
72              companyId, portletId, groupId, repositoryId, fileName, properties,
73              tagsEntries, is);
74      }
75  
76      public void checkRoot(long companyId) throws SystemException {
77          Hook hook = HookFactory.getInstance();
78  
79          hook.checkRoot(companyId);
80      }
81  
82      public InputStream getFileAsStream(
83              long companyId, long repositoryId, String fileName)
84          throws PortalException, SystemException {
85  
86          Hook hook = HookFactory.getInstance();
87  
88          return hook.getFileAsStream(companyId, repositoryId, fileName);
89      }
90  
91      public InputStream getFileAsStream(
92              long companyId, long repositoryId, String fileName,
93              double versionNumber)
94          throws PortalException, SystemException {
95  
96          Hook hook = HookFactory.getInstance();
97  
98          return hook.getFileAsStream(
99              companyId, repositoryId, fileName, versionNumber);
100     }
101 
102     public boolean hasFile(
103             long companyId, long repositoryId, String fileName,
104             double versionNumber)
105         throws PortalException, SystemException {
106 
107         Hook hook = HookFactory.getInstance();
108 
109         return hook.hasFile(companyId, repositoryId, fileName, versionNumber);
110     }
111 
112     public void move(String srcDir, String destDir) throws SystemException {
113         Hook hook = HookFactory.getInstance();
114 
115         hook.move(srcDir, destDir);
116     }
117 
118     public Hits search(
119             long companyId, String portletId, long groupId,
120             long[] repositoryIds, String keywords)
121         throws SystemException {
122 
123         Searcher searcher = null;
124 
125         try {
126             HitsImpl hits = new HitsImpl();
127 
128             BooleanQuery contextQuery = new BooleanQuery();
129 
130             LuceneUtil.addRequiredTerm(
131                 contextQuery, LuceneFields.PORTLET_ID, portletId);
132 
133             if (groupId > 0) {
134                 LuceneUtil.addRequiredTerm(
135                     contextQuery, LuceneFields.GROUP_ID, groupId);
136             }
137 
138             if ((repositoryIds != null) && (repositoryIds.length > 0)) {
139                 BooleanQuery repositoryIdsQuery = new BooleanQuery();
140 
141                 for (int i = 0; i < repositoryIds.length; i++) {
142                     Term term = new Term(
143                         "repositoryId", String.valueOf(repositoryIds[i]));
144                     TermQuery termQuery = new TermQuery(term);
145 
146                     repositoryIdsQuery.add(
147                         termQuery, BooleanClause.Occur.SHOULD);
148                 }
149 
150                 contextQuery.add(repositoryIdsQuery, BooleanClause.Occur.MUST);
151             }
152 
153             BooleanQuery searchQuery = new BooleanQuery();
154 
155             if (Validator.isNotNull(keywords)) {
156                 LuceneUtil.addTerm(searchQuery, LuceneFields.CONTENT, keywords);
157                 LuceneUtil.addTerm(
158                     searchQuery, LuceneFields.PROPERTIES, keywords);
159                 LuceneUtil.addTerm(
160                     searchQuery, LuceneFields.TAG_ENTRY, keywords);
161             }
162 
163             BooleanQuery fullQuery = new BooleanQuery();
164 
165             fullQuery.add(contextQuery, BooleanClause.Occur.MUST);
166 
167             if (searchQuery.clauses().size() > 0) {
168                 fullQuery.add(searchQuery, BooleanClause.Occur.MUST);
169             }
170 
171             searcher = LuceneUtil.getSearcher(companyId);
172 
173             hits.recordHits(searcher.search(fullQuery), searcher);
174 
175             return hits;
176         }
177         catch (Exception e) {
178             return LuceneUtil.closeSearcher(searcher, keywords, e);
179         }
180     }
181 
182     public void updateFile(
183             long companyId, String portletId, long groupId, long repositoryId,
184             String fileName, double versionNumber, String sourceFileName,
185             String properties, String[] tagsEntries, InputStream is)
186         throws PortalException, SystemException {
187 
188         validate(fileName, sourceFileName, is);
189 
190         Hook hook = HookFactory.getInstance();
191 
192         hook.updateFile(
193             companyId, portletId, groupId, repositoryId, fileName,
194             versionNumber, sourceFileName, properties, tagsEntries, is);
195     }
196 
197     public void validate(String fileName, File file) throws PortalException {
198         validate(fileName);
199 
200         if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
201             ((file == null) ||
202              (file.length() > PropsValues.DL_FILE_MAX_SIZE))) {
203 
204             throw new FileSizeException(fileName);
205         }
206     }
207 
208     public void validate(String fileName, byte[] byteArray)
209         throws PortalException {
210 
211         validate(fileName);
212 
213         if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
214             ((byteArray == null) ||
215              (byteArray.length > PropsValues.DL_FILE_MAX_SIZE))) {
216 
217             throw new FileSizeException(fileName);
218         }
219     }
220 
221     public void validate(String fileName, InputStream is)
222         throws PortalException {
223 
224         validate(fileName);
225 
226         // LEP-4851
227 
228         try {
229             if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
230                 ((is == null) ||
231                  (is.available() > PropsValues.DL_FILE_MAX_SIZE))) {
232 
233                 throw new FileSizeException(fileName);
234             }
235         }
236         catch (IOException ioe) {
237             throw new FileSizeException(ioe.getMessage());
238         }
239     }
240 
241     public void validate(String fileName) throws PortalException {
242         if ((fileName.indexOf("\\\\") != -1) ||
243             (fileName.indexOf("//") != -1) ||
244             (fileName.indexOf(":") != -1) ||
245             (fileName.indexOf("*") != -1) ||
246             (fileName.indexOf("?") != -1) ||
247             (fileName.indexOf("\"") != -1) ||
248             (fileName.indexOf("<") != -1) ||
249             (fileName.indexOf(">") != -1) ||
250             (fileName.indexOf("|") != -1) ||
251             (fileName.indexOf("&") != -1) ||
252             (fileName.indexOf("[") != -1) ||
253             (fileName.indexOf("]") != -1) ||
254             (fileName.indexOf("'") != -1)) {
255 
256             throw new FileNameException(fileName);
257         }
258 
259         boolean validFileExtension = false;
260 
261         String[] fileExtensions = PropsValues.DL_FILE_EXTENSIONS;
262 
263         if (!PropsValues.WEBDAV_LITMUS) {
264             for (int i = 0; i < fileExtensions.length; i++) {
265                 if (StringPool.STAR.equals(fileExtensions[i]) ||
266                     StringUtil.endsWith(fileName, fileExtensions[i])) {
267 
268                     validFileExtension = true;
269 
270                     break;
271                 }
272             }
273 
274             if (!validFileExtension) {
275                 throw new FileNameException(fileName);
276             }
277         }
278     }
279 
280     public void validate(String fileName, String sourceFileName, InputStream is)
281         throws PortalException {
282 
283         String fileNameExtension = FileUtil.getExtension(fileName);
284         String sourceFileNameExtension = FileUtil.getExtension(sourceFileName);
285 
286         if (!PropsValues.WEBDAV_LITMUS) {
287             if (Validator.isNull(fileNameExtension) ||
288                 !fileNameExtension.equalsIgnoreCase(sourceFileNameExtension)) {
289 
290                 throw new SourceFileNameException(sourceFileName);
291             }
292         }
293 
294         if (is == null) {
295             throw new FileSizeException(fileName);
296         }
297     }
298 
299 }