/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.sync.internal.upgrade.v1_0_2;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.service.DLSyncEventLocalService;
import com.liferay.portal.dao.orm.common.SQLTransformer;
import com.liferay.portal.kernel.dao.db.DB;
import com.liferay.portal.kernel.dao.db.DBManagerUtil;
import com.liferay.portal.kernel.dao.jdbc.AutoBatchPreparedStatementUtil;
import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.Property;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.GroupLocalService;
import com.liferay.portal.kernel.upgrade.UpgradeProcess;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.LoggingTimer;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.sync.constants.SyncDLObjectConstants;
import com.liferay.sync.service.configuration.SyncServiceConfigurationValues;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
/**
* @author Dennis Ju
*/
public class UpgradeSyncDLObject extends UpgradeProcess {
public UpgradeSyncDLObject(
DLSyncEventLocalService dlSyncEventLocalService,
GroupLocalService groupLocalService) {
_dlSyncEventLocalService = dlSyncEventLocalService;
_groupLocalService = groupLocalService;
}
@Override
protected void doUpgrade() throws Exception {
try (LoggingTimer loggingTimer = new LoggingTimer()) {
ActionableDynamicQuery actionableDynamicQuery =
_groupLocalService.getActionableDynamicQuery();
actionableDynamicQuery.setAddCriteriaMethod(
new ActionableDynamicQuery.AddCriteriaMethod() {
@Override
public void addCriteria(DynamicQuery dynamicQuery) {
Property classNameId = PropertyFactoryUtil.forName(
"classNameId");
Property siteProperty = PropertyFactoryUtil.forName(
"site");
dynamicQuery.add(
RestrictionsFactoryUtil.or(
classNameId.eq(
PortalUtil.getClassNameId(User.class)),
siteProperty.eq(true)));
}
});
actionableDynamicQuery.setPerformActionMethod(
new ActionableDynamicQuery.PerformActionMethod<Group>() {
@Override
public void performAction(Group group)
throws PortalException {
if (group.isStaged()) {
return;
}
try {
verifyDLFileEntriesAndFolders(group.getGroupId());
verifyLocks(group.getGroupId());
verifyMacPackages(group.getGroupId());
}
catch (Exception e) {
throw new PortalException(e);
}
}
});
actionableDynamicQuery.performActions();
_dlSyncEventLocalService.deleteDLSyncEvents();
}
}
protected void verifyDLFileEntriesAndFolders(long groupId)
throws Exception {
StringBundler sb1 = new StringBundler(51);
sb1.append("select DLFolder.companyId, DLFolder.userId, ");
sb1.append("DLFolder.userName, DLFolder.createDate, ");
sb1.append("DLFolder.modifiedDate, DLFolder.repositoryId, ");
sb1.append("DLFolder.parentFolderId as parentFolderId, ");
sb1.append("DLFolder.treePath, DLFolder.name, '' as extension, ");
sb1.append("'' as mimeType, DLFolder.description, '' as ");
sb1.append("changeLog, '' as version, 0 as versionId, 0 as size_, '");
sb1.append(SyncDLObjectConstants.TYPE_FOLDER);
sb1.append("' as type, DLFolder.folderId as typePK, ");
sb1.append("DLFolder.uuid_ as typeUuid, DLFolder.status ");
sb1.append("from DLFolder where DLFolder.repositoryId = ");
sb1.append(groupId);
sb1.append(" union all select DLFileVersion.companyId, ");
sb1.append("DLFileVersion.userId, DLFileVersion.userName, ");
sb1.append("DLFileVersion.createDate, DLFileVersion.modifiedDate, ");
sb1.append("DLFileVersion.repositoryId, DLFileVersion.folderId as ");
sb1.append("parentFolderId, DLFileVersion.treePath, ");
sb1.append("DLFileVersion.title as name, DLFileVersion.extension, ");
sb1.append("DLFileVersion.mimeType, DLFileVersion.description, ");
sb1.append("DLFileVersion.changeLog, DLFileVersion.version, ");
sb1.append("DLFileVersion.fileVersionId as versionId, ");
sb1.append("DLFileVersion.size_ as size_, '");
sb1.append(SyncDLObjectConstants.TYPE_FILE);
sb1.append("' as type, DLFileVersion.fileEntryId as typePK, ");
sb1.append("DLFileEntry.uuid_ as typeUuid, DLFileVersion.status ");
sb1.append("from DLFileEntry, DLFileVersion where ");
sb1.append("DLFileEntry.repositoryId = ");
sb1.append(groupId);
sb1.append(" and DLFileEntry.fileEntryId = DLFileVersion.fileEntryId ");
sb1.append("and DLFileEntry.version = DLFileVersion.version ");
sb1.append("union all select DLFileVersion.companyId, ");
sb1.append("DLFileVersion.userId, DLFileVersion.userName, ");
sb1.append("DLFileVersion.createDate, DLFileVersion.modifiedDate, ");
sb1.append("DLFileVersion.repositoryId, DLFileVersion.folderId ");
sb1.append("as parentFolderId, DLFileVersion.treePath, ");
sb1.append("DLFileVersion.title as name, DLFileVersion.extension, ");
sb1.append("DLFileVersion.mimeType, DLFileVersion.description, ");
sb1.append("DLFileVersion.changeLog, DLFileVersion.version, ");
sb1.append("DLFileVersion.fileVersionId as versionId, ");
sb1.append("DLFileVersion.size_ as size_, '");
sb1.append(SyncDLObjectConstants.TYPE_PRIVATE_WORKING_COPY);
sb1.append("' as type, DLFileVersion.fileEntryId as typePK, ");
sb1.append("DLFileEntry.uuid_ as typeUuid, DLFileVersion.status ");
sb1.append("from DLFileEntry, DLFileVersion where ");
sb1.append("DLFileEntry.repositoryId = ");
sb1.append(groupId);
sb1.append(" and DLFileEntry.fileEntryId = DLFileVersion.fileEntryId ");
sb1.append("and DLFileVersion.version = '");
sb1.append(DLFileEntryConstants.PRIVATE_WORKING_COPY_VERSION);
sb1.append("'");
StringBundler sb2 = new StringBundler(6);
sb2.append("insert into SyncDLObject (syncDLObjectId, companyId, ");
sb2.append("userId, userName, createTime, modifiedTime, ");
sb2.append("repositoryId, parentFolderId, treePath, name, extension, ");
sb2.append("mimeType, description, changeLog, version, versionId, ");
sb2.append("size_, event, type_, typePK, typeUuid) values (?, ?, ?, ");
sb2.append("?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
try (PreparedStatement ps1 = connection.prepareStatement(
sb1.toString());
PreparedStatement ps2 =
AutoBatchPreparedStatementUtil.concurrentAutoBatch(
connection, sb2.toString());
ResultSet rs = ps1.executeQuery()) {
while (rs.next()) {
Timestamp createDate = rs.getTimestamp("createDate");
Timestamp modifiedDate = rs.getTimestamp("modifiedDate");
int status = rs.getInt("status");
String event = StringPool.BLANK;
if (status == WorkflowConstants.STATUS_IN_TRASH) {
event = SyncDLObjectConstants.EVENT_TRASH;
}
else {
event = SyncDLObjectConstants.EVENT_ADD;
}
ps2.setLong(1, _increment());
ps2.setLong(2, rs.getLong("companyId"));
ps2.setLong(3, rs.getLong("userId"));
ps2.setString(4, rs.getString("userName"));
ps2.setLong(5, createDate.getTime());
ps2.setLong(6, modifiedDate.getTime());
ps2.setLong(7, groupId);
ps2.setLong(8, rs.getLong("parentFolderId"));
ps2.setString(9, rs.getString("treePath"));
ps2.setString(10, rs.getString("name"));
ps2.setString(11, rs.getString("extension"));
ps2.setString(12, rs.getString("mimeType"));
ps2.setString(13, rs.getString("description"));
ps2.setString(14, rs.getString("changeLog"));
ps2.setString(15, rs.getString("version"));
ps2.setLong(16, rs.getLong("versionId"));
ps2.setLong(17, rs.getLong("size_"));
ps2.setString(18, event);
ps2.setString(19, rs.getString("type"));
ps2.setLong(20, rs.getLong("typePK"));
ps2.setString(21, rs.getString("typeUuid"));
ps2.addBatch();
}
ps2.executeBatch();
}
}
protected void verifyLocks(long groupId) throws Exception {
StringBundler sb = new StringBundler(5);
sb.append("select Lock_.expirationDate, Lock_.userId, ");
sb.append("Lock_.userName, DLFileVersion.fileEntryId from ");
sb.append("DLFileVersion, Lock_ where DLFileVersion.version = '");
sb.append(DLFileEntryConstants.PRIVATE_WORKING_COPY_VERSION);
sb.append("' and CAST_TEXT(DLFileVersion.fileEntryId) = Lock_.key_");
String sql = SQLTransformer.transform(sb.toString());
try (PreparedStatement ps1 = connection.prepareStatement(sql);
PreparedStatement ps2 =
AutoBatchPreparedStatementUtil.concurrentAutoBatch(
connection,
"update SyncDLObject set lockExpirationDate = ?, " +
"lockUserId = ?, lockUserName = ? where typePK = ? " +
"and repositoryId = " + groupId);
ResultSet rs = ps1.executeQuery()) {
while (rs.next()) {
ps2.setTimestamp(1, rs.getTimestamp("expirationDate"));
ps2.setLong(2, rs.getLong("userId"));
ps2.setString(3, rs.getString("userName"));
ps2.setLong(4, rs.getLong("fileEntryId"));
ps2.addBatch();
}
ps2.executeBatch();
}
}
protected void verifyMacPackages(long groupId) throws Exception {
String[] fileNames =
SyncServiceConfigurationValues.SYNC_MAC_PACKAGE_METADATA_FILE_NAMES;
StringBundler sb = new StringBundler((fileNames.length * 4) + 5);
sb.append("select DLFolder.folderId, DLFolder.name from DLFolder, ");
sb.append("DLFileEntry where DLFolder.repositoryId = ");
sb.append(groupId);
sb.append(" and DLFileEntry.folderId = DLFolder.folderId and ");
sb.append("DLFileEntry.title in (");
for (int i = 0; i < fileNames.length; i++) {
sb.append(StringPool.APOSTROPHE);
sb.append(fileNames[i]);
sb.append(StringPool.APOSTROPHE);
if (i != (fileNames.length - 1)) {
sb.append(CharPool.COMMA);
}
}
sb.append(")");
try (PreparedStatement ps1 = connection.prepareStatement(sb.toString());
PreparedStatement ps2 =
AutoBatchPreparedStatementUtil.concurrentAutoBatch(
connection,
"update SyncDLObject set extraSettings = ? where typePK " +
"= ?");
ResultSet rs = ps1.executeQuery()) {
while (rs.next()) {
long folderId = rs.getLong("folderId");
String name = rs.getString("name");
String extension = FileUtil.getExtension(name);
if (!ArrayUtil.contains(
SyncServiceConfigurationValues.
SYNC_MAC_PACKAGE_FOLDER_EXTENSIONS, extension)) {
continue;
}
JSONObject extraSettingsJSONObject =
JSONFactoryUtil.createJSONObject();
extraSettingsJSONObject.put("macPackage", true);
ps2.setString(1, extraSettingsJSONObject.toString());
ps2.setLong(2, folderId);
ps2.addBatch();
}
ps2.executeBatch();
}
}
private static long _increment() {
DB db = DBManagerUtil.getDB();
return db.increment();
}
private final DLSyncEventLocalService _dlSyncEventLocalService;
private final GroupLocalService _groupLocalService;
}