You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sc...@apache.org on 2016/10/05 18:40:29 UTC

airavata git commit: adding capability cascade permissions and not to cascade permissions

Repository: airavata
Updated Branches:
  refs/heads/airavata-gov-registry 8afc7ea2e -> ea28a402c


adding capability cascade permissions and not to cascade permissions


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/ea28a402
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/ea28a402
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/ea28a402

Branch: refs/heads/airavata-gov-registry
Commit: ea28a402c1ae623278bb2d62514af8a6b97bd29d
Parents: 8afc7ea
Author: scnakandala <su...@gmail.com>
Authored: Wed Oct 5 14:40:23 2016 -0400
Committer: scnakandala <su...@gmail.com>
Committed: Wed Oct 5 14:40:23 2016 -0400

----------------------------------------------------------------------
 modules/sharing-registry/pom.xml                |   6 +-
 .../db/repositories/SharingRepository.java      |  12 +-
 .../server/SharingRegistryServerHandler.java    |  65 +++--
 .../registry/GovRegistryServerHandlerTest.java  |   4 +-
 .../registry/models/EntitySearchFields.java     |  48 ++++
 .../sharing/registry/models/Sharing.java        | 132 ++++++++--
 .../sharing/registry/models/SharingType.java    |  11 +-
 .../service/cpi/GovRegistryService.java         | 257 +++++++++++++++++--
 .../thrift_models/sharing_cpi.thrift            |   6 +-
 .../thrift_models/sharing_models.thrift         |  10 +-
 10 files changed, 464 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/pom.xml
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/pom.xml b/modules/sharing-registry/pom.xml
index 78b65cc..50e8d7b 100644
--- a/modules/sharing-registry/pom.xml
+++ b/modules/sharing-registry/pom.xml
@@ -21,8 +21,8 @@
     </properties>
 
     <modules>
-        <module>airavata-sharing-registry-stubs</module>
-        <module>airavata-sharing-registry-core</module>
-        <module>airavata-sharing-data-migrator</module>
+        <module>sharing-registry-stubs</module>
+        <module>sharing-registry-core</module>
+        <module>sharing-data-migrator</module>
     </modules>
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/db/repositories/SharingRepository.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/db/repositories/SharingRepository.java b/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/db/repositories/SharingRepository.java
index 27f9e0e..f5145a3 100644
--- a/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/db/repositories/SharingRepository.java
+++ b/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/db/repositories/SharingRepository.java
@@ -42,16 +42,22 @@ public class SharingRepository extends AbstractRepository<Sharing, SharingEntity
     public List<Sharing> getIndirectSharedChildren(String parentId, String permissionTypeId) throws GovRegistryException {
         HashMap<String, String> filters = new HashMap<>();
         filters.put(DBConstants.SharingTable.INHERITED_PARENT_ID, parentId);
-        filters.put(DBConstants.SharingTable.SHARING_TYPE, SharingType.INHERITED.toString());
+        filters.put(DBConstants.SharingTable.SHARING_TYPE, SharingType.INDIRECT_CASCADING.toString());
         filters.put(DBConstants.SharingTable.PERMISSION_TYPE_ID, permissionTypeId);
 
         return select(filters, 0, -1);
     }
 
