Search in sources :

Example 26 with NetworkFile

use of org.alfresco.jlan.server.filesys.NetworkFile in project alfresco-repository by Alfresco.

the class ContentDiskDriverTest method testScenarioMSExcel2011MacSaveShuffle.

// testScenarioMSPowerpoint2011MacSaveShuffle
/**
 * Simulates a Save from Excel 2011 Mac
 * 0. FileA.xlsx already exists.
 * 1. Create new document ._A8A09200
 * 2. Delete FileA.xlsx
 * 3. Rename ._A8A09200 to FileA.xlsx
 */
public void testScenarioMSExcel2011MacSaveShuffle() throws Exception {
    logger.debug("testScenarioMSExcel2011MacSaveShuffle(");
    final String FILE_NAME = "FileA.xlsx";
    final String FILE_NEW_TEMP = "._A8A09200";
    class TestContext {

        NetworkFile firstFileHandle;
    }
    ;
    final TestContext testContext = new TestContext();
    final String TEST_DIR = TEST_ROOT_DOS_PATH + "\\testScenarioMSExcel2011MacSaveShuffle";
    ServerConfiguration scfg = new ServerConfiguration("testServer");
    TestServer testServer = new TestServer("testServer", scfg);
    final SrvSession testSession = new TestSrvSession(666, testServer, "cifs", "remoteName");
    DiskSharedDevice share = getDiskSharedDevice();
    final TreeConnection testConnection = testServer.getTreeConnection(share);
    final RetryingTransactionHelper tran = transactionService.getRetryingTransactionHelper();
    /**
     * Clean up just in case garbage is left from a previous run
     */
    RetryingTransactionCallback<Void> deleteGarbageFileCB = new RetryingTransactionCallback<Void>() {

        @Override
        public Void execute() throws Throwable {
            driver.deleteFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NAME);
            return null;
        }
    };
    try {
        logger.debug("expect to get exception - cleaning garbage");
        tran.doInTransaction(deleteGarbageFileCB);
    } catch (Exception e) {
    // expect to go here
    }
    logger.debug("0) create new file");
    RetryingTransactionCallback<Void> createFileCB = new RetryingTransactionCallback<Void>() {

        @Override
        public Void execute() throws Throwable {
            /**
             * Create the test directory we are going to use
             */
            FileOpenParams createRootDirParams = new FileOpenParams(TEST_ROOT_DOS_PATH, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0);
            FileOpenParams createDirParams = new FileOpenParams(TEST_DIR, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0);
            driver.createDirectory(testSession, testConnection, createRootDirParams);
            driver.createDirectory(testSession, testConnection, createDirParams);
            /**
             * Create the file we are going to use (FileA.xlsx)
             */
            FileOpenParams createFileParams = new FileOpenParams(TEST_DIR + "\\" + FILE_NAME, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0);
            testContext.firstFileHandle = driver.createFile(testSession, testConnection, createFileParams);
            assertNotNull(testContext.firstFileHandle);
            driver.closeFile(testSession, testConnection, testContext.firstFileHandle);
            NodeRef file1NodeRef = getNodeForPath(testConnection, TEST_DIR + "\\" + FILE_NAME);
            nodeService.addAspect(file1NodeRef, ContentModel.ASPECT_VERSIONABLE, null);
            return null;
        }
    };
    tran.doInTransaction(createFileCB, false, true);
    /**
     * b) Save the new file
     * Write ContentDiskDriverTest3.doc to the test file,
     */
    logger.debug("b) write some content");
    RetryingTransactionCallback<Void> writeFileCB = new RetryingTransactionCallback<Void>() {

        @Override
        public Void execute() throws Throwable {
            FileOpenParams createFileParams = new FileOpenParams(TEST_DIR + "\\" + FILE_NEW_TEMP, 0, AccessMode.ReadWrite, FileAttribute.NTNormal, 0);
            testContext.firstFileHandle = driver.createFile(testSession, testConnection, createFileParams);
            ClassPathResource fileResource = new ClassPathResource("filesys/ContentDiskDriverTest3.doc");
            assertNotNull("unable to find test resource filesys/ContentDiskDriverTest3.doc", fileResource);
            byte[] buffer = new byte[1000];
            InputStream is = fileResource.getInputStream();
            try {
                long offset = 0;
                int i = is.read(buffer, 0, buffer.length);
                while (i > 0) {
                    testContext.firstFileHandle.writeFile(buffer, i, 0, offset);
                    offset += i;
                    i = is.read(buffer, 0, buffer.length);
                }
            } finally {
                is.close();
            }
            driver.closeFile(testSession, testConnection, testContext.firstFileHandle);
            return null;
        }
    };
    tran.doInTransaction(writeFileCB, false, true);
    /**
     * c) delete the old file
     */
    logger.debug("c) delete old file");
    RetryingTransactionCallback<Void> renameOldFileCB = new RetryingTransactionCallback<Void>() {

        @Override
        public Void execute() throws Throwable {
            driver.deleteFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NAME);
            return null;
        }
    };
    tran.doInTransaction(renameOldFileCB, false, true);
    /**
     * d) Move the new file into place, stuff should get shuffled
     */
    logger.debug("d) rename new file into place");
    RetryingTransactionCallback<Void> moveNewFileCB = new RetryingTransactionCallback<Void>() {

        @Override
        public Void execute() throws Throwable {
            driver.renameFile(testSession, testConnection, TEST_DIR + "\\" + FILE_NEW_TEMP, TEST_DIR + "\\" + FILE_NAME);
            return null;
        }
    };
    tran.doInTransaction(moveNewFileCB, false, true);
    logger.debug("e) validate results");
    /**
     * Now validate everything is correct
     */
    RetryingTransactionCallback<Void> validateCB = new RetryingTransactionCallback<Void>() {

        @Override
        public Void execute() throws Throwable {
            NodeRef shuffledNodeRef = getNodeForPath(testConnection, TEST_DIR + "\\" + FILE_NAME);
            Map<QName, Serializable> props = nodeService.getProperties(shuffledNodeRef);
            ContentData data = (ContentData) props.get(ContentModel.PROP_CONTENT);
            assertNotNull("data is null", data);
            assertEquals("size is wrong", 26112, data.getSize());
            assertEquals("mimeType is wrong", "application/msword", data.getMimetype());
            assertTrue("versionable aspect missing", nodeService.hasAspect(shuffledNodeRef, ContentModel.ASPECT_VERSIONABLE));
            assertTrue("hidden aspect still applied", !nodeService.hasAspect(shuffledNodeRef, ContentModel.ASPECT_HIDDEN));
            assertTrue("temporary aspect still applied", !nodeService.hasAspect(shuffledNodeRef, ContentModel.ASPECT_TEMPORARY));
            return null;
        }
    };
    tran.doInTransaction(validateCB, true, true);
}
Also used : Serializable(java.io.Serializable) RetryingTransactionHelper(org.alfresco.repo.transaction.RetryingTransactionHelper) ServerConfiguration(org.alfresco.jlan.server.config.ServerConfiguration) FileOpenParams(org.alfresco.jlan.server.filesys.FileOpenParams) NodeRef(org.alfresco.service.cmr.repository.NodeRef) ContentData(org.alfresco.service.cmr.repository.ContentData) NetworkFile(org.alfresco.jlan.server.filesys.NetworkFile) SrvSession(org.alfresco.jlan.server.SrvSession) InputStream(java.io.InputStream) QName(org.alfresco.service.namespace.QName) DeviceContextException(org.alfresco.jlan.server.core.DeviceContextException) FileExistsException(org.alfresco.jlan.server.filesys.FileExistsException) FileNotFoundException(java.io.FileNotFoundException) PermissionDeniedException(org.alfresco.jlan.server.filesys.PermissionDeniedException) AccessDeniedException(org.alfresco.jlan.server.filesys.AccessDeniedException) IOException(java.io.IOException) ClassPathResource(org.springframework.core.io.ClassPathResource) RetryingTransactionCallback(org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback) TreeConnection(org.alfresco.jlan.server.filesys.TreeConnection) DiskSharedDevice(org.alfresco.jlan.server.filesys.DiskSharedDevice)

Example 27 with NetworkFile

use of org.alfresco.jlan.server.filesys.NetworkFile 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 28 with NetworkFile

use of org.alfresco.jlan.server.filesys.NetworkFile in project alfresco-repository by Alfresco.

the class LegacyFileStateDriver method createFile.

@Override
public NetworkFile createFile(SrvSession sess, TreeConnection tree, FileOpenParams params) throws IOException {
    ContentContext tctx = (ContentContext) tree.getContext();
    FileStateCache cache = null;
    FileState fstate = null;
    FileAccessToken token = null;
    if (tctx.hasStateCache()) {
        cache = tctx.getStateCache();
        fstate = tctx.getStateCache().findFileState(params.getPath(), true);
        token = cache.grantFileAccess(params, fstate, FileStatus.NotExist);
        if (logger.isDebugEnabled()) {
            logger.debug("create file created lock token:" + token);
        }
    }
    try {
        NetworkFile newFile = diskInterface.createFile(sess, tree, params);
        int openCount = 1;
        if (newFile instanceof NetworkFileLegacyReferenceCount) {
            NetworkFileLegacyReferenceCount counter = (NetworkFileLegacyReferenceCount) newFile;
            openCount = counter.incrementLegacyOpenCount();
        }
        // This is the create so we store the first access token always
        newFile.setAccessToken(token);
        if (tctx.hasStateCache()) {
            fstate.setProcessId(params.getProcessId());
            fstate.setSharedAccess(params.getSharedAccess());
            // Indicate that the file is open
            fstate.setFileStatus(newFile.isDirectory() ? FileStatus.DirectoryExists : FileStatus.FileExists);
            long allocationSize = params.getAllocationSize();
            if (allocationSize > 0) {
                fstate.setAllocationSize(allocationSize);
                fstate.setFileSize(allocationSize);
            }
            if (newFile instanceof NodeRefNetworkFile) {
                NodeRefNetworkFile x = (NodeRefNetworkFile) newFile;
                x.setFileState(fstate);
            }
            if (newFile instanceof TempNetworkFile) {
                TempNetworkFile x = (TempNetworkFile) newFile;
                x.setFileState(fstate);
            }
        }
        if (newFile instanceof NodeRefNetworkFile) {
            NodeRefNetworkFile x = (NodeRefNetworkFile) newFile;
            x.setProcessId(params.getProcessId());
            x.setAccessToken(token);
        }
        if (newFile instanceof TempNetworkFile) {
            TempNetworkFile x = (TempNetworkFile) newFile;
            x.setAccessToken(token);
        }
        return newFile;
    } catch (IOException ie) {
        if (logger.isDebugEnabled()) {
            logger.debug("create file exception caught", ie);
        }
        if (tctx.hasStateCache() && token != null) {
            if (cache != null && fstate != null && token != null) {
                if (logger.isDebugEnabled()) {
                    logger.debug("create file release lock token:" + token);
                }
                cache.releaseFileAccess(fstate, token);
            }
        }
        throw ie;
    } catch (RuntimeException re) {
        // we could be out of memory or a NPE or some other unforseen situation.  JLAN will complain loudly ... as it should.
        if (logger.isDebugEnabled()) {
            logger.debug("create file exception caught", re);
        }
        if (tctx.hasStateCache() && token != null) {
            if (cache != null && fstate != null && token != null) {
                if (logger.isDebugEnabled()) {
                    logger.debug("create file release lock token:" + token);
                }
                cache.releaseFileAccess(fstate, token);
            }
        }
        throw re;
    }
}
Also used : FileStateCache(org.alfresco.jlan.server.filesys.cache.FileStateCache) FileState(org.alfresco.jlan.server.filesys.cache.FileState) NetworkFileLegacyReferenceCount(org.alfresco.filesys.alfresco.NetworkFileLegacyReferenceCount) IOException(java.io.IOException) NetworkFile(org.alfresco.jlan.server.filesys.NetworkFile) FileAccessToken(org.alfresco.jlan.server.filesys.FileAccessToken)

