2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portal.convert;
\r
17 import com.liferay.documentlibrary.util.FileSystemHook;
\r
18 import com.liferay.portal.kernel.exception.SystemException;
\r
19 import com.liferay.portal.kernel.log.Log;
\r
20 import com.liferay.portal.kernel.log.LogFactoryUtil;
\r
21 import com.liferay.portal.kernel.search.Indexer;
\r
22 import com.liferay.portal.kernel.util.ListUtil;
\r
23 import com.liferay.portal.kernel.util.PropsKeys;
\r
24 import com.liferay.portal.kernel.util.StringBundler;
\r
25 import com.liferay.portal.kernel.util.StringPool;
\r
26 import com.liferay.portal.kernel.workflow.WorkflowConstants;
\r
27 import com.liferay.portal.model.CompanyConstants;
\r
28 import com.liferay.portal.security.pacl.PACLClassLoaderUtil;
\r
29 import com.liferay.portal.util.MaintenanceUtil;
\r
30 import com.liferay.portal.util.PropsValues;
\r
31 import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;
\r
32 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
\r
33 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
\r
34 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
\r
35 import com.liferay.portlet.documentlibrary.store.AdvancedFileSystemStoreCO3;
\r
36 import com.liferay.portlet.documentlibrary.store.AdvancedFileSystemStore;
\r
37 import com.liferay.portlet.documentlibrary.store.CMISStore;
\r
38 import com.liferay.portlet.documentlibrary.store.FileSystemStore;
\r
39 import com.liferay.portlet.documentlibrary.store.JCRStore;
\r
40 import com.liferay.portlet.documentlibrary.store.S3Store;
\r
41 import com.liferay.portlet.documentlibrary.store.Store;
\r
42 import com.liferay.portlet.documentlibrary.store.StoreFactory;
\r
43 import com.liferay.portlet.documentlibrary.util.comparator.FileVersionVersionComparator;
\r
44 import com.liferay.portlet.messageboards.model.MBMessage;
\r
45 import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
\r
46 import com.liferay.portlet.wiki.model.WikiPage;
\r
47 import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
\r
49 import java.io.InputStream;
\r
51 import java.util.List;
\r
54 * @author Minhchau Dang
\r
55 * @author Alexander Chow
\r
57 public class ConvertDocumentLibrary extends ConvertProcess {
\r
60 public String getDescription() {
\r
61 return "migrate-documents-from-one-repository-to-another";
\r
65 public String getParameterDescription() {
\r
66 return "please-select-a-new-repository-hook";
\r
70 public String[] getParameterNames() {
\r
71 StringBundler sb = new StringBundler(_HOOKS.length * 2 + 2);
\r
73 sb.append(PropsKeys.DL_STORE_IMPL);
\r
74 sb.append(StringPool.EQUAL);
\r
76 for (String hook : _HOOKS) {
\r
77 if (!hook.equals(PropsValues.DL_STORE_IMPL)) {
\r
79 sb.append(StringPool.SEMICOLON);
\r
83 return new String[] {sb.toString()};
\r
87 public boolean isEnabled() {
\r
92 protected void doConvert() throws Exception {
\r
93 _sourceStore = StoreFactory.getInstance();
\r
95 _hook = new FileSystemHook();
\r
97 String[] values = getParameterValues();
\r
99 String targetStoreClassName = values[0];
\r
101 ClassLoader classLoader = PACLClassLoaderUtil.getPortalClassLoader();
\r
103 _targetStore = (Store)classLoader.loadClass(
\r
104 targetStoreClassName).newInstance();
\r
108 StoreFactory.setInstance(_targetStore);
\r
110 MaintenanceUtil.appendStatus(
\r
111 "Please set " + PropsKeys.DL_STORE_IMPL +
\r
112 " in your portal-ext.properties to use " +
\r
113 targetStoreClassName);
\r
115 PropsValues.DL_STORE_IMPL = targetStoreClassName;
\r
118 protected List<DLFileVersion> getDLFileVersions(DLFileEntry dlFileEntry)
\r
119 throws SystemException {
\r
121 List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(
\r
122 WorkflowConstants.STATUS_ANY);
\r
124 return ListUtil.sort(
\r
125 dlFileVersions, new FileVersionVersionComparator(true));
\r
128 protected void migrateDL() throws Exception {
\r
129 int count = DLFileEntryLocalServiceUtil.getFileEntriesCount();
\r
131 MaintenanceUtil.appendStatus(
\r
132 "Migrating " + count + " document library files");
\r
134 int pages = count / Indexer.DEFAULT_INTERVAL;
\r
136 for (int i = 0; i <= pages; i++) {
\r
137 int start = (i * Indexer.DEFAULT_INTERVAL);
\r
138 int end = start + Indexer.DEFAULT_INTERVAL;
\r
140 List<DLFileEntry> dlFileEntries =
\r
141 DLFileEntryLocalServiceUtil.getFileEntries(start, end);
\r
143 for (DLFileEntry dlFileEntry : dlFileEntries) {
\r
144 long companyId = dlFileEntry.getCompanyId();
\r
145 long repositoryId = dlFileEntry.getDataRepositoryId();
\r
147 migrateDLFileEntry(companyId, repositoryId, dlFileEntry);
\r
152 protected void migrateDLFileEntry(
\r
153 long companyId, long repositoryId, DLFileEntry fileEntry)
\r
156 String fileNameLR5 = "DLFE-" + fileEntry.getName() + "." + fileEntry.getExtension();
\r
158 List<DLFileVersion> dlFileVersions = getDLFileVersions(fileEntry);
\r
160 if (dlFileVersions.isEmpty()) {
\r
161 String versionNumber = Store.VERSION_DEFAULT;
\r
163 migrateFile(companyId, repositoryId, fileEntry.getName(), fileNameLR5, versionNumber);
\r
168 for (DLFileVersion dlFileVersion : dlFileVersions) {
\r
169 String versionNumber = dlFileVersion.getVersion();
\r
171 migrateFile(companyId, repositoryId, fileEntry.getName(), fileNameLR5, versionNumber);
\r
175 protected void migrateFile(
\r
176 long companyId, long repositoryId, String fileName, String fileNameLR5,
\r
177 String versionNumber) {
\r
180 String versionNumberLR5 = versionNumber;
\r
181 if(versionNumberLR5.contains(",")){
\r
182 versionNumberLR5 = versionNumberLR5.replaceAll(",", ".");
\r
184 System.out.println("CONVERT " + fileNameLR5 + " - version " + versionNumberLR5);
\r
185 InputStream is = _hook.getFileAsStream(
\r
186 companyId, repositoryId, fileNameLR5, Double.valueOf(versionNumberLR5));
\r
188 /*_sourceStore.getFileAsStream(
\r
189 companyId, repositoryId, fileName, versionNumber);*/
\r
191 if(versionNumber.contains(".")){
\r
192 versionNumber = versionNumber.replaceAll(".", ",");
\r
195 if (versionNumber.equals(Store.VERSION_DEFAULT)) {
\r
196 _targetStore.addFile(companyId, repositoryId, fileName, is);
\r
199 _targetStore.updateFile(
\r
200 companyId, repositoryId, fileName, versionNumber, is);
\r
203 catch (Exception e) {
\r
204 _log.error("Migration failed for " + fileName, e);
\r
208 protected void migrateFiles(
\r
209 long companyId, String dirName, String[] fileNames)
\r
212 long repositoryId = CompanyConstants.SYSTEM;
\r
213 String versionNumber = Store.VERSION_DEFAULT;
\r
216 _targetStore.addDirectory(companyId, repositoryId, dirName);
\r
218 catch (DuplicateDirectoryException dde) {
\r
221 for (String fileName : fileNames) {
\r
222 if (fileName.startsWith(StringPool.SLASH)) {
\r
223 fileName = fileName.substring(1);
\r
226 migrateFile(companyId, repositoryId, fileName, fileName, versionNumber);
\r
230 protected void migrateMB() throws Exception {
\r
231 int count = MBMessageLocalServiceUtil.getMBMessagesCount();
\r
233 MaintenanceUtil.appendStatus(
\r
234 "Migrating message boards attachments in " + count + " messages");
\r
236 int pages = count / Indexer.DEFAULT_INTERVAL;
\r
238 for (int i = 0; i <= pages; i++) {
\r
239 int start = (i * Indexer.DEFAULT_INTERVAL);
\r
240 int end = start + Indexer.DEFAULT_INTERVAL;
\r
242 List<MBMessage> messages = MBMessageLocalServiceUtil.getMBMessages(
\r
245 for (MBMessage message : messages) {
\r
247 message.getCompanyId(), message.getAttachmentsDir(),
\r
248 message.getAttachmentsFiles());
\r
253 protected void migratePortlets() throws Exception {
\r
259 protected void migrateWiki() throws Exception {
\r
260 int count = WikiPageLocalServiceUtil.getWikiPagesCount();
\r
262 MaintenanceUtil.appendStatus(
\r
263 "Migrating wiki page attachments in " + count + " pages");
\r
265 int pages = count / Indexer.DEFAULT_INTERVAL;
\r
267 for (int i = 0; i <= pages; i++) {
\r
268 int start = (i * Indexer.DEFAULT_INTERVAL);
\r
269 int end = start + Indexer.DEFAULT_INTERVAL;
\r
271 List<WikiPage> wikiPages = WikiPageLocalServiceUtil.getWikiPages(
\r
274 for (WikiPage wikiPage : wikiPages) {
\r
275 if (!wikiPage.isHead()) {
\r
280 wikiPage.getCompanyId(), wikiPage.getAttachmentsDir(),
\r
281 wikiPage.getAttachmentsFiles());
\r
286 private static final String[] _HOOKS = new String[] {
\r
287 AdvancedFileSystemStoreCO3.class.getName(), AdvancedFileSystemStore.class.getName(), CMISStore.class.getName(),
\r
288 FileSystemStore.class.getName(), JCRStore.class.getName(),
\r
289 S3Store.class.getName()
\r
292 private static Log _log = LogFactoryUtil.getLog(
\r
293 ConvertDocumentLibrary.class);
\r
295 private Store _sourceStore;
\r
296 private Store _targetStore;
\r
297 private FileSystemHook _hook;
\r