Author: [email protected]
Date: Tue May 31 11:27:51 2011
New Revision: 1154
Log:
[AMDATUCASSANDRA-68] Finalized integration test refactoring
Added:
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/UserAdminStoreTest.java
Removed:
trunk/amdatu-cassandra/test-integration/src/
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/UserAdminStoreTestBase.java
Modified:
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraConfigurationServiceImpl.java
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraDaemonActivatorImpl.java
trunk/amdatu-cassandra/cassandra-persistencemanager/pom.xml
trunk/amdatu-cassandra/cassandra-persistencemanager/src/main/java/org/amdatu/cassandra/persistencemanager/service/HectorCassandraPersistenceManagerImpl.java
trunk/amdatu-cassandra/test-integration/base/src/main/java/org/amdatu/cassandra/test/integration/base/CassandraFixture.java
trunk/amdatu-cassandra/test-integration/tests/pom.xml
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/CassandraPersistenceManagerTest.java
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTest.java
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTestBase.java
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/util/ServiceUtil.java
Modified:
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraConfigurationServiceImpl.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraConfigurationServiceImpl.java
(original)
+++
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraConfigurationServiceImpl.java
Tue May 31 11:27:51 2011
@@ -15,21 +15,21 @@
*/
package org.amdatu.cassandra.application.service;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Dictionary;
-
-import org.amdatu.cassandra.application.CassandraConfigurationService;
-import org.amdatu.core.config.templates.ConfigTemplateCallbackHandler;
-import org.amdatu.core.config.templates.ConfigTemplateManager;
-import org.apache.cassandra.thrift.ConsistencyLevel;
-import org.apache.log4j.PropertyConfigurator;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedService;
-import org.osgi.service.log.LogService;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Dictionary;
+
+import org.amdatu.cassandra.application.CassandraConfigurationService;
+import org.amdatu.core.config.templates.ConfigTemplateCallbackHandler;
+import org.amdatu.core.config.templates.ConfigTemplateManager;
+import org.apache.cassandra.thrift.ConsistencyLevel;
+import org.apache.log4j.PropertyConfigurator;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+import org.osgi.service.log.LogService;
/**
* This class provides utility methods to prepare Cassandra configuration
before starting it.
@@ -86,8 +86,12 @@
// Initialize log4j
File log4jPropertiesFile = new File(m_workDir,
CassandraConfigurationService.LOG4J_CONF_TARGET);
- url = bundle.getResource(LOG4J_CONF_SOURCE);
- try {
+ url = bundle.getResource(LOG4J_CONF_SOURCE);
+ ClassLoader oldClassLoader =
Thread.currentThread().getContextClassLoader();
+ try {
+ // Perform a classloader switch to prevent log4j trying to load
classes from the system classloader
+ // instead of the bundle classloader.
+
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
m_configTemplateManager.writeConfiguration(url,
log4jPropertiesFile, new CassandraCallbackHandler());
PropertyConfigurator.configure(log4jPropertiesFile.getAbsolutePath());
System.setProperty("log4j.configuration",
log4jPropertiesFile.toURI().toString());
@@ -95,6 +99,9 @@
}
catch (IOException e) {
m_logService.log(LogService.LOG_ERROR, "Could not replace
configuration entries in cassandra.yaml", e);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(oldClassLoader);
}
// Cassandra-foreground must be set to true, otherwise Cassandra will
close System err and out streams such
Modified:
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraDaemonActivatorImpl.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraDaemonActivatorImpl.java
(original)
+++
trunk/amdatu-cassandra/cassandra-application/src/main/java/org/amdatu/cassandra/application/service/CassandraDaemonActivatorImpl.java
Tue May 31 11:27:51 2011
@@ -15,23 +15,23 @@
*/
package org.amdatu.cassandra.application.service;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.amdatu.cassandra.application.CassandraConfigurationService;
-import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.concurrent.StageManager;
-import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.thrift.Cassandra;
-import org.apache.cassandra.thrift.CassandraDaemon;
-import org.apache.felix.dm.DependencyManager;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.osgi.service.log.LogService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.amdatu.cassandra.application.CassandraConfigurationService;
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.concurrent.StageManager;
+import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.thrift.Cassandra;
+import org.apache.cassandra.thrift.CassandraDaemon;
+import org.apache.felix.dm.DependencyManager;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.osgi.service.log.LogService;
public class CassandraDaemonActivatorImpl implements CassandraDaemonAvailable {
// Timeout for the initial Thrift connection
@@ -61,14 +61,22 @@
}
m_logService.log(LogService.LOG_INFO, getClass().getName() + " service
initialized");
-
- try {
+
+ ClassLoader oldClassLoader =
Thread.currentThread().getContextClassLoader();
+ try {
+ // Perform a classloader switch to prevent log4j trying to load
classes from the system classloader
+ // instead of the bundle classloader.
+
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
// Setup the Cassandra daemon
m_daemon = new CassandraDaemon();
m_logService.log(LogService.LOG_INFO, getClass().getName() + "
service started.");
}
catch (Throwable t) {
m_logService.log(LogService.LOG_ERROR, "An error occurred while
starting Cassandra service", t);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(oldClassLoader);
}
}
@@ -164,8 +172,8 @@
m_dependencyManager.add(
m_dependencyManager.createComponent()
-
.setInterface(CassandraDaemonAvailable.class.getName(), null)
- .setImplementation(service));
+
.setInterface(CassandraDaemonAvailable.class.getName(), null)
+ .setImplementation(service));
}
}
catch (TTransportException e) {
Modified: trunk/amdatu-cassandra/cassandra-persistencemanager/pom.xml
==============================================================================
--- trunk/amdatu-cassandra/cassandra-persistencemanager/pom.xml (original)
+++ trunk/amdatu-cassandra/cassandra-persistencemanager/pom.xml Tue May 31
11:27:51 2011
@@ -36,7 +36,7 @@
<dependency>
<groupId>me.prettyprint</groupId>
<artifactId>hector</artifactId>
- <version>0.7.0-28</version>
+ <version>0.7.0-29</version>
<scope>compile</scope>
</dependency>
<dependency>
Modified:
trunk/amdatu-cassandra/cassandra-persistencemanager/src/main/java/org/amdatu/cassandra/persistencemanager/service/HectorCassandraPersistenceManagerImpl.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-persistencemanager/src/main/java/org/amdatu/cassandra/persistencemanager/service/HectorCassandraPersistenceManagerImpl.java
(original)
+++
trunk/amdatu-cassandra/cassandra-persistencemanager/src/main/java/org/amdatu/cassandra/persistencemanager/service/HectorCassandraPersistenceManagerImpl.java
Tue May 31 11:27:51 2011
@@ -15,38 +15,38 @@
*/
package org.amdatu.cassandra.persistencemanager.service;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import me.prettyprint.cassandra.serializers.ByteBufferSerializer;
-import me.prettyprint.cassandra.serializers.BytesArraySerializer;
-import me.prettyprint.cassandra.serializers.SerializerTypeInferer;
-import me.prettyprint.cassandra.serializers.StringSerializer;
-import me.prettyprint.cassandra.service.OperationType;
-import me.prettyprint.hector.api.Cluster;
-import me.prettyprint.hector.api.ConsistencyLevelPolicy;
-import me.prettyprint.hector.api.HConsistencyLevel;
-import me.prettyprint.hector.api.Keyspace;
-import me.prettyprint.hector.api.Serializer;
-import me.prettyprint.hector.api.beans.ColumnSlice;
-import me.prettyprint.hector.api.beans.HColumn;
-import me.prettyprint.hector.api.beans.HSuperColumn;
-import me.prettyprint.hector.api.beans.OrderedRows;
-import me.prettyprint.hector.api.beans.OrderedSuperRows;
-import me.prettyprint.hector.api.beans.Row;
-import me.prettyprint.hector.api.beans.SuperRow;
-import me.prettyprint.hector.api.beans.SuperSlice;
-import me.prettyprint.hector.api.factory.HFactory;
-import me.prettyprint.hector.api.mutation.Mutator;
-import me.prettyprint.hector.api.query.QueryResult;
-import me.prettyprint.hector.api.query.RangeSlicesQuery;
-import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
-
-import org.amdatu.cassandra.persistencemanager.CassandraException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import me.prettyprint.cassandra.serializers.ByteBufferSerializer;
+import me.prettyprint.cassandra.serializers.BytesArraySerializer;
+import me.prettyprint.cassandra.serializers.SerializerTypeInferer;
+import me.prettyprint.cassandra.serializers.StringSerializer;
+import me.prettyprint.cassandra.service.OperationType;
+import me.prettyprint.hector.api.Cluster;
+import me.prettyprint.hector.api.ConsistencyLevelPolicy;
+import me.prettyprint.hector.api.HConsistencyLevel;
+import me.prettyprint.hector.api.Keyspace;
+import me.prettyprint.hector.api.Serializer;
+import me.prettyprint.hector.api.beans.ColumnSlice;
+import me.prettyprint.hector.api.beans.HColumn;
+import me.prettyprint.hector.api.beans.HSuperColumn;
+import me.prettyprint.hector.api.beans.OrderedRows;
+import me.prettyprint.hector.api.beans.OrderedSuperRows;
+import me.prettyprint.hector.api.beans.Row;
+import me.prettyprint.hector.api.beans.SuperRow;
+import me.prettyprint.hector.api.beans.SuperSlice;
+import me.prettyprint.hector.api.factory.HFactory;
+import me.prettyprint.hector.api.mutation.Mutator;
+import me.prettyprint.hector.api.query.QueryResult;
+import me.prettyprint.hector.api.query.RangeSlicesQuery;
+import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
+
+import org.amdatu.cassandra.persistencemanager.CassandraException;
/**
* This class implements a CassandraPersistenceManager using the Hector API.
It provides an additional
@@ -96,12 +96,20 @@
}
}
- private Keyspace getKeyspace() {
- String thriftHost = getConfigurationService().getRPCAddress() + ":" +
getConfigurationService().getRPCPort();
- String clusterName = getConfigurationService().getClustername();
- Cluster cluster = HFactory.getOrCreateCluster(clusterName, thriftHost);
- Keyspace keyspace = HFactory.createKeyspace(getKeyspaceName(),
cluster, new InternalConsistencyLevelPolicy());
- return keyspace;
+ private Keyspace getKeyspace() {
+ ClassLoader oldClassLoader =
Thread.currentThread().getContextClassLoader();
+ try {
+ // Perform a classloader switch to prevent log4j trying to load
classes from the system classloader
+ // instead of the bundle classloader.
+
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+ String thriftHost = getConfigurationService().getRPCAddress() +
":" + getConfigurationService().getRPCPort();
+ String clusterName = getConfigurationService().getClustername();
+ Cluster cluster = HFactory.getOrCreateCluster(clusterName,
thriftHost);
+ Keyspace keyspace = HFactory.createKeyspace(getKeyspaceName(),
cluster, new InternalConsistencyLevelPolicy());
+ return keyspace;
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldClassLoader);
+ }
}
public boolean exists(final String columnFamilyName, final String rowKey)
throws CassandraException {
@@ -109,10 +117,10 @@
StringSerializer nameSerializer = StringSerializer.get();
QueryResult<Integer> result =
HFactory.createCountQuery(getKeyspace(), stringSerializer,
nameSerializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setRange(null, null, 1)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setRange(null, null, 1)
+ .execute();
return result.get() > 0;
}
@@ -126,10 +134,10 @@
}
QueryResult<HSuperColumn<String, String, String>> result =
HFactory.createSuperColumnQuery(getKeyspace(), serializer,
serializer, serializer, serializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setSuperName(superColumnName)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setSuperName(superColumnName)
+ .execute();
if (result.get() != null) {
for (HColumn<String, String> column :
result.get().getColumns()) {
if (column.getName().equals(columnName)) {
@@ -142,10 +150,10 @@
else {
QueryResult<HColumn<String, String>> result =
HFactory.createColumnQuery(getKeyspace(), serializer,
serializer, serializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setName(columnName)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setName(columnName)
+ .execute();
return result.get() != null;
}
}
@@ -155,7 +163,7 @@
}
public List<String> getRowKeys(final String columnFamilyName, final String
column, final String superColumn)
- throws CassandraException {
+ throws CassandraException {
List<String> rowKeys = new ArrayList<String>();
if (isSuperColumnFamily(columnFamilyName)) {
Iterator<SuperRow<String, String, String, ByteBuffer>> iter =
@@ -218,7 +226,7 @@
}
public void deleteSuperColumn(final String columnFamilyName, final String
rowKey, final String superColumnName)
- throws CassandraException {
+ throws CassandraException {
deleteColumn(columnFamilyName, rowKey, superColumnName, null);
}
@@ -265,10 +273,10 @@
StringSerializer serializer = StringSerializer.get();
QueryResult<HSuperColumn<String, String, String>> result =
HFactory.createSuperColumnQuery(getKeyspace(), serializer,
serializer, serializer, serializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setSuperName(superColumnName)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setSuperName(superColumnName)
+ .execute();
if (result.get() != null) {
List<HColumn<String, String>> columns =
result.get().getColumns();
for (HColumn<String, String> column : columns) {
@@ -281,10 +289,10 @@
}
else {
QueryResult<HColumn<String, String>> result =
HFactory.createStringColumnQuery(getKeyspace())
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setName(columnName)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setName(columnName)
+ .execute();
if (result.get() == null) {
return null;
}
@@ -312,10 +320,10 @@
if (isSuper(columnFamilyName, superColumnName, columnName)) {
QueryResult<HSuperColumn<String, String, T>> result =
HFactory.createSuperColumnQuery(getKeyspace(), serializer,
serializer, serializer, valueSerializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setSuperName(superColumnName)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setSuperName(superColumnName)
+ .execute();
if (result.get() != null) {
List<HColumn<String, T>> columns = result.get().getColumns();
for (HColumn<String, T> column : columns) {
@@ -329,10 +337,10 @@
else {
QueryResult<HColumn<String, T>> result =
HFactory.createColumnQuery(getKeyspace(), serializer,
serializer, valueSerializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setName(columnName)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setName(columnName)
+ .execute();
if (result.get() == null) {
return null;
}
@@ -393,10 +401,10 @@
Serializer<T> valueSerializer = getSerializer(clazz);
QueryResult<SuperSlice<String, String, T>> result =
HFactory.createSuperSliceQuery(getKeyspace(), serializer,
serializer, serializer, valueSerializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setRange(null, null, false, COLUMN_LIMIT)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setRange(null, null, false, COLUMN_LIMIT)
+ .execute();
if (result.get() != null) {
return result.get().getSuperColumns();
}
@@ -414,10 +422,10 @@
Serializer<T> valueSerializer = getSerializer(clazz);
QueryResult<ColumnSlice<String, T>> result =
HFactory.createSliceQuery(getKeyspace(), serializer, serializer,
valueSerializer)
- .setColumnFamily(columnFamilyName)
- .setKey(rowKey)
- .setRange(null, null, false, COLUMN_LIMIT)
- .execute();
+ .setColumnFamily(columnFamilyName)
+ .setKey(rowKey)
+ .setRange(null, null, false, COLUMN_LIMIT)
+ .execute();
if (result.get() != null) {
return result.get().getColumns();
}
@@ -437,10 +445,10 @@
Serializer<T> valueSerializer = getSerializer(clazz);
RangeSuperSlicesQuery<String, String, String, T> rangeSlicesQuery =
HFactory.createRangeSuperSlicesQuery(getKeyspace(), serializer,
serializer, serializer, valueSerializer)
- .setColumnFamily(columnFamilyName)
- .setKeys(null, null)
- .setRange(superColumn, superColumn, false, colLimit)
- .setRowCount(ROW_LIMIT);
+ .setColumnFamily(columnFamilyName)
+ .setKeys(null, null)
+ .setRange(superColumn, superColumn, false, colLimit)
+ .setRowCount(ROW_LIMIT);
if (superColumn != null && column != null) {
rangeSlicesQuery.setColumnNames(superColumn, column);
}
@@ -459,10 +467,10 @@
Serializer<T> valueSerializer = getSerializer(clazz);
RangeSlicesQuery<String, String, T> rangeSlicesQuery =
HFactory.createRangeSlicesQuery(getKeyspace(), serializer,
serializer, valueSerializer)
- .setColumnFamily(columnFamilyName)
- .setKeys(null, null)
- .setRange(column, column, false, colLimit)
- .setRowCount(ROW_LIMIT);
+ .setColumnFamily(columnFamilyName)
+ .setKeys(null, null)
+ .setRange(column, column, false, colLimit)
+ .setRowCount(ROW_LIMIT);
if (column != null) {
rangeSlicesQuery.setColumnNames(column);
}
@@ -473,7 +481,7 @@
}
private boolean isSuper(final String columnFamily, final String
superColumn, final String column)
- throws CassandraException {
+ throws CassandraException {
boolean isSuper = super.isSuperColumnFamily(columnFamily);
if (isSuper && superColumn == null) {
throw new CassandraException("Invalid request: ColumnFamily '" +
columnFamily
Modified:
trunk/amdatu-cassandra/test-integration/base/src/main/java/org/amdatu/cassandra/test/integration/base/CassandraFixture.java
==============================================================================
---
trunk/amdatu-cassandra/test-integration/base/src/main/java/org/amdatu/cassandra/test/integration/base/CassandraFixture.java
(original)
+++
trunk/amdatu-cassandra/test-integration/base/src/main/java/org/amdatu/cassandra/test/integration/base/CassandraFixture.java
Tue May 31 11:27:51 2011
@@ -30,22 +30,14 @@
public Option provision() {
return org.ops4j.pax.exam.CoreOptions.provision(
- // Wrap libraries we depend on as OSGi bundles and provision those
- /*
wrappedBundle(mavenBundle().groupId("commons-httpclient").artifactId("commons-httpclient").versionAsInProject()),
-
wrappedBundle(mavenBundle().groupId("commons-codec").artifactId("commons-codec").versionAsInProject()),
-
wrappedBundle(mavenBundle().groupId("commons-logging").artifactId("commons-logging").versionAsInProject()),
-
wrappedBundle(mavenBundle().groupId("org.json").artifactId("json").versionAsInProject()),
-
- // The following 2 artifacts are necessary for default tenant
resolving
-
mavenBundle().groupId("org.amdatu.web").artifactId("org.amdatu.web.tenantresolver.hostname").versionAsInProject(),
-
mavenBundle().groupId("org.amdatu.web").artifactId("org.amdatu.web.tenantresolver.parameter").versionAsInProject(),*/
-
- // Provision Amdatu Auth bundles
+ // Provision Amdatu Cassandra bundles
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.test.integration.base").versionAsInProject(),
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.application").versionAsInProject(),
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.listener").versionAsInProject(),
-
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.persistencemanager").versionAsInProject()
- );
+
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.persistencemanager").versionAsInProject(),
+
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.useradminstore").versionAsInProject(),
+
mavenBundle().groupId("org.amdatu.cassandra").artifactId("org.amdatu.cassandra.tenantstore").versionAsInProject()
+ );
}
/**
@@ -61,7 +53,7 @@
public void configureCassandraDaemon(TestContext testContext) throws
Exception {
testContext.updateConfig(CassandraConfigurationService.PID,
getCassandraDaemonCfg());
}
-
+
private Properties getCassandraDaemonCfg() {
Properties properties = new Properties();
properties.put("workdir", "cassandra");
Modified: trunk/amdatu-cassandra/test-integration/tests/pom.xml
==============================================================================
--- trunk/amdatu-cassandra/test-integration/tests/pom.xml (original)
+++ trunk/amdatu-cassandra/test-integration/tests/pom.xml Tue May 31
11:27:51 2011
@@ -38,73 +38,51 @@
<!--
External library dependencies used by the integration tests.
-->
-
-
<!--
- Amdatu Web itest base to be used by the tests.
+ Amdatu Cassandra itest base to be used by the tests.
-->
<dependency>
- <groupId>org.amdatu.web</groupId>
- <artifactId>org.amdatu.web.tenantresolver.hostname</artifactId>
- <version>${org.amdatu.web.version}</version>
+ <groupId>org.amdatu.cassandra</groupId>
+ <artifactId>org.amdatu.cassandra.test.integration.base</artifactId>
+ <version>${project.version}</version>
<scope>test</scope>
<type>bundle</type>
</dependency>
<dependency>
- <groupId>org.amdatu.web</groupId>
- <artifactId>org.amdatu.web.tenantresolver.parameter</artifactId>
- <version>${org.amdatu.web.version}</version>
+ <groupId>org.amdatu.cassandra</groupId>
+ <artifactId>org.amdatu.cassandra.application</artifactId>
+ <version>${project.version}</version>
<scope>test</scope>
<type>bundle</type>
</dependency>
-
- <!--
- Amdatu Cassandra itest base to be used by the tests.
- -->
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.test.integration.base</artifactId>
+ <artifactId>org.amdatu.cassandra.listener</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.application</artifactId>
+ <artifactId>org.amdatu.cassandra.persistencemanager</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.listener</artifactId>
+ <artifactId>org.amdatu.cassandra.useradminstore</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.persistencemanager</artifactId>
+ <artifactId>org.amdatu.cassandra.tenantstore</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<type>bundle</type>
</dependency>
-
- <!--
- This transitive dependency is in the end needed by
- org.amdatu.cassandra.persistencemanager which depends on a maven 2
- version of this artifact. The maven-model pom..xml does not include
versions
- for all its dependencies, which works for maven 2 but fails with
maven 3.
- We therefore overrule this version with the maven 3 one.
- Without this dependency, you will get this error while running the
test:
- java.lang.AssertionError: Stream handler unavailable due to: null
- -->
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-model</artifactId>
- <version>3.0.3</version>
- </dependency>
-
</dependencies>
</dependencyManagement>
@@ -112,35 +90,34 @@
<!--
See explanation in the dependencyManagement section above.
-->
-
<dependency>
- <groupId>org.amdatu.web</groupId>
- <artifactId>org.amdatu.web.tenantresolver.hostname</artifactId>
+ <groupId>org.amdatu.cassandra</groupId>
+ <artifactId>org.amdatu.cassandra.test.integration.base</artifactId>
<type>bundle</type>
</dependency>
<dependency>
- <groupId>org.amdatu.web</groupId>
- <artifactId>org.amdatu.web.tenantresolver.parameter</artifactId>
+ <groupId>org.amdatu.cassandra</groupId>
+ <artifactId>org.amdatu.cassandra.application</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.test.integration.base</artifactId>
+ <artifactId>org.amdatu.cassandra.listener</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.application</artifactId>
+ <artifactId>org.amdatu.cassandra.persistencemanager</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.listener</artifactId>
+ <artifactId>org.amdatu.cassandra.useradminstore</artifactId>
<type>bundle</type>
</dependency>
<dependency>
<groupId>org.amdatu.cassandra</groupId>
- <artifactId>org.amdatu.cassandra.persistencemanager</artifactId>
+ <artifactId>org.amdatu.cassandra.tenantstore</artifactId>
<type>bundle</type>
</dependency>
</dependencies>
Modified:
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/CassandraPersistenceManagerTest.java
==============================================================================
---
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/CassandraPersistenceManagerTest.java
(original)
+++
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/CassandraPersistenceManagerTest.java
Tue May 31 11:27:51 2011
@@ -25,6 +25,7 @@
import org.amdatu.cassandra.persistencemanager.CassandraException;
import org.amdatu.cassandra.persistencemanager.CassandraPersistenceManager;
import org.amdatu.cassandra.test.integration.tests.framework.CassandraTestBase;
+import org.amdatu.cassandra.test.integration.tests.util.ServiceUtil;
/**
* This class provides an integration test for the Cassandra Persistence
Manager.
*
@@ -48,7 +49,7 @@
// Retrieve the CassandraPersistenceManager for the keyspace we just
created
m_pmFactory.createCassandraPersistenceManager(KEYSPACE);
String filter = "(" + CassandraPersistenceManager.KEYSPACE_AWARE_KEY +
"=" + KEYSPACE + ")";
- m_pm = getService(CassandraPersistenceManager.class, filter);
+ m_pm = ServiceUtil.getService(m_testContext,
CassandraPersistenceManager.class, filter);
}
public void execute() throws Exception {
Added:
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/UserAdminStoreTest.java
==============================================================================
--- (empty file)
+++
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/UserAdminStoreTest.java
Tue May 31 11:27:51 2011
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.amdatu.cassandra.test.integration.tests;
+
+import junit.framework.Assert;
+
+import org.amdatu.cassandra.test.integration.tests.framework.CassandraTestBase;
+import org.osgi.service.useradmin.Group;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+
+public class UserAdminStoreTest extends CassandraTestBase {
+ // Amount of milliseconds to wait between WRITE and READ operations
concerning the same row and same column.
+ // See AMDATU-137.
+ private static int WAIT = 20;
+
+ private static final String ADMIN_USER = "TestAdministrator";
+ private static final String EDITOR_USER = "TestEditor";
+ private static final String GUEST_USER = "TestGuest";
+
+ private static final String ADMIN_GROUP = "TestAdminUsers";
+ private static final String EDITOR_GROUP = "TestEditUsers";
+ private static final String GUEST_GROUP = "TestGuestUsers";
+
+ private void sleep() throws InterruptedException {
+ // Wait for 100 milliseconds, remember that Cassandra write operations
are asynchronously
+ Thread.sleep(WAIT);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void execute() throws Exception {
+ // Start the test, first remove all existing roles
+ Role[] allRoles = m_userAdmin.getRoles(null);
+ if (allRoles != null) {
+ for (Role role : allRoles) {
+ String roleName = role.getName();
+ m_userAdmin.removeRole(roleName);
+ sleep();
+ Assert.assertTrue("Role '" + roleName + "' removed but still
returned", m_userAdmin
+ .getRole(roleName) == null);
+ }
+ }
+
+ // Test if all roles have been removed
+ Assert.assertTrue("All roles were removed, but getRoles() still
returns roles",
+ m_userAdmin.getRoles(null) == null
+ || m_userAdmin.getRoles(null).length == 0);
+
+ // Create three test users and set the credentials
+ User adminUser = (User) m_userAdmin.createRole(ADMIN_USER, Role.USER);
+ User editorUser = (User) m_userAdmin.createRole(EDITOR_USER,
Role.USER);
+ User guestUser = (User) m_userAdmin.createRole(GUEST_USER, Role.USER);
+
+ Assert.assertTrue("All users were removed, but still creating a user
failed since it already exists",
+ adminUser != null && editorUser != null && guestUser != null);
+ adminUser.getCredentials().put("password", "adminpasswd");
+ editorUser.getCredentials().put("password", "editorpasswd");
+ guestUser.getCredentials().put("password", "guestpasswd");
+
+ // Now see if we can find these users from credentials
+ sleep();
+ Assert.assertTrue("TestAdmin user could not be found",
m_userAdmin.getRole(ADMIN_USER) != null);
+ Assert.assertTrue("TestEditor user could not be found",
m_userAdmin.getRole(EDITOR_USER) != null);
+ Assert.assertTrue("TestGuest user could not be found",
m_userAdmin.getRole(GUEST_USER) != null);
+
+ Assert.assertTrue("TestAdmin user could be retrieved by undefined
'name' property",
+ m_userAdmin.getUser("name", ADMIN_USER) == null);
+ Assert.assertTrue("TestEditor user could be retrieved by undefined
'name' property",
+ m_userAdmin.getUser("name", EDITOR_USER) == null);
+ Assert.assertTrue("TestGuest user could be retrieved by undefined
'name' property",
+ m_userAdmin.getUser("name", GUEST_USER) == null);
+
+ // Set user properties of admin
+ adminUser.getProperties().put("firstName", "John".getBytes());
+ adminUser.getProperties().put("lastName", "Doe".getBytes());
+
+ // And check if they were set correctly
+ sleep();
+ byte[] firstName = (byte[])
m_userAdmin.getRole(ADMIN_USER).getProperties().get("firstName");
+ Assert.assertTrue("firstName not properly set", new String(firstName,
"UTF-8").equals("John"));
+ byte[] lastName = (byte[])
m_userAdmin.getRole(ADMIN_USER).getProperties().get("lastName");
+ Assert.assertTrue("lastName not properly set", new String(lastName,
"UTF-8").equals("Doe"));
+
+ // Remove last name
+ adminUser.getProperties().remove("lastName");
+ sleep();
+ Assert.assertTrue("lastName not properly removed from property set",
+ m_userAdmin.getRole(ADMIN_USER).getProperties().get("lastName") ==
null);
+
+ // Now create "Administrator", "Editor" and "Guest" group and do some
assignments
+ Group adminGroup = (Group) m_userAdmin.createRole(ADMIN_GROUP,
Role.GROUP);
+ Group editorGroup = (Group) m_userAdmin.createRole(EDITOR_GROUP,
Role.GROUP);
+ Group guestGroup = (Group) m_userAdmin.createRole(GUEST_GROUP,
Role.GROUP);
+ adminGroup.addMember(adminUser);
+ adminGroup.addRequiredMember(adminUser);
+
+ // Excessive test of TestEditUsers group since this failed before
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 0);
+ assertRequiredMemberCount(EDITOR_GROUP, 0);
+ editorGroup.addMember(adminUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 1);
+ assertRequiredMemberCount(EDITOR_GROUP, 0);
+ editorGroup.addMember(editorUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 0);
+ editorGroup.addRequiredMember(adminUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 1);
+ editorGroup.addRequiredMember(editorUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 2);
+
+ guestGroup.addMember(adminUser);
+ sleep();
+ guestGroup.addMember(editorUser);
+ sleep();
+ guestGroup.addMember(guestUser);
+ sleep();
+
+ assertBasicMemberCount(ADMIN_GROUP, 1);
+ assertRequiredMemberCount(ADMIN_GROUP, 1);
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 2);
+ assertBasicMemberCount(GUEST_GROUP, 3);
+ assertRequiredMemberCount(GUEST_GROUP, 0);
+
+ // Now remove some members
+ guestGroup.removeMember(adminUser);
+ sleep();
+ assertBasicMemberCount(GUEST_GROUP, 2);
+
+ // Remove the editor user, is it removed from the admin group?
+ m_userAdmin.removeRole(EDITOR_USER);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 1);
+ assertRequiredMemberCount(EDITOR_GROUP, 1);
+ Assert.assertTrue("TestEditor should have been removed",
m_userAdmin.getRole(EDITOR_USER) == null);
+
+ // Now remove a user and verify that it is also removed as member of
all groups it was member of
+ m_userAdmin.removeRole(ADMIN_USER);
+ assertBasicMemberCount(ADMIN_GROUP, 0);
+ assertRequiredMemberCount(ADMIN_GROUP, 0);
+ assertBasicMemberCount(GUEST_GROUP, 1);
+
+ m_userAdmin.removeRole(GUEST_USER);
+ assertBasicMemberCount(GUEST_GROUP, 0);
+
+ // Finally, remove all test users and groups
+ allRoles = m_userAdmin.getRoles(null);
+ if (allRoles != null) {
+ for (Role role : allRoles) {
+ String roleName = role.getName();
+ m_userAdmin.removeRole(roleName);
+ sleep();
+ Assert.assertTrue("Role '" + roleName + "' removed but still
returned", m_userAdmin
+ .getRole(roleName) == null);
+ }
+ }
+ }
+
+ private void assertBasicMemberCount(final String group, final int
expected) {
+ Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin",
m_userAdmin.getRole(group) != null);
+ int count = 0;
+ if (((Group) m_userAdmin.getRole(group)).getMembers() != null) {
+ count = ((Group) m_userAdmin.getRole(group)).getMembers().length;
+ }
+ if (count != expected) {
+ Role[] members = ((Group) m_userAdmin.getRole(group)).getMembers();
+ String sMembers = toString(members);
+ Assert.assertTrue("Group '" + group + "' has " + count + " basic
members. Expected: " + expected
+ + ". Members found: " + sMembers, false);
+ }
+ }
+
+ private void assertRequiredMemberCount(final String group, final int
expected) {
+ Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin",
m_userAdmin.getRole(group) != null);
+ int count = 0;
+ if (((Group) m_userAdmin.getRole(group)).getRequiredMembers() != null)
{
+ count = ((Group)
m_userAdmin.getRole(group)).getRequiredMembers().length;
+ }
+ if (count != expected) {
+ Role[] members = ((Group)
m_userAdmin.getRole(group)).getRequiredMembers();
+ String sMembers = toString(members);
+ Assert.assertTrue("Group '" + group + "' has " + count + "
required members. Expected: " + expected
+ + ". Members found: " + sMembers, false);
+ }
+ }
+
+ private String toString(final Role[] members) {
+ String sMembers = "";
+ for (Role role : members) {
+ sMembers += role.getName() + " ";
+ }
+ return sMembers;
+ }
+}
Modified:
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTest.java
==============================================================================
---
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTest.java
(original)
+++
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTest.java
Tue May 31 11:27:51 2011
@@ -22,10 +22,13 @@
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.LibraryOptions.junitBundles;
+import org.amdatu.cassandra.application.CassandraConfigurationService;
import org.amdatu.cassandra.application.CassandraDaemonService;
import
org.amdatu.cassandra.persistencemanager.CassandraPersistenceManagerFactory;
import org.amdatu.cassandra.test.integration.base.CassandraFixture;
import org.amdatu.cassandra.test.integration.tests.CassandraDaemonTest;
+import
org.amdatu.cassandra.test.integration.tests.CassandraPersistenceManagerTest;
+import org.amdatu.cassandra.test.integration.tests.UserAdminStoreTest;
import org.amdatu.core.itest.base.CoreFixture;
import org.amdatu.core.itest.base.TestContext;
import org.amdatu.web.itest.base.WebFixture;
@@ -40,6 +43,7 @@
import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
import org.osgi.framework.BundleContext;
import org.osgi.service.log.LogService;
+import org.osgi.service.useradmin.UserAdmin;
@RunWith(JUnit4TestRunner.class)
@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
@@ -55,6 +59,8 @@
private CassandraDaemonService m_daemonService;
private DependencyManager m_dependencyManager;
private CassandraPersistenceManagerFactory m_pmFactory;
+ private TestContext m_testContext;
+ private UserAdmin m_userAdmin;
@Configuration
public Option[] config() {
@@ -79,7 +85,7 @@
// FIXME quickfix to let configadmin settle to
// prevent felix dropping configs
- Thread.sleep(1000);
+ Thread.sleep(2000);
return testContext;
}
@@ -88,21 +94,26 @@
public void runTest(BundleContext bundleContext) throws Exception {
// Setup test context
m_bundleContext = bundleContext;
- TestContext testContext = testContextSetUp(bundleContext);
+ m_testContext = testContextSetUp(bundleContext);
// Initialize services
- m_logService = assertAvailable(testContext, LogService.class);
- m_daemonService = assertAvailable(testContext,
CassandraDaemonService.class);
- m_pmFactory = assertAvailable(testContext,
CassandraPersistenceManagerFactory.class);
+ m_logService = assertAvailable(m_testContext, LogService.class);
+ assertAvailable(m_testContext, CassandraConfigurationService.class);
+
+ m_daemonService = assertAvailable(m_testContext,
CassandraDaemonService.class);
+ m_pmFactory = assertAvailable(m_testContext,
CassandraPersistenceManagerFactory.class);
+ m_userAdmin = assertAvailable(m_testContext, UserAdmin.class);
// Create the dependency manager
- m_dependencyManager = new
DependencyManager(testContext.getBundleContext());
+ m_dependencyManager = new
DependencyManager(m_testContext.getBundleContext());
// Execute the tests
test(CassandraDaemonTest.class);
-
+ test(CassandraPersistenceManagerTest.class);
+ test(UserAdminStoreTest.class);
+
// And we are done
- testContext.tearDown();
+ m_testContext.tearDown();
}
private <T extends CassandraTestBase> void test(Class<T> testClass) throws
Exception {
@@ -117,5 +128,7 @@
test.setPMFactoryService(m_pmFactory);
test.setDependencyManager(m_dependencyManager);
test.setBundleContext(m_bundleContext);
+ test.setTestContext(m_testContext);
+ test.setUserAdmin(m_userAdmin);
}
}
Modified:
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTestBase.java
==============================================================================
---
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTestBase.java
(original)
+++
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/framework/CassandraTestBase.java
Tue May 31 11:27:51 2011
@@ -17,12 +17,11 @@
import org.amdatu.cassandra.application.CassandraDaemonService;
import
org.amdatu.cassandra.persistencemanager.CassandraPersistenceManagerFactory;
+import org.amdatu.core.itest.base.TestContext;
import org.apache.felix.dm.DependencyManager;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.log.LogService;
-
-
+import org.osgi.service.useradmin.UserAdmin;
public abstract class CassandraTestBase {
protected volatile BundleContext m_bundleContext;
@@ -30,6 +29,8 @@
protected volatile CassandraDaemonService m_daemonService;
protected volatile DependencyManager m_dependencyManager;
protected volatile CassandraPersistenceManagerFactory m_pmFactory;
+ protected volatile TestContext m_testContext;
+ protected volatile UserAdmin m_userAdmin;
public abstract void execute() throws Exception;
@@ -53,7 +54,11 @@
m_bundleContext = context;
}
- protected <T extends Object> T getService(Class<T> clazz, String filter)
throws InvalidSyntaxException {
- return (T) m_bundleContext.getServiceReferences(clazz.getName(),
filter);
+ public void setTestContext(TestContext context) {
+ m_testContext = context;
+ }
+
+ public void setUserAdmin(UserAdmin userAdmin) {
+ m_userAdmin = userAdmin;
}
}
Modified:
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/util/ServiceUtil.java
==============================================================================
---
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/util/ServiceUtil.java
(original)
+++
trunk/amdatu-cassandra/test-integration/tests/src/test/java/org/amdatu/cassandra/test/integration/tests/util/ServiceUtil.java
Tue May 31 11:27:51 2011
@@ -15,10 +15,14 @@
// 1. Try to get the service directly using getAllServiceReferences,
return it if available
// 2. Invoke super.getService using the service tracker, this will wait
until the service is available
// 3. Again try to get the service directly using getAllServiceReferences,
as step 2. might ave failed
- @SuppressWarnings("unchecked")
public static <T extends Object> T getService(TestContext testContext,
Class<T> clazz) throws Exception {
+ return getService(testContext, clazz, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T extends Object> T getService(TestContext testContext,
Class<T> clazz, String filter) throws Exception {
BundleContext bundleContext = testContext.getBundleContext();
- ServiceReference[] servRef =
bundleContext.getAllServiceReferences(clazz.getName(), null);
+ ServiceReference[] servRef =
bundleContext.getAllServiceReferences(clazz.getName(), filter);
if (servRef != null && servRef.length > 0) {
return (T)
bundleContext.getService(getServiceRefWithHighestRank(servRef));
}
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits