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);
}
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;
}
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;
}
}
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);
}
}
}
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);
}
Aggregations