mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
.externalToolBuilders
config
source
cpp
java
org
alfresco
email
filesys
alfresco
auth
avm
AVMContext.java
AVMDiskDriver.java
AVMNetworkFile.java
AVMPath.java
AVMSearchContext.java
AVMShareMapper.java
AVMSingleFileSearchContext.java
DummyFolderPseudoFile.java
PseudoFileListSearchContext.java
StorePseudoFile.java
StoreType.java
VersionPseudoFile.java
WebProjectStorePseudoFile.java
debug
repo
state
util
AlfrescoConfigSection.java
CIFSServerBean.java
FTPServerBean.java
FileServerConfig.java
FileServerConfigMBean.java
NFSServerBean.java
ServerConfigurationBean.java
jcr
linkvalidation
model
repo
sandbox
service
tools
util
apache
queryRegister.dtd
meta-inf
test-resources
web
.classpath
.project
build.xml
Restructured the file server code packages. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@7757 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
363 lines
12 KiB
Java
363 lines
12 KiB
Java
/*
|
|
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* As a special exception to the terms and conditions of version 2.0 of
|
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
|
* FLOSS exception. You should have recieved a copy of the text describing
|
|
* the FLOSS exception, and it is also available here:
|
|
* http://www.alfresco.com/legal/licensing" */
|
|
|
|
package org.alfresco.filesys.avm;
|
|
|
|
import java.util.Enumeration;
|
|
|
|
import org.alfresco.config.ConfigElement;
|
|
import org.alfresco.jlan.server.SrvSession;
|
|
import org.alfresco.jlan.server.config.InvalidConfigurationException;
|
|
import org.alfresco.jlan.server.config.ServerConfiguration;
|
|
import org.alfresco.jlan.server.core.InvalidDeviceInterfaceException;
|
|
import org.alfresco.jlan.server.core.ShareMapper;
|
|
import org.alfresco.jlan.server.core.ShareType;
|
|
import org.alfresco.jlan.server.core.SharedDevice;
|
|
import org.alfresco.jlan.server.core.SharedDeviceList;
|
|
import org.alfresco.jlan.server.filesys.DiskSharedDevice;
|
|
import org.alfresco.jlan.server.filesys.FilesystemsConfigSection;
|
|
import org.alfresco.jlan.util.StringList;
|
|
import org.alfresco.service.cmr.avm.AVMNotFoundException;
|
|
import org.alfresco.service.cmr.avm.AVMService;
|
|
import org.alfresco.service.cmr.avm.AVMWrongTypeException;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
/**
|
|
* AVM Filesystem Share Mapper Class
|
|
*
|
|
* <p>Provides access to store versions using the share name '<storename>_<version>'.
|
|
*
|
|
* @author gkspencer
|
|
*/
|
|
public class AVMShareMapper implements ShareMapper {
|
|
|
|
// Logging
|
|
|
|
private static final Log logger = LogFactory.getLog("org.alfresco.smb.protocol");
|
|
|
|
// Regular expression to test for AVM versioned share name
|
|
|
|
private static final String AVM_SHAREPATTERN = "[a-zA-Z0-9-]*_[0-9]+";
|
|
|
|
// Server configuration
|
|
|
|
private ServerConfiguration m_config;
|
|
private FilesystemsConfigSection m_filesysConfig;
|
|
|
|
// List of available AVM shares
|
|
|
|
private StringList m_avmShareNames;
|
|
|
|
// Filesystem driver to be used to create home shares
|
|
|
|
private AVMDiskDriver m_driver;
|
|
|
|
// Debug enable flag
|
|
|
|
private boolean m_debug;
|
|
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
public AVMShareMapper()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Initialize the share mapper
|
|
*
|
|
* @param config ServerConfiguration
|
|
* @param params ConfigElement
|
|
* @exception InvalidConfigurationException
|
|
*/
|
|
public void initializeMapper(ServerConfiguration config, ConfigElement params) throws InvalidConfigurationException
|
|
{
|
|
// Save the server configuration
|
|
|
|
m_config = config;
|
|
m_filesysConfig = (FilesystemsConfigSection) m_config.getConfigSection(FilesystemsConfigSection.SectionName);
|
|
|
|
// Check if debug is enabled
|
|
|
|
if (params != null && params.getChild("debug") != null)
|
|
m_debug = true;
|
|
|
|
// Build the list of available AVM share names
|
|
|
|
m_avmShareNames = new StringList();
|
|
|
|
SharedDeviceList shrList = m_filesysConfig.getShares();
|
|
Enumeration<SharedDevice> shrEnum = shrList.enumerateShares();
|
|
|
|
while ( shrEnum.hasMoreElements())
|
|
{
|
|
// Get the current shared device and check if it is an AVM filesystem device
|
|
|
|
SharedDevice curShare = shrEnum.nextElement();
|
|
|
|
try
|
|
{
|
|
if ( curShare.getInterface() instanceof AVMDiskDriver)
|
|
{
|
|
// Add the shared filesystem name to the list of AVM shares
|
|
|
|
m_avmShareNames.addString( curShare.getName());
|
|
|
|
// Set the AVM filesystem driver to be used when creating dynamic shares
|
|
|
|
if ( m_driver == null)
|
|
m_driver = (AVMDiskDriver) curShare.getInterface();
|
|
}
|
|
}
|
|
catch ( InvalidDeviceInterfaceException ex)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if debug output is enabled
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public final boolean hasDebug()
|
|
{
|
|
return m_debug;
|
|
}
|
|
|
|
/**
|
|
* Return the list of available shares.
|
|
*
|
|
* @param host String
|
|
* @param sess SrvSession
|
|
* @param allShares boolean
|
|
* @return SharedDeviceList
|
|
*/
|
|
public SharedDeviceList getShareList(String host, SrvSession sess, boolean allShares)
|
|
{
|
|
// Make a copy of the global share list and add the per session dynamic shares
|
|
|
|
SharedDeviceList shrList = new SharedDeviceList(m_filesysConfig.getShares());
|
|
|
|
if ( sess != null && sess.hasDynamicShares()) {
|
|
|
|
// Add the per session dynamic shares
|
|
|
|
shrList.addShares(sess.getDynamicShareList());
|
|
}
|
|
|
|
// Remove unavailable shares from the list and return the list
|
|
|
|
if ( allShares == false)
|
|
shrList.removeUnavailableShares();
|
|
return shrList;
|
|
}
|
|
|
|
/**
|
|
* Find a share using the name and type for the specified client.
|
|
*
|
|
* @param host String
|
|
* @param name String
|
|
* @param typ int
|
|
* @param sess SrvSession
|
|
* @param create boolean
|
|
* @return SharedDevice
|
|
* @exception InvalidUserException
|
|
*/
|
|
public SharedDevice findShare(String tohost, String name, int typ, SrvSession sess, boolean create)
|
|
throws Exception
|
|
{
|
|
// Find the required share by name/type. Use a case sensitive search first, if that fails use a case
|
|
// insensitive search.
|
|
|
|
SharedDevice share = m_filesysConfig.getShares().findShare(name, typ, false);
|
|
|
|
if ( share == null)
|
|
{
|
|
|
|
// Try a case insensitive search for the required share
|
|
|
|
share = m_filesysConfig.getShares().findShare(name, typ, true);
|
|
}
|
|
|
|
// If the share was not found then check if the share is in the AVM versioned share format - '<storename>_<version>'
|
|
|
|
if ( share == null && ( typ == ShareType.DISK || typ == ShareType.UNKNOWN))
|
|
{
|
|
// Check if the share has already been created for the session
|
|
|
|
if ( sess.hasDynamicShares())
|
|
{
|
|
|
|
// Check if the required share exists in the sessions dynamic share list
|
|
|
|
share = sess.getDynamicShareList().findShare(name, typ, false);
|
|
|
|
// DEBUG
|
|
|
|
if ( logger.isDebugEnabled())
|
|
logger.debug(" Reusing existing dynamic share for " + name);
|
|
}
|
|
|
|
// Check if the share name matches the AVM versioned share name pattern
|
|
|
|
if ( share == null && create == true && name.matches( AVM_SHAREPATTERN))
|
|
{
|
|
// DEBUG
|
|
|
|
if ( logger.isDebugEnabled())
|
|
logger.debug("Map dynamic share " + name + ", type=" + ShareType.TypeAsString(typ));
|
|
|
|
// Split the store name and version id from the share name
|
|
|
|
int pos = name.indexOf( '_');
|
|
|
|
String storePath = name.substring(0, pos) + ":/";
|
|
int storeVersion = -1;
|
|
|
|
try
|
|
{
|
|
String storeVer = name.substring( pos + 1);
|
|
storeVersion = Integer.parseInt( storeVer);
|
|
|
|
if ( storeVersion < 0)
|
|
storeVersion = -1;
|
|
}
|
|
catch ( NumberFormatException ex)
|
|
{
|
|
logger.error( "Invalid store version id, name=" + name);
|
|
}
|
|
|
|
// Create the disk driver and context
|
|
|
|
if ( storePath.length() > 0 && storeVersion != -1)
|
|
{
|
|
// Validate the store name and version
|
|
|
|
AVMService avmService = m_driver.getAvmService();
|
|
|
|
m_driver.beginReadTransaction( sess);
|
|
|
|
try
|
|
{
|
|
// Validate the store name/version
|
|
|
|
avmService.lookup( storeVersion, storePath);
|
|
|
|
// Create a dynamic share mapped to the AVM store/version
|
|
|
|
AVMContext avmCtx = new AVMContext( name, storePath, storeVersion);
|
|
avmCtx.enableStateTable( true, m_driver.getStateReaper());
|
|
|
|
// Create a dynamic shared device for the store version
|
|
|
|
DiskSharedDevice diskShare = new DiskSharedDevice( name, m_driver, avmCtx, SharedDevice.Temporary);
|
|
|
|
// Add the new share to the sessions dynamic share list
|
|
|
|
sess.addDynamicShare(diskShare);
|
|
share = diskShare;
|
|
|
|
// DEBUG
|
|
|
|
if (logger.isDebugEnabled())
|
|
logger.debug(" Mapped share " + name + " - " + diskShare);
|
|
}
|
|
catch ( AVMNotFoundException ex)
|
|
{
|
|
// DEBUG
|
|
|
|
if ( logger.isDebugEnabled())
|
|
logger.debug( "Failed to map share to " + name + ", not such store/version");
|
|
}
|
|
catch ( AVMWrongTypeException ex)
|
|
{
|
|
// DEBUG
|
|
|
|
if ( logger.isDebugEnabled())
|
|
logger.debug( "Failed to map share to " + name + ", wrong type");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check if the share is available
|
|
|
|
if ( share != null && share.getContext() != null && share.getContext().isAvailable() == false)
|
|
share = null;
|
|
|
|
// Return the shared device, or null if no matching device was found
|
|
|
|
return share;
|
|
}
|
|
|
|
/**
|
|
* Delete temporary shares for the specified session
|
|
*
|
|
* @param sess SrvSession
|
|
*/
|
|
public void deleteShares(SrvSession sess)
|
|
{
|
|
|
|
// Check if the session has any dynamic shares
|
|
|
|
if ( sess.hasDynamicShares() == false)
|
|
return;
|
|
|
|
// Delete the dynamic shares
|
|
|
|
SharedDeviceList shares = sess.getDynamicShareList();
|
|
Enumeration<SharedDevice> enm = shares.enumerateShares();
|
|
|
|
while ( enm.hasMoreElements()) {
|
|
|
|
// Get the current share from the list
|
|
|
|
SharedDevice shr = (SharedDevice) enm.nextElement();
|
|
|
|
// Close the shared device
|
|
|
|
shr.getContext().CloseContext();
|
|
|
|
// DEBUG
|
|
|
|
if (logger.isDebugEnabled())
|
|
logger.debug("Deleted dynamic share " + shr);
|
|
}
|
|
|
|
// Clear the dynamic share list
|
|
|
|
shares.removeAllShares();
|
|
}
|
|
|
|
/**
|
|
* Close the share mapper, release any resources.
|
|
*/
|
|
public void closeMapper()
|
|
{
|
|
// TODO Auto-generated method stub
|
|
|
|
}
|
|
}
|