Search in sources :

Example 1 with RenameFileOperation

use of org.alfresco.filesys.repo.rules.operations.RenameFileOperation in project alfresco-repository by Alfresco.

the class ScenarioDoubleRenameShuffleInstance 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");
        }
        isComplete = true;
        return null;
    }
    switch(internalState) {
        case NONE:
            /**
             * Looking for first rename Y(middle) to Z(end)
             */
            if (operation instanceof RenameFileOperation) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Got first rename - tracking rename: " + operation);
                }
                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.RENAME1;
                return new RenameFileCommand(r.getFrom(), r.getTo(), r.getRootNodeRef(), r.getFromPath(), r.getToPath());
            } else {
                // anything else bomb out
                if (logger.isDebugEnabled()) {
                    logger.debug("State error, expected a RENAME");
                }
                isComplete = true;
            }
        case RENAME1:
            /**
             * Looking for the second of two renames X(createName) to Y(middle) to Z(end)
             */
            if (operation instanceof RenameFileOperation) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Tracking rename: " + operation);
                }
                RenameFileOperation r = (RenameFileOperation) operation;
                // Now see if this rename makes a pair
                if (fileMiddle.equalsIgnoreCase(r.getTo())) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Got second rename");
                    }
                    fileFrom = r.getFrom();
                    /**
                     * This shuffle reverses the rename out of the way and then copies the
                     * content only.   Finally it moves the temp file into place for the subsequent
                     * delete.
                     * a) Rename Z to Y (Reverse previous move)
                     * b) Copy Content from X to Y
                     * c) Rename X to Z (move temp file out to old location)
                     */
                    if (logger.isDebugEnabled()) {
                        logger.debug("Go and shuffle! fromName:" + fileFrom + " middle: " + fileMiddle + " end: " + fileEnd);
                    }
                    String[] paths = FileName.splitPath(r.getFromPath());
                    String oldFolder = paths[0];
                    ArrayList<Command> commands = new ArrayList<Command>();
                    RenameFileCommand r1 = new RenameFileCommand(fileEnd, fileMiddle, r.getRootNodeRef(), oldFolder + "\\" + fileEnd, oldFolder + "\\" + fileMiddle);
                    commands.add(r1);
                    CopyContentCommand copyContent = new CopyContentCommand(fileFrom, fileMiddle, r.getRootNodeRef(), oldFolder + "\\" + fileFrom, oldFolder + "\\" + fileMiddle);
                    commands.add(copyContent);
                    if (deleteBackup) {
                        logger.debug("deleteBackup option turned on");
                        DeleteFileCommand d1 = new DeleteFileCommand(oldFolder, r.getRootNodeRef(), oldFolder + "\\" + fileFrom);
                        commands.add(d1);
                    } else {
                        RenameFileCommand r2 = new RenameFileCommand(fileFrom, fileEnd, r.getRootNodeRef(), oldFolder + "\\" + fileFrom, oldFolder + "\\" + fileEnd);
                        commands.add(r2);
                    }
                    /**
                     * TODO - we may need to copy a new node for the backup and delete the temp node.
                     * It depends if we care about the contents of the Backup file.
                     */
                    isComplete = true;
                    return new CompoundCommand(commands);
                }
            }
            if (operation instanceof MoveFileOperation) {
                if (logger.isDebugEnabled()) {
                    logger.info("Tracking rename: " + operation);
                }
                MoveFileOperation r = (MoveFileOperation) operation;
                // Now see if this rename makes a pair
                if (fileMiddle.equalsIgnoreCase(r.getTo())) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Got second rename");
                    }
                    fileFrom = r.getFrom();
                    /**
                     * This shuffle reverses the rename out of the way and then copies the
                     * content only.   Finally it moves the temp file into place for the subsequent
                     * delete.
                     * a) Rename Z to Y (Reverse previous move)
                     * b) Copy Content from X to Y
                     * c) Rename X to Z (move temp file out to old location)
                     */
                    if (logger.isDebugEnabled()) {
                        logger.debug("Go and shuffle! fromName:" + fileFrom + " middle: " + fileMiddle + " end: " + fileEnd);
                    }
                    String[] paths = FileName.splitPath(r.getFromPath());
                    String oldFolder = paths[0];
                    ArrayList<Command> commands = new ArrayList<Command>();
                    RenameFileCommand r1 = new RenameFileCommand(fileEnd, fileMiddle, r.getRootNodeRef(), folderEnd + "\\" + fileEnd, folderMiddle + "\\" + fileMiddle);
                    commands.add(r1);
                    CopyContentCommand copyContent = new CopyContentCommand(fileFrom, fileMiddle, r.getRootNodeRef(), oldFolder + "\\" + fileFrom, folderMiddle + "\\" + fileMiddle);
                    commands.add(copyContent);
                    if (deleteBackup) {
                        logger.debug("deleteBackup option turned on");
                        DeleteFileCommand d1 = new DeleteFileCommand(oldFolder, r.getRootNodeRef(), oldFolder + "\\" + fileFrom);
                        commands.add(d1);
                    } else {
                        MoveFileCommand m1 = new MoveFileCommand(fileFrom, fileEnd, r.getRootNodeRef(), oldFolder + "\\" + fileFrom, folderEnd + "\\" + fileEnd, isMoveAsSystem());
                        commands.add(m1);
                    }
                    /**
                     * TODO - we may need to copy a new node for the backup and delete the temp node.
                     * It depends if we care about the contents of the Backup file.
                     */
                    isComplete = true;
                    return new CompoundCommand(commands);
                } else {
                    if ((interimPattern != null)) {
                        // ALF-16257: temporary Word file moved from .TemporaryItems
                        Matcher m = interimPattern.matcher(r.getFromPath());
                        if (m.matches() && r.getFrom().equals(r.getTo())) {
                            if (logger.isDebugEnabled()) {
                                logger.debug("Got system move from temporary folder: " + r.getFrom() + " to " + r.getToPath());
                            }
                            return new MoveFileCommand(r.getFrom(), r.getTo(), r.getRootNodeRef(), r.getFromPath(), r.getToPath(), true);
                        }
                    }
                }
            }
            break;
    }
    return null;
}
Also used : Matcher(java.util.regex.Matcher) ArrayList(java.util.ArrayList) 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) MoveFileCommand(org.alfresco.filesys.repo.rules.commands.MoveFileCommand) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) MoveFileOperation(org.alfresco.filesys.repo.rules.operations.MoveFileOperation) MoveFileCommand(org.alfresco.filesys.repo.rules.commands.MoveFileCommand)