Example 29 with NetworkFile

use of org.alfresco.jlan.server.filesys.NetworkFile in project alfresco-repository by Alfresco.

the class LegacyFileStateDriver method openFile.

@Override
public NetworkFile openFile(SrvSession sess, TreeConnection tree, FileOpenParams params) throws IOException {
    ContentContext tctx = (ContentContext) tree.getContext();
    String path = params.getPath();
    boolean rollbackOpen = false;
    boolean rollbackToken = false;
    boolean rollbackCount = false;
    boolean rollbackSetToken = false;
    FileAccessToken token = null;
    FileStateCache cache = null;
    FileState fstate = null;
    NetworkFile openFile = null;
    if (tctx.hasStateCache()) {
        cache = tctx.getStateCache();
        fstate = tctx.getStateCache().findFileState(params.getPath(), true);
        if (!params.isDirectory()) {
            try {
                token = cache.grantFileAccess(params, fstate, FileStatus.Unknown);
            } catch (IOException e) {
                if (logger.isDebugEnabled()) {
                    logger.debug("UNABLE to grant file access for path:" + path + ", params" + params, e);
                }
                throw e;
            }
            rollbackToken = true;
            if (logger.isDebugEnabled()) {
                logger.debug("open file created lock token:" + token + ", for path:" + path);
            }
        }
    }
    try {
        openFile = diskInterface.openFile(sess, tree, params);
        rollbackOpen = true;
        if (openFile instanceof NetworkFileLegacyReferenceCount) {
            NetworkFileLegacyReferenceCount counter = (NetworkFileLegacyReferenceCount) openFile;
            int legacyOpenCount = counter.incrementLegacyOpenCount();
            if (logger.isDebugEnabled()) {
                logger.debug("openFile: legacyOpenCount: " + legacyOpenCount);
            }
            rollbackCount = true;
        } else {
            logger.debug("openFile does not implement NetworkFileLegacyReferenceCount");
        }
        if (openFile.hasAccessToken()) {
            // already has an access token, release the second token
            if (cache != null && fstate != null && token != null) {
                if (logger.isDebugEnabled()) {
                    logger.debug("already has access token, release lock token:" + token);
                }
                cache.releaseFileAccess(fstate, token);
            }
        } else {
            if (logger.isDebugEnabled()) {
                logger.debug("store access token on open network file object token:" + token);
            }
            // first access token
            openFile.setAccessToken(token);
            rollbackSetToken = true;
        }
        if (tctx.hasStateCache()) {
            fstate = tctx.getStateCache().findFileState(path, true);
            fstate.setProcessId(params.getProcessId());
            fstate.setSharedAccess(params.getSharedAccess());
            // Access date time is read/write time not open time
            // fstate.updateAccessDateTime();
            fstate.setFileSize(openFile.getFileSize());
            fstate.updateChangeDateTime(openFile.getModifyDate());
            fstate.updateModifyDateTime(openFile.getModifyDate());
        }
        if (openFile instanceof ContentNetworkFile) {
            ContentNetworkFile x = (ContentNetworkFile) openFile;
            x.setProcessId(params.getProcessId());
            if (fstate != null) {
                x.setFileState(fstate);
                fstate.setFileStatus(FileStatus.FileExists);
            }
        } else if (openFile instanceof TempNetworkFile) {
            TempNetworkFile x = (TempNetworkFile) openFile;
            if (fstate != null) {
                x.setFileState(fstate);
                fstate.setFileStatus(FileStatus.FileExists);
            }
        } else if (openFile instanceof AlfrescoFolder) {
            AlfrescoFolder x = (AlfrescoFolder) openFile;
            if (fstate != null) {
                x.setFileState(fstate);
                fstate.setFileStatus(FileStatus.DirectoryExists);
            }
        } else if (openFile instanceof NetworkFile) {
            NetworkFile x = (NetworkFile) openFile;
            if (fstate != null) {
                // NetworkFile does not have setFileState
                // x.setFileState(fstate);
                fstate.setFileStatus(FileStatus.FileExists);
            }
        }
        rollbackToken = false;
        rollbackCount = false;
        rollbackSetToken = false;
        rollbackOpen = false;
        if (logger.isDebugEnabled()) {
            logger.debug("successfully opened file:" + openFile);
        }
        return openFile;
    } finally {
        if (rollbackToken) {
            if (logger.isDebugEnabled()) {
                logger.debug("rollback token:" + token);
            }
            if (cache != null && fstate != null && token != null) {
                if (logger.isDebugEnabled()) {
                    logger.debug("open file release lock token:" + token);
                }
                cache.releaseFileAccess(fstate, token);
            }
        }
        if (rollbackCount) {
            if (logger.isDebugEnabled()) {
                logger.debug("rollback legacy open count:" + token);
            }
            if (openFile instanceof NetworkFileLegacyReferenceCount) {
                NetworkFileLegacyReferenceCount counter = (NetworkFileLegacyReferenceCount) openFile;
                counter.decrementLagacyOpenCount();
            }
        }
        if (rollbackSetToken) {
            if (logger.isDebugEnabled()) {
                logger.debug("rollback set access token:" + token);
            }
            openFile.setAccessToken(null);
        }
        if (rollbackOpen) {
            if (logger.isDebugEnabled()) {
                logger.debug("rollback open:" + token);
            }
            diskInterface.closeFile(sess, tree, openFile);
        }
    }
}
Also used : FileState(org.alfresco.jlan.server.filesys.cache.FileState) IOException(java.io.IOException) NetworkFileLegacyReferenceCount(org.alfresco.filesys.alfresco.NetworkFileLegacyReferenceCount) FileAccessToken(org.alfresco.jlan.server.filesys.FileAccessToken) FileStateCache(org.alfresco.jlan.server.filesys.cache.FileStateCache) NetworkFile(org.alfresco.jlan.server.filesys.NetworkFile)

