Merged DEV/SWIFT to HEAD

26012: OpenCMIS server bug fixes: PWC properties update and document version delete
   26205: - integrated the CMIS Client API project into the build
          - made the local CMIS client use the Alfresco OpenCMIS Extension
          - updated OpenCMIS
   26300: expose all non-child associations through OpenCMIS and check relationship source and target instead of the relationship type
   26356: OpenCMIS update
   26378: added more CMIS client examples
   26380: added helper methods for CMIS client
   26500: - fixed CMIS date aspect property encoding 
          - fixed CMIS rendition filter handling
   26519: OpenCMIS update
   26523: fixed CMISConnectionManager
   26596: renamed CMIS JavaScript root objects (cmis -> cmisserver, cmisclient -> cmis)
   26651: removed the cmis-client-api project and replaced it with a jar in 3rd-party
   26652: - corrected CMIS samples
   26656: - removed cmis-client-api from build
   26658: - removed the last bit of cmis-client-api
   26663: - added CMIS samples (browser and upload)
   26742: CMIS webscripts samples update
   26743: CMIS webscripts samples update
   26939: removed duplicate commons-fileupload
   26942: updated commons-lang to 2.6
   26943: updated OpenCMIS (browser binding is now included in the server framework)
   26953: refactored OpenCMIS client integration
   26974: Update classpath for Florian - OpenCMIS browser bindings are now rolled into the main jar, no need for their own one
   26975: removed outdated CMIS browser binding demo page
   27048: port of the Spring Surf CMIS browser plus a few new features (create folder, create document, delete object)
   27077: bug fix: CMIS id for associations
   27079: OpenCMIS update
   27085: added check if CMIS is supported
   27086: OpenCMIS client bindings update (force JAX-WS RI)
   27138: clean up
   27764: CMIS default connection handling
   27879: OpenCMIS client: moved server definitions to separate config file
   27880: OpenCMIS client: removed test repositories from configuration
   27918: changed CMIS server configuration tag name to match Spring Surf configuration
   27920: enabled relationships in CMIS browser
   27924: Updated Spring Surf and added the Spring Surf CMIS framework
          [Merge note: Kept most recent HEAD jars where conflicts occured]
   27926: Updated Spring Surf source jars
          [Merge note: Kept most recent HEAD jars where conflicts occured]

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28219 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2011-06-06 19:49:42 +00:00
parent 23207fbf7f
commit 633aa3b36e
108 changed files with 2258 additions and 414 deletions

View File

