package org.peerbox.watchservice.states; import java.nio.file.Path; import org.hive2hive.core.exceptions.NoPeerConnectionException; import org.hive2hive.core.exceptions.NoSessionException; import org.hive2hive.processframework.exceptions.InvalidProcessStateException; import org.hive2hive.processframework.exceptions.ProcessExecutionException; import org.peerbox.app.manager.file.FileInfo; import org.peerbox.app.manager.file.IFileManager; import org.peerbox.watchservice.IAction; import org.peerbox.watchservice.filetree.IFileTree; import org.peerbox.watchservice.states.listeners.LocalFileMoveListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Files in the LocalMove state have been locally moved. The file already exists * at the destination of the move operation, both in the file-system and in the * {@link org.peerbox.watchservice.filetree.FileTree FileTree} representing it. * The source path of the file is known and provided to the H2H network. * @author Claudio * */ public class LocalMoveState extends AbstractActionState { private final static Logger logger = LoggerFactory.getLogger(LocalMoveState.class); private Path source; public LocalMoveState(IAction action, Path source) { super(action, StateType.LOCAL_MOVE); this.source = source; } public Path getSourcePath() { return source; } @Override public ExecutionHandle execute(IFileManager fileManager) throws NoSessionException, NoPeerConnectionException, ProcessExecutionException, InvalidProcessStateException { final Path path = action.getFile().getPath(); handle = fileManager.move(source, path); if(handle != null){ FileInfo destFile = new FileInfo(action.getFile()); FileInfo sourceFile = new FileInfo(source, action.getFile().isFolder()); handle.getProcess().attachListener(new LocalFileMoveListener(sourceFile, destFile, action.getFileEventManager().getMessageBus())); handle.executeAsync(); } String contentHash = action.getFile().getContentHash(); // Path pathToRemove = action.getFile().getPath(); IFileTree fileTree = action.getFileEventManager().getFileTree(); boolean isRemoved = fileTree.getCreatedByContentHash().get(contentHash).remove(action.getFile()); logger.trace("IsRemoved for file {} with hash {}: {}", action.getFile().getPath(), contentHash, isRemoved); logger.debug("Task \"Move File\" executed from: " + source.toString() + " to " + path.toString()); return new ExecutionHandle(action, handle); } @Override public AbstractActionState changeStateOnLocalCreate() { logStateTransition(getStateType(), EventType.LOCAL_CREATE, StateType.INITIAL); return new InitialState(action); } @Override public AbstractActionState changeStateOnLocalUpdate() { logStateTransition(getStateType(), EventType.LOCAL_UPDATE, StateType.LOCAL_MOVE); return this; } @Override public AbstractActionState changeStateOnLocalMove(Path destination) { logStateTransition(getStateType(), EventType.LOCAL_MOVE, StateType.INITIAL); return new InitialState(action); } @Override public AbstractActionState changeStateOnRemoteUpdate() { logStateTransition(getStateType(), EventType.REMOTE_UPDATE, StateType.REMOTE_UPDATE); return new EstablishedState(action); } @Override public AbstractActionState changeStateOnRemoteDelete() { logStateTransition(getStateType(), EventType.REMOTE_DELETE, StateType.LOCAL_CREATE); return new EstablishedState(action); } @Override public AbstractActionState changeStateOnRemoteMove(Path oldFilePath) { logStateTransition(getStateType(), EventType.REMOTE_MOVE, StateType.LOCAL_MOVE); return new EstablishedState(action); } @Override public AbstractActionState changeStateOnRemoteCreate() { logStateTransition(getStateType(), EventType.REMOTE_CREATE, StateType.REMOTE_CREATE); return new EstablishedState(action); } @Override public AbstractActionState handleRemoteCreate() { action.getFileEventManager().initiateForceSync(action.getFile().getPath() .getParent()); return changeStateOnRemoteCreate(); } @Override public AbstractActionState handleRemoteDelete() { action.updateTimeAndQueue(); action.getFileEventManager().initiateForceSync(action.getFile().getPath() .getParent()); return changeStateOnRemoteDelete(); } @Override public AbstractActionState handleRemoteUpdate() { action.getFileEventManager().initiateForceSync(action.getFile().getPath() .getParent()); return changeStateOnRemoteUpdate(); } @Override public AbstractActionState handleRemoteMove(Path path) { action.getFileEventManager().initiateForceSync(action.getFile().getPath() .getParent()); return changeStateOnRemoteMove(path); } }