Search in sources :

Example 6 with RenameFileCommand

use of org.alfresco.filesys.repo.rules.commands.RenameFileCommand in project alfresco-repository by Alfresco.

the class ScenarioTempDeleteShuffleInstance method evaluate.

/**
 * Evaluate the next operation
 * @param operation
 */
public Command evaluate(Operation operation) {
    /**
     * Anti-pattern : timeout
     */
    Date now = new Date();
    if (now.getTime() > startTime.getTime() + getTimeout()) {
        if (logger.isDebugEnabled()) {
            logger.debug("Instance timed out lockName:" + lockName);
            isComplete = true;
            return null;
        }
    }
    switch(internalState) {
        case NONE:
            /**
             * Looking for target file being deleted
             *
             * Need to intervene and replace delete with a rename to temp file.
             */
            if (operation instanceof DeleteFileOperation) {
                DeleteFileOperation d = (DeleteFileOperation) operation;
                if (logger.isDebugEnabled()) {
                    logger.debug("entering DELETE_SUBSTITUTED state: " + lockName);
                }
                String tempName = ".shuffle" + d.getName();
                deletes.put(d.getName(), tempName);
                String[] paths = FileName.splitPath(d.getPath());
                String currentFolder = paths[0];
                RenameFileCommand r1 = new RenameFileCommand(d.getName(), tempName, d.getRootNodeRef(), d.getPath(), currentFolder + "\\" + tempName);
                internalState = InternalState.DELETE_SUBSTITUTED;
                return r1;
            } else {
                // anything else bomb out
                if (logger.isDebugEnabled()) {
                    logger.debug("State error, expected a DELETE");
                }
                isComplete = true;
            }
            break;
        case DELETE_SUBSTITUTED:
            /**
             * Looking for a move operation of the deleted file
             */
            if (operation instanceof MoveFileOperation) {
                MoveFileOperation m = (MoveFileOperation) operation;
                String targetFile = m.getTo();
                if (deletes.containsKey(targetFile)) {
                    String tempName = deletes.get(targetFile);
                    String[] paths = FileName.splitPath(m.getToPath());
                    String currentFolder = paths[0];
                    /**
                     * This is where the scenario fires.
                     * a) Rename the temp file back to the targetFile
                     * b) Copy content from moved file
                     * c) Delete rather than move file
                     */
                    logger.debug("scenario fires");
                    ArrayList<Command> commands = new ArrayList<Command>();
                    RenameFileCommand r1 = new RenameFileCommand(tempName, targetFile, m.getRootNodeRef(), currentFolder + "\\" + tempName, m.getToPath());
                    CopyContentCommand copyContent = new CopyContentCommand(m.getFrom(), targetFile, m.getRootNodeRef(), m.getFromPath(), m.getToPath());
                    DeleteFileCommand d1 = new DeleteFileCommand(m.getFrom(), m.getRootNodeRef(), m.getFromPath());
                    commands.add(r1);
                    commands.add(copyContent);
                    commands.add(d1);
                    logger.debug("Scenario complete");
                    isComplete = true;
                    return new CompoundCommand(commands);
                }
            }
    }
    return null;
}
Also used : CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) RenameFileCommand(org.alfresco.filesys.repo.rules.commands.RenameFileCommand) DeleteFileOperation(org.alfresco.filesys.repo.rules.operations.DeleteFileOperation) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand) RenameFileCommand(org.alfresco.filesys.repo.rules.commands.RenameFileCommand) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) MoveFileOperation(org.alfresco.filesys.repo.rules.operations.MoveFileOperation) ArrayList(java.util.ArrayList) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) Date(java.util.Date) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand)

Example 7 with RenameFileCommand

use of org.alfresco.filesys.repo.rules.commands.RenameFileCommand in project alfresco-repository by Alfresco.

the class ScenarioRenameDeleteMoveInstance method evaluate.

/**
 * Evaluate the next operation
 *
 * @param operation Operation
 */
public Command evaluate(Operation operation) {
    /**
     * Anti-pattern : timeout
     */
    Date now = new Date();
    if (now.getTime() > startTime.getTime() + getTimeout()) {
        if (logger.isDebugEnabled()) {
            logger.debug("Instance timed out");
        }
        isComplete = true;
        return null;
    }
    switch(internalState) {
        case NONE:
            if (operation instanceof RenameFileOperation) {
                RenameFileOperation r = (RenameFileOperation) operation;
                fileMiddle = r.getFrom();
                fileEnd = r.getTo();
                String[] paths = FileName.splitPath(r.getFromPath());
                folderMiddle = paths[0];
                String[] paths2 = FileName.splitPath(r.getToPath());
                folderEnd = paths2[0];
                internalState = InternalState.DELETE;
            } else {
                // anything else bomb out
                if (logger.isDebugEnabled()) {
                    logger.debug("State error, expected a RENAME");
                }
                isComplete = true;
            }
        case DELETE:
            if (operation instanceof DeleteFileOperation) {
                internalState = InternalState.MOVE;
                DeleteFileOperation d = (DeleteFileOperation) operation;
                if (d.getName().equalsIgnoreCase(fileEnd)) {
                    ArrayList<Command> commands = new ArrayList<Command>();
                    ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                    ArrayList<Command> postErrorCommands = new ArrayList<Command>();
                    // Rename node to remove "hidden". In this case node will be moved to the archive store and can be restored later.
                    // This can be replaced with command that removes hidden aspect in future(when ContentDiskDriver2.setFileInformation() method will support hidden attribute)
                    RenameFileCommand r1 = new RenameFileCommand(fileEnd, "tmp" + fileEnd, d.getRootNodeRef(), folderEnd + "\\" + fileEnd, folderEnd + "\\" + "tmp" + fileEnd);
                    fileEnd = "tmp" + fileEnd;
                    commands.add(r1);
                    commands.add(new DeleteFileCommand(fileEnd, d.getRootNodeRef(), folderEnd + "\\" + fileEnd));
                    postCommitCommands.add(newDeleteFileCallbackCommand());
                    return new CompoundCommand(commands, postCommitCommands, postErrorCommands);
                }
            }
            if (operation instanceof CloseFileOperation) {
                CloseFileOperation c = (CloseFileOperation) operation;
                if (c.getNetworkFile().hasDeleteOnClose() && c.getName().equalsIgnoreCase(fileEnd)) {
                    internalState = InternalState.MOVE;
                    ArrayList<Command> commands = new ArrayList<Command>();
                    ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                    ArrayList<Command> postErrorCommands = new ArrayList<Command>();
                    // Rename node to remove "hidden". In this case node will be moved to the archive store and can be restored later.
                    RenameFileCommand r1 = new RenameFileCommand(fileEnd, "tmp" + fileEnd, c.getRootNodeRef(), folderEnd + "\\" + fileEnd, folderEnd + "\\" + "tmp" + fileEnd);
                    fileEnd = "tmp" + fileEnd;
                    commands.add(r1);
                    commands.add(new CloseFileCommand(fileEnd, c.getNetworkFile(), c.getRootNodeRef(), folderEnd + "\\" + fileEnd));
                    postCommitCommands.add(newDeleteFileCallbackCommand());
                    return new CompoundCommand(commands, postCommitCommands, postErrorCommands);
                }
            }
            break;
        case MOVE:
            if (operation instanceof MoveFileOperation && originalNodeRef != null) {
                if (logger.isDebugEnabled()) {
                    logger.info("Tracking rename: " + operation);
                }
                MoveFileOperation m = (MoveFileOperation) operation;
                if (fileMiddle.equalsIgnoreCase(m.getTo())) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Got second rename");
                    }
                    fileFrom = m.getFrom();
                    String[] paths = FileName.splitPath(m.getFromPath());
                    String oldFolder = paths[0];
                    ArrayList<Command> commands = new ArrayList<Command>();
                    RestoreFileCommand rest1 = new RestoreFileCommand(fileEnd, m.getRootNodeRef(), folderEnd, 0, originalNodeRef);
                    RenameFileCommand r1 = new RenameFileCommand(fileEnd, fileMiddle, m.getRootNodeRef(), folderEnd + "\\" + fileEnd, folderMiddle + "\\" + fileMiddle);
                    commands.add(rest1);
                    commands.add(r1);
                    CopyContentCommand copyContent = new CopyContentCommand(fileFrom, fileMiddle, m.getRootNodeRef(), oldFolder + "\\" + fileFrom, folderMiddle + "\\" + fileMiddle);
                    commands.add(copyContent);
                    DeleteFileCommand d1 = new DeleteFileCommand(oldFolder, m.getRootNodeRef(), oldFolder + "\\" + fileFrom);
                    commands.add(d1);
                    isComplete = true;
                    return new CompoundCommand(commands);
                }
            }
            break;
    }
    return null;
}
Also used : CloseFileCommand(org.alfresco.filesys.repo.rules.commands.CloseFileCommand) DeleteFileOperation(org.alfresco.filesys.repo.rules.operations.DeleteFileOperation) RestoreFileCommand(org.alfresco.filesys.repo.rules.commands.RestoreFileCommand) ArrayList(java.util.ArrayList) CloseFileOperation(org.alfresco.filesys.repo.rules.operations.CloseFileOperation) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) Date(java.util.Date) RenameFileOperation(org.alfresco.filesys.repo.rules.operations.RenameFileOperation) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) RenameFileCommand(org.alfresco.filesys.repo.rules.commands.RenameFileCommand) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand) RenameFileCommand(org.alfresco.filesys.repo.rules.commands.RenameFileCommand) CloseFileCommand(org.alfresco.filesys.repo.rules.commands.CloseFileCommand) RestoreFileCommand(org.alfresco.filesys.repo.rules.commands.RestoreFileCommand) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) MoveFileOperation(org.alfresco.filesys.repo.rules.operations.MoveFileOperation)

Example 8 with RenameFileCommand

use of org.alfresco.filesys.repo.rules.commands.RenameFileCommand in project alfresco-repository by Alfresco.

the class CommandExecutorImpl method executeInternal.

/**
 * @param sess SrvSession
 * @param tree TreeConnection
 * @param command Command
 * @param result Object
 * @return Object
 * @throws IOException
 */
private Object executeInternal(SrvSession sess, TreeConnection tree, Command command, Object result) throws IOException {
    FileFilterMode.setClient(ClientHelper.getClient(sess));
    try {
        if (command instanceof CompoundCommand) {
            Object ret = null;
            logger.debug("compound command received");
            CompoundCommand x = (CompoundCommand) command;
            for (Command compoundPart : x.getCommands()) {
                logger.debug("running part of compound command");
                Object val = executeInternal(sess, tree, compoundPart, result);
                if (val != null) {
                    // Return the value from the last command.
                    ret = val;
                }
            }
            return ret;
        } else if (command instanceof CreateFileCommand) {
            logger.debug("create file command");
            CreateFileCommand create = (CreateFileCommand) command;
            return repositoryDiskInterface.createFile(create.getRootNode(), create.getPath(), create.getAllocationSize(), create.isHidden());
        } else if (command instanceof RestoreFileCommand) {
            logger.debug("restore file command");
            RestoreFileCommand restore = (RestoreFileCommand) command;
            return repositoryDiskInterface.restoreFile(sess, tree, restore.getRootNode(), restore.getPath(), restore.getAllocationSize(), restore.getOriginalNodeRef());
        } else if (command instanceof DeleteFileCommand) {
            logger.debug("delete file command");
            DeleteFileCommand delete = (DeleteFileCommand) command;
            return repositoryDiskInterface.deleteFile2(sess, tree, delete.getRootNode(), delete.getPath());
        } else if (command instanceof OpenFileCommand) {
            logger.debug("open file command");
            OpenFileCommand o = (OpenFileCommand) command;
            OpenFileMode mode = o.getMode();
            return repositoryDiskInterface.openFile(sess, tree, o.getRootNodeRef(), o.getPath(), mode, o.isTruncate());
        } else if (command instanceof CloseFileCommand) {
            logger.debug("close file command");
            CloseFileCommand c = (CloseFileCommand) command;
            return repositoryDiskInterface.closeFile(tree, c.getRootNodeRef(), c.getPath(), c.getNetworkFile());
        } else if (command instanceof ReduceQuotaCommand) {
            logger.debug("reduceQuota file command");
            ReduceQuotaCommand r = (ReduceQuotaCommand) command;
            repositoryDiskInterface.reduceQuota(sess, tree, r.getNetworkFile());
        } else if (command instanceof RenameFileCommand) {
            logger.debug("rename command");
            RenameFileCommand rename = (RenameFileCommand) command;
            repositoryDiskInterface.renameFile(rename.getRootNode(), rename.getFromPath(), rename.getToPath(), rename.isSoft(), false);
        } else if (command instanceof MoveFileCommand) {
            logger.debug("move command");
            MoveFileCommand move = (MoveFileCommand) command;
            repositoryDiskInterface.renameFile(move.getRootNode(), move.getFromPath(), move.getToPath(), false, move.isMoveAsSystem());
        } else if (command instanceof CopyContentCommand) {
            if (logger.isDebugEnabled()) {
                logger.debug("Copy content command - copy content");
            }
            CopyContentCommand copy = (CopyContentCommand) command;
            repositoryDiskInterface.copyContent(copy.getRootNode(), copy.getFromPath(), copy.getToPath());
        } else if (command instanceof DoNothingCommand) {
            if (logger.isDebugEnabled()) {
                logger.debug("Do Nothing Command - doing nothing");
            }
        } else if (command instanceof ResultCallback) {
            if (logger.isDebugEnabled()) {
                logger.debug("Result Callback");
            }
            ResultCallback callback = (ResultCallback) command;
            callback.execute(result);
        } else if (command instanceof RemoveTempFileCommand) {
            RemoveTempFileCommand r = (RemoveTempFileCommand) command;
            if (logger.isDebugEnabled()) {
                logger.debug("Remove Temp File:" + r.getNetworkFile());
            }
            File file = r.getNetworkFile().getFile();
            boolean isDeleted = file.delete();
            if (!isDeleted) {
                logger.debug("unable to delete temp file:" + r.getNetworkFile() + ", closed=" + r.getNetworkFile().isClosed());
                /*
                     * Unable to delete temporary file
                     * Could be a bug with the file handle not being closed, but yourkit does not
                     * find anything awry.
                     * There are reported Windows JVM bugs such as 4715154 ... 
                     */
                FileOutputStream fos = new FileOutputStream(file);
                FileChannel outChan = null;
                try {
                    outChan = fos.getChannel();
                    outChan.truncate(0);
                } catch (IOException e) {
                    logger.debug("unable to clean up file", e);
                } finally {
                    if (outChan != null) {
                        try {
                            outChan.close();
                        } catch (IOException e) {
                        }
                    }
                    fos.close();
                }
            }
        } else if (command instanceof ReturnValueCommand) {
            ReturnValueCommand r = (ReturnValueCommand) command;
            if (logger.isDebugEnabled()) {
                logger.debug("Return value");
            }
            return r.getReturnValue();
        } else if (command instanceof RemoveNoContentFileOnError) {
            RemoveNoContentFileOnError r = (RemoveNoContentFileOnError) command;
            if (logger.isDebugEnabled()) {
                logger.debug("Remove no content file on error");
            }
            repositoryDiskInterface.deleteEmptyFile(r.getRootNodeRef(), r.getPath());
        }
    } finally {
        FileFilterMode.clearClient();
    }
    return null;
}
Also used : CloseFileCommand(org.alfresco.filesys.repo.rules.commands.CloseFileCommand) DoNothingCommand(org.alfresco.filesys.repo.rules.commands.DoNothingCommand) ReduceQuotaCommand(org.alfresco.filesys.repo.rules.commands.ReduceQuotaCommand) OpenFileCommand(org.alfresco.filesys.repo.rules.commands.OpenFileCommand) CreateFileCommand(org.alfresco.filesys.repo.rules.commands.CreateFileCommand) RestoreFileCommand(org.alfresco.filesys.repo.rules.commands.RestoreFileCommand) FileChannel(java.nio.channels.FileChannel) RemoveNoContentFileOnError(org.alfresco.filesys.repo.rules.commands.RemoveNoContentFileOnError) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) IOException(java.io.IOException) RemoveTempFileCommand(org.alfresco.filesys.repo.rules.commands.RemoveTempFileCommand) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) RenameFileCommand(org.alfresco.filesys.repo.rules.commands.RenameFileCommand) RenameFileCommand(org.alfresco.filesys.repo.rules.commands.RenameFileCommand) DoNothingCommand(org.alfresco.filesys.repo.rules.commands.DoNothingCommand) CloseFileCommand(org.alfresco.filesys.repo.rules.commands.CloseFileCommand) CreateFileCommand(org.alfresco.filesys.repo.rules.commands.CreateFileCommand) Command(org.alfresco.filesys.repo.rules.Command) MoveFileCommand(org.alfresco.filesys.repo.rules.commands.MoveFileCommand) RestoreFileCommand(org.alfresco.filesys.repo.rules.commands.RestoreFileCommand) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand) ReturnValueCommand(org.alfresco.filesys.repo.rules.commands.ReturnValueCommand) OpenFileCommand(org.alfresco.filesys.repo.rules.commands.OpenFileCommand) ReduceQuotaCommand(org.alfresco.filesys.repo.rules.commands.ReduceQuotaCommand) RemoveTempFileCommand(org.alfresco.filesys.repo.rules.commands.RemoveTempFileCommand) ReturnValueCommand(org.alfresco.filesys.repo.rules.commands.ReturnValueCommand) FileOutputStream(java.io.FileOutputStream) File(java.io.File) MoveFileCommand(org.alfresco.filesys.repo.rules.commands.MoveFileCommand)