@@ -19,7 +19,6 @@
package org.alfresco.repo.cmis.client;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -33,27 +32,38 @@ import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.SessionFactory;
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.extensions.config.ConfigService;
public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectionManager, InitializingBean
/**
* Connection manager base class.
*/
public abstract class AbstractCMISConnectionManagerImpl extends CMISHelper implements CMISConnectionManager
{
public static final String SERVER_NAME = "name";
public static final String SERVER_DESCRIPTION = "description";
public static final String LOCAL_CONNECTION_ID = "local";
public static final String DEFAULT_CONNECTION_ID = "default";
public static final char RESERVED_ID_CHAR = '$';
protected ConfigService configService;
protected AuthenticationService authenticationService;
protected SessionFactory sessionFactory;
protected final SessionFactory sessionFactory = SessionFactoryImpl.newInstance();
protected LinkedHashMap<String, CMISConnection> sharedConnections;
protected LinkedHashMap<String, CMISConnection> userConnections;
protected int userConnectionsCapacity = 1000;
protected int sharedConnectionsCapacity = 1000;
protected int sharedConnectionsCapacity = 100;
protected Map<String, CMISServer> servers;
protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
protected final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
// --- set up ---
public void setConfigService(ConfigService configService)
{
this.configService = configService;
}
public void setAuthenticationService(AuthenticationService authenticationService)
{
@@ -70,28 +80,12 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
this.sharedConnectionsCapacity = sharedConnectionsCapacity;
}
public void setServers(List<Map<String, String>> serverList)
{
servers = new HashMap<String, CMISServer>();
for (Map<String, String> serverData : serverList)
{
CMISServer server = createServerDefinition(serverData);
if (server != null)
{
servers.put(server.getName(), server);
}
}
}
@Override
public void afterPropertiesSet() throws Exception
public void init()
{
lock.writeLock().lock();
try
{
sessionFactory = SessionFactoryImpl.newInstance();
// create shared connection LRU cache
sharedConnections = new LinkedHashMap<String, CMISConnection>(sharedConnectionsCapacity,
(int) Math.ceil(sharedConnectionsCapacity / 0.75) + 1, true)
{
@@ -104,6 +98,7 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
}
};
// create user connection LRU cache
userConnections = new LinkedHashMap<String, CMISConnection>(userConnectionsCapacity,
(int) Math.ceil(userConnectionsCapacity / 0.75) + 1, true)
{
@@ -115,15 +110,33 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return size() > userConnectionsCapacity;
}
};
// get predefined server definitions
CMISServersConfigElement cmisServersConfig = (CMISServersConfigElement) configService.getConfig("CMIS")
.getConfigElement("cmis-servers");
if (cmisServersConfig != null && cmisServersConfig.getServerDefinitions() != null)
{
servers = cmisServersConfig.getServerDefinitions();
} else
{
servers = new HashMap<String, CMISServer>();
}
} finally
{
lock.writeLock().unlock();
}
}
// --- connections ---
@Override
public CMISConnection createUserConnection(CMISServer server, String connectionId)
{
if (connectionId == null || connectionId.length() == 0 || connectionId.indexOf(RESERVED_ID_CHAR) > -1)
{
throw new IllegalArgumentException("Invalid connection id!");
}
String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null)
{
@@ -142,7 +155,7 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
throw new IllegalStateException("Connection id is already in use!");
}
connection = createConnection(server, userConnectionId);
connection = createConnection(server, userConnectionId, false);
userConnections.put(userConnectionId, connection);
} finally
@@ -161,6 +174,12 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
@Override
public CMISConnection createSharedConnection(CMISServer server, String connectionId)
{
if (connectionId == null || connectionId.length() == 0 || connectionId.indexOf(RESERVED_ID_CHAR) > -1
|| DEFAULT_CONNECTION_ID.equals(connectionId))
{
throw new IllegalArgumentException("Invalid connection id!");
}
CMISConnection connection;
lock.writeLock().lock();
@@ -171,9 +190,9 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
throw new IllegalStateException("Connection id is already in use!");
}
connection = createConnection(server, connectionId);
connection = createConnection(server, connectionId, true);
sharedConnections.put(connection.getId(), connection);
sharedConnections.put(connection.getInternalId(), connection);
} finally
{
lock.writeLock().unlock();
@@ -182,23 +201,42 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return connection;
}
protected CMISConnection createConnection(CMISServer server, String connectionId)
protected CMISConnection createConnection(CMISServer server, String connectionId, boolean isShared)
{
if (connectionId == null || connectionId.length() == 0 || connectionId.indexOf(RESERVED_ID_CHAR) > -1)
{
throw new IllegalArgumentException("Invalid connection id!");
}
Session session = createSession(server.getParameters());
String username = server.getParameters().get(SessionParameter.USER);
return new CMISConnectionImpl(this, connectionId, session, server, username, false);
return new CMISConnectionImpl(this, connectionId, session, server, username, false, isShared);
}
@Override
public abstract CMISConnection getConnection();
public Collection<CMISConnection> getUserConnections()
public CMISConnection getConnection(String connectionId)
{
lock.writeLock().lock();
try
{
CMISConnection connection = sharedConnections.get(connectionId);
if (connection != null)
{
return connection;
}
String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null)
{
return null;
}
String userConnectionId = createUserConnectionId(currentUser, connectionId);
return userConnections.get(userConnectionId);
} finally
{
lock.writeLock().unlock();
}
}
public List<CMISConnection> getUserConnections()
{
String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null)
@@ -213,16 +251,17 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
for (CMISConnection conn : userConnections.values())
{
int idx = conn.getId().indexOf(RESERVED_ID_CHAR);
int idx = conn.getInternalId().indexOf(RESERVED_ID_CHAR);
if (idx > -1)
{
if (currentUser.equals(conn.getId().substring(idx + 1)))
if (currentUser.equals(conn.getInternalId().substring(idx + 1)))
{
result.add(conn);
}
}
}
Collections.sort(result);
return Collections.unmodifiableList(result);
} finally
{
@@ -230,43 +269,15 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
}
}
public CMISConnection getUserConnections(String connectionId)
{
String currentUser = authenticationService.getCurrentUserName();
if (currentUser == null)
{
throw new IllegalStateException("No current user!");
}
lock.writeLock().lock();
try
{
String userConnectionId = createUserConnectionId(currentUser, connectionId);
return userConnections.get(userConnectionId);
} finally
{
lock.writeLock().unlock();
}
}
public Collection<CMISConnection> getSharedConnections()
public List<CMISConnection> getSharedConnections()
{
lock.writeLock().lock();
try
{
return Collections.unmodifiableCollection(sharedConnections.values());
} finally
{
lock.writeLock().unlock();
}
}
List<CMISConnection> result = new ArrayList<CMISConnection>(sharedConnections.values());
public CMISConnection getSharedConnection(String connectionId)
{
lock.writeLock().lock();
try
{
return sharedConnections.get(connectionId);
Collections.sort(result);
return Collections.unmodifiableList(result);
} finally
{
lock.writeLock().unlock();
@@ -275,7 +286,7 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
public void removeConnection(CMISConnection connection)
{
if (connection == null || connection.getId() == null)
if (connection == null || connection.getInternalId() == null)
{
return;
}
@@ -283,19 +294,12 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
lock.writeLock().lock();
try
{
if (connection.isLocal())
if (connection.isShared())
{
userConnections.remove(LOCAL_CONNECTION_ID);
sharedConnections.remove(connection.getInternalId());
} else
{
int idx = connection.getId().indexOf(RESERVED_ID_CHAR);
if (idx == -1)
{
sharedConnections.remove(connection.getId());
} else
{
userConnections.remove(connection.getId());
}
userConnections.remove(connection.getInternalId());
}
} finally
{
@@ -314,25 +318,23 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
}
}
@Override
public Collection<CMISServer> getServerDefinitions()
// --- servers ---
public List<CMISServer> getServerDefinitions()
{
return servers == null ? null : servers.values();
return servers == null ? null : Collections.unmodifiableList(new ArrayList<CMISServer>(servers.values()));
}
@Override
public CMISServer getServerDefinition(String serverName)
{
return servers == null ? null : servers.get(serverName);
}
@Override
public CMISServer createServerDefinition(String serverName, Map<String, String> parameters)
{
return new CMISServerImpl(serverName, null, parameters);
}
@Override
public CMISServer createServerDefinition(CMISServer server, String username, String password)
{
if (server == null)
@@ -347,7 +349,6 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return new CMISServerImpl(server.getName(), server.getDescription(), parameters);
}
@Override
public CMISServer createServerDefinition(CMISServer server, String username, String password, String repositoryId)
{
if (server == null)
@@ -384,7 +385,6 @@ public abstract class AbstractCMISConnectionManagerImpl implements CMISConnectio
return null;
}
@Override
public List<Repository> getRepositories(CMISServer server)
{
if (server == null)