Example 2 with RenameFileOperation

use of org.alfresco.filesys.repo.rules.operations.RenameFileOperation in project alfresco-repository by Alfresco.

the class ScenarioMultipleRenameShuffleInstance 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");
        }
        isComplete = true;
        return null;
    }
    switch(internalState) {
        case NONE:
            /**
             * Looking for first rename O(original) to T(temporary)
             */
            if (operation instanceof RenameFileOperation) {
                RenameFileOperation r = (RenameFileOperation) operation;
                if (logger.isDebugEnabled()) {
                    logger.debug("Got first rename - tracking rename: " + operation);
                }
                originalName = r.getFromPath();
                ArrayList<Command> commands = new ArrayList<Command>();
                ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                ArrayList<Command> postErrorCommands = new ArrayList<Command>();
                CreateFileCommand c1 = new CreateFileCommand(r.getTo(), r.getRootNodeRef(), r.getToPath(), 0, true);
                CopyContentCommand copyContent = new CopyContentCommand(r.getFrom(), r.getTo(), r.getRootNodeRef(), r.getFromPath(), r.getToPath());
                DeleteFileCommand d1 = new DeleteFileCommand(r.getFrom(), r.getRootNodeRef(), r.getFromPath());
                postCommitCommands.add(deleteFileCallbackCommand());
                commands.add(c1);
                commands.add(copyContent);
                commands.add(d1);
                internalState = InternalState.INITIALISED;
                return new CompoundCommand(commands, postCommitCommands, postErrorCommands);
            } else {
                // anything else bomb out
                if (logger.isDebugEnabled()) {
                    logger.debug("State error, expected a RENAME");
                }
                isComplete = true;
            }
        case INITIALISED:
            /**
             * Looking for last rename T(temporary) to O(original)
             */
            if (operation instanceof RenameFileOperation) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Tracking rename: " + operation);
                }
                RenameFileOperation r = (RenameFileOperation) operation;
                if (r.getToPath().equalsIgnoreCase(originalName)) {
                    ArrayList<Command> commands = new ArrayList<Command>();
                    RestoreFileCommand r1 = new RestoreFileCommand(r.getTo(), r.getRootNodeRef(), r.getToPath(), 0, originalNodeRef);
                    CopyContentCommand copyContent = new CopyContentCommand(r.getFrom(), r1.getName(), r.getRootNodeRef(), r.getFromPath(), r1.getPath());
                    DeleteFileCommand d1 = new DeleteFileCommand(r.getFrom(), r.getRootNodeRef(), r.getFromPath());
                    commands.add(r1);
                    commands.add(copyContent);
                    commands.add(d1);
                    if (logger.isDebugEnabled()) {
                        logger.debug("Scenario complete");
                    }
                    isComplete = true;
                    return new CompoundCommand(commands);
                }
            }
            break;
    }
    return null;
}
Also used : ArrayList(java.util.ArrayList) Date(java.util.Date) RenameFileOperation(org.alfresco.filesys.repo.rules.operations.RenameFileOperation)

