--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portal.convert;\r
+\r
+import com.liferay.documentlibrary.util.FileSystemHook;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.search.Indexer;\r
+import com.liferay.portal.kernel.util.ListUtil;\r
+import com.liferay.portal.kernel.util.PropsKeys;\r
+import com.liferay.portal.kernel.util.StringBundler;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.workflow.WorkflowConstants;\r
+import com.liferay.portal.model.CompanyConstants;\r
+import com.liferay.portal.security.pacl.PACLClassLoaderUtil;\r
+import com.liferay.portal.util.MaintenanceUtil;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portlet.documentlibrary.DuplicateDirectoryException;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntry;\r
+import com.liferay.portlet.documentlibrary.model.DLFileVersion;\r
+import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.store.AdvancedFileSystemStoreCO3;\r
+import com.liferay.portlet.documentlibrary.store.AdvancedFileSystemStore;\r
+import com.liferay.portlet.documentlibrary.store.CMISStore;\r
+import com.liferay.portlet.documentlibrary.store.FileSystemStore;\r
+import com.liferay.portlet.documentlibrary.store.JCRStore;\r
+import com.liferay.portlet.documentlibrary.store.S3Store;\r
+import com.liferay.portlet.documentlibrary.store.Store;\r
+import com.liferay.portlet.documentlibrary.store.StoreFactory;\r
+import com.liferay.portlet.documentlibrary.util.comparator.FileVersionVersionComparator;\r
+import com.liferay.portlet.messageboards.model.MBMessage;\r
+import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;\r
+import com.liferay.portlet.wiki.model.WikiPage;\r
+import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;\r
+\r
+import java.io.InputStream;\r
+\r
+import java.util.List;\r
+\r
+/**\r
+ * @author Minhchau Dang\r
+ * @author Alexander Chow\r
+ */\r
+public class ConvertDocumentLibrary extends ConvertProcess {\r
+\r
+ @Override\r
+ public String getDescription() {\r
+ return "migrate-documents-from-one-repository-to-another";\r
+ }\r
+\r
+ @Override\r
+ public String getParameterDescription() {\r
+ return "please-select-a-new-repository-hook";\r
+ }\r
+\r
+ @Override\r
+ public String[] getParameterNames() {\r
+ StringBundler sb = new StringBundler(_HOOKS.length * 2 + 2);\r
+\r
+ sb.append(PropsKeys.DL_STORE_IMPL);\r
+ sb.append(StringPool.EQUAL);\r
+\r
+ for (String hook : _HOOKS) {\r
+ if (!hook.equals(PropsValues.DL_STORE_IMPL)) {\r
+ sb.append(hook);\r
+ sb.append(StringPool.SEMICOLON);\r
+ }\r
+ }\r
+\r
+ return new String[] {sb.toString()};\r
+ }\r
+\r
+ @Override\r
+ public boolean isEnabled() {\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ protected void doConvert() throws Exception {\r
+ _sourceStore = StoreFactory.getInstance();\r
+ \r
+ _hook = new FileSystemHook();\r
+\r
+ String[] values = getParameterValues();\r
+\r
+ String targetStoreClassName = values[0];\r
+\r
+ ClassLoader classLoader = PACLClassLoaderUtil.getPortalClassLoader();\r
+\r
+ _targetStore = (Store)classLoader.loadClass(\r
+ targetStoreClassName).newInstance();\r
+\r
+ migratePortlets();\r
+\r
+ StoreFactory.setInstance(_targetStore);\r
+\r
+ MaintenanceUtil.appendStatus(\r
+ "Please set " + PropsKeys.DL_STORE_IMPL +\r
+ " in your portal-ext.properties to use " +\r
+ targetStoreClassName);\r
+\r
+ PropsValues.DL_STORE_IMPL = targetStoreClassName;\r
+ }\r
+\r
+ protected List<DLFileVersion> getDLFileVersions(DLFileEntry dlFileEntry)\r
+ throws SystemException {\r
+\r
+ List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(\r
+ WorkflowConstants.STATUS_ANY);\r
+\r
+ return ListUtil.sort(\r
+ dlFileVersions, new FileVersionVersionComparator(true));\r
+ }\r
+\r
+ protected void migrateDL() throws Exception {\r
+ int count = DLFileEntryLocalServiceUtil.getFileEntriesCount();\r
+\r
+ MaintenanceUtil.appendStatus(\r
+ "Migrating " + count + " document library files");\r
+\r
+ int pages = count / Indexer.DEFAULT_INTERVAL;\r
+\r
+ for (int i = 0; i <= pages; i++) {\r
+ int start = (i * Indexer.DEFAULT_INTERVAL);\r
+ int end = start + Indexer.DEFAULT_INTERVAL;\r
+\r
+ List<DLFileEntry> dlFileEntries =\r
+ DLFileEntryLocalServiceUtil.getFileEntries(start, end);\r
+\r
+ for (DLFileEntry dlFileEntry : dlFileEntries) {\r
+ long companyId = dlFileEntry.getCompanyId();\r
+ long repositoryId = dlFileEntry.getDataRepositoryId();\r
+\r
+ migrateDLFileEntry(companyId, repositoryId, dlFileEntry);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void migrateDLFileEntry(\r
+ long companyId, long repositoryId, DLFileEntry fileEntry)\r
+ throws Exception {\r
+\r
+ String fileNameLR5 = "DLFE-" + fileEntry.getName() + "." + fileEntry.getExtension();\r
+\r
+ List<DLFileVersion> dlFileVersions = getDLFileVersions(fileEntry);\r
+\r
+ if (dlFileVersions.isEmpty()) {\r
+ String versionNumber = Store.VERSION_DEFAULT;\r
+\r
+ migrateFile(companyId, repositoryId, fileEntry.getName(), fileNameLR5, versionNumber);\r
+\r
+ return;\r
+ }\r
+\r
+ for (DLFileVersion dlFileVersion : dlFileVersions) {\r
+ String versionNumber = dlFileVersion.getVersion();\r
+\r
+ migrateFile(companyId, repositoryId, fileEntry.getName(), fileNameLR5, versionNumber);\r
+ }\r
+ }\r
+\r
+ protected void migrateFile(\r
+ long companyId, long repositoryId, String fileName, String fileNameLR5,\r
+ String versionNumber) {\r
+\r
+ try {\r
+ String versionNumberLR5 = versionNumber;\r
+ if(versionNumberLR5.contains(",")){\r
+ versionNumberLR5 = versionNumberLR5.replaceAll(",", ".");\r
+ }\r
+ System.out.println("CONVERT " + fileNameLR5 + " - version " + versionNumberLR5);\r
+ InputStream is = _hook.getFileAsStream(\r
+ companyId, repositoryId, fileNameLR5, Double.valueOf(versionNumberLR5));\r
+ \r
+ /*_sourceStore.getFileAsStream(\r
+ companyId, repositoryId, fileName, versionNumber);*/\r
+ \r
+ if(versionNumber.contains(".")){\r
+ versionNumber = versionNumber.replaceAll(".", ",");\r
+ }\r
+\r
+ if (versionNumber.equals(Store.VERSION_DEFAULT)) {\r
+ _targetStore.addFile(companyId, repositoryId, fileName, is);\r
+ }\r
+ else {\r
+ _targetStore.updateFile(\r
+ companyId, repositoryId, fileName, versionNumber, is);\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ _log.error("Migration failed for " + fileName, e);\r
+ }\r
+ }\r
+\r
+ protected void migrateFiles(\r
+ long companyId, String dirName, String[] fileNames)\r
+ throws Exception {\r
+\r
+ long repositoryId = CompanyConstants.SYSTEM;\r
+ String versionNumber = Store.VERSION_DEFAULT;\r
+\r
+ try {\r
+ _targetStore.addDirectory(companyId, repositoryId, dirName);\r
+ }\r
+ catch (DuplicateDirectoryException dde) {\r
+ }\r
+\r
+ for (String fileName : fileNames) {\r
+ if (fileName.startsWith(StringPool.SLASH)) {\r
+ fileName = fileName.substring(1);\r
+ }\r
+ \r
+ migrateFile(companyId, repositoryId, fileName, fileName, versionNumber);\r
+ }\r
+ }\r
+\r
+ protected void migrateMB() throws Exception {\r
+ int count = MBMessageLocalServiceUtil.getMBMessagesCount();\r
+\r
+ MaintenanceUtil.appendStatus(\r
+ "Migrating message boards attachments in " + count + " messages");\r
+\r
+ int pages = count / Indexer.DEFAULT_INTERVAL;\r
+\r
+ for (int i = 0; i <= pages; i++) {\r
+ int start = (i * Indexer.DEFAULT_INTERVAL);\r
+ int end = start + Indexer.DEFAULT_INTERVAL;\r
+\r
+ List<MBMessage> messages = MBMessageLocalServiceUtil.getMBMessages(\r
+ start, end);\r
+\r
+ for (MBMessage message : messages) {\r
+ migrateFiles(\r
+ message.getCompanyId(), message.getAttachmentsDir(),\r
+ message.getAttachmentsFiles());\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void migratePortlets() throws Exception {\r
+ migrateDL();\r
+ migrateMB();\r
+ migrateWiki();\r
+ }\r
+\r
+ protected void migrateWiki() throws Exception {\r
+ int count = WikiPageLocalServiceUtil.getWikiPagesCount();\r
+\r
+ MaintenanceUtil.appendStatus(\r
+ "Migrating wiki page attachments in " + count + " pages");\r
+\r
+ int pages = count / Indexer.DEFAULT_INTERVAL;\r
+\r
+ for (int i = 0; i <= pages; i++) {\r
+ int start = (i * Indexer.DEFAULT_INTERVAL);\r
+ int end = start + Indexer.DEFAULT_INTERVAL;\r
+\r
+ List<WikiPage> wikiPages = WikiPageLocalServiceUtil.getWikiPages(\r
+ start, end);\r
+\r
+ for (WikiPage wikiPage : wikiPages) {\r
+ if (!wikiPage.isHead()) {\r
+ continue;\r
+ }\r
+\r
+ migrateFiles(\r
+ wikiPage.getCompanyId(), wikiPage.getAttachmentsDir(),\r
+ wikiPage.getAttachmentsFiles());\r
+ }\r
+ }\r
+ }\r
+\r
+ private static final String[] _HOOKS = new String[] {\r
+ AdvancedFileSystemStoreCO3.class.getName(), AdvancedFileSystemStore.class.getName(), CMISStore.class.getName(),\r
+ FileSystemStore.class.getName(), JCRStore.class.getName(),\r
+ S3Store.class.getName()\r
+ };\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(\r
+ ConvertDocumentLibrary.class);\r
+\r
+ private Store _sourceStore;\r
+ private Store _targetStore;\r
+ private FileSystemHook _hook;\r
+\r
+}
\ No newline at end of file