Aggregations

CompoundCommand (org.alfresco.filesys.repo.rules.commands.CompoundCommand)8 CopyContentCommand (org.alfresco.filesys.repo.rules.commands.CopyContentCommand)8 RenameFileCommand (org.alfresco.filesys.repo.rules.commands.RenameFileCommand)8 ArrayList (java.util.ArrayList)7 Date (java.util.Date)7 DeleteFileCommand (org.alfresco.filesys.repo.rules.commands.DeleteFileCommand)7 DeleteFileOperation (org.alfresco.filesys.repo.rules.operations.DeleteFileOperation)6 RenameFileOperation (org.alfresco.filesys.repo.rules.operations.RenameFileOperation)5 CreateFileOperation (org.alfresco.filesys.repo.rules.operations.CreateFileOperation)4 MoveFileOperation (org.alfresco.filesys.repo.rules.operations.MoveFileOperation)4 CloseFileCommand (org.alfresco.filesys.repo.rules.commands.CloseFileCommand)2 MoveFileCommand (org.alfresco.filesys.repo.rules.commands.MoveFileCommand)2 RestoreFileCommand (org.alfresco.filesys.repo.rules.commands.RestoreFileCommand)2 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 FileChannel (java.nio.channels.FileChannel)1 Matcher (java.util.regex.Matcher)1 Command (org.alfresco.filesys.repo.rules.Command)1 CreateFileCommand (org.alfresco.filesys.repo.rules.commands.CreateFileCommand)1