Example 3 with RenameFileOperation

use of org.alfresco.filesys.repo.rules.operations.RenameFileOperation in project alfresco-repository by Alfresco.

the class ScenarioOpenFileInstance method evaluate.

/**
 * Evaluate the next operation
 * @param operation
 */
public Command evaluate(Operation operation) {
    /**
     * Anti Pattern - Delete of the open file.
     */
    if (operation instanceof DeleteFileOperation) {
        DeleteFileOperation d = (DeleteFileOperation) operation;
        if (d.getName() == null) {
            return null;
        }
        if (name.equalsIgnoreCase(d.getName())) {
            logger.debug("Anti-Pattern - delete of the open file, scenario:" + this);
            isComplete = true;
            return null;
        }
    }
    switch(state) {
        case NONE:
            if (operation instanceof CreateFileOperation) {
                CreateFileOperation c = (CreateFileOperation) operation;
                name = c.getName();
                if (name != null) {
                    state = InternalState.OPENING;
                    logger.debug("Create File name:" + name);
                    ArrayList<Command> commands = new ArrayList<Command>();
                    ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                    ArrayList<Command> postErrorCommands = new ArrayList<Command>();
                    commands.add(new CreateFileCommand(c.getName(), c.getRootNodeRef(), c.getPath(), c.getAllocationSize(), c.isHidden()));
                    postCommitCommands.add(newOpenFileCallbackCommand());
                    postErrorCommands.add(newOpenFileErrorCallbackCommand());
                    return new CompoundCommand(commands, postCommitCommands, postErrorCommands);
                }
            } else if (operation instanceof OpenFileOperation) {
                OpenFileOperation o = (OpenFileOperation) operation;
                name = o.getName();
                if (name != null) {
                    state = InternalState.OPENING;
                    logger.debug("Open File name:" + name);
                    ArrayList<Command> commands = new ArrayList<Command>();
                    commands.add(new OpenFileCommand(o.getName(), o.getMode(), o.isTruncate(), o.getRootNodeRef(), o.getPath()));
                    ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                    ArrayList<Command> postErrorCommands = new ArrayList<Command>();
                    postCommitCommands.add(newOpenFileCallbackCommand());
                    postErrorCommands.add(newOpenFileErrorCallbackCommand());
                    return new CompoundCommand(commands, postCommitCommands, postErrorCommands);
                }
            }
            // Scenario Not Started
            logger.debug("Scenario not started - no name");
            isComplete = true;
            return null;
        case OPENING:
            if (operation instanceof OpenFileOperation) {
                OpenFileOperation o = (OpenFileOperation) operation;
                if (o.getName() == null) {
                    return null;
                }
                if (name.equalsIgnoreCase(o.getName())) {
                    /**
                     * TODO What to do here - one thread is in the middle of
                     * opening a file while another tries to open the same file
                     * sleep for a bit? then check state again?  What happens if file
                     * closes while sleeping.   For now log an error.
                     */
                    logger.error("Second open while in opening state. :" + name);
                // isComplete = true;
                // return null;
                }
            }
            /**
             * Anti-pattern : timeout - is this needed ?
             */
            Date now = new Date();
            if (now.getTime() > startTime.getTime() + getTimeout()) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Instance in OPENING STATE timed out name" + name);
                }
                isComplete = true;
            }
            return null;
        case ERROR:
            logger.debug("Open has failed :" + name);
            isComplete = true;
            return null;
        case OPEN:
            if (operation instanceof RenameFileOperation) {
                RenameFileOperation r = (RenameFileOperation) operation;
                if (r.getFrom() == null) {
                    return null;
                }
                if (name.equalsIgnoreCase(r.getFrom())) {
                    logger.warn("rename of an open file");
                }
            }
            if (operation instanceof CloseFileOperation) {
                CloseFileOperation c = (CloseFileOperation) operation;
                if (c.getName() == null) {
                    return null;
                }
                if (name.equalsIgnoreCase(c.getName())) {
                    NetworkFile file = c.getNetworkFile();
                    if (isReadOnly(file)) {
                        // Read Only File
                        if (openReadOnlyCount == 1) {
                            if (logger.isDebugEnabled()) {
                                logger.debug("Close of last read only file handle:" + this);
                            }
                            openReadOnlyCount = 0;
                            if (openReadWriteCount <= 0) {
                                if (logger.isDebugEnabled()) {
                                    logger.debug("Scenario is complete:" + this);
                                }
                                isComplete = true;
                            }
                            if (file instanceof TempNetworkFile) {
                                logger.debug("this is the last close of a temp read only file");
                                ArrayList<Command> commands = new ArrayList<Command>();
                                ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                                commands.add(new CloseFileCommand(c.getName(), file, c.getRootNodeRef(), c.getPath()));
                                postCommitCommands.add(new RemoveTempFileCommand((TempNetworkFile) file));
                                return new CompoundCommand(commands, postCommitCommands);
                            } else {
                                return new CloseFileCommand(c.getName(), file, c.getRootNodeRef(), c.getPath());
                            }
                        }
                        if (logger.isDebugEnabled()) {
                            logger.debug("Only decrement count of read only file handle:" + this);
                        }
                        openReadOnlyCount--;
                        return new DoNothingCommand();
                    } else {
                        // Read Only File
                        if (openReadWriteCount == 1) {
                            if (logger.isDebugEnabled()) {
                                logger.debug("Close of last read write file handle:" + this);
                            }
                            openReadWriteCount = 0;
                            if (openReadOnlyCount <= 0) {
                                if (logger.isDebugEnabled()) {
                                    logger.debug("Scenario is complete:" + this);
                                }
                                isComplete = true;
                            }
                            // 
                            ArrayList<Command> commands = new ArrayList<Command>();
                            ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                            ArrayList<Command> postErrorCommands = new ArrayList<Command>();
                            commands.add(new CloseFileCommand(c.getName(), file, c.getRootNodeRef(), c.getPath()));
                            if (c.isDeleteOnClose()) {
                                postCommitCommands.add(new ReduceQuotaCommand(c.getName(), file, c.getRootNodeRef(), c.getPath()));
                            }
                            if (file instanceof TempNetworkFile) {
                                postCommitCommands.add(new RemoveTempFileCommand((TempNetworkFile) file));
                            }
                            return new CompoundCommand(commands, postCommitCommands, postErrorCommands);
                        }
                        if (logger.isDebugEnabled()) {
                            logger.debug("Only decrement count of read write file handle:" + this);
                        }
                        openReadWriteCount--;
                        return new DoNothingCommand();
                    }
                }
            } else if (operation instanceof OpenFileOperation) {
                OpenFileOperation o = (OpenFileOperation) operation;
                if (o.getName() == null) {
                    return null;
                }
                if (name != null && name.equalsIgnoreCase(o.getName())) {
                    if (o.getMode() == OpenFileMode.READ_WRITE) {
                        // This is an open of a read write access
                        if (openReadWriteCount == 0) {
                            logger.debug("Open first read/write from scenario:" + this);
                            ArrayList<Command> commands = new ArrayList<Command>();
                            commands.add(new OpenFileCommand(o.getName(), o.getMode(), o.isTruncate(), o.getRootNodeRef(), o.getPath()));
                            ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                            postCommitCommands.add(newOpenFileCallbackCommand());
                            return new CompoundCommand(commands, postCommitCommands);
                        } else {
                            // TODO Need a permission check here and increment post check
                            openReadWriteCount++;
                            logger.debug("Return already open read/write file handle from scenario:" + this);
                            return new ReturnValueCommand(fileHandleReadWrite);
                        }
                    } else {
                        if (openReadWriteCount > 0) {
                            // however the file is already open for read/write
                            openReadWriteCount++;
                            logger.debug("Return already open read/write file handle from scenario:" + this);
                            return new ReturnValueCommand(fileHandleReadWrite);
                        }
                        if (openReadOnlyCount == 0) {
                            logger.debug("Open first read only from scenario:" + this);
                            ArrayList<Command> commands = new ArrayList<Command>();
                            commands.add(new OpenFileCommand(o.getName(), o.getMode(), o.isTruncate(), o.getRootNodeRef(), o.getPath()));
                            ArrayList<Command> postCommitCommands = new ArrayList<Command>();
                            postCommitCommands.add(newOpenFileCallbackCommand());
                            return new CompoundCommand(commands, postCommitCommands);
                        } else {
                            openReadOnlyCount++;
                            logger.debug("Return already open only file handle from scenario:" + this);
                            return new ReturnValueCommand(fileHandleReadOnly);
                        }
                    }
                }
            }
            break;
    }
    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) DeleteFileOperation(org.alfresco.filesys.repo.rules.operations.DeleteFileOperation) OpenFileCommand(org.alfresco.filesys.repo.rules.commands.OpenFileCommand) CreateFileCommand(org.alfresco.filesys.repo.rules.commands.CreateFileCommand) ArrayList(java.util.ArrayList) CloseFileOperation(org.alfresco.filesys.repo.rules.operations.CloseFileOperation) RemoveTempFileCommand(org.alfresco.filesys.repo.rules.commands.RemoveTempFileCommand) OpenFileOperation(org.alfresco.filesys.repo.rules.operations.OpenFileOperation) Date(java.util.Date) RenameFileOperation(org.alfresco.filesys.repo.rules.operations.RenameFileOperation) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand) TempNetworkFile(org.alfresco.filesys.repo.TempNetworkFile) 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) 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) CallbackCommand(org.alfresco.filesys.repo.rules.commands.CallbackCommand) ReduceQuotaCommand(org.alfresco.filesys.repo.rules.commands.ReduceQuotaCommand) RemoveTempFileCommand(org.alfresco.filesys.repo.rules.commands.RemoveTempFileCommand) ReturnValueCommand(org.alfresco.filesys.repo.rules.commands.ReturnValueCommand) CreateFileOperation(org.alfresco.filesys.repo.rules.operations.CreateFileOperation) TempNetworkFile(org.alfresco.filesys.repo.TempNetworkFile) NetworkFile(org.alfresco.jlan.server.filesys.NetworkFile)