Example 30 with NetworkFile

use of org.alfresco.jlan.server.filesys.NetworkFile in project alfresco-repository by Alfresco.

the class NonTransactionalRuleContentDiskDriver method openFile.

@Override
public NetworkFile openFile(SrvSession sess, TreeConnection tree, FileOpenParams param) throws IOException {
    String path = param.getPath();
    boolean truncate = param.isOverwrite();
    if (logger.isDebugEnabled()) {
        int sharedAccess = param.getSharedAccess();
        String strSharedAccess = SharingMode.getSharingModeAsString(sharedAccess);
        logger.debug("openFile:" + path + ", isDirectory: " + param.isDirectory() + ", isStream: " + param.isStream() + ", readOnlyAccess: " + param.isReadOnlyAccess() + ", readWriteAccess: " + param.isReadWriteAccess() + ", writeOnlyAccess:" + param.isWriteOnlyAccess() + ", attributesOnlyAccess:" + param.isAttributesOnlyAccess() + ", sequentialAccessOnly:" + param.isSequentialAccessOnly() + ", writeThrough:" + param.isWriteThrough() + ", truncate:" + truncate + ", requestBatchOpLock:" + param.requestBatchOpLock() + ", requestExclusiveOpLock:" + param.requestExclusiveOpLock() + ", isDeleteOnClose:" + param.isDeleteOnClose() + ", allocationSize:" + param.getAllocationSize() + ", sharedAccess: " + strSharedAccess + ", openAction: " + param.getOpenAction() + param);
    }
    ContentContext tctx = (ContentContext) tree.getContext();
    NodeRef rootNode = tctx.getRootNode();
    DriverState driverState = getDriverState(sess);
    String[] paths = FileName.splitPath(path);
    String folder = paths[0];
    String file = paths[1];
    EvaluatorContext ctx = getEvaluatorContext(driverState, folder);
    OpenFileMode openMode = OpenFileMode.READ_ONLY;
    if (param.isAttributesOnlyAccess()) {
        openMode = OpenFileMode.ATTRIBUTES_ONLY;
    } else if (param.isReadWriteAccess()) {
        openMode = OpenFileMode.READ_WRITE;
    } else if (param.isWriteOnlyAccess()) {
        openMode = OpenFileMode.WRITE_ONLY;
    } else if (param.isReadOnlyAccess()) {
        openMode = OpenFileMode.READ_ONLY;
    } else if (param.isDeleteOnClose()) {
        if (logger.isDebugEnabled()) {
            logger.debug("open file has delete on close");
        }
        openMode = OpenFileMode.DELETE;
    }
    try {
        Operation o = new OpenFileOperation(file, openMode, truncate, rootNode, path);
        Command c = ruleEvaluator.evaluate(ctx, o);
        Object ret = commandExecutor.execute(sess, tree, c);
        if (ret != null && ret instanceof NetworkFile) {
            NetworkFile x = (NetworkFile) ret;
            if (logger.isDebugEnabled()) {
                logger.debug("returning open file: for path:" + path + ", ret:" + ret);
            }
            return x;
        } else {
            // Error - contact broken
            logger.error("contract broken - NetworkFile not returned. " + ret == null ? "Return value is null" : ret);
            return null;
        }
    } catch (org.alfresco.repo.security.permissions.AccessDeniedException ade) {
        throw new AccessDeniedException("Unable to open file " + param.getPath(), ade);
    }
// return diskInterface.openFile(sess, tree, params);
}
Also used : AccessDeniedException(org.alfresco.jlan.server.filesys.AccessDeniedException) EvaluatorContext(org.alfresco.filesys.repo.rules.EvaluatorContext) OpenFileOperation(org.alfresco.filesys.repo.rules.operations.OpenFileOperation) RenameFileOperation(org.alfresco.filesys.repo.rules.operations.RenameFileOperation) DeleteFileOperation(org.alfresco.filesys.repo.rules.operations.DeleteFileOperation) CreateFileOperation(org.alfresco.filesys.repo.rules.operations.CreateFileOperation) Operation(org.alfresco.filesys.repo.rules.Operation) MoveFileOperation(org.alfresco.filesys.repo.rules.operations.MoveFileOperation) CloseFileOperation(org.alfresco.filesys.repo.rules.operations.CloseFileOperation) OpenFileOperation(org.alfresco.filesys.repo.rules.operations.OpenFileOperation) NodeRef(org.alfresco.service.cmr.repository.NodeRef) Command(org.alfresco.filesys.repo.rules.Command) NetworkFile(org.alfresco.jlan.server.filesys.NetworkFile)