-    public List<Sharing> getPermissionsForEntity(String entityId) throws GovRegistryException {
+    public List<Sharing> getCascadingPermissionsForEntity(String entityId) throws GovRegistryException {
         HashMap<String, String> filters = new HashMap<>();
         filters.put(DBConstants.SharingTable.ENTITY_ID, entityId);
-        return select(filters, 0, -1);
+        String query = "SELECT p from " + SharingEntity.class.getSimpleName() + " as p";
+        query += " WHERE ";
+        query += "p." + DBConstants.SharingTable.ENTITY_ID + " = '" + entityId + "' AND ";
+        query += "p." + DBConstants.SharingTable.SHARING_TYPE + " IN('" + SharingType.DIRECT_CASCADING.toString()
+                + "', '" + SharingType.INDIRECT_CASCADING + "') ";
+        query += " ORDER BY p.createdTime DESC";
+        return select(query, 0, -1);
     }
 
     public boolean hasAccess(String entityId, List<String> groupIds, List<String> permissionTypeIds) throws GovRegistryException {

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java b/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
index 7ae1c64..01ae934 100644
--- a/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
+++ b/modules/sharing-registry/sharing-registry-core/src/main/java/org/apache/airavata/sharing/registry/server/SharingRegistryServerHandler.java
@@ -36,7 +36,7 @@ import java.util.*;
 public class SharingRegistryServerHandler implements GovRegistryService.Iface{
     private final static Logger logger = LoggerFactory.getLogger(SharingRegistryServerHandler.class);
 
-    public static String GLOBAL_PERMISSION_NAME = "GLOBAL";
+    public static String GLOBAL_PERMISSION_NAME = "OWNER";
 
     private DomainRepository domainRepository;
     private UserRepository userRepository;
@@ -372,7 +372,7 @@ public class SharingRegistryServerHandler implements GovRegistryService.Iface{
         newSharing.setEntityId(entity.entityId);
         newSharing.setGroupId(entity.ownerId);
         newSharing.setGroupType(GroupType.SINGLE_USER);
-        newSharing.setSharingType(SharingType.DIRECT);
+        newSharing.setSharingType(SharingType.DIRECT_CASCADING);
         newSharing.setCreatedTime(System.currentTimeMillis());
         newSharing.setUpdatedTime(System.currentTimeMillis());
 
@@ -380,14 +380,14 @@ public class SharingRegistryServerHandler implements GovRegistryService.Iface{
 
         //creating records for inherited permissions
         if(entity.getParentEntityId() != null && entity.getParentEntityId() != ""){
-            List<Sharing> sharings = sharingRepository.getPermissionsForEntity(entity.parentEntityId);
+            List<Sharing> sharings = sharingRepository.getCascadingPermissionsForEntity(entity.parentEntityId);
             for(Sharing sharing : sharings){
                 newSharing = new Sharing();
                 newSharing.setPermissionTypeId(sharing.permissionTypeId);
                 newSharing.setEntityId(entity.entityId);
                 newSharing.setGroupId(sharing.groupId);
                 newSharing.setGroupType(sharing.groupType);
-                newSharing.setSharingType(SharingType.INHERITED);
+                newSharing.setSharingType(SharingType.INDIRECT_CASCADING);
                 newSharing.setCreatedTime(System.currentTimeMillis());
                 newSharing.setUpdatedTime(System.currentTimeMillis());
 
@@ -439,16 +439,16 @@ public class SharingRegistryServerHandler implements GovRegistryService.Iface{
      * @param permissionType
      */
     @Override
-    public boolean shareEntityWithUsers(String entityId, List<String> userList, String permissionTypeId) throws GovRegistryException, TException {
-        return shareEntity(entityId, userList, permissionTypeId, GroupType.SINGLE_USER);
+    public boolean shareEntityWithUsers(String entityId, List<String> userList, String permissionTypeId, boolean cascadePermission) throws GovRegistryException, TException {
+        return shareEntity(entityId, userList, permissionTypeId, GroupType.SINGLE_USER, cascadePermission);
     }
 
     @Override
-    public boolean shareEntityWithGroups(String entityId, List<String> groupList, String permissionTypeId) throws GovRegistryException, TException {
-        return shareEntity(entityId, groupList, permissionTypeId, GroupType.MULTI_USER);
+    public boolean shareEntityWithGroups(String entityId, List<String> groupList, String permissionTypeId, boolean cascadePermission) throws GovRegistryException, TException {
+        return shareEntity(entityId, groupList, permissionTypeId, GroupType.MULTI_USER, cascadePermission);
     }
 
-    private boolean shareEntity(String entityId, List<String> groupOrUserList, String permissionTypeId, GroupType groupType)  throws GovRegistryException, TException {
+    private boolean shareEntity(String entityId, List<String> groupOrUserList, String permissionTypeId, GroupType groupType, boolean cascadePermission)  throws GovRegistryException, TException {
         //Adding permission for the specified users/groups for the specified entity
         LinkedList<Entity> temp = new LinkedList<>();
         for(String userId : groupOrUserList){
@@ -457,31 +457,40 @@ public class SharingRegistryServerHandler implements GovRegistryService.Iface{
             sharing.setEntityId(entityId);
             sharing.setGroupId(userId);
             sharing.setGroupType(groupType);
-            sharing.setSharingType(SharingType.DIRECT);
+            if(cascadePermission) {
+                sharing.setSharingType(SharingType.DIRECT_CASCADING);
+                sharing.setCascadePermission(true);
+            }else {
+                sharing.setSharingType(SharingType.DIRECT_NON_CASCADING);
+                sharing.setCascadePermission(false);
+            }
             sharing.setCreatedTime(System.currentTimeMillis());
             sharing.setUpdatedTime(System.currentTimeMillis());
 
             sharingRepository.create(sharing);
         }
 
-        //Adding permission for the specified users/groups for all child entities
-        entityRepository.getChildEntities(entityId).stream().forEach(e-> temp.addLast(e));
-        while(temp.size() > 0){
-            Entity entity = temp.pop();
-            String childEntityId = entity.entityId;
-            String parentEntityId = entity.parentEntityId;
-            for(String userId : groupOrUserList){
-                Sharing sharing = new Sharing();
-                sharing.setPermissionTypeId(permissionTypeId);
-                sharing.setEntityId(childEntityId);
-                sharing.setGroupId(userId);
-                sharing.setGroupType(groupType);
-                sharing.setSharingType(SharingType.INHERITED);
-                sharing.setInheritedParentId(parentEntityId);
-                sharing.setCreatedTime(System.currentTimeMillis());
-                sharing.setUpdatedTime(System.currentTimeMillis());
-                sharingRepository.create(sharing);
-                entityRepository.getChildEntities(childEntityId).stream().forEach(e-> temp.addLast(e));
+        if(cascadePermission){
+            //Adding permission for the specified users/groups for all child entities
+            entityRepository.getChildEntities(entityId).stream().forEach(e-> temp.addLast(e));
+            while(temp.size() > 0){
+                Entity entity = temp.pop();
+                String childEntityId = entity.entityId;
+                String parentEntityId = entity.parentEntityId;
+                for(String userId : groupOrUserList){
+                    Sharing sharing = new Sharing();
+                    sharing.setPermissionTypeId(permissionTypeId);
+                    sharing.setEntityId(childEntityId);
+                    sharing.setGroupId(userId);
+                    sharing.setGroupType(groupType);
+                    sharing.setSharingType(SharingType.INDIRECT_CASCADING);
+                    sharing.setInheritedParentId(parentEntityId);
+                    sharing.setCascadePermission(true);
+                    sharing.setCreatedTime(System.currentTimeMillis());
+                    sharing.setUpdatedTime(System.currentTimeMillis());
+                    sharingRepository.create(sharing);
+                    entityRepository.getChildEntities(childEntityId).stream().forEach(e-> temp.addLast(e));
+                }
             }
         }
         return true;

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-core/src/test/java/org/apache/airavata/sharing/registry/GovRegistryServerHandlerTest.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-core/src/test/java/org/apache/airavata/sharing/registry/GovRegistryServerHandlerTest.java b/modules/sharing-registry/sharing-registry-core/src/test/java/org/apache/airavata/sharing/registry/GovRegistryServerHandlerTest.java
index 688117c..afef6b8 100644
--- a/modules/sharing-registry/sharing-registry-core/src/test/java/org/apache/airavata/sharing/registry/GovRegistryServerHandlerTest.java
+++ b/modules/sharing-registry/sharing-registry-core/src/test/java/org/apache/airavata/sharing/registry/GovRegistryServerHandlerTest.java
@@ -236,8 +236,8 @@ public class GovRegistryServerHandlerTest {
         String entityId3 = govRegistryServerHandler.createEntity(entity3);
         Assert.assertNotNull(entityId3);
 
-        govRegistryServerHandler.shareEntityWithUsers(entityId1, Arrays.asList(userId2), permissionTypeId1);
-        govRegistryServerHandler.shareEntityWithGroups(entityId3, Arrays.asList(groupId2), permissionTypeId1);
+        govRegistryServerHandler.shareEntityWithUsers(entityId1, Arrays.asList(userId2), permissionTypeId1, true);
+        govRegistryServerHandler.shareEntityWithGroups(entityId3, Arrays.asList(groupId2), permissionTypeId1, true);
 
         Entity entity4 = new Entity();
         entity4.setEntityId(domainId+":Entity4");

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/EntitySearchFields.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/EntitySearchFields.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/EntitySearchFields.java
new file mode 100644
index 0000000..6832191
--- /dev/null
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/EntitySearchFields.java
@@ -0,0 +1,48 @@
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.sharing.registry.models;
+
+
+import java.util.Map;
+import java.util.HashMap;
+import org.apache.thrift.TEnum;
+
+public enum EntitySearchFields implements org.apache.thrift.TEnum {
+  NAME(0),
+  DESCRIPTION(1),
+  FULL_TEXT(2);
+
+  private final int value;
+
+  private EntitySearchFields(int value) {
+    this.value = value;
+  }
+
+  /**
+   * Get the integer value of this enum value, as defined in the Thrift IDL.
+   */
+  public int getValue() {
+    return value;
+  }
+
+  /**
+   * Find a the enum type by its integer value, as defined in the Thrift IDL.
+   * @return null if the value is not found.
+   */
+  public static EntitySearchFields findByValue(int value) { 
+    switch (value) {
+      case 0:
+        return NAME;
+      case 1:
+        return DESCRIPTION;
+      case 2:
+        return FULL_TEXT;
+      default:
+        return null;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Sharing.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Sharing.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Sharing.java
index 5106eab..3b3a709 100644
--- a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Sharing.java
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/Sharing.java
@@ -44,8 +44,9 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
   private static final org.apache.thrift.protocol.TField GROUP_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("groupType", org.apache.thrift.protocol.TType.I32, (short)4);
   private static final org.apache.thrift.protocol.TField SHARING_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("sharingType", org.apache.thrift.protocol.TType.I32, (short)5);
   private static final org.apache.thrift.protocol.TField INHERITED_PARENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("inheritedParentId", org.apache.thrift.protocol.TType.STRING, (short)6);
-  private static final org.apache.thrift.protocol.TField CREATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("createdTime", org.apache.thrift.protocol.TType.I64, (short)7);
-  private static final org.apache.thrift.protocol.TField UPDATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("updatedTime", org.apache.thrift.protocol.TType.I64, (short)8);
+  private static final org.apache.thrift.protocol.TField CASCADE_PERMISSION_FIELD_DESC = new org.apache.thrift.protocol.TField("cascadePermission", org.apache.thrift.protocol.TType.BOOL, (short)7);
+  private static final org.apache.thrift.protocol.TField CREATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("createdTime", org.apache.thrift.protocol.TType.I64, (short)8);
+  private static final org.apache.thrift.protocol.TField UPDATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("updatedTime", org.apache.thrift.protocol.TType.I64, (short)9);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -67,6 +68,7 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
    */
   public SharingType sharingType; // optional
   public String inheritedParentId; // optional
+  public boolean cascadePermission; // optional
   public long createdTime; // optional
   public long updatedTime; // optional
 
@@ -86,8 +88,9 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
      */
     SHARING_TYPE((short)5, "sharingType"),
     INHERITED_PARENT_ID((short)6, "inheritedParentId"),
-    CREATED_TIME((short)7, "createdTime"),
-    UPDATED_TIME((short)8, "updatedTime");
+    CASCADE_PERMISSION((short)7, "cascadePermission"),
+    CREATED_TIME((short)8, "createdTime"),
+    UPDATED_TIME((short)9, "updatedTime");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -114,9 +117,11 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
           return SHARING_TYPE;
         case 6: // INHERITED_PARENT_ID
           return INHERITED_PARENT_ID;
-        case 7: // CREATED_TIME
+        case 7: // CASCADE_PERMISSION
+          return CASCADE_PERMISSION;
+        case 8: // CREATED_TIME
           return CREATED_TIME;
-        case 8: // UPDATED_TIME
+        case 9: // UPDATED_TIME
           return UPDATED_TIME;
         default:
           return null;
@@ -158,10 +163,11 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
   }
 
   // isset id assignments
-  private static final int __CREATEDTIME_ISSET_ID = 0;
-  private static final int __UPDATEDTIME_ISSET_ID = 1;
+  private static final int __CASCADEPERMISSION_ISSET_ID = 0;
+  private static final int __CREATEDTIME_ISSET_ID = 1;
+  private static final int __UPDATEDTIME_ISSET_ID = 2;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.PERMISSION_TYPE_ID,_Fields.ENTITY_ID,_Fields.GROUP_ID,_Fields.GROUP_TYPE,_Fields.SHARING_TYPE,_Fields.INHERITED_PARENT_ID,_Fields.CREATED_TIME,_Fields.UPDATED_TIME};
+  private static final _Fields optionals[] = {_Fields.PERMISSION_TYPE_ID,_Fields.ENTITY_ID,_Fields.GROUP_ID,_Fields.GROUP_TYPE,_Fields.SHARING_TYPE,_Fields.INHERITED_PARENT_ID,_Fields.CASCADE_PERMISSION,_Fields.CREATED_TIME,_Fields.UPDATED_TIME};
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -177,6 +183,8 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
         new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, SharingType.class)));
     tmpMap.put(_Fields.INHERITED_PARENT_ID, new org.apache.thrift.meta_data.FieldMetaData("inheritedParentId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.CASCADE_PERMISSION, new org.apache.thrift.meta_data.FieldMetaData("cascadePermission", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     tmpMap.put(_Fields.CREATED_TIME, new org.apache.thrift.meta_data.FieldMetaData("createdTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     tmpMap.put(_Fields.UPDATED_TIME, new org.apache.thrift.meta_data.FieldMetaData("updatedTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
@@ -211,6 +219,7 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
     if (other.isSetInheritedParentId()) {
       this.inheritedParentId = other.inheritedParentId;
     }
+    this.cascadePermission = other.cascadePermission;
     this.createdTime = other.createdTime;
     this.updatedTime = other.updatedTime;
   }
@@ -227,6 +236,8 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
     this.groupType = null;
     this.sharingType = null;
     this.inheritedParentId = null;
+    setCascadePermissionIsSet(false);
+    this.cascadePermission = false;
     setCreatedTimeIsSet(false);
     this.createdTime = 0;
     setUpdatedTimeIsSet(false);
@@ -393,6 +404,29 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
     }
   }
 
+  public boolean isCascadePermission() {
+    return this.cascadePermission;
+  }
+
+  public Sharing setCascadePermission(boolean cascadePermission) {
+    this.cascadePermission = cascadePermission;
+    setCascadePermissionIsSet(true);
+    return this;
+  }
+
+  public void unsetCascadePermission() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID);
+  }
+
+  /** Returns true if field cascadePermission is set (has been assigned a value) and false otherwise */
+  public boolean isSetCascadePermission() {
+    return EncodingUtils.testBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID);
+  }
+
+  public void setCascadePermissionIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID, value);
+  }
+
   public long getCreatedTime() {
     return this.createdTime;
   }
@@ -489,6 +523,14 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
       }
       break;
 
+    case CASCADE_PERMISSION:
+      if (value == null) {
+        unsetCascadePermission();
+      } else {
+        setCascadePermission((Boolean)value);
+      }
+      break;
+
     case CREATED_TIME:
       if (value == null) {
         unsetCreatedTime();
@@ -528,6 +570,9 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
     case INHERITED_PARENT_ID:
       return getInheritedParentId();
 
+    case CASCADE_PERMISSION:
+      return isCascadePermission();
+
     case CREATED_TIME:
       return getCreatedTime();
 
@@ -557,6 +602,8 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
       return isSetSharingType();
     case INHERITED_PARENT_ID:
       return isSetInheritedParentId();
+    case CASCADE_PERMISSION:
+      return isSetCascadePermission();
     case CREATED_TIME:
       return isSetCreatedTime();
     case UPDATED_TIME:
@@ -632,6 +679,15 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
         return false;
     }
 
+    boolean this_present_cascadePermission = true && this.isSetCascadePermission();
+    boolean that_present_cascadePermission = true && that.isSetCascadePermission();
+    if (this_present_cascadePermission || that_present_cascadePermission) {
+      if (!(this_present_cascadePermission && that_present_cascadePermission))
+        return false;
+      if (this.cascadePermission != that.cascadePermission)
+        return false;
+    }
+
     boolean this_present_createdTime = true && this.isSetCreatedTime();
     boolean that_present_createdTime = true && that.isSetCreatedTime();
     if (this_present_createdTime || that_present_createdTime) {
@@ -687,6 +743,11 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
     if (present_inheritedParentId)
       list.add(inheritedParentId);
 
+    boolean present_cascadePermission = true && (isSetCascadePermission());
+    list.add(present_cascadePermission);
+    if (present_cascadePermission)
+      list.add(cascadePermission);
+
     boolean present_createdTime = true && (isSetCreatedTime());
     list.add(present_createdTime);
     if (present_createdTime)
@@ -768,6 +829,16 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetCascadePermission()).compareTo(other.isSetCascadePermission());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetCascadePermission()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.cascadePermission, other.cascadePermission);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     lastComparison = Boolean.valueOf(isSetCreatedTime()).compareTo(other.isSetCreatedTime());
     if (lastComparison != 0) {
       return lastComparison;
@@ -867,6 +938,12 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
       }
       first = false;
     }
+    if (isSetCascadePermission()) {
+      if (!first) sb.append(", ");
+      sb.append("cascadePermission:");
+      sb.append(this.cascadePermission);
+      first = false;
+    }
     if (isSetCreatedTime()) {
       if (!first) sb.append(", ");
       sb.append("createdTime:");
@@ -972,7 +1049,15 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 7: // CREATED_TIME
+          case 7: // CASCADE_PERMISSION
+            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+              struct.cascadePermission = iprot.readBool();
+              struct.setCascadePermissionIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 8: // CREATED_TIME
             if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
               struct.createdTime = iprot.readI64();
               struct.setCreatedTimeIsSet(true);
@@ -980,7 +1065,7 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 8: // UPDATED_TIME
+          case 9: // UPDATED_TIME
             if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
               struct.updatedTime = iprot.readI64();
               struct.setUpdatedTimeIsSet(true);
@@ -1045,6 +1130,11 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
           oprot.writeFieldEnd();
         }
       }
+      if (struct.isSetCascadePermission()) {
+        oprot.writeFieldBegin(CASCADE_PERMISSION_FIELD_DESC);
+        oprot.writeBool(struct.cascadePermission);
+        oprot.writeFieldEnd();
+      }
       if (struct.isSetCreatedTime()) {
         oprot.writeFieldBegin(CREATED_TIME_FIELD_DESC);
         oprot.writeI64(struct.createdTime);
@@ -1091,13 +1181,16 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
       if (struct.isSetInheritedParentId()) {
         optionals.set(5);
       }
-      if (struct.isSetCreatedTime()) {
+      if (struct.isSetCascadePermission()) {
         optionals.set(6);
       }
-      if (struct.isSetUpdatedTime()) {
+      if (struct.isSetCreatedTime()) {
         optionals.set(7);
       }
-      oprot.writeBitSet(optionals, 8);
+      if (struct.isSetUpdatedTime()) {
+        optionals.set(8);
+      }
+      oprot.writeBitSet(optionals, 9);
       if (struct.isSetPermissionTypeId()) {
         oprot.writeString(struct.permissionTypeId);
       }
@@ -1116,6 +1209,9 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
       if (struct.isSetInheritedParentId()) {
         oprot.writeString(struct.inheritedParentId);
       }
+      if (struct.isSetCascadePermission()) {
+        oprot.writeBool(struct.cascadePermission);
+      }
       if (struct.isSetCreatedTime()) {
         oprot.writeI64(struct.createdTime);
       }
@@ -1127,7 +1223,7 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, Sharing struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(8);
+      BitSet incoming = iprot.readBitSet(9);
       if (incoming.get(0)) {
         struct.permissionTypeId = iprot.readString();
         struct.setPermissionTypeIdIsSet(true);
@@ -1153,10 +1249,14 @@ public class Sharing implements org.apache.thrift.TBase<Sharing, Sharing._Fields
         struct.setInheritedParentIdIsSet(true);
       }
       if (incoming.get(6)) {
+        struct.cascadePermission = iprot.readBool();
+        struct.setCascadePermissionIsSet(true);
+      }
+      if (incoming.get(7)) {
         struct.createdTime = iprot.readI64();
         struct.setCreatedTimeIsSet(true);
       }
-      if (incoming.get(7)) {
+      if (incoming.get(8)) {
         struct.updatedTime = iprot.readI64();
         struct.setUpdatedTimeIsSet(true);
       }

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/SharingType.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/SharingType.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/SharingType.java
index ff9f919..f57f7d1 100644
--- a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/SharingType.java
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/models/SharingType.java
@@ -12,8 +12,9 @@ import java.util.HashMap;
 import org.apache.thrift.TEnum;
 
 public enum SharingType implements org.apache.thrift.TEnum {
-  DIRECT(0),
-  INHERITED(1);
+  DIRECT_NON_CASCADING(0),
+  DIRECT_CASCADING(1),
+  INDIRECT_CASCADING(2);
 
   private final int value;
 
@@ -35,9 +36,11 @@ public enum SharingType implements org.apache.thrift.TEnum {
   public static SharingType findByValue(int value) { 
     switch (value) {
       case 0:
-        return DIRECT;
+        return DIRECT_NON_CASCADING;
       case 1:
-        return INHERITED;
+        return DIRECT_CASCADING;
+      case 2:
+        return INDIRECT_CASCADING;
       default:
         return null;
     }

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/GovRegistryService.java
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/GovRegistryService.java b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/GovRegistryService.java
index efcbab5..1e0e1b9 100644
--- a/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/GovRegistryService.java
+++ b/modules/sharing-registry/sharing-registry-stubs/src/main/java/org/apache/airavata/sharing/registry/service/cpi/GovRegistryService.java
@@ -152,12 +152,13 @@ public class GovRegistryService {
      * @param entityId
      * @param userList
      * @param perssionTypeId
+     * @param cascadePermission
      */
-    public boolean shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException;
+    public boolean shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, boolean cascadePermission) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException;
 
     public boolean revokeEntitySharingFromUsers(String entityId, List<String> userList, String perssionTypeId) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException;
 
-    public boolean shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException;
+    public boolean shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, boolean cascadePermission) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException;
 
     public boolean revokeEntitySharingFromGroups(String entityId, List<String> groupList, String perssionTypeId) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException;
 
@@ -237,11 +238,11 @@ public class GovRegistryService {
 
     public void getPermissionTypes(String domain, int offset, int limit, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
 
-    public void shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
+    public void shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, boolean cascadePermission, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
 
     public void revokeEntitySharingFromUsers(String entityId, List<String> userList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
 
-    public void shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
+    public void shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, boolean cascadePermission, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
 
     public void revokeEntitySharingFromGroups(String entityId, List<String> groupList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
 
@@ -1195,18 +1196,19 @@ public class GovRegistryService {
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "getPermissionTypes failed: unknown result");
     }
 
-    public boolean shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException
+    public boolean shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, boolean cascadePermission) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException
     {
-      send_shareEntityWithUsers(entityId, userList, perssionTypeId);
+      send_shareEntityWithUsers(entityId, userList, perssionTypeId, cascadePermission);
       return recv_shareEntityWithUsers();
     }
 
-    public void send_shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId) throws org.apache.thrift.TException
+    public void send_shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, boolean cascadePermission) throws org.apache.thrift.TException
     {
       shareEntityWithUsers_args args = new shareEntityWithUsers_args();
       args.setEntityId(entityId);
       args.setUserList(userList);
       args.setPerssionTypeId(perssionTypeId);
+      args.setCascadePermission(cascadePermission);
       sendBase("shareEntityWithUsers", args);
     }
 
@@ -1251,18 +1253,19 @@ public class GovRegistryService {
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "revokeEntitySharingFromUsers failed: unknown result");
     }
 
-    public boolean shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException
+    public boolean shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, boolean cascadePermission) throws org.apache.airavata.sharing.registry.models.GovRegistryException, org.apache.thrift.TException
     {
-      send_shareEntityWithGroups(entityId, groupList, perssionTypeId);
+      send_shareEntityWithGroups(entityId, groupList, perssionTypeId, cascadePermission);
       return recv_shareEntityWithGroups();
     }
 
-    public void send_shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId) throws org.apache.thrift.TException
+    public void send_shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, boolean cascadePermission) throws org.apache.thrift.TException
     {
       shareEntityWithGroups_args args = new shareEntityWithGroups_args();
       args.setEntityId(entityId);
       args.setGroupList(groupList);
       args.setPerssionTypeId(perssionTypeId);
+      args.setCascadePermission(cascadePermission);
       sendBase("shareEntityWithGroups", args);
     }
 
@@ -2531,9 +2534,9 @@ public class GovRegistryService {
       }
     }
 
-    public void shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
+    public void shareEntityWithUsers(String entityId, List<String> userList, String perssionTypeId, boolean cascadePermission, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      shareEntityWithUsers_call method_call = new shareEntityWithUsers_call(entityId, userList, perssionTypeId, resultHandler, this, ___protocolFactory, ___transport);
+      shareEntityWithUsers_call method_call = new shareEntityWithUsers_call(entityId, userList, perssionTypeId, cascadePermission, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
@@ -2542,11 +2545,13 @@ public class GovRegistryService {
       private String entityId;
       private List<String> userList;
       private String perssionTypeId;
-      public shareEntityWithUsers_call(String entityId, List<String> userList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private boolean cascadePermission;
+      public shareEntityWithUsers_call(String entityId, List<String> userList, String perssionTypeId, boolean cascadePermission, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.entityId = entityId;
         this.userList = userList;
         this.perssionTypeId = perssionTypeId;
+        this.cascadePermission = cascadePermission;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
@@ -2555,6 +2560,7 @@ public class GovRegistryService {
         args.setEntityId(entityId);
         args.setUserList(userList);
         args.setPerssionTypeId(perssionTypeId);
+        args.setCascadePermission(cascadePermission);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -2607,9 +2613,9 @@ public class GovRegistryService {
       }
     }
 
-    public void shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
+    public void shareEntityWithGroups(String entityId, List<String> groupList, String perssionTypeId, boolean cascadePermission, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      shareEntityWithGroups_call method_call = new shareEntityWithGroups_call(entityId, groupList, perssionTypeId, resultHandler, this, ___protocolFactory, ___transport);
+      shareEntityWithGroups_call method_call = new shareEntityWithGroups_call(entityId, groupList, perssionTypeId, cascadePermission, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
@@ -2618,11 +2624,13 @@ public class GovRegistryService {
       private String entityId;
       private List<String> groupList;
       private String perssionTypeId;
-      public shareEntityWithGroups_call(String entityId, List<String> groupList, String perssionTypeId, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private boolean cascadePermission;
+      public shareEntityWithGroups_call(String entityId, List<String> groupList, String perssionTypeId, boolean cascadePermission, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.entityId = entityId;
         this.groupList = groupList;
         this.perssionTypeId = perssionTypeId;
+        this.cascadePermission = cascadePermission;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
@@ -2631,6 +2639,7 @@ public class GovRegistryService {
         args.setEntityId(entityId);
         args.setGroupList(groupList);
         args.setPerssionTypeId(perssionTypeId);
+        args.setCascadePermission(cascadePermission);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -3648,7 +3657,7 @@ public class GovRegistryService {
       public shareEntityWithUsers_result getResult(I iface, shareEntityWithUsers_args args) throws org.apache.thrift.TException {
         shareEntityWithUsers_result result = new shareEntityWithUsers_result();
         try {
-          result.success = iface.shareEntityWithUsers(args.entityId, args.userList, args.perssionTypeId);
+          result.success = iface.shareEntityWithUsers(args.entityId, args.userList, args.perssionTypeId, args.cascadePermission);
           result.setSuccessIsSet(true);
         } catch (org.apache.airavata.sharing.registry.models.GovRegistryException gre) {
           result.gre = gre;
@@ -3698,7 +3707,7 @@ public class GovRegistryService {
       public shareEntityWithGroups_result getResult(I iface, shareEntityWithGroups_args args) throws org.apache.thrift.TException {
         shareEntityWithGroups_result result = new shareEntityWithGroups_result();
         try {
-          result.success = iface.shareEntityWithGroups(args.entityId, args.groupList, args.perssionTypeId);
+          result.success = iface.shareEntityWithGroups(args.entityId, args.groupList, args.perssionTypeId, args.cascadePermission);
           result.setSuccessIsSet(true);
         } catch (org.apache.airavata.sharing.registry.models.GovRegistryException gre) {
           result.gre = gre;
@@ -5872,7 +5881,7 @@ public class GovRegistryService {
       }
 
       public void start(I iface, shareEntityWithUsers_args args, org.apache.thrift.async.AsyncMethodCallback<Boolean> resultHandler) throws TException {
-        iface.shareEntityWithUsers(args.entityId, args.userList, args.perssionTypeId,resultHandler);
+        iface.shareEntityWithUsers(args.entityId, args.userList, args.perssionTypeId, args.cascadePermission,resultHandler);
       }
     }
 
@@ -5988,7 +5997,7 @@ public class GovRegistryService {
       }
 
       public void start(I iface, shareEntityWithGroups_args args, org.apache.thrift.async.AsyncMethodCallback<Boolean> resultHandler) throws TException {
-        iface.shareEntityWithGroups(args.entityId, args.groupList, args.perssionTypeId,resultHandler);
+        iface.shareEntityWithGroups(args.entityId, args.groupList, args.perssionTypeId, args.cascadePermission,resultHandler);
       }
     }
 
@@ -37294,6 +37303,7 @@ public class GovRegistryService {
     private static final org.apache.thrift.protocol.TField ENTITY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("entityId", org.apache.thrift.protocol.TType.STRING, (short)1);
     private static final org.apache.thrift.protocol.TField USER_LIST_FIELD_DESC = new org.apache.thrift.protocol.TField("userList", org.apache.thrift.protocol.TType.LIST, (short)2);
     private static final org.apache.thrift.protocol.TField PERSSION_TYPE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("perssionTypeId", org.apache.thrift.protocol.TType.STRING, (short)3);
+    private static final org.apache.thrift.protocol.TField CASCADE_PERMISSION_FIELD_DESC = new org.apache.thrift.protocol.TField("cascadePermission", org.apache.thrift.protocol.TType.BOOL, (short)4);
 
     private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
     static {
@@ -37304,12 +37314,14 @@ public class GovRegistryService {
     public String entityId; // required
     public List<String> userList; // required
     public String perssionTypeId; // required
+    public boolean cascadePermission; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
       ENTITY_ID((short)1, "entityId"),
       USER_LIST((short)2, "userList"),
-      PERSSION_TYPE_ID((short)3, "perssionTypeId");
+      PERSSION_TYPE_ID((short)3, "perssionTypeId"),
+      CASCADE_PERMISSION((short)4, "cascadePermission");
 
       private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -37330,6 +37342,8 @@ public class GovRegistryService {
             return USER_LIST;
           case 3: // PERSSION_TYPE_ID
             return PERSSION_TYPE_ID;
+          case 4: // CASCADE_PERMISSION
+            return CASCADE_PERMISSION;
           default:
             return null;
         }
@@ -37370,6 +37384,8 @@ public class GovRegistryService {
     }
 
     // isset id assignments
+    private static final int __CASCADEPERMISSION_ISSET_ID = 0;
+    private byte __isset_bitfield = 0;
     public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
     static {
       Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -37380,6 +37396,8 @@ public class GovRegistryService {
               new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
       tmpMap.put(_Fields.PERSSION_TYPE_ID, new org.apache.thrift.meta_data.FieldMetaData("perssionTypeId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.CASCADE_PERMISSION, new org.apache.thrift.meta_data.FieldMetaData("cascadePermission", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
       metaDataMap = Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(shareEntityWithUsers_args.class, metaDataMap);
     }
@@ -37390,18 +37408,22 @@ public class GovRegistryService {
     public shareEntityWithUsers_args(
       String entityId,
       List<String> userList,
-      String perssionTypeId)
+      String perssionTypeId,
+      boolean cascadePermission)
     {
       this();
       this.entityId = entityId;
       this.userList = userList;
       this.perssionTypeId = perssionTypeId;
+      this.cascadePermission = cascadePermission;
+      setCascadePermissionIsSet(true);
     }
 
     /**
      * Performs a deep copy on <i>other</i>.
      */
     public shareEntityWithUsers_args(shareEntityWithUsers_args other) {
+      __isset_bitfield = other.__isset_bitfield;
       if (other.isSetEntityId()) {
         this.entityId = other.entityId;
       }
@@ -37412,6 +37434,7 @@ public class GovRegistryService {
       if (other.isSetPerssionTypeId()) {
         this.perssionTypeId = other.perssionTypeId;
       }
+      this.cascadePermission = other.cascadePermission;
     }
 
     public shareEntityWithUsers_args deepCopy() {
@@ -37423,6 +37446,8 @@ public class GovRegistryService {
       this.entityId = null;
       this.userList = null;
       this.perssionTypeId = null;
+      setCascadePermissionIsSet(false);
+      this.cascadePermission = false;
     }
 
     public String getEntityId() {
@@ -37512,6 +37537,29 @@ public class GovRegistryService {
       }
     }
 
+    public boolean isCascadePermission() {
+      return this.cascadePermission;
+    }
+
+    public shareEntityWithUsers_args setCascadePermission(boolean cascadePermission) {
+      this.cascadePermission = cascadePermission;
+      setCascadePermissionIsSet(true);
+      return this;
+    }
+
+    public void unsetCascadePermission() {
+      __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID);
+    }
+
+    /** Returns true if field cascadePermission is set (has been assigned a value) and false otherwise */
+    public boolean isSetCascadePermission() {
+      return EncodingUtils.testBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID);
+    }
+
+    public void setCascadePermissionIsSet(boolean value) {
+      __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID, value);
+    }
+
     public void setFieldValue(_Fields field, Object value) {
       switch (field) {
       case ENTITY_ID:
@@ -37538,6 +37586,14 @@ public class GovRegistryService {
         }
         break;
 
+      case CASCADE_PERMISSION:
+        if (value == null) {
+          unsetCascadePermission();
+        } else {
+          setCascadePermission((Boolean)value);
+        }
+        break;
+
       }
     }
 
@@ -37552,6 +37608,9 @@ public class GovRegistryService {
       case PERSSION_TYPE_ID:
         return getPerssionTypeId();
 
+      case CASCADE_PERMISSION:
+        return isCascadePermission();
+
       }
       throw new IllegalStateException();
     }
@@ -37569,6 +37628,8 @@ public class GovRegistryService {
         return isSetUserList();
       case PERSSION_TYPE_ID:
         return isSetPerssionTypeId();
+      case CASCADE_PERMISSION:
+        return isSetCascadePermission();
       }
       throw new IllegalStateException();
     }
@@ -37613,6 +37674,15 @@ public class GovRegistryService {
           return false;
       }
 
+      boolean this_present_cascadePermission = true;
+      boolean that_present_cascadePermission = true;
+      if (this_present_cascadePermission || that_present_cascadePermission) {
+        if (!(this_present_cascadePermission && that_present_cascadePermission))
+          return false;
+        if (this.cascadePermission != that.cascadePermission)
+          return false;
+      }
+
       return true;
     }
 
@@ -37635,6 +37705,11 @@ public class GovRegistryService {
       if (present_perssionTypeId)
         list.add(perssionTypeId);
 
+      boolean present_cascadePermission = true;
+      list.add(present_cascadePermission);
+      if (present_cascadePermission)
+        list.add(cascadePermission);
+
       return list.hashCode();
     }
 
@@ -37676,6 +37751,16 @@ public class GovRegistryService {
           return lastComparison;
         }
       }
+      lastComparison = Boolean.valueOf(isSetCascadePermission()).compareTo(other.isSetCascadePermission());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetCascadePermission()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.cascadePermission, other.cascadePermission);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -37719,6 +37804,10 @@ public class GovRegistryService {
         sb.append(this.perssionTypeId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("cascadePermission:");
+      sb.append(this.cascadePermission);
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -37734,6 +37823,7 @@ public class GovRegistryService {
       if (perssionTypeId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'perssionTypeId' was not present! Struct: " + toString());
       }
+      // alas, we cannot check 'cascadePermission' because it's a primitive and you chose the non-beans generator.
       // check for sub-struct validity
     }
 
@@ -37747,6 +37837,8 @@ public class GovRegistryService {
 
     private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
       try {
+        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
+        __isset_bitfield = 0;
         read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
       } catch (org.apache.thrift.TException te) {
         throw new java.io.IOException(te);
@@ -37805,6 +37897,14 @@ public class GovRegistryService {
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 4: // CASCADE_PERMISSION
+              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+                struct.cascadePermission = iprot.readBool();
+                struct.setCascadePermissionIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -37813,6 +37913,9 @@ public class GovRegistryService {
         iprot.readStructEnd();
 
         // check for required fields of primitive type, which can't be checked in the validate method
+        if (!struct.isSetCascadePermission()) {
+          throw new org.apache.thrift.protocol.TProtocolException("Required field 'cascadePermission' was not found in serialized data! Struct: " + toString());
+        }
         struct.validate();
       }
 
@@ -37842,6 +37945,9 @@ public class GovRegistryService {
           oprot.writeString(struct.perssionTypeId);
           oprot.writeFieldEnd();
         }
+        oprot.writeFieldBegin(CASCADE_PERMISSION_FIELD_DESC);
+        oprot.writeBool(struct.cascadePermission);
+        oprot.writeFieldEnd();
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -37868,6 +37974,7 @@ public class GovRegistryService {
           }
         }
         oprot.writeString(struct.perssionTypeId);
+        oprot.writeBool(struct.cascadePermission);
       }
 
       @Override
@@ -37888,6 +37995,8 @@ public class GovRegistryService {
         struct.setUserListIsSet(true);
         struct.perssionTypeId = iprot.readString();
         struct.setPerssionTypeIdIsSet(true);
+        struct.cascadePermission = iprot.readBool();
+        struct.setCascadePermissionIsSet(true);
       }
     }
 
@@ -39440,6 +39549,7 @@ public class GovRegistryService {
     private static final org.apache.thrift.protocol.TField ENTITY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("entityId", org.apache.thrift.protocol.TType.STRING, (short)1);
     private static final org.apache.thrift.protocol.TField GROUP_LIST_FIELD_DESC = new org.apache.thrift.protocol.TField("groupList", org.apache.thrift.protocol.TType.LIST, (short)2);
     private static final org.apache.thrift.protocol.TField PERSSION_TYPE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("perssionTypeId", org.apache.thrift.protocol.TType.STRING, (short)3);
+    private static final org.apache.thrift.protocol.TField CASCADE_PERMISSION_FIELD_DESC = new org.apache.thrift.protocol.TField("cascadePermission", org.apache.thrift.protocol.TType.BOOL, (short)4);
 
     private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
     static {
@@ -39450,12 +39560,14 @@ public class GovRegistryService {
     public String entityId; // required
     public List<String> groupList; // required
     public String perssionTypeId; // required
+    public boolean cascadePermission; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
       ENTITY_ID((short)1, "entityId"),
       GROUP_LIST((short)2, "groupList"),
-      PERSSION_TYPE_ID((short)3, "perssionTypeId");
+      PERSSION_TYPE_ID((short)3, "perssionTypeId"),
+      CASCADE_PERMISSION((short)4, "cascadePermission");
 
       private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -39476,6 +39588,8 @@ public class GovRegistryService {
             return GROUP_LIST;
           case 3: // PERSSION_TYPE_ID
             return PERSSION_TYPE_ID;
+          case 4: // CASCADE_PERMISSION
+            return CASCADE_PERMISSION;
           default:
             return null;
         }
@@ -39516,6 +39630,8 @@ public class GovRegistryService {
     }
 
     // isset id assignments
+    private static final int __CASCADEPERMISSION_ISSET_ID = 0;
+    private byte __isset_bitfield = 0;
     public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
     static {
       Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -39526,6 +39642,8 @@ public class GovRegistryService {
               new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
       tmpMap.put(_Fields.PERSSION_TYPE_ID, new org.apache.thrift.meta_data.FieldMetaData("perssionTypeId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.CASCADE_PERMISSION, new org.apache.thrift.meta_data.FieldMetaData("cascadePermission", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
       metaDataMap = Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(shareEntityWithGroups_args.class, metaDataMap);
     }
@@ -39536,18 +39654,22 @@ public class GovRegistryService {
     public shareEntityWithGroups_args(
       String entityId,
       List<String> groupList,
-      String perssionTypeId)
+      String perssionTypeId,
+      boolean cascadePermission)
     {
       this();
       this.entityId = entityId;
       this.groupList = groupList;
       this.perssionTypeId = perssionTypeId;
+      this.cascadePermission = cascadePermission;
+      setCascadePermissionIsSet(true);
     }
 
     /**
      * Performs a deep copy on <i>other</i>.
      */
     public shareEntityWithGroups_args(shareEntityWithGroups_args other) {
+      __isset_bitfield = other.__isset_bitfield;
       if (other.isSetEntityId()) {
         this.entityId = other.entityId;
       }
@@ -39558,6 +39680,7 @@ public class GovRegistryService {
       if (other.isSetPerssionTypeId()) {
         this.perssionTypeId = other.perssionTypeId;
       }
+      this.cascadePermission = other.cascadePermission;
     }
 
     public shareEntityWithGroups_args deepCopy() {
@@ -39569,6 +39692,8 @@ public class GovRegistryService {
       this.entityId = null;
       this.groupList = null;
       this.perssionTypeId = null;
+      setCascadePermissionIsSet(false);
+      this.cascadePermission = false;
     }
 
     public String getEntityId() {
@@ -39658,6 +39783,29 @@ public class GovRegistryService {
       }
     }
 
+    public boolean isCascadePermission() {
+      return this.cascadePermission;
+    }
+
+    public shareEntityWithGroups_args setCascadePermission(boolean cascadePermission) {
+      this.cascadePermission = cascadePermission;
+      setCascadePermissionIsSet(true);
+      return this;
+    }
+
+    public void unsetCascadePermission() {
+      __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID);
+    }
+
+    /** Returns true if field cascadePermission is set (has been assigned a value) and false otherwise */
+    public boolean isSetCascadePermission() {
+      return EncodingUtils.testBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID);
+    }
+
+    public void setCascadePermissionIsSet(boolean value) {
+      __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CASCADEPERMISSION_ISSET_ID, value);
+    }
+
     public void setFieldValue(_Fields field, Object value) {
       switch (field) {
       case ENTITY_ID:
@@ -39684,6 +39832,14 @@ public class GovRegistryService {
         }
         break;
 
+      case CASCADE_PERMISSION:
+        if (value == null) {
+          unsetCascadePermission();
+        } else {
+          setCascadePermission((Boolean)value);
+        }
+        break;
+
       }
     }
 
@@ -39698,6 +39854,9 @@ public class GovRegistryService {
       case PERSSION_TYPE_ID:
         return getPerssionTypeId();
 
+      case CASCADE_PERMISSION:
+        return isCascadePermission();
+
       }
       throw new IllegalStateException();
     }
@@ -39715,6 +39874,8 @@ public class GovRegistryService {
         return isSetGroupList();
       case PERSSION_TYPE_ID:
         return isSetPerssionTypeId();
+      case CASCADE_PERMISSION:
+        return isSetCascadePermission();
       }
       throw new IllegalStateException();
     }
@@ -39759,6 +39920,15 @@ public class GovRegistryService {
           return false;
       }
 
+      boolean this_present_cascadePermission = true;
+      boolean that_present_cascadePermission = true;
+      if (this_present_cascadePermission || that_present_cascadePermission) {
+        if (!(this_present_cascadePermission && that_present_cascadePermission))
+          return false;
+        if (this.cascadePermission != that.cascadePermission)
+          return false;
+      }
+
       return true;
     }
 
@@ -39781,6 +39951,11 @@ public class GovRegistryService {
       if (present_perssionTypeId)
         list.add(perssionTypeId);
 
+      boolean present_cascadePermission = true;
+      list.add(present_cascadePermission);
+      if (present_cascadePermission)
+        list.add(cascadePermission);
+
       return list.hashCode();
     }
 
@@ -39822,6 +39997,16 @@ public class GovRegistryService {
           return lastComparison;
         }
       }
+      lastComparison = Boolean.valueOf(isSetCascadePermission()).compareTo(other.isSetCascadePermission());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetCascadePermission()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.cascadePermission, other.cascadePermission);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -39865,6 +40050,10 @@ public class GovRegistryService {
         sb.append(this.perssionTypeId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("cascadePermission:");
+      sb.append(this.cascadePermission);
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -39880,6 +40069,7 @@ public class GovRegistryService {
       if (perssionTypeId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'perssionTypeId' was not present! Struct: " + toString());
       }
+      // alas, we cannot check 'cascadePermission' because it's a primitive and you chose the non-beans generator.
       // check for sub-struct validity
     }
 
@@ -39893,6 +40083,8 @@ public class GovRegistryService {
 
     private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
       try {
+        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
+        __isset_bitfield = 0;
         read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
       } catch (org.apache.thrift.TException te) {
         throw new java.io.IOException(te);
@@ -39951,6 +40143,14 @@ public class GovRegistryService {
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 4: // CASCADE_PERMISSION
+              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+                struct.cascadePermission = iprot.readBool();
+                struct.setCascadePermissionIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -39959,6 +40159,9 @@ public class GovRegistryService {
         iprot.readStructEnd();
 
         // check for required fields of primitive type, which can't be checked in the validate method
+        if (!struct.isSetCascadePermission()) {
+          throw new org.apache.thrift.protocol.TProtocolException("Required field 'cascadePermission' was not found in serialized data! Struct: " + toString());
+        }
         struct.validate();
       }
 
@@ -39988,6 +40191,9 @@ public class GovRegistryService {
           oprot.writeString(struct.perssionTypeId);
           oprot.writeFieldEnd();
         }
+        oprot.writeFieldBegin(CASCADE_PERMISSION_FIELD_DESC);
+        oprot.writeBool(struct.cascadePermission);
+        oprot.writeFieldEnd();
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -40014,6 +40220,7 @@ public class GovRegistryService {
           }
         }
         oprot.writeString(struct.perssionTypeId);
+        oprot.writeBool(struct.cascadePermission);
       }
 
       @Override
@@ -40034,6 +40241,8 @@ public class GovRegistryService {
         struct.setGroupListIsSet(true);
         struct.perssionTypeId = iprot.readString();
         struct.setPerssionTypeIdIsSet(true);
+        struct.cascadePermission = iprot.readBool();
+        struct.setCascadePermissionIsSet(true);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/thrift_models/sharing_cpi.thrift
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/thrift_models/sharing_cpi.thrift b/modules/sharing-registry/thrift_models/sharing_cpi.thrift
index d3cc54f..cec2543 100644
--- a/modules/sharing-registry/thrift_models/sharing_cpi.thrift
+++ b/modules/sharing-registry/thrift_models/sharing_cpi.thrift
@@ -88,9 +88,9 @@ service GovRegistryService {
     /**
      * Sharing Entity with Users and Groups
     **/
-    bool shareEntityWithUsers(1: required string entityId, 2: required list<string> userList, 3: required string perssionTypeId) throws (1: sharing_models.GovRegistryException gre)
-    bool revokeEntitySharingFromUsers(1: required string entityId, 2: required list<string> userList, 3: required string perssionTypeId) throws (1: sharing_models.GovRegistryException gre)
-    bool shareEntityWithGroups(1: required string entityId, 2: required list<string> groupList, 3: required string perssionTypeId) throws (1: sharing_models.GovRegistryException gre)
+    bool shareEntityWithUsers(1: required string entityId, 2: required list<string> userList, 3: required string perssionTypeId, 4: required bool cascadePermission) throws (1: sharing_models.GovRegistryException gre)
+    bool revokeEntitySharingFromUsers(1: required string entityId, 2: required list<string> userList, 3: required string perssionTypeId ) throws (1: sharing_models.GovRegistryException gre)
+    bool shareEntityWithGroups(1: required string entityId, 2: required list<string> groupList, 3: required string perssionTypeId, 4: required bool cascadePermission) throws (1: sharing_models.GovRegistryException gre)
     bool revokeEntitySharingFromGroups(1: required string entityId, 2: required list<string> groupList, 3: required string perssionTypeId) throws (1: sharing_models.GovRegistryException gre)
     bool userHasAccess(1: required string domainId, 2: required string userId, 3: required string entityId, 4: required string permissionTypeId) throws (1: sharing_models.GovRegistryException gre)
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/ea28a402/modules/sharing-registry/thrift_models/sharing_models.thrift
----------------------------------------------------------------------
diff --git a/modules/sharing-registry/thrift_models/sharing_models.thrift b/modules/sharing-registry/thrift_models/sharing_models.thrift
index 5670c5e..6dd3983 100644
--- a/modules/sharing-registry/thrift_models/sharing_models.thrift
+++ b/modules/sharing-registry/thrift_models/sharing_models.thrift
@@ -109,8 +109,9 @@ struct PermissionType {
 }
 
 enum SharingType {
-    DIRECT,
-    INHERITED
+    DIRECT_NON_CASCADING,
+    DIRECT_CASCADING,
+    INDIRECT_CASCADING
  }
 
 struct Sharing {
@@ -120,8 +121,9 @@ struct Sharing {
     4: optional GroupType groupType,
     5: optional SharingType sharingType,
     6: optional string inheritedParentId,
-    7: optional i64 createdTime,
-    8: optional i64 updatedTime
+    7: optional bool cascadePermission,
+    8: optional i64 createdTime,
+    9: optional i64 updatedTime
 }
 
 exception GovRegistryException {