1
14
15 package com.liferay.documentlibrary.util;
16
17 import com.liferay.portal.kernel.log.Log;
18 import com.liferay.portal.kernel.log.LogFactoryUtil;
19 import com.liferay.portal.kernel.search.Document;
20 import com.liferay.portal.kernel.search.Field;
21 import com.liferay.portal.kernel.search.SearchEngineUtil;
22 import com.liferay.portal.kernel.util.CharPool;
23 import com.liferay.portal.kernel.util.FileUtil;
24 import com.liferay.portal.kernel.util.GetterUtil;
25 import com.liferay.portal.kernel.util.StringBundler;
26 import com.liferay.portal.kernel.util.StringPool;
27 import com.liferay.portal.kernel.util.StringUtil;
28 import com.liferay.portal.kernel.util.Validator;
29
30 import java.io.File;
31
32
41 public class AdvancedFileSystemHook extends FileSystemHook {
42
43 public void reIndex(String[] ids) {
44 long companyId = GetterUtil.getLong(ids[0]);
45 String portletId = ids[1];
46 long groupId = GetterUtil.getLong(ids[2]);
47 long repositoryId = GetterUtil.getLong(ids[3]);
48
49 File repositoryDir = getRepositoryDir(companyId, repositoryId);
50
51 String[] fileNames = FileUtil.listDirs(repositoryDir);
52
53 boolean dlFile = false;
54
55 for (String fileName : fileNames) {
56 reindex(
57 companyId, portletId, groupId, repositoryId,
58 repositoryDir.getPath() + StringPool.SLASH + fileName, dlFile);
59 }
60 }
61
62 protected void buildPath(StringBundler sb, String fileNameFragment) {
63 int fileNameFragmentLength = fileNameFragment.length();
64
65 if ((fileNameFragmentLength <= 2) || (getDepth(sb.toString()) > 3)) {
66 return;
67 }
68
69 for (int i = 0;i < fileNameFragmentLength;i += 2) {
70 if ((i + 2) < fileNameFragmentLength) {
71 sb.append(fileNameFragment.substring(i, i + 2));
72 sb.append(StringPool.SLASH);
73
74 if (getDepth(sb.toString()) > 3) {
75 return;
76 }
77 }
78 }
79
80 return;
81 }
82
83 protected int getDepth(String path) {
84 String[] fragments = StringUtil.split(path, StringPool.SLASH);
85
86 return fragments.length;
87 }
88
89 protected File getDirNameDir(
90 long companyId, long repositoryId, String dirName) {
91
92 File repositoryDir = getRepositoryDir(companyId, repositoryId);
93
94 return new File(repositoryDir + StringPool.SLASH + dirName);
95 }
96
97 protected File getFileNameDir(
98 long companyId, long repositoryId, String fileName) {
99
100 if (fileName.indexOf(CharPool.SLASH) != -1) {
101 return getDirNameDir(companyId, repositoryId, fileName);
102 }
103
104 String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);
105
106 StringBundler sb = new StringBundler();
107
108 String fileNameFragment = removeExtension(fileName);
109
110 if (fileNameFragment.startsWith("DLFE-")) {
111 fileNameFragment = fileNameFragment.substring(5);
112
113 sb.append("DLFE" + StringPool.SLASH);
114 }
115
116 buildPath(sb, fileNameFragment);
117
118 File repositoryDir = getRepositoryDir(companyId, repositoryId);
119
120 File fileNameDir = new File(
121 repositoryDir + StringPool.SLASH + sb.toString() +
122 StringPool.SLASH + fileNameFragment + ext);
123
124 return fileNameDir;
125 }
126
127 protected File getFileNameVersionFile(
128 long companyId, long repositoryId, String fileName, double version) {
129
130 String ext = StringPool.PERIOD + FileUtil.getExtension(fileName);
131
132 int pos = fileName.lastIndexOf(StringPool.SLASH);
133
134 if (pos == -1) {
135 StringBundler sb = new StringBundler();
136
137 String fileNameFragment = removeExtension(fileName);
138
139 if (fileNameFragment.startsWith("DLFE-")) {
140 fileNameFragment = fileNameFragment.substring(5);
141
142 sb.append("DLFE" + StringPool.SLASH);
143 }
144
145 buildPath(sb, fileNameFragment);
146
147 File repositoryDir = getRepositoryDir(companyId, repositoryId);
148
149 return new File(
150 repositoryDir + StringPool.SLASH + sb.toString() +
151 StringPool.SLASH + fileNameFragment + ext +
152 StringPool.SLASH + fileNameFragment +
153 StringPool.UNDERLINE + version + ext);
154 }
155 else {
156 File fileNameDir = getDirNameDir(companyId, repositoryId, fileName);
157
158 String fileNameFragment = removeExtension(
159 fileName.substring(pos + 1));
160
161 return new File(
162 fileNameDir + StringPool.SLASH + fileNameFragment +
163 StringPool.UNDERLINE + version + ext);
164 }
165 }
166
167 protected double getHeadVersionNumber(
168 long companyId, long repositoryId, String fileName) {
169
170 File fileNameDir = getFileNameDir(companyId, repositoryId, fileName);
171
172 if (!fileNameDir.exists()) {
173 return DEFAULT_VERSION;
174 }
175
176 String[] versionNumbers = FileUtil.listFiles(fileNameDir);
177
178 double headVersionNumber = DEFAULT_VERSION;
179
180 for (int i = 0; i < versionNumbers.length; i++) {
181 String versionNumberFragment = versionNumbers[i];
182
183 versionNumberFragment = removeExtension(versionNumberFragment);
184
185 int pos = versionNumberFragment.lastIndexOf(StringPool.UNDERLINE);
186
187 if (pos > -1) {
188 versionNumberFragment = versionNumberFragment.substring(
189 pos + 1);
190 }
191
192 double versionNumber = GetterUtil.getDouble(versionNumberFragment);
193
194 if (versionNumber > headVersionNumber) {
195 headVersionNumber = versionNumber;
196 }
197 }
198
199 return headVersionNumber;
200 }
201
202 protected void reindex(
203 long companyId, String portletId, long groupId, long repositoryId,
204 String fileName, boolean dlFile) {
205
206 String shortFileName = FileUtil.getShortFileName(fileName);
207
208 if (shortFileName.equals("DLFE")) {
209 dlFile = true;
210 }
211
212 if (shortFileName.equals("DLFE") ||
213 Validator.isNumber(shortFileName)) {
214
215 String[] curFileNames = FileUtil.listDirs(fileName);
216
217 for (String curFileName : curFileNames) {
218 reindex(
219 companyId, portletId, groupId, repositoryId,
220 fileName + StringPool.SLASH + curFileName, dlFile);
221 }
222 }
223 else {
224 if (dlFile) {
225 shortFileName = "DLFE-" + shortFileName;
226 }
227
228 try {
229 Document doc = DLIndexerUtil.getFileDocument(
230 companyId, portletId, groupId, 0, repositoryId,
231 shortFileName);
232
233 if (doc != null) {
234 SearchEngineUtil.updateDocument(
235 companyId, doc.get(Field.UID), doc);
236 }
237 }
238 catch (Exception e) {
239 _log.error("Reindexing " + shortFileName, e);
240 }
241 }
242 }
243
244 protected String removeExtension(String fileName) {
245 String ext = FileUtil.getExtension(fileName);
246
247 if (ext != null) {
248 fileName = fileName.substring(
249 0, fileName.length() - ext.length() - 1);
250 }
251
252 return fileName;
253 }
254
255 private static Log _log = LogFactoryUtil.getLog(
256 AdvancedFileSystemHook.class);
257
258 }