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.InputStream;
45
46 import org.apache.lucene.index.Term;
47 import org.apache.lucene.search.BooleanClause;
48 import org.apache.lucene.search.BooleanQuery;
49 import org.apache.lucene.search.Searcher;
50 import org.apache.lucene.search.TermQuery;
51
52
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)
120 throws SystemException {
121
122 Searcher searcher = null;
123
124 try {
125 HitsImpl hits = new HitsImpl();
126
127 BooleanQuery contextQuery = new BooleanQuery();
128
129 LuceneUtil.addRequiredTerm(
130 contextQuery, LuceneFields.PORTLET_ID, portletId);
131
132 if (groupId > 0) {
133 LuceneUtil.addRequiredTerm(
134 contextQuery, LuceneFields.GROUP_ID, groupId);
135 }
136
137 if ((repositoryIds != null) && (repositoryIds.length > 0)) {
138 BooleanQuery repositoryIdsQuery = new BooleanQuery();
139
140 for (int i = 0; i < repositoryIds.length; i++) {
141 Term term = new Term(
142 "repositoryId", String.valueOf(repositoryIds[i]));
143 TermQuery termQuery = new TermQuery(term);
144
145 repositoryIdsQuery.add(
146 termQuery, BooleanClause.Occur.SHOULD);
147 }
148
149 contextQuery.add(repositoryIdsQuery, BooleanClause.Occur.MUST);
150 }
151
152 BooleanQuery searchQuery = new BooleanQuery();
153
154 if (Validator.isNotNull(keywords)) {
155 LuceneUtil.addTerm(searchQuery, LuceneFields.CONTENT, keywords);
156 LuceneUtil.addTerm(
157 searchQuery, LuceneFields.PROPERTIES, keywords);
158 LuceneUtil.addTerm(
159 searchQuery, LuceneFields.TAG_ENTRY, keywords);
160 }
161
162 BooleanQuery fullQuery = new BooleanQuery();
163
164 fullQuery.add(contextQuery, BooleanClause.Occur.MUST);
165
166 if (searchQuery.clauses().size() > 0) {
167 fullQuery.add(searchQuery, BooleanClause.Occur.MUST);
168 }
169
170 searcher = LuceneUtil.getSearcher(companyId);
171
172 hits.recordHits(searcher.search(fullQuery), searcher);
173
174 return hits;
175 }
176 catch (Exception e) {
177 return LuceneUtil.closeSearcher(searcher, keywords, e);
178 }
179 }
180
181 public void updateFile(
182 long companyId, String portletId, long groupId, long repositoryId,
183 String fileName, double versionNumber, String sourceFileName,
184 String properties, String[] tagsEntries, InputStream is)
185 throws PortalException, SystemException {
186
187 validate(fileName, sourceFileName, is);
188
189 Hook hook = HookFactory.getInstance();
190
191 hook.updateFile(
192 companyId, portletId, groupId, repositoryId, fileName,
193 versionNumber, sourceFileName, properties, tagsEntries, is);
194 }
195
196 public void validate(String fileName, File file) throws PortalException {
197 validate(fileName);
198
199 if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
200 ((file == null) ||
201 (file.length() > PropsValues.DL_FILE_MAX_SIZE))) {
202
203 throw new FileSizeException(fileName);
204 }
205 }
206
207 public void validate(String fileName, byte[] byteArray)
208 throws PortalException {
209
210 validate(fileName);
211
212 if ((PropsValues.DL_FILE_MAX_SIZE > 0) &&
213 ((byteArray == null) ||
214 (byteArray.length > PropsValues.DL_FILE_MAX_SIZE))) {
215
216 throw new FileSizeException(fileName);
217 }
218 }
219
220 public void validate(String fileName, InputStream is)
221 throws PortalException {
222
223 validate(fileName);
224
225 if (is == null) {
226 throw new FileSizeException(fileName);
227 }
228 }
229
230 public void validate(String fileName) throws PortalException {
231 if ((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 (fileName.indexOf("'") != -1)) {
244
245 throw new FileNameException(fileName);
246 }
247
248 boolean validFileExtension = false;
249
250 String[] fileExtensions = PropsValues.DL_FILE_EXTENSIONS;
251
252 if (!PropsValues.WEBDAV_LITMUS) {
253 for (int i = 0; i < fileExtensions.length; i++) {
254 if (StringPool.STAR.equals(fileExtensions[i]) ||
255 StringUtil.endsWith(fileName, fileExtensions[i])) {
256
257 validFileExtension = true;
258
259 break;
260 }
261 }
262
263 if (!validFileExtension) {
264 throw new FileNameException(fileName);
265 }
266 }
267 }
268
269 public void validate(String fileName, String sourceFileName, InputStream is)
270 throws PortalException {
271
272 String fileNameExtension = FileUtil.getExtension(fileName);
273 String sourceFileNameExtension = FileUtil.getExtension(sourceFileName);
274
275 if (!PropsValues.WEBDAV_LITMUS) {
276 if (Validator.isNull(fileNameExtension) ||
277 !fileNameExtension.equalsIgnoreCase(sourceFileNameExtension)) {
278
279 throw new SourceFileNameException(sourceFileName);
280 }
281 }
282
283 if (is == null) {
284 throw new FileSizeException(fileName);
285 }
286 }
287
288 }