Example 4 with RenameFileOperation

use of org.alfresco.filesys.repo.rules.operations.RenameFileOperation in project alfresco-repository by Alfresco.

the class ScenarioCreateDeleteRenameShuffleInstance 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 createName:" + createName);
            isComplete = true;
            return null;
        }
    }
    /**
     * Anti-pattern for all states - delete the file we are
     * shuffling
     */
    if (createName != null) {
        if (operation instanceof DeleteFileOperation) {
            DeleteFileOperation d = (DeleteFileOperation) operation;
            if (d.getName().equals(createName)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Anti-pattern : Shuffle file deleted createName:" + createName);
                }
                isComplete = true;
                return null;
            }
        }
    }
    switch(internalState) {
        case NONE:
            // Looking for a create transition
            if (operation instanceof CreateFileOperation) {
                CreateFileOperation c = (CreateFileOperation) operation;
                this.createName = c.getName();
                if (logger.isDebugEnabled()) {
                    logger.debug("entering ACTIVE state: " + createName);
                }
                internalState = InternalState.ACTIVE;
                return null;
            } else {
                // anything else bomb out
                if (logger.isDebugEnabled()) {
                    logger.debug("State error, expected a CREATE");
                }
                isComplete = true;
            }
            break;
        case ACTIVE:
            /**
             * 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;
                String deleteName = d.getName();
                /**
                 * For Mac 2011 powerpoint files - add an extra check based on the filename
                 * e.g FileA1 - delete FileA.
                 * For Mac 2011 excel files - check that file to delete is not temporary
                 */
                if (checkFilename) {
                    boolean isRightTarget = false;
                    int i = deleteName.lastIndexOf('.');
                    int j = createName.lastIndexOf('.');
                    if (i > 0) {
                        String deleteExt = deleteName.substring(i + 1, deleteName.length());
                        String createExt = (j > 0) ? createName.substring(j + 1, createName.length()) : "";
                        if (deleteExt.startsWith("ppt") && createExt.startsWith("ppt")) {
                            isRightTarget = (i < createName.length()) && deleteName.substring(0, i).equalsIgnoreCase(createName.substring(0, i));
                        } else if (deleteExt.startsWith("xls") && createExt.isEmpty()) {
                            isRightTarget = !deleteName.startsWith("._") && !deleteName.startsWith("~$");
                        }
                    }
                    if (isRightTarget) {
                        logger.debug("check filenames - does match");
                    } else {
                        if (logger.isDebugEnabled()) {
                            logger.debug("check filename patterns do not match - Ignore" + createName + deleteName);
                        }
                        return null;
                    }
                }
                if (logger.isDebugEnabled()) {
                    logger.debug("got a delete : replace with rename createName:" + createName + "deleteName:" + deleteName);
                }
                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);
                return r1;
            }
            /**
             */
            if (operation instanceof RenameFileOperation) {
                RenameFileOperation m = (RenameFileOperation) 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
                     */
                    if (logger.isDebugEnabled()) {
                        logger.debug("scenario fires:" + createName);
                    }
                    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 : DeleteFileOperation(org.alfresco.filesys.repo.rules.operations.DeleteFileOperation) ArrayList(java.util.ArrayList) 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) CopyContentCommand(org.alfresco.filesys.repo.rules.commands.CopyContentCommand) DeleteFileCommand(org.alfresco.filesys.repo.rules.commands.DeleteFileCommand) CreateFileOperation(org.alfresco.filesys.repo.rules.operations.CreateFileOperation)

