You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ch...@apache.org on 2014/03/11 17:40:55 UTC

git commit: adding project data to cpi - AIRAVATA-991, AIRAVATA-1006

Repository: airavata
Updated Branches:
  refs/heads/master f7dba4ecb -> 44ec4d315


adding project data to cpi - AIRAVATA-991, AIRAVATA-1006


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

Branch: refs/heads/master
Commit: 44ec4d31566fb2bab2f0b8c03bfa4af7e75f8287
Parents: f7dba4e
Author: chathuri <ch...@apache.org>
Authored: Tue Mar 11 12:40:46 2014 -0400
Committer: chathuri <ch...@apache.org>
Committed: Tue Mar 11 12:40:46 2014 -0400

----------------------------------------------------------------------
 .../server/handler/AiravataServerHandler.java   |  45 +++-
 .../src/main/resources/registry-derby.sql       |  13 +-
 .../src/main/resources/registry-mysql.sql       |  13 +-
 .../java-client-samples/pom.xml                 |  10 +-
 .../client/samples/CreateLaunchExperiment.java  |  20 ++
 .../main/resources/airavata-client.properties   |   4 +-
 .../airavata/common/utils/AiravataUtils.java    |  16 ++
 .../src/test/resources/registry-derby.sql       |  15 +-
 .../persistance/registry/jpa/ResourceType.java  |   1 +
 .../registry/jpa/impl/ExperimentRegistry.java   |  67 +++---
 .../registry/jpa/impl/ProjectRegistry.java      | 211 +++++++++++++++++++
 .../registry/jpa/impl/RegistryImpl.java         |  30 ++-
 .../persistance/registry/jpa/model/Project.java |  23 ++
 .../registry/jpa/model/ProjectUser.java         |  77 +++++++
 .../registry/jpa/model/ProjectUser_PK.java      |  62 ++++++
 .../jpa/resources/AbstractResource.java         |   7 +
 .../registry/jpa/resources/ProjectResource.java |  87 +++++++-
 .../jpa/resources/ProjectUserResource.java      | 109 ++++++++++
 .../registry/jpa/resources/Utils.java           |  18 ++
 .../jpa/utils/ThriftDataModelConversion.java    |  22 ++
 .../src/main/resources/META-INF/persistence.xml |   1 +
 .../src/main/resources/registry-derby.sql       |  13 +-
 .../src/main/resources/registry-mysql.sql       |  13 +-
 .../src/test/resources/registry-derby.sql       |  13 +-
 .../airavata/registry/cpi/utils/Constants.java  |   5 +
 25 files changed, 823 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
index 1002f91..9bfe446 100644
--- a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
+++ b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/handler/AiravataServerHandler.java
@@ -32,10 +32,7 @@ import org.apache.airavata.orchestrator.client.OrchestratorClientFactory;
 import org.apache.airavata.orchestrator.cpi.OrchestratorService;
 import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
 import org.apache.airavata.model.workspace.experiment.*;
-import org.apache.airavata.registry.cpi.ChildDataType;
-import org.apache.airavata.registry.cpi.DataType;
-import org.apache.airavata.registry.cpi.ParentDataType;
-import org.apache.airavata.registry.cpi.Registry;
+import org.apache.airavata.registry.cpi.*;
 import org.apache.airavata.registry.cpi.utils.Constants;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
@@ -71,7 +68,14 @@ public class AiravataServerHandler implements Airavata.Iface {
      */
     @Override
     public String createProject(Project project, String userName) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-        return null;
+        try {
+            registry = RegistryFactory.getDefaultRegistry();
+            project.setOwner(userName);
+            return (String)registry.add(ParentDataType.PROJECT, project);
+        } catch (RegistryException e) {
+            logger.error("Error while creating the project", e);
+            throw new AiravataSystemException();
+        }
     }
 
     /**
@@ -81,7 +85,13 @@ public class AiravataServerHandler implements Airavata.Iface {
      */
     @Override
     public void updateProject(Project project) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-
+        try {
+            registry = RegistryFactory.getDefaultRegistry();
+            registry.update(DataType.PROJECT, project, project.getProjectID());
+        } catch (RegistryException e) {
+            logger.error("Error while updating the project", e);
+            throw new AiravataSystemException();
+        }
     }
 
     /**
@@ -91,7 +101,13 @@ public class AiravataServerHandler implements Airavata.Iface {
      */
     @Override
     public Project getProject(String projectId) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-        return null;
