Author: [email protected]
Date: Tue Oct 4 12:22:46 2011
New Revision: 1425
Log:
[AMDATUCASSANDRA-101] Implemented multi-tenancy for the gadget store
Modified:
trunk/amdatu-cassandra/cassandra-store-gadget/pom.xml
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/osgi/Activator.java
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/CassandraGadgetStorageProviderImpl.java
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/GadgetColumnFamilyProvider.java
trunk/amdatu-cassandra/cassandra-store-token/src/main/java/org/amdatu/cassandra/store/token/service/CassandraTokenStorageProviderImpl.java
Modified: trunk/amdatu-cassandra/cassandra-store-gadget/pom.xml
==============================================================================
--- trunk/amdatu-cassandra/cassandra-store-gadget/pom.xml (original)
+++ trunk/amdatu-cassandra/cassandra-store-gadget/pom.xml Tue Oct 4
12:22:46 2011
@@ -29,6 +29,11 @@
<dependencies>
<dependency>
+ <groupId>org.amdatu.core</groupId>
+ <artifactId>org.amdatu.core.tenant</artifactId>
+ <type>bundle</type>
+ </dependency>
+ <dependency>
<groupId>org.amdatu.cassandra</groupId>
<artifactId>org.amdatu.cassandra.listener</artifactId>
<type>bundle</type>
Modified:
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/osgi/Activator.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/osgi/Activator.java
(original)
+++
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/osgi/Activator.java
Tue Oct 4 12:22:46 2011
@@ -15,11 +15,10 @@
*/
package org.amdatu.cassandra.store.gadget.osgi;
-import org.amdatu.cassandra.listener.ColumnFamilyAvailable;
import org.amdatu.cassandra.listener.ColumnFamilyProvider;
-import org.amdatu.cassandra.persistencemanager.CassandraPersistenceManager;
import
org.amdatu.cassandra.store.gadget.service.CassandraGadgetStorageProviderImpl;
import org.amdatu.cassandra.store.gadget.service.GadgetColumnFamilyProvider;
+import org.amdatu.core.tenant.Tenant;
import org.amdatu.opensocial.gadgetmanagement.GadgetStorageProvider;
import org.apache.felix.dm.DependencyActivatorBase;
import org.apache.felix.dm.DependencyManager;
@@ -38,22 +37,12 @@
.setImplementation(GadgetColumnFamilyProvider.class));
// Create and register the Cassandra Gadget storage provider
- String keyspaceFilter = "(" +
CassandraPersistenceManager.KEYSPACE_AWARE_KEY + "="
- + CassandraPersistenceManager.DEFAULT_KEYSPACE + ")";
- String gadgetCFFilter = "(&" + keyspaceFilter + "(" +
ColumnFamilyAvailable.FILTER_NAME
- + "=" + GadgetColumnFamilyProvider.CF_GADGET + "))";
- String categoryCFFilter = "(&" + keyspaceFilter + "(" +
ColumnFamilyAvailable.FILTER_NAME
- + "=" + GadgetColumnFamilyProvider.CF_GADGETCATEGORY + "))";
manager.add(
- createComponent()
+ createAdapterService(Tenant.class, null)
.setImplementation(CassandraGadgetStorageProviderImpl.class)
.setInterface(GadgetStorageProvider.class.getName(), null)
.add(createServiceDependency().setService(LogService.class).setRequired(true))
-
.add(createServiceDependency().setService(CassandraPersistenceManager.class,
keyspaceFilter)
- .setRequired(true))
-
.add(createServiceDependency().setService(ColumnFamilyAvailable.class,
gadgetCFFilter).setRequired(true))
-
.add(createServiceDependency().setService(ColumnFamilyAvailable.class,
categoryCFFilter)
- .setRequired(true)));
+ );
}
@Override
Modified:
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/CassandraGadgetStorageProviderImpl.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/CassandraGadgetStorageProviderImpl.java
(original)
+++
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/CassandraGadgetStorageProviderImpl.java
Tue Oct 4 12:22:46 2011
@@ -25,17 +25,23 @@
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.amdatu.cassandra.listener.ColumnFamilyAvailable;
import org.amdatu.cassandra.persistencemanager.CassandraPersistenceManager;
+import org.amdatu.core.tenant.Tenant;
import org.amdatu.opensocial.gadgetmanagement.GadgetCategory;
import org.amdatu.opensocial.gadgetmanagement.GadgetDefinition;
import org.amdatu.opensocial.gadgetmanagement.GadgetStorageException;
import org.amdatu.opensocial.gadgetmanagement.GadgetStorageProvider;
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
import org.osgi.service.log.LogService;
/**
* This class provides a Cassandra implementation of the GadgetStore. The
GadgetStore is responsible for storing
* gadget definitions and categories.
- *
+ * NB: CRUD operations on categories are implemented in this storage provider,
but no longer supported by
+ * the API.
+ *
* @author ivol
*/
public class CassandraGadgetStorageProviderImpl implements
GadgetStorageProvider {
@@ -52,9 +58,15 @@
private static final String C_NAME = "name";
- private volatile CassandraPersistenceManager m_pm;
+ // Tenant unaware service dependencies
private volatile LogService m_logService;
-
+ private volatile DependencyManager m_dependencyManager;
+ private volatile Tenant m_tenant;
+ private volatile Component m_component;
+
+ // Tenant aware service depdendencies
+ private volatile CassandraPersistenceManager m_pm;
+
// Locks
private ReentrantReadWriteLock m_cassandraLock = new
ReentrantReadWriteLock();
@@ -63,7 +75,7 @@
*/
public CassandraGadgetStorageProviderImpl() {
}
-
+
/**
* Constructor used by the Unit test.
*
@@ -77,8 +89,35 @@
m_logService = logService;
}
+ public void init(final Component component) {
+ // Add tenant specific service dependencies
+ // The CassandraPersistenceManager for the keyspace with the same id
as our tenant
+ String ksFilter = "(" + CassandraPersistenceManager.KEYSPACE_AWARE_KEY
+ "=" + m_tenant.getId() + ")";
+ m_component.add(m_dependencyManager.createServiceDependency()
+ .setService(CassandraPersistenceManager.class, ksFilter)
+ .setRequired(true)
+ .setInstanceBound(true));
+
+ // The ColumnFamilyAvailable for the Gadget CF
+ String gadgetCfFilter = "(" + ColumnFamilyAvailable.FILTER_NAME + "="
+ GadgetColumnFamilyProvider.CF_GADGET + ")";
+ String gadgetCfAvailableFilter = "(&" + ksFilter + gadgetCfFilter +
")";
+ m_component.add(m_dependencyManager.createServiceDependency()
+ .setService(ColumnFamilyAvailable.class, gadgetCfAvailableFilter)
+ .setRequired(true)
+ .setInstanceBound(true));
+
+ // The ColumnFamilyAvailable for the Gadget category CF
+ String categoryCfFilter = "(" + ColumnFamilyAvailable.FILTER_NAME +
"=" + GadgetColumnFamilyProvider.CF_GADGETCATEGORY + ")";
+ String categoryCfAvailableFilter = "(&" + ksFilter + categoryCfFilter
+ ")";
+ m_component.add(m_dependencyManager.createServiceDependency()
+ .setService(ColumnFamilyAvailable.class, categoryCfAvailableFilter)
+ .setRequired(true)
+ .setInstanceBound(true));
+ }
+
public void start() {
- m_logService.log(LogService.LOG_DEBUG, "Service " +
this.getClass().getName() + " is now available");
+ m_logService.log(LogService.LOG_INFO,
+ "Service '" + getClass().getName() + "' started for tenant '" +
m_tenant.getId() + "'");
}
public void addGadget(final GadgetDefinition gadget) throws
GadgetStorageException {
@@ -86,7 +125,6 @@
m_cassandraLock.writeLock().lock();
String rowKey = gadget.getUrl();
m_pm.setValue(CF_GADGET, rowKey, SC_BASIC, C_GADGETURL,
gadget.getUrl());
- m_pm.setValue(CF_GADGET, rowKey, SC_BASIC, C_GADGETURL,
gadget.getUrl());
m_pm.setValue(CF_GADGET, rowKey, SC_BASIC, C_DEFAULTVISIBLE,
new Boolean(gadget.isDefaultVisible()).toString());
m_pm.setValue(CF_GADGET, rowKey, SC_BASIC, C_CATEGORY,
gadget.getCategory().getId());
@@ -105,6 +143,9 @@
public GadgetDefinition getGadget(String id) throws GadgetStorageException
{
GadgetDefinition gadget = null;
String url = m_pm.getValue(CF_GADGET, id, SC_BASIC, C_GADGETURL,
String.class);
+ if (url == null) {
+ return null;
+ }
String categoryId = m_pm.getValue(CF_GADGET, id, SC_BASIC, C_CATEGORY,
String.class);
GadgetCategory category = getCategory(categoryId);
boolean defaultVisible =
Modified:
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/GadgetColumnFamilyProvider.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/GadgetColumnFamilyProvider.java
(original)
+++
trunk/amdatu-cassandra/cassandra-store-gadget/src/main/java/org/amdatu/cassandra/store/gadget/service/GadgetColumnFamilyProvider.java
Tue Oct 4 12:22:46 2011
@@ -19,7 +19,6 @@
import org.amdatu.cassandra.listener.ColumnFamilyDefinition.ColumnType;
import org.amdatu.cassandra.listener.ColumnFamilyDefinition.CompareType;
import org.amdatu.cassandra.listener.ColumnFamilyProvider;
-import org.amdatu.cassandra.persistencemanager.CassandraPersistenceManager;
/**
* This service provides the ColumnFamilies 'Gadget' and 'GadgetCategory' for
the Default keyspace.
@@ -41,13 +40,13 @@
return new ColumnFamilyDefinition[] {
new ColumnFamilyDefinition(
CF_GADGET,
- new String[]
{CassandraPersistenceManager.DEFAULT_KEYSPACE},
+ null,
ColumnType.SUPER,
CompareType.BYTESTYPE,
CompareType.BYTESTYPE),
new ColumnFamilyDefinition(
CF_GADGETCATEGORY,
- new String[]
{CassandraPersistenceManager.DEFAULT_KEYSPACE},
+ null,
ColumnType.SUPER,
CompareType.BYTESTYPE,
CompareType.BYTESTYPE)};
Modified:
trunk/amdatu-cassandra/cassandra-store-token/src/main/java/org/amdatu/cassandra/store/token/service/CassandraTokenStorageProviderImpl.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-store-token/src/main/java/org/amdatu/cassandra/store/token/service/CassandraTokenStorageProviderImpl.java
(original)
+++
trunk/amdatu-cassandra/cassandra-store-token/src/main/java/org/amdatu/cassandra/store/token/service/CassandraTokenStorageProviderImpl.java
Tue Oct 4 12:22:46 2011
@@ -133,7 +133,7 @@
else if (C_TIMESTAMP.equals(col.getName())) {
timestamp = Long.parseLong(col.getValue());
}
- else if (C_SECRET.equals(col.getName())) {
+ else if (C_PROPERTIES.equals(col.getName())) {
properties = stringToMap(col.getValue());
}
}
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits