1
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
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
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 }