+        try {
+            registry = RegistryFactory.getDefaultRegistry();
+            return (Project)registry.get(DataType.PROJECT, projectId);
+        } catch (RegistryException e) {
+            logger.error("Error while updating the project", e);
+            throw new AiravataSystemException();
+        }
     }
 
     /**
@@ -101,7 +117,20 @@ public class AiravataServerHandler implements Airavata.Iface {
      */
     @Override
     public List<Project> getAllUserProjects(String userName) throws InvalidRequestException, AiravataClientException, AiravataSystemException, TException {
-        return null;
+        List<Project> projects = new ArrayList<Project>();
+        try {
+            registry = RegistryFactory.getDefaultRegistry();
+            List<Object> list = registry.get(DataType.PROJECT, Constants.FieldConstants.ProjectConstants.OWNER, userName);
+            if (list != null && !list.isEmpty()){
+                for (Object o : list){
+                    projects.add((Project)o);
+                }
+            }
+            return projects;
+        } catch (RegistryException e) {
+            logger.error("Error while updating the project", e);
+            throw new AiravataSystemException();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/airavata-api/airavata-api-server/src/main/resources/registry-derby.sql
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-api-server/src/main/resources/registry-derby.sql b/airavata-api/airavata-api-server/src/main/resources/registry-derby.sql
index b794ba0..245ae19 100644
--- a/airavata-api/airavata-api-server/src/main/resources/registry-derby.sql
+++ b/airavata-api/airavata-api-server/src/main/resources/registry-derby.sql
@@ -57,11 +57,22 @@ CREATE TABLE PROJECT
          GATEWAY_NAME VARCHAR(255),
          USER_NAME VARCHAR(255),
          PROJECT_NAME VARCHAR(255),
+         DESCRIPTION VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (PROJECT_NAME),
          FOREIGN KEY (GATEWAY_NAME) REFERENCES GATEWAY(GATEWAY_NAME) ON DELETE CASCADE,
          FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
 );
 
+CREATE TABLE PROJECT_USER
+(
+    PROJECT_NAME VARCHAR(255),
+    USER_NAME VARCHAR(255),
+    PRIMARY KEY (PROJECT_NAME,USER_NAME),
+    FOREIGN KEY (PROJECT_NAME) REFERENCES PROJECT(PROJECT_NAME) ON DELETE CASCADE,
+    FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
 CREATE TABLE PUBLISHED_WORKFLOW
 (
          GATEWAY_NAME VARCHAR(255),
@@ -131,7 +142,7 @@ CREATE TABLE EXPERIMENT
         EXECUTION_USER VARCHAR(255),
         PROJECT_NAME VARCHAR(255),
         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        EXPERIMENT_NAME VARCHAR(255),
+        EXPERIMENT_NAME VARCHAR(255) NOT NULL,
         EXPERIMENT_DESCRIPTION VARCHAR(255),
         APPLICATION_ID VARCHAR(255),
         APPLICATION_VERSION VARCHAR(255),

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/airavata-api/airavata-api-server/src/main/resources/registry-mysql.sql
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-api-server/src/main/resources/registry-mysql.sql b/airavata-api/airavata-api-server/src/main/resources/registry-mysql.sql
index 21fb8ec..020dfd5 100644
--- a/airavata-api/airavata-api-server/src/main/resources/registry-mysql.sql
+++ b/airavata-api/airavata-api-server/src/main/resources/registry-mysql.sql
@@ -57,11 +57,22 @@ CREATE TABLE PROJECT
          GATEWAY_NAME VARCHAR(255),
          USER_NAME VARCHAR(255),
          PROJECT_NAME VARCHAR(255),
+         DESCRIPTION VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT NOW(),
          PRIMARY KEY (PROJECT_NAME),
          FOREIGN KEY (GATEWAY_NAME) REFERENCES GATEWAY(GATEWAY_NAME) ON DELETE CASCADE,
          FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
 );
 
+CREATE TABLE PROJECT_USER
+(
+    PROJECT_NAME VARCHAR(255),
+    USER_NAME VARCHAR(255),
+    PRIMARY KEY (PROJECT_NAME,USER_NAME),
+    FOREIGN KEY (PROJECT_NAME) REFERENCES PROJECT(PROJECT_NAME) ON DELETE CASCADE,
+    FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
 CREATE TABLE PUBLISHED_WORKFLOW
 (
          GATEWAY_NAME VARCHAR(255),
@@ -131,7 +142,7 @@ CREATE TABLE EXPERIMENT
         EXECUTION_USER VARCHAR(255),
         PROJECT_NAME VARCHAR(255),
         CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        EXPERIMENT_NAME VARCHAR(255),
+        EXPERIMENT_NAME VARCHAR(255) NOT NULL,
         EXPERIMENT_DESCRIPTION VARCHAR(255),
         APPLICATION_ID VARCHAR(255),
         APPLICATION_VERSION VARCHAR(255),

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/java-client-samples/pom.xml b/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
index b5f2631..e9350f1 100644
--- a/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
+++ b/airavata-api/airavata-client-sdks/java-client-samples/pom.xml
@@ -72,11 +72,11 @@
             <artifactId>slf4j-log4j12</artifactId>
             <version>${org.slf4j.version}</version>
         </dependency>
-        <!--<dependency>-->
-            <!--<groupId>mysql</groupId>-->
-            <!--<artifactId>mysql-connector-java</artifactId>-->
-            <!--<version>5.1.17</version>-->
-        <!--</dependency>-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.17</version>
+        </dependency>
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java
index 6c11091..7a129c4 100644
--- a/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java
+++ b/airavata-api/airavata-client-sdks/java-client-samples/src/main/java/org/apache/airavata/client/samples/CreateLaunchExperiment.java
@@ -68,6 +68,11 @@ public class CreateLaunchExperiment {
             System.out.println("Experiment ID : " + expId);
             launchExperiment(airavata, expId);
             System.out.println("Launched successfully");
+            List<Experiment> experiments = getExperimentsForUser(airavata, "admin");
+            for (Experiment exp : experiments){
+                System.out.println(" exp id : " + exp.getExperimentID());
+            }
+
 //            try {
 //                Thread.sleep(20000);
 //            } catch (InterruptedException e) {
@@ -373,4 +378,19 @@ public class CreateLaunchExperiment {
             throw new TException(e);
         }
     }
+
+    public static List<Experiment> getExperimentsForUser (Airavata.Client client, String user){
+        try {
+            return client.getAllUserExperiments(user);
+        } catch (AiravataSystemException e) {
+            e.printStackTrace();
+        } catch (InvalidRequestException e) {
+            e.printStackTrace();
+        } catch (AiravataClientException e) {
+            e.printStackTrace();
+        }catch (TException e){
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/airavata-api/airavata-client-sdks/java-client-samples/src/main/resources/airavata-client.properties
----------------------------------------------------------------------
diff --git a/airavata-api/airavata-client-sdks/java-client-samples/src/main/resources/airavata-client.properties b/airavata-api/airavata-client-sdks/java-client-samples/src/main/resources/airavata-client.properties
index 9786a1a..2a463b1 100644
--- a/airavata-api/airavata-client-sdks/java-client-samples/src/main/resources/airavata-client.properties
+++ b/airavata-api/airavata-client-sdks/java-client-samples/src/main/resources/airavata-client.properties
@@ -35,13 +35,13 @@ class.registry.accessor=org.apache.airavata.persistance.registry.jpa.impl.Airava
 ########################Registry JPA Implementation Settings########################
 #for mysql [AiravataJPARegistry]
 #registry.jdbc.driver=com.mysql.jdbc.Driver
-#registry.jdbc.url=jdbc:mysql://gw111.iu.xsede.org:3306/airavata
+#registry.jdbc.url=jdbc:mysql://localhost:3306/persistent_data
 
 #for derby [AiravataJPARegistry]
 registry.jdbc.driver=org.apache.derby.jdbc.ClientDriver
 registry.jdbc.url=jdbc:derby://localhost:1527/persistent_data;create=true;user=airavata;password=airavata
 registry.jdbc.user=airavata
-registry.jdbc.password=airavata12
+registry.jdbc.password=airavata
 start.derby.server.mode=true
 
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
----------------------------------------------------------------------
diff --git a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java b/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
index 84b00f0..45d2b8f 100644
--- a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
+++ b/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/AiravataUtils.java
@@ -21,6 +21,9 @@
 
 package org.apache.airavata.common.utils;
 
+import java.sql.Timestamp;
+import java.util.Calendar;
+
 public class AiravataUtils {
 	public static final String EXECUTION_MODE="application.execution.mode";
 	public static void setExecutionMode(ExecutionMode mode){
@@ -50,4 +53,17 @@ public class AiravataUtils {
 	public static void setExecutionAsClient(){
 		setExecutionMode(ExecutionMode.CLIENT);
 	}
+
+    public static Timestamp getCurrentTimestamp() {
+        Calendar calender = Calendar.getInstance();
+        java.util.Date d = calender.getTime();
+        return new Timestamp(d.getTime());
+    }
+
+    public static Timestamp getTime(long time) {
+        if (time == 0 || time < 0){
+            return getCurrentTimestamp();
+        }
+        return new Timestamp(time);
+    }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/orchestrator/orchestrator-core/src/test/resources/registry-derby.sql
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/src/test/resources/registry-derby.sql b/modules/orchestrator/orchestrator-core/src/test/resources/registry-derby.sql
index 7b8fb39..245ae19 100644
--- a/modules/orchestrator/orchestrator-core/src/test/resources/registry-derby.sql
+++ b/modules/orchestrator/orchestrator-core/src/test/resources/registry-derby.sql
@@ -57,11 +57,22 @@ CREATE TABLE PROJECT
          GATEWAY_NAME VARCHAR(255),
          USER_NAME VARCHAR(255),
          PROJECT_NAME VARCHAR(255),
+         DESCRIPTION VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (PROJECT_NAME),
          FOREIGN KEY (GATEWAY_NAME) REFERENCES GATEWAY(GATEWAY_NAME) ON DELETE CASCADE,
          FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
 );
 
+CREATE TABLE PROJECT_USER
+(
+    PROJECT_NAME VARCHAR(255),
+    USER_NAME VARCHAR(255),
+    PRIMARY KEY (PROJECT_NAME,USER_NAME),
+    FOREIGN KEY (PROJECT_NAME) REFERENCES PROJECT(PROJECT_NAME) ON DELETE CASCADE,
+    FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
 CREATE TABLE PUBLISHED_WORKFLOW
 (
          GATEWAY_NAME VARCHAR(255),
@@ -131,7 +142,7 @@ CREATE TABLE EXPERIMENT
         EXECUTION_USER VARCHAR(255),
         PROJECT_NAME VARCHAR(255),
         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        EXPERIMENT_NAME VARCHAR(255),
+        EXPERIMENT_NAME VARCHAR(255) NOT NULL,
         EXPERIMENT_DESCRIPTION VARCHAR(255),
         APPLICATION_ID VARCHAR(255),
         APPLICATION_VERSION VARCHAR(255),
@@ -255,7 +266,7 @@ CREATE TABLE JOB_DETAIL
 (
         JOB_ID VARCHAR(255),
         TASK_ID VARCHAR(255),
-        JOB_DESCRIPTION VARCHAR(255),
+        JOB_DESCRIPTION CLOB,
         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
         COMPUTE_RESOURCE_CONSUMED VARCHAR(255),
         PRIMARY KEY (TASK_ID, JOB_ID),

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/ResourceType.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/ResourceType.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/ResourceType.java
index 859caa0..1e0736b 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/ResourceType.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/ResourceType.java
@@ -24,6 +24,7 @@ public enum ResourceType {
     GATEWAY,
     PROJECT,
     USER,
+    PROJECT_USER,
     SERVICE_DESCRIPTOR,
     PUBLISHED_WORKFLOW,
     USER_WORKFLOW,

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
index 26de4c0..28b8dbe 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
@@ -21,6 +21,7 @@
 
 package org.apache.airavata.persistance.registry.jpa.impl;
 
+import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.workspace.experiment.*;
 import org.apache.airavata.persistance.registry.jpa.Resource;
 import org.apache.airavata.persistance.registry.jpa.ResourceType;
@@ -73,7 +74,7 @@ public class ExperimentRegistry {
                 project = workerResource.getProject(experiment.getProjectID());
                 experimentResource.setProject(project);
             }
-            experimentResource.setCreationTime(getTime(experiment.getCreationTime()));
+            experimentResource.setCreationTime(AiravataUtils.getTime(experiment.getCreationTime()));
             experimentResource.setDescription(experiment.getDescription());
             experimentResource.setApplicationId(experiment.getApplicationId());
             experimentResource.setApplicationVersion(experiment.getApplicationVersion());
@@ -243,7 +244,7 @@ public class ExperimentRegistry {
             cmsr.setNumberOfThreads(resourceScheduling.getNumberOfThreads());
             cmsr.setQueueName(resourceScheduling.getQueueName());
             cmsr.setWalltimeLimit(resourceScheduling.getWallTimeLimit());
-            cmsr.setJobStartTime(getTime(resourceScheduling.getJobStartTime()));
+            cmsr.setJobStartTime(AiravataUtils.getTime(resourceScheduling.getJobStartTime()));
             cmsr.setPhysicalMemory(resourceScheduling.getTotalPhysicalMemory());
             cmsr.setProjectName(resourceScheduling.getComputationalProjectAccount());
             cmsr.save();
@@ -402,7 +403,7 @@ public class ExperimentRegistry {
                 status = (StatusResource) experiment.create(ResourceType.STATUS);
             }
             status.setExperimentResource(experiment);
-            status.setStatusUpdateTime(getTime(experimentStatus.getTimeOfStateChange()));
+            status.setStatusUpdateTime(AiravataUtils.getTime(experimentStatus.getTimeOfStateChange()));
             status.setState(experimentStatus.getExperimentState().toString());
             status.setStatusType(StatusType.EXPERIMENT.toString());
             status.save();
@@ -421,7 +422,7 @@ public class ExperimentRegistry {
             statusResource.setExperimentResource(experiment);
             statusResource.setWorkflowNodeDetail(workflowNode);
             statusResource.setStatusType(StatusType.WORKFLOW_NODE.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getWorkflowNodeState().toString());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -439,7 +440,7 @@ public class ExperimentRegistry {
             statusResource.setExperimentResource(workflowNode.getExperimentResource());
             statusResource.setWorkflowNodeDetail(workflowNode);
             statusResource.setStatusType(StatusType.WORKFLOW_NODE.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getWorkflowNodeState().toString());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -459,7 +460,7 @@ public class ExperimentRegistry {
             statusResource.setWorkflowNodeDetail(workflowNode);
             statusResource.setTaskDetailResource(taskDetail);
             statusResource.setStatusType(StatusType.TASK.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getExecutionState().toString());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -479,7 +480,7 @@ public class ExperimentRegistry {
             statusResource.setWorkflowNodeDetail(taskDetail.getWorkflowNodeDetailResource());
             statusResource.setTaskDetailResource(taskDetail);
             statusResource.setStatusType(StatusType.TASK.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getExecutionState().toString());
             statusResource.save();
         } catch (Exception e) {
@@ -504,7 +505,7 @@ public class ExperimentRegistry {
             statusResource.setWorkflowNodeDetail(taskDetail.getWorkflowNodeDetailResource());
             statusResource.setTaskDetailResource(taskDetail);
             statusResource.setStatusType(StatusType.JOB.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getJobState().toString());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -528,7 +529,7 @@ public class ExperimentRegistry {
             statusResource.setWorkflowNodeDetail(workflowNode);
             statusResource.setTaskDetailResource(taskDetail);
             statusResource.setStatusType(StatusType.JOB.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getJobState().toString());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -554,7 +555,7 @@ public class ExperimentRegistry {
             statusResource.setWorkflowNodeDetail(taskDetail.getWorkflowNodeDetailResource());
             statusResource.setTaskDetailResource(taskDetail);
             statusResource.setStatusType(StatusType.APPLICATION.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getApplicationState());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -575,7 +576,7 @@ public class ExperimentRegistry {
             statusResource.setWorkflowNodeDetail(jobDetail.getTaskDetailResource().getWorkflowNodeDetailResource());
             statusResource.setTaskDetailResource(jobDetail.getTaskDetailResource());
             statusResource.setStatusType(StatusType.APPLICATION.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getApplicationState());
             statusResource.save();
         } catch (Exception e) {
@@ -602,7 +603,7 @@ public class ExperimentRegistry {
             statusResource.setTaskDetailResource(taskDetail);
             statusResource.setDataTransferDetail(dataTransferDetail);
             statusResource.setStatusType(StatusType.DATA_TRANSFER.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getTransferState().toString());
             statusResource.save();
             return String.valueOf(statusResource.getStatusId());
@@ -624,7 +625,7 @@ public class ExperimentRegistry {
             statusResource.setTaskDetailResource(dataTransferDetail.getTaskDetailResource());
             statusResource.setDataTransferDetail(dataTransferDetail);
             statusResource.setStatusType(StatusType.DATA_TRANSFER.toString());
-            statusResource.setStatusUpdateTime(getTime(status.getTimeOfStateChange()));
+            statusResource.setStatusUpdateTime(AiravataUtils.getTime(status.getTimeOfStateChange()));
             statusResource.setState(status.getTransferState().toString());
             statusResource.save();
         } catch (Exception e) {
@@ -639,7 +640,7 @@ public class ExperimentRegistry {
             WorkflowNodeDetailResource resource = (WorkflowNodeDetailResource) experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
             resource.setExperimentResource(experiment);
             resource.setNodeName(nodeDetails.getNodeName());
-            resource.setCreationTime(getTime(nodeDetails.getCreationTime()));
+            resource.setCreationTime(AiravataUtils.getTime(nodeDetails.getCreationTime()));
             resource.setNodeInstanceId(getNodeInstanceID(nodeDetails.getNodeName()));
             resource.save();
             String nodeId = resource.getNodeInstanceId();
@@ -686,7 +687,7 @@ public class ExperimentRegistry {
             ExperimentResource experiment = (ExperimentResource) gatewayResource.create(ResourceType.EXPERIMENT);
             WorkflowNodeDetailResource workflowNode = experiment.getWorkflowNode(nodeId);
             workflowNode.setNodeName(nodeDetails.getNodeName());
-            workflowNode.setCreationTime(getTime(nodeDetails.getCreationTime()));
+            workflowNode.setCreationTime(AiravataUtils.getTime(nodeDetails.getCreationTime()));
             workflowNode.setNodeInstanceId(getNodeInstanceID(nodeDetails.getNodeName()));
             workflowNode.save();
             String expID = workflowNode.getExperimentResource().getExpID();
@@ -778,7 +779,7 @@ public class ExperimentRegistry {
             taskDetail.setTaskId(getTaskID(workflowNode.getNodeName()));
             taskDetail.setApplicationId(taskDetails.getApplicationId());
             taskDetail.setApplicationVersion(taskDetails.getApplicationVersion());
-            taskDetail.setCreationTime(getTime(taskDetails.getCreationTime()));
+            taskDetail.setCreationTime(AiravataUtils.getTime(taskDetails.getCreationTime()));
             taskDetail.save();
             List<DataObjectType> applicationInputs = taskDetails.getApplicationInputs();
             if (applicationInputs != null) {
@@ -844,7 +845,7 @@ public class ExperimentRegistry {
             taskDetail.setTaskId(getTaskID(workflowNode.getNodeName()));
             taskDetail.setApplicationId(taskDetails.getApplicationId());
             taskDetail.setApplicationVersion(taskDetails.getApplicationVersion());
-            taskDetail.setCreationTime(getTime(taskDetails.getCreationTime()));
+            taskDetail.setCreationTime(AiravataUtils.getTime(taskDetails.getCreationTime()));
             taskDetail.save();
             List<DataObjectType> applicationInputs = taskDetails.getApplicationInputs();
             if (applicationInputs != null) {
@@ -981,7 +982,7 @@ public class ExperimentRegistry {
             JobDetailResource jobDetail = taskDetail.createJobDetail((String) ids.getSecondLevelIdentifier());
             jobDetail.setTaskDetailResource(taskDetail);
             jobDetail.setJobDescription(jobDetails.getJobDescription());
-            jobDetail.setCreationTime(getTime(jobDetails.getCreationTime()));
+            jobDetail.setCreationTime(AiravataUtils.getTime(jobDetails.getCreationTime()));
             jobDetail.setComputeResourceConsumed(jobDetails.getComputeResourceConsumed());
             jobDetail.save();
             JobStatus jobStatus = jobDetails.getJobStatus();
@@ -1024,7 +1025,7 @@ public class ExperimentRegistry {
             TaskDetailResource taskDetailResource = jobDetail.getTaskDetailResource();
             jobDetail.setTaskDetailResource(taskDetailResource);
             jobDetail.setJobDescription(jobDetails.getJobDescription());
-            jobDetail.setCreationTime(getTime(jobDetails.getCreationTime()));
+            jobDetail.setCreationTime(AiravataUtils.getTime(jobDetails.getCreationTime()));
             jobDetail.setComputeResourceConsumed(jobDetails.getComputeResourceConsumed());
             jobDetail.save();
             String taskId = taskDetailResource.getTaskId();
@@ -1068,7 +1069,7 @@ public class ExperimentRegistry {
             resource.setTaskDetailResource(taskDetail);
             resource.setTransferId(getDataTransferID(taskId));
             resource.setTransferDescription(transferDetails.getTransferDescription());
-            resource.setCreationTime(getTime(transferDetails.getCreationTime()));
+            resource.setCreationTime(AiravataUtils.getTime(transferDetails.getCreationTime()));
             resource.save();
             String transferId = resource.getTransferId();
             TransferStatus transferStatus = transferDetails.getTransferStatus();
@@ -1096,7 +1097,7 @@ public class ExperimentRegistry {
             DataTransferDetailResource resource = taskDetail.getDataTransferDetail(transferId);
             resource.setTaskDetailResource(taskDetail);
             resource.setTransferDescription(transferDetails.getTransferDescription());
-            resource.setCreationTime(getTime(transferDetails.getCreationTime()));
+            resource.setCreationTime(AiravataUtils.getTime(transferDetails.getCreationTime()));
             resource.save();
             String taskId = resource.getTaskDetailResource().getTaskId();
             TransferStatus transferStatus = transferDetails.getTransferStatus();
@@ -1137,7 +1138,7 @@ public class ExperimentRegistry {
             schedulingResource.setNumberOfThreads(scheduling.getNumberOfThreads());
             schedulingResource.setQueueName(scheduling.getQueueName());
             schedulingResource.setWalltimeLimit(scheduling.getWallTimeLimit());
-            schedulingResource.setJobStartTime(getTime(scheduling.getJobStartTime()));
+            schedulingResource.setJobStartTime(AiravataUtils.getTime(scheduling.getJobStartTime()));
             schedulingResource.setPhysicalMemory(scheduling.getTotalPhysicalMemory());
             schedulingResource.setProjectName(scheduling.getComputationalProjectAccount());
             schedulingResource.save();
@@ -1269,7 +1270,7 @@ public class ExperimentRegistry {
                         "identifier for job..");
             }
             if (errorResource != null) {
-                errorResource.setCreationTime(getTime(error.getCreationTime()));
+                errorResource.setCreationTime(AiravataUtils.getTime(error.getCreationTime()));
                 errorResource.setActualErrorMsg(error.getActualErrorMessage());
                 errorResource.setUserFriendlyErrorMsg(error.getUserFriendlyMessage());
                 errorResource.setErrorCategory(error.getErrorCategory().toString());
@@ -1377,7 +1378,7 @@ public class ExperimentRegistry {
                 ProjectResource project = workerResource.createProject(experiment.getProjectID());
                 existingExperiment.setProject(project);
             }
-            existingExperiment.setCreationTime(getTime(experiment.getCreationTime()));
+            existingExperiment.setCreationTime(AiravataUtils.getTime(experiment.getCreationTime()));
             existingExperiment.setDescription(experiment.getDescription());
             existingExperiment.setApplicationId(experiment.getApplicationId());
             existingExperiment.setApplicationVersion(experiment.getApplicationVersion());
@@ -1541,7 +1542,7 @@ public class ExperimentRegistry {
             cmsr.setNumberOfThreads(resourceScheduling.getNumberOfThreads());
             cmsr.setQueueName(resourceScheduling.getQueueName());
             cmsr.setWalltimeLimit(resourceScheduling.getWallTimeLimit());
-            cmsr.setJobStartTime(getTime(resourceScheduling.getJobStartTime()));
+            cmsr.setJobStartTime(AiravataUtils.getTime(resourceScheduling.getJobStartTime()));
             cmsr.setPhysicalMemory(resourceScheduling.getTotalPhysicalMemory());
             cmsr.setProjectName(resourceScheduling.getComputationalProjectAccount());
             cmsr.save();
@@ -2261,8 +2262,7 @@ public class ExperimentRegistry {
 
     public boolean isExperimentExist(String expID) throws Exception {
         try {
-            gatewayResource.isExists(ResourceType.EXPERIMENT, expID);
-            return true;
+            return gatewayResource.isExists(ResourceType.EXPERIMENT, expID);
         } catch (Exception e) {
             logger.error("Error while retrieving experiment...", e.getMessage());
             throw new Exception(e);
@@ -2477,17 +2477,4 @@ public class ExperimentRegistry {
             throw new Exception(e);
         }
     }
-
-    public Timestamp getCurrentTimestamp() {
-        Calendar calender = Calendar.getInstance();
-        java.util.Date d = calender.getTime();
-        return new Timestamp(d.getTime());
-    }
-
-    public Timestamp getTime(long time) {
-        if (time == 0 || time < 0){
-          return getCurrentTimestamp();
-        }
-        return new Timestamp(time);
-    }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
new file mode 100644
index 0000000..63e1ada
--- /dev/null
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
@@ -0,0 +1,211 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.persistance.registry.jpa.impl;
+
+import org.apache.airavata.common.utils.AiravataUtils;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.persistance.registry.jpa.Resource;
+import org.apache.airavata.persistance.registry.jpa.ResourceType;
+import org.apache.airavata.persistance.registry.jpa.ResourceUtils;
+import org.apache.airavata.persistance.registry.jpa.resources.*;
+import org.apache.airavata.persistance.registry.jpa.utils.ThriftDataModelConversion;
+import org.apache.airavata.registry.cpi.utils.Constants;
+import org.apache.axis2.i18n.ProjectResourceBundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProjectRegistry {
+    private GatewayResource gatewayResource;
+    private WorkerResource workerResource;
+    private final static Logger logger = LoggerFactory.getLogger(ProjectRegistry.class);
+
+    public ProjectRegistry(GatewayResource gatewayResource, UserResource user) {
+        if (!ResourceUtils.isGatewayExist(gatewayResource.getGatewayName())){
+            this.gatewayResource = gatewayResource;
+        }else {
+            gatewayResource = (GatewayResource)ResourceUtils.getGateway(gatewayResource.getGatewayName());
+        }
+        if (!ResourceUtils.isUserExist(user.getUserName())){
+            workerResource = new WorkerResource(user.getUserName(), gatewayResource);
+            workerResource.save();
+        }else {
+            workerResource = (WorkerResource)ResourceUtils.getWorker(gatewayResource.getGatewayName(), user.getUserName());
+        }
+    }
+
+    public String addProject (Project project) throws Exception{
+        String projectId;
+        try {
+            if (!ResourceUtils.isUserExist(project.getOwner())){
+                logger.error("User does not exist in the system..");
+                throw new Exception("User does not exist in the system..");
+            }
+            ProjectResource projectResource = new ProjectResource();
+            projectResource.setName(project.getName());
+            projectResource.setDescription(project.getDescription());
+            projectResource.setCreationTime(AiravataUtils.getTime(project.getCreationTime()));
+            projectResource.setGateway(gatewayResource);
+            UserResource user = (UserResource)ResourceUtils.getUser(project.getOwner());
+            ResourceUtils.addGatewayWorker(gatewayResource, user);
+            WorkerResource worker = new WorkerResource(project.getOwner(), gatewayResource);
+            projectResource.setWorker(worker);
+            projectResource.save();
+            ProjectUserResource resource = (ProjectUserResource)projectResource.create(ResourceType.PROJECT_USER);
+            resource.setProjectName(project.getName());
+            resource.setUserName(project.getOwner());
+            resource.save();
+            projectId = projectResource.getName();
+            List<String> sharedGroups = project.getSharedGroups();
+            if (sharedGroups != null && !sharedGroups.isEmpty()){
+                for (String group : sharedGroups){
+                    //TODO - add shared groups
+                    logger.info("Groups are not supported at the moment...");
+                }
+            }
+
+            List<String> sharedUsers = project.getSharedUsers();
+            if (sharedUsers != null && !sharedUsers.isEmpty()){
+                for (String username : sharedUsers){
+                    ProjectUserResource pr = (ProjectUserResource)projectResource.create(ResourceType.PROJECT_USER);
+                    pr.setUserName(username);
+                    pr.save();
+                }
+            }
+        }catch (Exception e){
+            logger.error("Error while saving project to registry", e.getMessage());
+            throw new Exception(e);
+        }
+        return projectId;
+    }
+
+    public void updateProject (Project project, String projectName) throws Exception{
+        try {
+            ProjectResource existingProject = workerResource.getProject(projectName);
+            existingProject.setDescription(project.getDescription());
+            existingProject.setCreationTime(AiravataUtils.getTime(project.getCreationTime()));
+            existingProject.setGateway(gatewayResource);
+            UserResource user = (UserResource)ResourceUtils.getUser(project.getOwner());
+            ResourceUtils.addGatewayWorker(gatewayResource, user);
+            WorkerResource worker = new WorkerResource(project.getOwner(), gatewayResource);
+            existingProject.setWorker(worker);
+            existingProject.save();
+            ProjectUserResource resource = (ProjectUserResource)existingProject.create(ResourceType.PROJECT_USER);
+            resource.setProjectName(project.getName());
+            resource.setUserName(project.getOwner());
+            resource.save();
+            List<String> sharedGroups = project.getSharedGroups();
+            if (sharedGroups != null && !sharedGroups.isEmpty()){
+                for (String group : sharedGroups){
+                    //TODO - add shared groups
+                    logger.info("Groups are not supported at the moment...");
+                }
+            }
+
+            List<String> sharedUsers = project.getSharedUsers();
+            if (sharedUsers != null && !sharedUsers.isEmpty()){
+                for (String username : sharedUsers){
+                    ProjectUserResource pr = (ProjectUserResource)existingProject.create(ResourceType.PROJECT_USER);
+                    pr.setUserName(username);
+                    pr.save();
+                }
+            }
+        }catch (Exception e){
+            logger.error("Error while saving project to registry", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    public Project getProject (String projectName) throws Exception{
+        try {
+            ProjectResource project = workerResource.getProject(projectName);
+            if (project != null){
+                return ThriftDataModelConversion.getProject(project);
+            }
+        }catch (Exception e){
+            logger.error("Error while retrieving project from registry", e.getMessage());
+            throw new Exception(e);
+        }
+        return null;
+    }
+
+    public List<Project> getProjectList (String fieldName, Object value) throws Exception{
+        List<Project> projects = new ArrayList<Project>();
+        try {
+            if (fieldName.equals(Constants.FieldConstants.ProjectConstants.OWNER)){
+                workerResource.setUser((String)value);
+                List<ProjectResource> projectList = workerResource.getProjects();
+                if (projectList != null && !projectList.isEmpty()){
+                    for (ProjectResource pr : projectList){
+                        projects.add(ThriftDataModelConversion.getProject(pr));
+                    }
+                }
+                return projects;
+            }
+        }catch (Exception e){
+            logger.error("Error while retrieving project from registry", e.getMessage());
+            throw new Exception(e);
+        }
+        return projects;
+    }
+
+    public List<String> getProjectIDs (String fieldName, Object value) throws Exception{
+        List<String> projectIds = new ArrayList<String>();
+        try {
+            if (fieldName.equals(Constants.FieldConstants.ProjectConstants.OWNER)){
+                workerResource.setUser((String)value);
+                List<ProjectResource> projectList = workerResource.getProjects();
+                if (projectList != null && !projectList.isEmpty()){
+                    for (ProjectResource pr : projectList){
+                        projectIds.add(pr.getName());
+                    }
+                }
+                return projectIds;
+            }
+        }catch (Exception e){
+            logger.error("Error while retrieving projects from registry", e.getMessage());
+            throw new Exception(e);
+        }
+        return projectIds;
+    }
+
+    public void removeProject (String projectName) throws Exception {
+        try {
+            workerResource.removeProject(projectName);
+        } catch (Exception e) {
+            logger.error("Error while removing the project..", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    public boolean isProjectExist(String projectName) throws Exception {
+        try {
+            return workerResource.isProjectExists(projectName);
+        } catch (Exception e) {
+            logger.error("Error while retrieving project...", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
index d5df069..549e7c1 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/RegistryImpl.java
@@ -23,6 +23,7 @@ package org.apache.airavata.persistance.registry.jpa.impl;
 
 import org.apache.airavata.common.exception.ApplicationSettingsException;
 import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.model.workspace.Project;
 import org.apache.airavata.model.workspace.experiment.*;
 import org.apache.airavata.persistance.registry.jpa.ResourceUtils;
 import org.apache.airavata.persistance.registry.jpa.resources.GatewayResource;
@@ -38,7 +39,8 @@ public class RegistryImpl implements Registry {
     private GatewayResource gatewayResource;
     private UserResource user;
     private final static Logger logger = LoggerFactory.getLogger(RegistryImpl.class);
-    ExperimentRegistry experimentRegistry = null;
+    private ExperimentRegistry experimentRegistry = null;
+    private ProjectRegistry projectRegistry = null;
 
     public RegistryImpl() {
         try {
@@ -47,6 +49,7 @@ public class RegistryImpl implements Registry {
             user = ResourceUtils.createUser(ServerSettings.getSystemUser(), ServerSettings.getSystemUserPassword());
             user.save();
             experimentRegistry = new ExperimentRegistry(gatewayResource, user);
+            projectRegistry = new ProjectRegistry(gatewayResource, user);
         } catch (ApplicationSettingsException e) {
             logger.error("Unable to read airavata server properties..", e.getMessage());
         }
@@ -58,6 +61,7 @@ public class RegistryImpl implements Registry {
         user = ResourceUtils.createUser(username, password);
         user.save();
         experimentRegistry = new ExperimentRegistry(gatewayResource, user);
+        projectRegistry = new ProjectRegistry(gatewayResource, user);
     }
 
     /**
@@ -74,6 +78,8 @@ public class RegistryImpl implements Registry {
     public Object add(ParentDataType dataType, Object newObjectToAdd) throws RegistryException {
         try {
             switch (dataType) {
+                case PROJECT:
+                    return projectRegistry.addProject((Project)newObjectToAdd);
                 case EXPERIMENT:
                     return experimentRegistry.addExperiment((Experiment) newObjectToAdd);
                 default:
@@ -166,6 +172,9 @@ public class RegistryImpl implements Registry {
     public void update(DataType dataType, Object newObjectToUpdate, Object identifier) throws RegistryException {
         try {
             switch (dataType) {
+                case PROJECT:
+                    projectRegistry.updateProject((Project)newObjectToUpdate, (String)identifier);
+                    break;
                 case EXPERIMENT:
                     experimentRegistry.updateExperiment((Experiment) newObjectToUpdate, (String) identifier);
                     break;
@@ -282,6 +291,8 @@ public class RegistryImpl implements Registry {
     public Object get(DataType dataType, Object identifier) throws RegistryException {
         try {
             switch (dataType) {
+                case PROJECT:
+                    return projectRegistry.getProject((String)identifier);
                 case EXPERIMENT:
                     return experimentRegistry.getExperiment((String) identifier, null);
                 case EXPERIMENT_CONFIGURATION_DATA:
@@ -345,9 +356,15 @@ public class RegistryImpl implements Registry {
         try {
             List<Object> result = new ArrayList<Object>();
             switch (dataType) {
+                case PROJECT:
+                    List<Project> projectList = projectRegistry.getProjectList(fieldName, value);
+                    for (Project project : projectList ){
+                        result.add(project);
+                    }
+                    return result;
                 case EXPERIMENT:
-                    List<Experiment> experimentMetaDataList = experimentRegistry.getExperimentList(fieldName, value);
-                    for (Experiment experiment : experimentMetaDataList) {
+                    List<Experiment> experimentList = experimentRegistry.getExperimentList(fieldName, value);
+                    for (Experiment experiment : experimentList) {
                         result.add(experiment);
                     }
                     return result;
@@ -445,6 +462,8 @@ public class RegistryImpl implements Registry {
     public List<String> getIds(DataType dataType, String fieldName, Object value) throws RegistryException {
         try {
             switch (dataType) {
+                case PROJECT:
+                    return projectRegistry.getProjectIDs(fieldName, value);
                 case EXPERIMENT:
                     return experimentRegistry.getExperimentIDs(fieldName, value);
                 case EXPERIMENT_CONFIGURATION_DATA:
@@ -480,6 +499,9 @@ public class RegistryImpl implements Registry {
     public void remove(DataType dataType, Object identifier) throws RegistryException {
         try {
             switch (dataType) {
+                case PROJECT:
+                    projectRegistry.removeProject((String)identifier);
+                    break;
                 case EXPERIMENT:
                     experimentRegistry.removeExperiment((String) identifier);
                     break;
@@ -534,6 +556,8 @@ public class RegistryImpl implements Registry {
     public boolean isExist(DataType dataType, Object identifier) throws RegistryException {
         try {
             switch (dataType) {
+                case PROJECT:
+                    return projectRegistry.isProjectExist((String)identifier);
                 case EXPERIMENT:
                     return experimentRegistry.isExperimentExist((String) identifier);
                 case EXPERIMENT_CONFIGURATION_DATA:

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/Project.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/Project.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/Project.java
index a7c8a69..fded5f0 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/Project.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/Project.java
@@ -21,6 +21,7 @@
 package org.apache.airavata.persistance.registry.jpa.model;
 
 import javax.persistence.*;
+import java.sql.Timestamp;
 
 @Entity
 @Table(name ="PROJECT")
@@ -29,6 +30,11 @@ public class Project {
     @Column(name = "PROJECT_NAME")
     private String project_name;
 
+    @Column(name = "DESCRIPTION")
+    private String description;
+    @Column(name = "CREATION_TIME")
+    private Timestamp creationTime;
+
     @ManyToOne(cascade=CascadeType.MERGE)
     @JoinColumn(name = "GATEWAY_NAME")
     private Gateway gateway;
@@ -37,6 +43,7 @@ public class Project {
     @JoinColumn(name = "USER_NAME")
     private Users users;
 
+
     public String getProject_name() {
         return project_name;
     }
@@ -60,5 +67,21 @@ public class Project {
     public void setUsers(Users users) {
         this.users = users;
     }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Timestamp getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(Timestamp creationTime) {
+        this.creationTime = creationTime;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser.java
new file mode 100644
index 0000000..be5a475
--- /dev/null
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.persistance.registry.jpa.model;
+
+
+import javax.persistence.*;
+
+@Entity
+@IdClass(ProjectUser_PK.class)
+@Table(name = "PROJECT_USER")
+public class ProjectUser {
+    @Id
+    @Column(name = "PROJECT_NAME")
+    private String projectName;
+    @Id
+    @Column(name = "USER_NAME")
+    private String userName;
+
+    @ManyToOne(cascade=CascadeType.MERGE)
+    @JoinColumn(name = "PROJECT_NAME")
+    private Project project;
+
+    @ManyToOne(cascade=CascadeType.MERGE)
+    @JoinColumn(name = "USER_NAME")
+    private Users user;
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public Project getProject() {
+        return project;
+    }
+
+    public void setProject(Project project) {
+        this.project = project;
+    }
+
+    public Users getUser() {
+        return user;
+    }
+
+    public void setUser(Users user) {
+        this.user = user;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser_PK.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser_PK.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser_PK.java
new file mode 100644
index 0000000..d626624
--- /dev/null
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/model/ProjectUser_PK.java
@@ -0,0 +1,62 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.persistance.registry.jpa.model;
+
+public class ProjectUser_PK {
+    private String projectName;
+    private String userName;
+
+    public ProjectUser_PK(String projectName, String userName) {
+        this.projectName = projectName;
+        this.userName = userName;
+    }
+
+    public ProjectUser_PK() {
+        ;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return 1;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/AbstractResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/AbstractResource.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/AbstractResource.java
index 8b41831..51bda89 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/AbstractResource.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/AbstractResource.java
@@ -33,6 +33,7 @@ public abstract class AbstractResource implements Resource {
 	public static final String USERS = "Users";
 	public static final String GATEWAY_WORKER = "Gateway_Worker";
 	public static final String PROJECT = "Project";
+	public static final String PROJECT_USER = "ProjectUser";
 	public static final String PUBLISHED_WORKFLOW = "Published_Workflow";
 	public static final String USER_WORKFLOW = "User_Workflow";
 	public static final String HOST_DESCRIPTOR = "Host_Descriptor";
@@ -94,6 +95,12 @@ public abstract class AbstractResource implements Resource {
 		public static final String PROJECT_NAME = "project_name";
 	}
 
+    // Project table
+    public final class ProjectUserConstants {
+        public static final String USERNAME = "userName";
+        public static final String PROJECT_NAME = "projectName";
+    }
+
 	// Published_Workflow table
 	public final class PublishedWorkflowConstants {
 		public static final String GATEWAY_NAME = "gateway_name";

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectResource.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectResource.java
index 63b92fe..db72a11 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectResource.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectResource.java
@@ -20,6 +20,7 @@
 */
 package org.apache.airavata.persistance.registry.jpa.resources;
 
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,6 +40,8 @@ public class ProjectResource extends AbstractResource {
     private String name;
     private GatewayResource gateway;
     private WorkerResource worker;
+    private String description;
+    private Timestamp creationTime;
 
     /**
      *
@@ -70,7 +73,13 @@ public class ProjectResource extends AbstractResource {
             experimentResource.setExecutionUser(worker.getUser());
             experimentResource.setProject(this);
             return experimentResource;
-        } else {
+        } else if (type == ResourceType.PROJECT_USER){
+            ProjectUserResource pr = new ProjectUserResource();
+            pr.setProjectName(name);
+            pr.setUserName(worker.getUser());
+            return pr;
+        }
+        else {
             logger.error("Unsupported resource type for project resource.", new IllegalArgumentException());
             throw new IllegalArgumentException("Unsupported resource type for project resource.");
         }
@@ -89,6 +98,12 @@ public class ProjectResource extends AbstractResource {
         	generator.setParameter(ExperimentConstants.EXPERIMENT_ID, name);
         	Query q = generator.deleteQuery(em);
         	q.executeUpdate();
+        }else if (type == ResourceType.PROJECT_USER){
+            QueryGenerator generator = new QueryGenerator(PROJECT_USER);
+            generator.setParameter(ProjectUserConstants.USERNAME, name);
+            generator.setParameter(ProjectUserConstants.PROJECT_NAME, this.name);
+            Query q = generator.deleteQuery(em);
+            q.executeUpdate();
         }else {
             logger.error("Unsupported resource type for project resource.", new IllegalArgumentException());
             throw new IllegalArgumentException("Unsupported resource type for project resource.");
@@ -116,11 +131,23 @@ public class ProjectResource extends AbstractResource {
             em.getTransaction().commit();
             em.close();
             return experimentResource;
+        } else if (type == ResourceType.PROJECT_USER){
+            EntityManager em = ResourceUtils.getEntityManager();
+            em.getTransaction().begin();
+            QueryGenerator generator = new QueryGenerator(PROJECT_USER);
+            generator.setParameter(ProjectUserConstants.USERNAME, name);
+            generator.setParameter(ProjectUserConstants.PROJECT_NAME, this.name);
+            Query q = generator.selectQuery(em);
+            ProjectUser prUser = (ProjectUser) q.getSingleResult();
+            ExperimentResource experimentResource = (ExperimentResource)
+                    Utils.getResource(ResourceType.PROJECT_USER, prUser);
+            em.getTransaction().commit();
+            em.close();
+            return experimentResource;
         }else{
             logger.error("Unsupported resource type for project resource.", new IllegalArgumentException());
             throw new IllegalArgumentException("Unsupported resource type for project resource.");
         }
-
     }
 
     /**
@@ -130,7 +157,6 @@ public class ProjectResource extends AbstractResource {
      */
     public List<Resource> get(ResourceType type) {
         List<Resource> resourceList = new ArrayList<Resource>();
-
         if (type == ResourceType.EXPERIMENT) {
             EntityManager em = ResourceUtils.getEntityManager();
             em.getTransaction().begin();
@@ -148,7 +174,24 @@ public class ProjectResource extends AbstractResource {
             }
             em.getTransaction().commit();
             em.close();
-        } else {
+        }else if (type == ResourceType.PROJECT_USER) {
+            EntityManager em = ResourceUtils.getEntityManager();
+            em.getTransaction().begin();
+            QueryGenerator generator = new QueryGenerator(PROJECT_USER);
+            generator.setParameter(ProjectUserConstants.PROJECT_NAME, name);
+            Query q = generator.selectQuery(em);
+            List<?> results = q.getResultList();
+            if (results.size() != 0) {
+                for (Object result : results) {
+                    ProjectUser projectUser = (ProjectUser) result;
+                    ProjectUserResource pr = (ProjectUserResource)
+                            Utils.getResource(ResourceType.PROJECT_USER, projectUser);
+                    resourceList.add(pr);
+                }
+            }
+            em.getTransaction().commit();
+            em.close();
+        }else {
             logger.error("Unsupported resource type for project resource.", new IllegalArgumentException());
             throw new IllegalArgumentException("Unsupported resource type for project resource.");
         }
@@ -171,18 +214,21 @@ public class ProjectResource extends AbstractResource {
         project.setGateway(modelGateway);
         Users user = em.find(Users.class, worker.getUser());
         project.setUsers(user);
+        project.setDescription(description);
+        project.setCreationTime(creationTime);
 
         if(existingprojectResource != null){
            existingprojectResource.setGateway(modelGateway);
-            existingprojectResource.setUsers(user);
-            project = em.merge(existingprojectResource);
+           existingprojectResource.setUsers(user);
+           existingprojectResource.setDescription(description);
+           existingprojectResource.setCreationTime(creationTime);
+           project = em.merge(existingprojectResource);
         }else {
             em.persist(project);
         }
 
         em.getTransaction().commit();
         em.close();
-
     }
 
     /**
@@ -233,6 +279,22 @@ public class ProjectResource extends AbstractResource {
 		this.gateway = gateway;
 	}
 
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Timestamp getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(Timestamp creationTime) {
+        this.creationTime = creationTime;
+    }
+
     /**
      *
      * @param experimentId experiment ID
@@ -283,4 +345,15 @@ public class ProjectResource extends AbstractResource {
 		remove(ResourceType.EXPERIMENT, experimentId);
 	}
 
+    public List<ProjectUserResource> getProjectUserList (){
+        List<Resource> resources = get(ResourceType.PROJECT_USER);
+        List<ProjectUserResource> projectUserResources = new ArrayList<ProjectUserResource>();
+        if (resources != null && !resources.isEmpty()){
+            for (Resource r : resources){
+                projectUserResources.add((ProjectUserResource)r);
+            }
+        }
+        return projectUserResources;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectUserResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectUserResource.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectUserResource.java
new file mode 100644
index 0000000..cdfde80
--- /dev/null
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/ProjectUserResource.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.airavata.persistance.registry.jpa.resources;
+
+import org.apache.airavata.persistance.registry.jpa.Resource;
+import org.apache.airavata.persistance.registry.jpa.ResourceType;
+import org.apache.airavata.persistance.registry.jpa.ResourceUtils;
+import org.apache.airavata.persistance.registry.jpa.model.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.EntityManager;
+import java.util.List;
+
+public class ProjectUserResource extends AbstractResource {
+    private String projectName;
+    private String userName;
+
+    private static final Logger logger = LoggerFactory.getLogger(ProjectUserResource.class);
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    @Override
+    public Resource create(ResourceType type) {
+        logger.error("Unsupported resource type for project resource data resource.", new UnsupportedOperationException());
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void remove(ResourceType type, Object name) {
+        logger.error("Unsupported resource type for project resource data resource.", new UnsupportedOperationException());
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Resource get(ResourceType type, Object name) {
+        logger.error("Unsupported resource type for project resource data resource.", new UnsupportedOperationException());
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<Resource> get(ResourceType type) {
+        logger.error("Unsupported resource type for project resource data resource.", new UnsupportedOperationException());
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void save() {
+        EntityManager em = ResourceUtils.getEntityManager();
+        ProjectUser existingPrUser = em.find(ProjectUser.class, new ProjectUser_PK(projectName, userName));
+        em.close();
+
+        em = ResourceUtils.getEntityManager();
+        em.getTransaction().begin();
+        ProjectUser prUser = new ProjectUser();
+        prUser.setProjectName(projectName);
+        prUser.setUserName(userName);
+        Users user = em.find(Users.class, userName);
+        prUser.setUser(user);
+        Project project = em.find(Project.class, projectName);
+        prUser.setProject(project);
+
+        if(existingPrUser != null){
+            existingPrUser.setProjectName(projectName);
+            existingPrUser.setUserName(userName);
+            existingPrUser.setUser(user);
+            existingPrUser.setProject(project);
+            prUser = em.merge(existingPrUser);
+        }else {
+            em.persist(prUser);
+        }
+
+        em.getTransaction().commit();
+        em.close();
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/Utils.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/Utils.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/Utils.java
index ec1c4dd..b9144be 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/Utils.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/resources/Utils.java
@@ -212,6 +212,13 @@ public class Utils {
                     logger.error("Object should be a Project.", new IllegalArgumentException());
                     throw new IllegalArgumentException("Object should be a Project.");
                 }
+            case PROJECT_USER:
+                if (o instanceof  ProjectUser){
+                    return createProjectUser((ProjectUser)o);
+                }else {
+                    logger.error("Object should be a ProjectUser.", new IllegalArgumentException());
+                    throw new IllegalArgumentException("Object should be a ProjectUser.");
+                }
             case CONFIGURATION:
                 if(o instanceof Configuration){
                     return createConfiguration((Configuration) o);
@@ -427,11 +434,22 @@ public class Utils {
             gateway_worker.setUser(o.getUsers());
             WorkerResource workerResource = (WorkerResource) createGatewayWorker(gateway_worker);
             projectResource.setWorker(workerResource);
+            projectResource.setDescription(o.getDescription());
+            projectResource.setCreationTime(o.getCreationTime());
         }
 
         return projectResource;
     }
 
+    private static Resource createProjectUser(ProjectUser o) {
+        ProjectUserResource projectUserResource = new ProjectUserResource();
+        if (o != null){
+            projectUserResource.setUserName(o.getUser().getUser_name());
+            projectUserResource.setProjectName(o.getProjectName());
+        }
+        return projectUserResource;
+    }
+
     /**
      *
      * @param o configuration model object

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/utils/ThriftDataModelConversion.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/utils/ThriftDataModelConversion.java b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/utils/ThriftDataModelConversion.java
index 2f1a97a..0b7d923 100644
--- a/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/utils/ThriftDataModelConversion.java
+++ b/modules/registry/airavata-jpa-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/utils/ThriftDataModelConversion.java
@@ -21,6 +21,7 @@
 
 package org.apache.airavata.persistance.registry.jpa.utils;
 
+import org.apache.airavata.model.workspace.Project;
 import org.apache.airavata.model.workspace.experiment.*;
 import org.apache.airavata.persistance.registry.jpa.ResourceType;
 import org.apache.airavata.persistance.registry.jpa.resources.*;
@@ -33,6 +34,27 @@ import java.util.List;
 public class ThriftDataModelConversion {
     private final static Logger logger = LoggerFactory.getLogger(ThriftDataModelConversion.class);
 
+    public static Project getProject (ProjectResource pr){
+        Project project = new Project();
+        if (pr != null) {
+            project.setProjectID(pr.getName());
+            project.setName(pr.getName());
+            project.setCreationTime(pr.getCreationTime().getTime());
+            project.setDescription(pr.getDescription());
+            project.setOwner(pr.getWorker().getUser());
+            List<ProjectUserResource> projectUserList = pr.getProjectUserList();
+            List<String> sharedUsers = new ArrayList<String>();
+            if (projectUserList != null && !projectUserList.isEmpty()){
+                for (ProjectUserResource resource : projectUserList){
+                    sharedUsers.add(resource.getUserName());
+                }
+            }
+            project.setSharedGroups(sharedUsers);
+        }
+        return project;
+    }
+
+
     public static Experiment getExperiment(ExperimentResource experimentResource){
         Experiment experiment = new Experiment();
         if (experimentResource != null){

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/resources/META-INF/persistence.xml b/modules/registry/airavata-jpa-registry/src/main/resources/META-INF/persistence.xml
index b51300b..39eea77 100644
--- a/modules/registry/airavata-jpa-registry/src/main/resources/META-INF/persistence.xml
+++ b/modules/registry/airavata-jpa-registry/src/main/resources/META-INF/persistence.xml
@@ -28,6 +28,7 @@
         <class>org.apache.airavata.persistance.registry.jpa.model.Users</class>
         <class>org.apache.airavata.persistance.registry.jpa.model.Gateway_Worker</class>
         <class>org.apache.airavata.persistance.registry.jpa.model.Project</class>
+        <class>org.apache.airavata.persistance.registry.jpa.model.ProjectUser</class>
         <class>org.apache.airavata.persistance.registry.jpa.model.Published_Workflow</class>
         <class>org.apache.airavata.persistance.registry.jpa.model.User_Workflow</class>
         <class>org.apache.airavata.persistance.registry.jpa.model.Host_Descriptor</class>

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/resources/registry-derby.sql
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/resources/registry-derby.sql b/modules/registry/airavata-jpa-registry/src/main/resources/registry-derby.sql
index b794ba0..245ae19 100644
--- a/modules/registry/airavata-jpa-registry/src/main/resources/registry-derby.sql
+++ b/modules/registry/airavata-jpa-registry/src/main/resources/registry-derby.sql
@@ -57,11 +57,22 @@ CREATE TABLE PROJECT
          GATEWAY_NAME VARCHAR(255),
          USER_NAME VARCHAR(255),
          PROJECT_NAME VARCHAR(255),
+         DESCRIPTION VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (PROJECT_NAME),
          FOREIGN KEY (GATEWAY_NAME) REFERENCES GATEWAY(GATEWAY_NAME) ON DELETE CASCADE,
          FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
 );
 
+CREATE TABLE PROJECT_USER
+(
+    PROJECT_NAME VARCHAR(255),
+    USER_NAME VARCHAR(255),
+    PRIMARY KEY (PROJECT_NAME,USER_NAME),
+    FOREIGN KEY (PROJECT_NAME) REFERENCES PROJECT(PROJECT_NAME) ON DELETE CASCADE,
+    FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
 CREATE TABLE PUBLISHED_WORKFLOW
 (
          GATEWAY_NAME VARCHAR(255),
@@ -131,7 +142,7 @@ CREATE TABLE EXPERIMENT
         EXECUTION_USER VARCHAR(255),
         PROJECT_NAME VARCHAR(255),
         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        EXPERIMENT_NAME VARCHAR(255),
+        EXPERIMENT_NAME VARCHAR(255) NOT NULL,
         EXPERIMENT_DESCRIPTION VARCHAR(255),
         APPLICATION_ID VARCHAR(255),
         APPLICATION_VERSION VARCHAR(255),

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/main/resources/registry-mysql.sql
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/main/resources/registry-mysql.sql b/modules/registry/airavata-jpa-registry/src/main/resources/registry-mysql.sql
index 21fb8ec..020dfd5 100644
--- a/modules/registry/airavata-jpa-registry/src/main/resources/registry-mysql.sql
+++ b/modules/registry/airavata-jpa-registry/src/main/resources/registry-mysql.sql
@@ -57,11 +57,22 @@ CREATE TABLE PROJECT
          GATEWAY_NAME VARCHAR(255),
          USER_NAME VARCHAR(255),
          PROJECT_NAME VARCHAR(255),
+         DESCRIPTION VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT NOW(),
          PRIMARY KEY (PROJECT_NAME),
          FOREIGN KEY (GATEWAY_NAME) REFERENCES GATEWAY(GATEWAY_NAME) ON DELETE CASCADE,
          FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
 );
 
+CREATE TABLE PROJECT_USER
+(
+    PROJECT_NAME VARCHAR(255),
+    USER_NAME VARCHAR(255),
+    PRIMARY KEY (PROJECT_NAME,USER_NAME),
+    FOREIGN KEY (PROJECT_NAME) REFERENCES PROJECT(PROJECT_NAME) ON DELETE CASCADE,
+    FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
 CREATE TABLE PUBLISHED_WORKFLOW
 (
          GATEWAY_NAME VARCHAR(255),
@@ -131,7 +142,7 @@ CREATE TABLE EXPERIMENT
         EXECUTION_USER VARCHAR(255),
         PROJECT_NAME VARCHAR(255),
         CREATION_TIME TIMESTAMP DEFAULT NOW(),
-        EXPERIMENT_NAME VARCHAR(255),
+        EXPERIMENT_NAME VARCHAR(255) NOT NULL,
         EXPERIMENT_DESCRIPTION VARCHAR(255),
         APPLICATION_ID VARCHAR(255),
         APPLICATION_VERSION VARCHAR(255),

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/airavata-jpa-registry/src/test/resources/registry-derby.sql
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-jpa-registry/src/test/resources/registry-derby.sql b/modules/registry/airavata-jpa-registry/src/test/resources/registry-derby.sql
index b794ba0..245ae19 100644
--- a/modules/registry/airavata-jpa-registry/src/test/resources/registry-derby.sql
+++ b/modules/registry/airavata-jpa-registry/src/test/resources/registry-derby.sql
@@ -57,11 +57,22 @@ CREATE TABLE PROJECT
          GATEWAY_NAME VARCHAR(255),
          USER_NAME VARCHAR(255),
          PROJECT_NAME VARCHAR(255),
+         DESCRIPTION VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY (PROJECT_NAME),
          FOREIGN KEY (GATEWAY_NAME) REFERENCES GATEWAY(GATEWAY_NAME) ON DELETE CASCADE,
          FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
 );
 
+CREATE TABLE PROJECT_USER
+(
+    PROJECT_NAME VARCHAR(255),
+    USER_NAME VARCHAR(255),
+    PRIMARY KEY (PROJECT_NAME,USER_NAME),
+    FOREIGN KEY (PROJECT_NAME) REFERENCES PROJECT(PROJECT_NAME) ON DELETE CASCADE,
+    FOREIGN KEY (USER_NAME) REFERENCES USERS(USER_NAME) ON DELETE CASCADE
+);
+
 CREATE TABLE PUBLISHED_WORKFLOW
 (
          GATEWAY_NAME VARCHAR(255),
@@ -131,7 +142,7 @@ CREATE TABLE EXPERIMENT
         EXECUTION_USER VARCHAR(255),
         PROJECT_NAME VARCHAR(255),
         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-        EXPERIMENT_NAME VARCHAR(255),
+        EXPERIMENT_NAME VARCHAR(255) NOT NULL,
         EXPERIMENT_DESCRIPTION VARCHAR(255),
         APPLICATION_ID VARCHAR(255),
         APPLICATION_VERSION VARCHAR(255),

http://git-wip-us.apache.org/repos/asf/airavata/blob/44ec4d31/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/utils/Constants.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/utils/Constants.java b/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/utils/Constants.java
index f2579b2..6aa38a9 100644
--- a/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/utils/Constants.java
+++ b/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/utils/Constants.java
@@ -23,6 +23,11 @@ package org.apache.airavata.registry.cpi.utils;
 
 public class Constants {
     public final class FieldConstants {
+        public final class ProjectConstants {
+            public static final String PROJECT_ID = "projectID";
+            public static final String OWNER = "owner";
+        }
+
         public final class ExperimentConstants {
             public static final String EXPERIMENT_NAME = "experimentName";
             public static final String USER_NAME = "userName";