public class ContentDiskDriver extends AlfrescoTxDiskDriver implements org.alfresco.jlan.server.filesys.DiskInterface, org.alfresco.jlan.server.locking.FileLockingInterface, org.alfresco.jlan.server.locking.OpLockInterface, org.alfresco.jlan.server.filesys.DiskSizeInterface
Provides a filesystem interface for various protocols such as SMB/CIFS and FTP.
AlfrescoTxDiskDriver.CallableIO<V>, AlfrescoTxDiskDriver.PropagatingException
Modifier and Type | Field and Description |
---|---|
static String |
AttrLinkNode |
static String |
CanDeleteWithoutPerms |
static int |
CustomFileStatus |
static int |
DeleteOnClose |
static int |
DirectoryExists |
protected static long |
DiskFreeDefault |
protected static long |
DiskSizeDefault |
static int |
FileExists |
static int |
FileNotExist |
static int |
FileRenamed |
static int |
FileUnknown |
ioControlHandler, m_transactionService
Constructor and Description |
---|
ContentDiskDriver(CifsHelper cifsHelper)
Class constructor
|
Modifier and Type | Method and Description |
---|---|
void |
closeFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.NetworkFile file)
Close the file.
|
org.alfresco.jlan.server.core.DeviceContext |
createContext(String deviceName,
org.springframework.extensions.config.ConfigElement cfg)
Parse and validate the parameter string and create a device context object for this instance
of the shared device.
|
void |
createDirectory(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.FileOpenParams params)
Create a new directory on this file system.
|
org.alfresco.jlan.server.filesys.NetworkFile |
createFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.FileOpenParams params)
Create a new file on the file system.
|
void |
deleteDirectory(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String dir)
Delete the directory from the filesystem.
|
void |
deleteFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String name)
Delete the specified file.
|
int |
fileExists(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String name)
Check if the specified file exists, and whether it is a file or directory.
|
void |
flushFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.NetworkFile file)
Flush any buffered output for the specified file.
|
ActionService |
getActionService() |
AuthenticationContext |
getAuthenticationContext()
Return the authentication context
|
AuthenticationService |
getAuthenticationService()
Return the authentication service
|
CheckOutCheckInService |
getCheckOutCheckInService() |
CifsHelper |
getCifsHelper()
Return the CIFS helper
|
ContentService |
getContentService()
Return the content service
|
org.alfresco.service.cmr.dictionary.DictionaryService |
getDictionaryService()
Return the dictionary service
|
void |
getDiskInformation(org.alfresco.jlan.server.filesys.DiskDeviceContext ctx,
org.alfresco.jlan.server.filesys.SrvDiskInfo diskDev)
Get the disk information for this shared disk device.
|
FileFolderService |
getFileFolderService()
Return the file folder service
|
org.alfresco.jlan.server.filesys.FileInfo |
getFileInformation(org.alfresco.jlan.server.SrvSession session,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String path)
Get the file information for the specified file.
|
org.alfresco.jlan.server.locking.LockManager |
getLockManager(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree)
Return the lock manager used by this filesystem
|
LockService |
getLockService()
Return the lock service
|
org.alfresco.service.namespace.NamespaceService |
getNamespaceService()
Return the namespace service
|
NodeArchiveService |
getNodeArchiveService()
Return the node archive service
|
org.alfresco.service.cmr.repository.NodeRef |
getNodeForPath(org.alfresco.jlan.server.filesys.TreeConnection tree,
String path)
Get the node for the specified path
|
org.alfresco.service.cmr.repository.NodeService |
getNodeService()
Return the node service
|
org.alfresco.jlan.server.locking.OpLockManager |
getOpLockManager(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree)
Return the oplock manager implementation associated with this virtual filesystem
|
OwnableService |
getOwnableService()
Get the ownable service
|
String |
getPathForNode(org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.service.cmr.repository.NodeRef nodeRef)
Convert a node into a share relative path
|
org.alfresco.service.cmr.security.PermissionService |
getPermissionService()
Return the permission service
|
BehaviourFilter |
getPolicyFilter()
Get the policy behaviour filter, used to inhibit versioning on a per transaction basis
|
org.alfresco.jlan.server.filesys.pseudo.PseudoFileInterface |
getPseudoFileInterface(ContentContext context)
Return the pseudo file support implementation
|
org.alfresco.service.cmr.search.SearchService |
getSearchService()
Return the search service
|
org.alfresco.jlan.server.filesys.cache.FileState |
getStateForPath(org.alfresco.jlan.server.filesys.TreeConnection tree,
String path)
Get the file state for the specified path
|
boolean |
hasPseudoFileInterface(ContentContext context)
Check if pseudo file support is enabled
|
void |
init() |
boolean |
isOpLocksEnabled(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree)
Enable/disable oplock support
|
boolean |
isReadOnly(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.core.DeviceContext ctx)
Determine if the disk device is read-only.
|
org.alfresco.jlan.server.filesys.NetworkFile |
openFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.FileOpenParams params)
Open a file or folder
|
int |
readFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.NetworkFile file,
byte[] buffer,
int bufferPosition,
int size,
long fileOffset)
Read a block of data from the specified file.
|
void |
registerContext(org.alfresco.jlan.server.core.DeviceContext ctx)
Registers a device context object for this instance
of the shared device.
|
void |
renameFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String oldName,
String newName)
Rename the specified file.
|
long |
seekFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.NetworkFile file,
long pos,
int typ)
Seek to the specified file position.
|
void |
setActionService(ActionService actionService) |
void |
setAuthenticationContext(AuthenticationContext authContext)
Set the authentication context
|
void |
setAuthenticationService(AuthenticationService authService)
Set the authentication service
|
void |
setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService) |
void |
setContentService(ContentService contentService) |
void |
setDictionaryService(org.alfresco.service.cmr.dictionary.DictionaryService dictionaryService)
Set the dictionary service
|
void |
setFileFolderService(FileFolderService fileService)
Set the file folder service
|
void |
setFileInformation(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String name,
org.alfresco.jlan.server.filesys.FileInfo info)
Set file information
|
void |
setLockService(LockService lockService)
Set the lock service
|
void |
setMimetypeService(org.alfresco.service.cmr.repository.MimetypeService mimetypeService) |
void |
setNamespaceService(org.alfresco.service.namespace.NamespaceService namespaceService) |
void |
setNodeArchiveService(NodeArchiveService nodeArchiveService)
Set the node archive service
|
void |
setNodeMonitorFactory(NodeMonitorFactory nodeMonitorFactory)
Set the node monitor factory
|
void |
setNodeService(org.alfresco.service.cmr.repository.NodeService nodeService) |
void |
setOwnableService(OwnableService ownableService)
Set the ownable servive
|
void |
setPermissionService(org.alfresco.service.cmr.security.PermissionService permissionService)
Set the permission service
|
void |
setPolicyFilter(BehaviourFilter policyFilter)
Set the policy behaviour filter, used to inhibit versioning on a per transaction basis
|
void |
setRenameCSVShufflePattern(Pattern renameCSVShufflePattern)
Set the regular expression that will be applied to CSV files during renames.
|
void |
setSearchService(org.alfresco.service.cmr.search.SearchService searchService) |
void |
setSysAdminParams(SysAdminParams sysAdminParams)
Sets the sys admin params.
|
org.alfresco.jlan.server.filesys.SearchContext |
startSearch(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
String searchPath,
int attributes)
Start a new search on the filesystem using the specified searchPath that may contain
wildcards.
|
void |
treeClosed(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree)
Connection opened to this disk device
|
void |
treeOpened(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree)
Connection closed to this device
|
void |
truncateFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.NetworkFile file,
long size)
Truncate a file to the specified size
|
int |
writeFile(org.alfresco.jlan.server.SrvSession sess,
org.alfresco.jlan.server.filesys.TreeConnection tree,
org.alfresco.jlan.server.filesys.NetworkFile file,
byte[] buffer,
int bufferOffset,
int size,
long fileOffset)
Write a block of data to the file.
|
beginReadTransaction, beginWriteTransaction, doInWriteTransaction, endTransaction
getIoControlHandler, getServiceRegistry, getTransactionService, processIOControl, setIoControlHandler, setServiceRegistry, setTransactionService
public static final int FileUnknown
public static final int FileNotExist
public static final int FileExists
public static final int DirectoryExists
public static final int CustomFileStatus
public static final int FileRenamed
public static final int DeleteOnClose
public static final String AttrLinkNode
public static final String CanDeleteWithoutPerms
protected static final long DiskSizeDefault
protected static final long DiskFreeDefault
public ContentDiskDriver(CifsHelper cifsHelper)
cifsHelper
- to connect to the repository servicespublic void init()
public final CifsHelper getCifsHelper()
public final AuthenticationService getAuthenticationService()
public final AuthenticationContext getAuthenticationContext()
public final org.alfresco.service.cmr.repository.NodeService getNodeService()
public CheckOutCheckInService getCheckOutCheckInService()
public final ContentService getContentService()
public final org.alfresco.service.namespace.NamespaceService getNamespaceService()
public final org.alfresco.service.cmr.search.SearchService getSearchService()
public final FileFolderService getFileFolderService()
public final org.alfresco.service.cmr.security.PermissionService getPermissionService()
public final NodeArchiveService getNodeArchiveService()
public final LockService getLockService()
public BehaviourFilter getPolicyFilter()
public final org.alfresco.service.cmr.dictionary.DictionaryService getDictionaryService()
public final OwnableService getOwnableService()
public void setContentService(ContentService contentService)
contentService
- the content servicepublic void setNamespaceService(org.alfresco.service.namespace.NamespaceService namespaceService)
namespaceService
- the namespace servicepublic void setNodeService(org.alfresco.service.cmr.repository.NodeService nodeService)
nodeService
- the node servicepublic void setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService)
checkOutCheckInService
- used to check for checked out nodespublic void setSearchService(org.alfresco.service.cmr.search.SearchService searchService)
searchService
- the search servicepublic void setPermissionService(org.alfresco.service.cmr.security.PermissionService permissionService)
permissionService
- PermissionServicepublic void setAuthenticationContext(AuthenticationContext authContext)
authContext
- AuthenticationContextpublic void setAuthenticationService(AuthenticationService authService)
authService
- AuthenticationServicepublic void setSysAdminParams(SysAdminParams sysAdminParams)
sysAdminParams
- the sys admin paramspublic void setFileFolderService(FileFolderService fileService)
fileService
- FileFolderServicepublic void setMimetypeService(org.alfresco.service.cmr.repository.MimetypeService mimetypeService)
mimetypeService
- service for helping with mimetypes and encodingpublic void setNodeMonitorFactory(NodeMonitorFactory nodeMonitorFactory)
nodeMonitorFactory
- NodeMonitorFactorypublic void setNodeArchiveService(NodeArchiveService nodeArchiveService)
nodeArchiveService
- nodeArchiveServicepublic void setLockService(LockService lockService)
lockService
- LockServicepublic void setPolicyFilter(BehaviourFilter policyFilter)
policyFilter
- PolicyBehaviourFilterpublic void setDictionaryService(org.alfresco.service.cmr.dictionary.DictionaryService dictionaryService)
dictionaryService
- DictionaryServicepublic void setOwnableService(OwnableService ownableService)
ownableService
- OwnableServicepublic void setRenameCSVShufflePattern(Pattern renameCSVShufflePattern)
renameCSVShufflePattern
- a regular expression CSV filename matchpublic org.alfresco.jlan.server.core.DeviceContext createContext(String deviceName, org.springframework.extensions.config.ConfigElement cfg) throws org.alfresco.jlan.server.core.DeviceContextException
WARNING: side effect, may commit or roll back current user transaction context.
createContext
in interface org.alfresco.jlan.server.core.DeviceInterface
deviceName
- The name of the devicecfg
- ConfigElement the configuration of the device context.org.alfresco.jlan.server.core.DeviceContextException
public void registerContext(org.alfresco.jlan.server.core.DeviceContext ctx) throws org.alfresco.jlan.server.core.DeviceContextException
registerContext
in interface ExtendedDiskInterface
registerContext
in class AlfrescoDiskDriver
ctx
- the contextorg.alfresco.jlan.server.core.DeviceContextException
public final boolean hasPseudoFileInterface(ContentContext context)
context
- ContentContextpublic final org.alfresco.jlan.server.filesys.pseudo.PseudoFileInterface getPseudoFileInterface(ContentContext context)
context
- ContentContextpublic boolean isReadOnly(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.core.DeviceContext ctx) throws IOException
isReadOnly
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessionctx
- Device contextIOException
- If an error occurs.public org.alfresco.jlan.server.filesys.FileInfo getFileInformation(org.alfresco.jlan.server.SrvSession session, org.alfresco.jlan.server.filesys.TreeConnection tree, String path) throws IOException
getFileInformation
in interface org.alfresco.jlan.server.filesys.DiskInterface
session
- Server sessiontree
- Tree connectionpath
- File name/path that information is required for.IOException
- The exception description.public org.alfresco.jlan.server.filesys.SearchContext startSearch(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, String searchPath, int attributes) throws FileNotFoundException
startSearch
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionsearchPath
- File(s) to search for, may include wildcards.attributes
- Attributes of the file(s) to search for, see class SMBFileAttribute.FileNotFoundException
- If the search could not be started.public int fileExists(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, String name)
WARNING: side effect, commit or roll back current user transaction context. Current transaction becomes read only.
fileExists
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionname
- the path of the fileFileStatus
public org.alfresco.jlan.server.filesys.NetworkFile openFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.FileOpenParams params) throws IOException
openFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- SrvSessiontree
- TreeConnectionparams
- FileOpenParamsIOException
public org.alfresco.jlan.server.filesys.NetworkFile createFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.FileOpenParams params) throws IOException
WARNING : side effect - closes current transaction context.
createFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionparams
- File create parametersIOException
- If an error occurs.public void createDirectory(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.FileOpenParams params) throws IOException
WARNING : side effect - closes current transaction context.
createDirectory
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connection.params
- Directory create parametersIOException
- If an error occurs.public void deleteDirectory(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, String dir) throws IOException
deleteDirectory
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectiondir
- Directory name.IOException
- The exception description.public void flushFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.NetworkFile file) throws IOException
flushFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionfile
- Network file context.IOException
- The exception description.public void closeFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.NetworkFile file) throws IOException
closeFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connection.file
- Network file context.IOException
- If an error occurs.public void deleteFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, String name) throws IOException
deleteFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionname
- NetworkFileIOException
- The exception description.public void renameFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, String oldName, String newName) throws IOException
renameFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionoldName
- java.lang.StringnewName
- java.lang.StringIOException
- The exception description.public void setFileInformation(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, String name, org.alfresco.jlan.server.filesys.FileInfo info) throws IOException
setFileInformation
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- SrvSessiontree
- TreeConnectionname
- Stringinfo
- FileInfoIOException
public void truncateFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.NetworkFile file, long size) throws IOException
truncateFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionfile
- Network file detailssize
- New file lengthIOException
- The exception description.public int readFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.NetworkFile file, byte[] buffer, int bufferPosition, int size, long fileOffset) throws IOException
readFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Session detailstree
- Tree connectionfile
- Network filebuffer
- Buffer to return data tobufferPosition
- Starting position in the return buffersize
- Maximum size of data to returnfileOffset
- File offset to read dataIOException
- The exception description.public long seekFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.NetworkFile file, long pos, int typ) throws IOException
seekFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionfile
- Network file.pos
- Position to seek to.typ
- Seek type.IOException
public int writeFile(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.jlan.server.filesys.NetworkFile file, byte[] buffer, int bufferOffset, int size, long fileOffset) throws IOException
writeFile
in interface org.alfresco.jlan.server.filesys.DiskInterface
sess
- Server sessiontree
- Tree connectionfile
- Network file detailsbuffer
- byte[] Data to be writtenbufferOffset
- Offset within the buffer that the data startssize
- int Data lengthfileOffset
- Position within the file that the data is to be written.IOException
- The exception description.public org.alfresco.service.cmr.repository.NodeRef getNodeForPath(org.alfresco.jlan.server.filesys.TreeConnection tree, String path) throws FileNotFoundException
tree
- TreeConnectionpath
- StringFileNotFoundException
public String getPathForNode(org.alfresco.jlan.server.filesys.TreeConnection tree, org.alfresco.service.cmr.repository.NodeRef nodeRef) throws FileNotFoundException
FileNotFoundException
public org.alfresco.jlan.server.filesys.cache.FileState getStateForPath(org.alfresco.jlan.server.filesys.TreeConnection tree, String path) throws FileNotFoundException
tree
- TreeConnectionpath
- StringFileNotFoundException
public void treeClosed(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree)
treeClosed
in interface org.alfresco.jlan.server.core.DeviceInterface
sess
- Server sessiontree
- Tree connectionpublic void treeOpened(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree)
treeOpened
in interface org.alfresco.jlan.server.core.DeviceInterface
sess
- Server sessiontree
- Tree connectionpublic org.alfresco.jlan.server.locking.LockManager getLockManager(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree)
getLockManager
in interface org.alfresco.jlan.server.locking.FileLockingInterface
sess
- SrvSessiontree
- TreeConnectionpublic org.alfresco.jlan.server.locking.OpLockManager getOpLockManager(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree)
getOpLockManager
in interface org.alfresco.jlan.server.locking.OpLockInterface
sess
- SrvSessiontree
- TreeConnectionpublic boolean isOpLocksEnabled(org.alfresco.jlan.server.SrvSession sess, org.alfresco.jlan.server.filesys.TreeConnection tree)
isOpLocksEnabled
in interface org.alfresco.jlan.server.locking.OpLockInterface
sess
- SrvSessiontree
- TreeConnectionpublic void getDiskInformation(org.alfresco.jlan.server.filesys.DiskDeviceContext ctx, org.alfresco.jlan.server.filesys.SrvDiskInfo diskDev) throws IOException
getDiskInformation
in interface org.alfresco.jlan.server.filesys.DiskSizeInterface
ctx
- DiskDeviceContextdiskDev
- SrvDiskInfoIOException
public void setActionService(ActionService actionService)
public ActionService getActionService()
Copyright © 2005–2017 Alfresco Software. All rights reserved.