1
14
15 package com.liferay.documentlibrary.service.impl;
16
17 import com.liferay.documentlibrary.FileNameException;
18 import com.liferay.documentlibrary.FileSizeException;
19 import com.liferay.documentlibrary.SourceFileNameException;
20 import com.liferay.documentlibrary.service.DLLocalService;
21 import com.liferay.documentlibrary.util.Hook;
22 import com.liferay.portal.PortalException;
23 import com.liferay.portal.SystemException;
24 import com.liferay.portal.kernel.annotation.BeanReference;
25 import com.liferay.portal.kernel.search.BooleanClauseOccur;
26 import com.liferay.portal.kernel.search.BooleanQuery;
27 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
28 import com.liferay.portal.kernel.search.Field;
29 import com.liferay.portal.kernel.search.Hits;
30 import com.liferay.portal.kernel.search.SearchEngineUtil;
31 import com.liferay.portal.kernel.search.TermQuery;
32 import com.liferay.portal.kernel.search.TermQueryFactoryUtil;
33 import com.liferay.portal.kernel.util.FileUtil;
34 import com.liferay.portal.kernel.util.PropsKeys;
35 import com.liferay.portal.kernel.util.StringPool;
36 import com.liferay.portal.kernel.util.StringUtil;
37 import com.liferay.portal.kernel.util.Validator;
38 import com.liferay.portal.model.Group;
39 import com.liferay.portal.service.GroupLocalService;
40 import com.liferay.portal.util.PrefsPropsUtil;
41 import com.liferay.portal.util.PropsValues;
42 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
43 import com.liferay.portlet.documentlibrary.service.DLFolderService;
44
45 import java.io.File;
46 import java.io.IOException;
47 import java.io.InputStream;
48
49 import java.util.Date;
50
51
56 public class DLLocalServiceImpl implements DLLocalService {
57
58 public void addFile(
59 long companyId, String portletId, long groupId, long repositoryId,
60 String fileName, long fileEntryId, String properties,
61 Date modifiedDate, String[] tagsCategories, String[] tagsEntries,
62 InputStream is)
63 throws PortalException, SystemException {
64
65 validate(fileName, is);
66
67 hook.addFile(
68 companyId, portletId, groupId, repositoryId, fileName, fileEntryId,
69 properties, modifiedDate, tagsCategories, tagsEntries, is);
70 }
71
72 public void checkRoot(long companyId) throws SystemException {
73 hook.checkRoot(companyId);
74 }
75
76 public InputStream getFileAsStream(
77 long companyId, long repositoryId, String fileName)
78 throws PortalException, SystemException {
79
80 return hook.getFileAsStream(companyId, repositoryId, fileName);
81 }
82
83 public InputStream getFileAsStream(
84 long companyId, long repositoryId, String fileName,
85 double versionNumber)
86 throws PortalException, SystemException {
87
88 return hook.getFileAsStream(
89 companyId, repositoryId, fileName, versionNumber);
90 }
91
92 public boolean hasFile(
93 long companyId, long repositoryId, String fileName,
94 double versionNumber)
95 throws PortalException, SystemException {
96
97 return hook.hasFile(companyId, repositoryId, fileName, versionNumber);
98 }
99
100 public void move(String srcDir, String destDir) throws SystemException {
101 hook.move(srcDir, destDir);
102 }
103
104 public Hits search(
105 long companyId, String portletId, long groupId,
106 long userId, long[] repositoryIds, String keywords, int start,
107 int end)
108 throws SystemException {
109
110 try {
111 BooleanQuery contextQuery = BooleanQueryFactoryUtil.create();
112
113 contextQuery.addRequiredTerm(Field.PORTLET_ID, portletId);
114
115 if (groupId > 0) {
116 Group group = groupLocalService.getGroup(groupId);
117
118 if (group.isLayout()) {
119 contextQuery.addRequiredTerm(Field.SCOPE_GROUP_ID, groupId);
120
121 groupId = group.getParentGroupId();
122 }
123
124 contextQuery.addRequiredTerm(Field.GROUP_ID, groupId);
125 }
126
127 if ((repositoryIds != null) && (repositoryIds.length > 0)) {
128 BooleanQuery repositoryIdsQuery =
129 BooleanQueryFactoryUtil.create();
130
131 for (long repositoryId : repositoryIds) {
132 try {
133 if (userId > 0) {
134 try {
135 dlFolderService.getFolder(repositoryId);
136 }
137 catch (Exception e) {
138 continue;
139 }
140 }
141
142 TermQuery termQuery = TermQueryFactoryUtil.create(
143 "repositoryId", repositoryId);
144
145 repositoryIdsQuery.add(
146 termQuery, BooleanClauseOccur.SHOULD);
147 }
148 catch (Exception e) {
149 }
150 }
151
152 contextQuery.add(repositoryIdsQuery, BooleanClauseOccur.MUST);
153 }
154
155 BooleanQuery searchQuery = BooleanQueryFactoryUtil.create();
156
157 if (Validator.isNotNull(keywords)) {
158 searchQuery.addTerm(Field.CONTENT, keywords);
159 searchQuery.addTerm(Field.PROPERTIES, keywords);
160 searchQuery.addTerm(Field.TAGS_ENTRIES, keywords, true);
161 }
162
163 BooleanQuery fullQuery = BooleanQueryFactoryUtil.create();
164
165 fullQuery.add(contextQuery, BooleanClauseOccur.MUST);
166
167 if (searchQuery.clauses().size() > 0) {
168 fullQuery.add(searchQuery, BooleanClauseOccur.MUST);
169 }
170
171 return SearchEngineUtil.search(
172 companyId, groupId, userId, DLFileEntry.class.getName(),
173 fullQuery, start, end);
174 }
175 catch (Exception e) {
176 throw new SystemException(e);
177 }
178 }
179
180 public void updateFile(
181 long companyId, String portletId, long groupId, long repositoryId,
182 String fileName, double versionNumber, String sourceFileName,
183 long fileEntryId, String properties, Date modifiedDate,
184 String[] tagsCategories, String[] tagsEntries, InputStream is)
185 throws PortalException, SystemException {
186
187 validate(fileName, sourceFileName, is);
188
189 hook.updateFile(
190 companyId, portletId, groupId, repositoryId, fileName,
191 versionNumber, sourceFileName, fileEntryId, properties,
192 modifiedDate, tagsCategories, tagsEntries, is);
193 }
194
195 public void validate(String fileName, File file)
196 throws PortalException, SystemException {
197
198 validate(fileName);
199
200 if (((PropsValues.WEBDAV_LITMUS) ||
201 (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
202 ((file == null) ||
203 (file.length() >
204 PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
205
206 throw new FileSizeException(fileName);
207 }
208 }
209
210 public void validate(String fileName, byte[] bytes)
211 throws PortalException, SystemException {
212
213 validate(fileName);
214
215 if (((PropsValues.WEBDAV_LITMUS) ||
216 (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
217 ((bytes == null) ||
218 (bytes.length >
219 PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
220
221 throw new FileSizeException(fileName);
222 }
223 }
224
225 public void validate(String fileName, InputStream is)
226 throws PortalException, SystemException {
227
228 validate(fileName);
229
230
232 try {
233 if (((PropsValues.WEBDAV_LITMUS) ||
234 (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
235 ((is == null) ||
236 (is.available() >
237 PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
238
239 throw new FileSizeException(fileName);
240 }
241 }
242 catch (IOException ioe) {
243 throw new FileSizeException(ioe.getMessage());
244 }
245 }
246
247 public void validate(String fileName)
248 throws PortalException, SystemException {
249
250 if ((fileName.indexOf("\\\\") != -1) ||
251 (fileName.indexOf("//") != -1) ||
252 (fileName.indexOf(":") != -1) ||
253 (fileName.indexOf("*") != -1) ||
254 (fileName.indexOf("?") != -1) ||
255 (fileName.indexOf("\"") != -1) ||
256 (fileName.indexOf("<") != -1) ||
257 (fileName.indexOf(">") != -1) ||
258 (fileName.indexOf("|") != -1) ||
259 (fileName.indexOf("[") != -1) ||
260 (fileName.indexOf("]") != -1) ||
261 (fileName.indexOf("'") != -1)) {
262
263 throw new FileNameException(fileName);
264 }
265
266 boolean validFileExtension = false;
267
268 String[] fileExtensions = PrefsPropsUtil.getStringArray(
269 PropsKeys.DL_FILE_EXTENSIONS, StringPool.COMMA);
270
271 if (!PropsValues.WEBDAV_LITMUS) {
272 for (int i = 0; i < fileExtensions.length; i++) {
273 if (StringPool.STAR.equals(fileExtensions[i]) ||
274 StringUtil.endsWith(fileName, fileExtensions[i])) {
275
276 validFileExtension = true;
277
278 break;
279 }
280 }
281
282 if (!validFileExtension) {
283 throw new FileNameException(fileName);
284 }
285 }
286 }
287
288 public void validate(String fileName, String sourceFileName, InputStream is)
289 throws PortalException, SystemException {
290
291 String fileNameExtension = FileUtil.getExtension(fileName);
292 String sourceFileNameExtension = FileUtil.getExtension(sourceFileName);
293
294 if (!PropsValues.WEBDAV_LITMUS) {
295 if (Validator.isNull(fileNameExtension) ||
296 !fileNameExtension.equalsIgnoreCase(sourceFileNameExtension)) {
297
298 throw new SourceFileNameException(sourceFileName);
299 }
300 }
301
302 try {
303 if (((PropsValues.WEBDAV_LITMUS) ||
304 (PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE) > 0)) &&
305 ((is == null) ||
306 (is.available() >
307 PrefsPropsUtil.getLong(PropsKeys.DL_FILE_MAX_SIZE)))) {
308
309 throw new FileSizeException(fileName);
310 }
311 }
312 catch (IOException ioe) {
313 throw new FileSizeException(ioe.getMessage());
314 }
315 }
316
317 @BeanReference(type = GroupLocalService.class)
318 protected GroupLocalService groupLocalService;
319
320 @BeanReference(type = DLFolderService.class)
321 protected DLFolderService dlFolderService;
322
323 @BeanReference(type = Hook.class)
324 protected Hook hook;
325
326 }