Example 5 with RenameFileOperation

use of org.alfresco.filesys.repo.rules.operations.RenameFileOperation in project alfresco-repository by Alfresco.

the class ScenarioCreateShuffleInstance 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 createName:" + createName);
            isComplete = true;
            return null;
        }
    }
    /**
     * Anti-pattern for all states - delete the file we are
     * shuffling
     */
    if (createName != null) {
        if (operation instanceof DeleteFileOperation) {
            DeleteFileOperation d = (DeleteFileOperation) operation;
            if (d.getName().equals(createName)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Anti-pattern : Shuffle file deleted createName:" + createName);
                }
                isComplete = true;
                return null;
            }
        }
    }
    switch(internalState) {
        case NONE:
            // Looking for a create transition
            if (operation instanceof CreateFileOperation) {
                CreateFileOperation c = (CreateFileOperation) operation;
                this.createName = c.getName();
                if (logger.isDebugEnabled()) {
                    logger.debug("entering RENAME state: " + createName);
                }
                internalState = InternalState.RENAME;
                return null;
            } else {
                // anything else bomb out
                if (logger.isDebugEnabled()) {
                    logger.debug("State error, expected a CREATE");
                }
                isComplete = true;
            }
            break;
        case RENAME:
            /**
             * Looking for two renames X(createName) to Y(middle) to Z(end)
             */
            if (operation instanceof RenameFileOperation) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Tracking rename: " + operation);
                }
                RenameFileOperation r = (RenameFileOperation) operation;
                renames.put(r.getFrom(), r.getTo());
                // Now see if this rename makes a pair.
                String middle = renames.get(createName);
                if (middle != null) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Got second rename");
                    }
                    String end = renames.get(middle);
                    if (end != null) {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Got two renames ");
                        }
                        this.move1 = middle;
                        this.move2 = end;
                        if (logger.isDebugEnabled()) {
                            logger.debug("entering DELETE state");
                        }
                        internalState = InternalState.DELETE;
                        /**
                         * This shuffle reverses the rename out of the way and then copies the
                         * content only.   Finally it moves the temp file into place for the subsequent
                         * delete.
                         * a) Rename Z to Y (Reverse previous move)
                         * b) Copy Content from X to Y
                         * c) Rename X to Z (move temp file out to old location)
                         */
                        if (logger.isDebugEnabled()) {
                            logger.debug("Go and shuffle! createName:" + createName + " move1 " + move1 + " move2 " + move2);
                        }
                        String[] paths = FileName.splitPath(r.getFromPath());
                        String oldFolder = paths[0];
                        // String oldFile = paths[1];
                        ArrayList<Command> commands = new ArrayList<Command>();
                        RenameFileCommand r1 = new RenameFileCommand(end, middle, r.getRootNodeRef(), oldFolder + "\\" + end, oldFolder + "\\" + middle);
                        CopyContentCommand copyContent = new CopyContentCommand(createName, move1, r.getRootNodeRef(), oldFolder + "\\" + createName, oldFolder + "\\" + middle);
                        RenameFileCommand r2 = new RenameFileCommand(createName, end, r.getRootNodeRef(), oldFolder + "\\" + createName, oldFolder + "\\" + end);
                        commands.add(r1);
                        commands.add(copyContent);
                        commands.add(r2);
                        return new CompoundCommand(commands);
                    }
                }
            }
            break;
        case DELETE:
            if (operation instanceof DeleteFileOperation) {
                DeleteFileOperation d = (DeleteFileOperation) operation;
                if (d.getName().equals(move2)) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Scenario complete createName:" + createName);
                    }
                    isComplete = true;
                }
            }
            /**
             * Todo consider create shuffle with backup file which will never
             * calls delete - do we need to pattern match on "Backup*".
             * At the moment the delete state does nothing - hence
             * we can simply set complete here for all situations.
             */
            isComplete = true;
            break;
    }
    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) CreateFileOperation(org.alfresco.filesys.repo.rules.operations.CreateFileOperation) ArrayList(java.util.ArrayList) Date(java.util.Date) RenameFileOperation(org.alfresco.filesys.repo.rules.operations.RenameFileOperation) CompoundCommand(org.alfresco.filesys.repo.rules.commands.CompoundCommand)

