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

Reply via email to