Aggregations

NetworkFile (org.alfresco.jlan.server.filesys.NetworkFile)54 NodeRef (org.alfresco.service.cmr.repository.NodeRef)48 SrvSession (org.alfresco.jlan.server.SrvSession)44 ServerConfiguration (org.alfresco.jlan.server.config.ServerConfiguration)44 DiskSharedDevice (org.alfresco.jlan.server.filesys.DiskSharedDevice)44 FileOpenParams (org.alfresco.jlan.server.filesys.FileOpenParams)44 TreeConnection (org.alfresco.jlan.server.filesys.TreeConnection)44 RetryingTransactionHelper (org.alfresco.repo.transaction.RetryingTransactionHelper)44 RetryingTransactionCallback (org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback)44 IOException (java.io.IOException)36 Serializable (java.io.Serializable)33 AccessDeniedException (org.alfresco.jlan.server.filesys.AccessDeniedException)29 QName (org.alfresco.service.namespace.QName)27 FileNotFoundException (java.io.FileNotFoundException)24 FileExistsException (org.alfresco.jlan.server.filesys.FileExistsException)24 PermissionDeniedException (org.alfresco.jlan.server.filesys.PermissionDeniedException)24 DeviceContextException (org.alfresco.jlan.server.core.DeviceContextException)23 ContentData (org.alfresco.service.cmr.repository.ContentData)14 ClassPathResource (org.springframework.core.io.ClassPathResource)12 InputStream (java.io.InputStream)7