Aggregations

RenameFileOperation (org.alfresco.filesys.repo.rules.operations.RenameFileOperation)16 Date (java.util.Date)9 ArrayList (java.util.ArrayList)8 CompoundCommand (org.alfresco.filesys.repo.rules.commands.CompoundCommand)7 CopyContentCommand (org.alfresco.filesys.repo.rules.commands.CopyContentCommand)7 DeleteFileOperation (org.alfresco.filesys.repo.rules.operations.DeleteFileOperation)7 Matcher (java.util.regex.Matcher)6 DeleteFileCommand (org.alfresco.filesys.repo.rules.commands.DeleteFileCommand)6 RenameFileCommand (org.alfresco.filesys.repo.rules.commands.RenameFileCommand)6 CreateFileOperation (org.alfresco.filesys.repo.rules.operations.CreateFileOperation)6 CloseFileOperation (org.alfresco.filesys.repo.rules.operations.CloseFileOperation)4 MoveFileOperation (org.alfresco.filesys.repo.rules.operations.MoveFileOperation)4 CloseFileCommand (org.alfresco.filesys.repo.rules.commands.CloseFileCommand)3 RestoreFileCommand (org.alfresco.filesys.repo.rules.commands.RestoreFileCommand)2 OpenFileOperation (org.alfresco.filesys.repo.rules.operations.OpenFileOperation)2 TempNetworkFile (org.alfresco.filesys.repo.TempNetworkFile)1 Command (org.alfresco.filesys.repo.rules.Command)1 EvaluatorContext (org.alfresco.filesys.repo.rules.EvaluatorContext)1 Operation (org.alfresco.filesys.repo.rules.Operation)1 CallbackCommand (org.alfresco.filesys.repo.rules.commands.CallbackCommand)1