/**
* 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.engine.service;
import com.liferay.sync.engine.document.library.event.Event;
import com.liferay.sync.engine.document.library.util.FileEventManager;
import com.liferay.sync.engine.file.system.Watcher;
import com.liferay.sync.engine.file.system.util.WatcherManager;
import com.liferay.sync.engine.model.ModelListener;
import com.liferay.sync.engine.model.SyncFile;
import com.liferay.sync.engine.model.SyncSite;
import com.liferay.sync.engine.model.SyncSiteModelListener;
import com.liferay.sync.engine.service.persistence.SyncSitePersistence;
import com.liferay.sync.engine.util.FileKeyUtil;
import com.liferay.sync.engine.util.FileUtil;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Shinn Lok
*/
public class SyncSiteService {
public static SyncSite activateSyncSite(
long syncSiteId, List<SyncFile> ignoredSyncFiles, boolean reset)
throws Exception {
// Sync site
SyncSite syncSite = fetchSyncSite(syncSiteId);
if (syncSite.isActive()) {
return syncSite;
}
if (reset) {
syncSite.setRemoteSyncTime(-1);
deleteSyncFiles(syncSite);
}
// Sync file
String filePathName = syncSite.getFilePathName();
if (!FileUtil.exists(Paths.get(filePathName))) {
Files.createDirectories(Paths.get(filePathName));
SyncFile syncFile = SyncFileService.fetchSyncFile(filePathName);
FileKeyUtil.writeFileKey(
Paths.get(filePathName),
String.valueOf(syncFile.getSyncFileId()), true);
}
// Sync files
for (SyncFile syncFile : ignoredSyncFiles) {
syncFile.setModifiedTime(0);
syncFile.setState(SyncFile.STATE_UNSYNCED);
syncFile.setSyncAccountId(syncSite.getSyncAccountId());
SyncFileService.update(syncFile);
}
syncSite.setActive(true);
syncSite.setState(SyncSite.STATE_SYNCED);
syncSite.setUiEvent(SyncSite.UI_EVENT_NONE);
update(syncSite);
return syncSite;
}
public static SyncSite deactivateSyncSite(long syncSiteId) {
SyncSite syncSite = fetchSyncSite(syncSiteId);
if (!syncSite.isActive()) {
return syncSite;
}
return deactivateSyncSite(syncSite);
}
public static void deleteSyncSite(long syncSiteId) {
try {
// Sync site
SyncSite syncSite = fetchSyncSite(syncSiteId);
List<SyncFile> syncFiles = SyncFileService.findSyncFiles(
syncSite.getGroupId(), SyncFile.STATE_IN_PROGRESS,
syncSite.getSyncAccountId());
syncFiles.add(
SyncFileService.fetchSyncFile(syncSite.getFilePathName()));
for (SyncFile syncFile : syncFiles) {
Set<Event> events = FileEventManager.getEvents(
syncFile.getSyncFileId());
for (Event event : events) {
event.cancel();
}
}
_syncSitePersistence.deleteById(syncSiteId);
// Sync file
SyncFile syncFile = SyncFileService.fetchSyncFile(
syncSite.getFilePathName());
SyncFileService.deleteSyncFile(syncFile);
// Sync files
try {
deleteSyncFiles(syncSite);
}
catch (IOException ioe) {
_logger.error(ioe.getMessage(), ioe);
}
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
}
}
public static SyncSite fetchSyncSite(long syncSiteId) {
try {
return _syncSitePersistence.queryForId(syncSiteId);
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return null;
}
}
public static SyncSite fetchSyncSite(long groupId, long syncAccountId) {
try {
return _syncSitePersistence.fetchByG_S(groupId, syncAccountId);
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return null;
}
}
public static SyncSite fetchSyncSite(
String filePathName, long syncAccountId) {
try {
return _syncSitePersistence.fetchByF_S(filePathName, syncAccountId);
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return null;
}
}
public static List<SyncSite> findSyncSites(long syncAccountId) {
try {
return _syncSitePersistence.findBySyncAccountId(syncAccountId);
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return Collections.emptyList();
}
}
public static Set<Long> getActiveGroupIds(long syncAccountId) {
try {
return new HashSet<>(
_syncSitePersistence.findByA_S(true, syncAccountId, "groupId"));
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return Collections.emptySet();
}
}
public static Set<Long> getActiveSyncSiteIds(long syncAccountId) {
try {
Set<Long> activeSyncSiteIds = _activeSyncSiteIds.get(syncAccountId);
if (activeSyncSiteIds != null) {
return activeSyncSiteIds;
}
activeSyncSiteIds = new HashSet<>(
_syncSitePersistence.findByA_S(
true, syncAccountId, "syncSiteId"));
_activeSyncSiteIds.put(syncAccountId, activeSyncSiteIds);
return activeSyncSiteIds;
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return Collections.emptySet();
}
}
public static SyncSitePersistence getSyncSitePersistence() {
if (_syncSitePersistence != null) {
return _syncSitePersistence;
}
try {
_syncSitePersistence = new SyncSitePersistence();
registerModelListener(new SyncSiteModelListener());
return _syncSitePersistence;
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return null;
}
}
public static void registerModelListener(
ModelListener<SyncSite> modelListener) {
_syncSitePersistence.registerModelListener(modelListener);
}
public static SyncSite setFilePathName(
long syncSiteId, String targetFilePathName) {
// Sync site
SyncSite syncSite = fetchSyncSite(syncSiteId);
String sourceFilePathName = syncSite.getFilePathName();
syncSite.setFilePathName(targetFilePathName);
update(syncSite);
// Sync file
SyncFile syncFile = SyncFileService.fetchSyncFile(sourceFilePathName);
syncFile.setName(syncSite.getName());
syncFile.setFilePathName(targetFilePathName);
SyncFileService.update(syncFile);
// Sync files
SyncFileService.renameSyncFiles(sourceFilePathName, targetFilePathName);
return syncSite;
}
public static void unregisterModelListener(
ModelListener<SyncSite> modelListener) {
_syncSitePersistence.unregisterModelListener(modelListener);
}
public static SyncSite update(SyncSite syncSite) {
try {
_syncSitePersistence.createOrUpdate(syncSite);
return syncSite;
}
catch (SQLException sqle) {
if (_logger.isDebugEnabled()) {
_logger.debug(sqle.getMessage(), sqle);
}
return null;
}
}
protected static SyncSite deactivateSyncSite(SyncSite syncSite) {
// Sync site
syncSite.setActive(false);
syncSite = update(syncSite);
List<SyncFile> syncFiles = SyncFileService.findSyncFiles(
syncSite.getGroupId(), SyncFile.STATE_IN_PROGRESS,
syncSite.getSyncAccountId());
syncFiles.add(
SyncFileService.fetchSyncFile(syncSite.getFilePathName()));
for (SyncFile syncFile : syncFiles) {
Set<Event> events = FileEventManager.getEvents(
syncFile.getSyncFileId());
for (Event event : events) {
event.cancel();
}
}
// Sync files
try {
deleteSyncFiles(syncSite);
}
catch (IOException ioe) {
_logger.error(ioe.getMessage(), ioe);
}
if (_logger.isDebugEnabled()) {
_logger.debug("Sync site {} deactivated", syncSite.getName());
}
return syncSite;
}
protected static void deleteSyncFiles(SyncSite syncSite)
throws IOException {
SyncFile syncFile = SyncFileService.fetchSyncFile(
syncSite.getFilePathName());
if (syncFile != null) {
SyncFileService.deleteSyncFiles(syncFile, true);
}
Path filePath = Paths.get(syncSite.getFilePathName());
if (!FileUtil.exists(filePath)) {
return;
}
final Watcher watcher = WatcherManager.getWatcher(
syncSite.getSyncAccountId());
Files.walkFileTree(
filePath,
new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult postVisitDirectory(
Path filePath, IOException ioe)
throws IOException {
if (ioe != null) {
return super.postVisitDirectory(filePath, ioe);
}
watcher.addDeletedFilePathName(filePath.toString());
FileUtil.deleteFile(filePath);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(
Path filePath, BasicFileAttributes basicFileAttributes)
throws IOException {
watcher.addDeletedFilePathName(filePath.toString());
FileUtil.deleteFile(filePath);
return FileVisitResult.CONTINUE;
}
});
}
private static final Logger _logger = LoggerFactory.getLogger(
SyncSiteService.class);
private static final Map<Long, Set<Long>> _activeSyncSiteIds =
new HashMap<>();
private static SyncSitePersistence _syncSitePersistence =
getSyncSitePersistence();
}