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 2015/06/07 19:01:05 UTC

[24/44] airavata git commit: Mongo Registry WIP

Mongo Registry WIP


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

Branch: refs/heads/mongo-registry
Commit: 945161ea138dc9576f8f2bc6ce7452cc386821b0
Parents: 847f2d9
Author: Supun Nakandala <sc...@apache.org>
Authored: Wed May 27 23:15:35 2015 +0530
Committer: Supun Nakandala <sc...@apache.org>
Committed: Wed May 27 23:15:35 2015 +0530

----------------------------------------------------------------------
 .../registry/jpa/impl/ExperimentRegistry.java   | 230 ++++---------------
 .../registry/jpa/impl/ProjectRegistry.java      | 148 +++---------
 .../persistance/registry/jpa/mongo/Test.java    |   2 -
 .../registry/jpa/mongo/dao/ExperimentDao.java   |  76 ++++--
 .../registry/jpa/mongo/dao/ProjectDao.java      | 189 +++++++++++++++
 .../registry/mongo/ExperimentDaoTest.java       |  30 ++-
 6 files changed, 338 insertions(+), 337 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/945161ea/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
index e7791fa..e6f7c4c 100644
--- a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
+++ b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ExperimentRegistry.java
@@ -23,7 +23,6 @@ package org.apache.airavata.persistance.registry.jpa.impl;
 
 import org.apache.airavata.common.logger.AiravataLogger;
 import org.apache.airavata.common.logger.AiravataLoggerFactory;
-import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType;
 import org.apache.airavata.model.workspace.experiment.*;
 import org.apache.airavata.persistance.registry.jpa.ResourceType;
@@ -37,7 +36,6 @@ import org.apache.airavata.registry.cpi.RegistryModelType;
 import org.apache.airavata.registry.cpi.ResultOrderType;
 import org.apache.airavata.registry.cpi.utils.Constants;
 
-import java.sql.Timestamp;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -253,7 +251,7 @@ public class ExperimentRegistry {
         try {
             TaskDetails taskDetails = experimentDao.getTaskDetail((String) ids.getTopLevelIdentifier());
             for (JobDetails jobDetails : taskDetails.getJobDetailsList()) {
-                if (jobDetails.getJobId().equals((String) ids.getSecondLevelIdentifier())) {
+                if (jobDetails.getJobId().equals(ids.getSecondLevelIdentifier())) {
                     jobDetails.setApplicationStatus(status);
                     experimentDao.updateTaskDetail(taskDetails);
                     return;
@@ -512,94 +510,26 @@ public class ExperimentRegistry {
         }
     }
 
-    //Todo
     public String addErrorDetails(ErrorDetails error, Object id) throws RegistryException {
         try {
-            ErrorDetailResource errorResource = null;
-            ExperimentResource experiment;
-            TaskDetailResource taskDetail;
-            WorkflowNodeDetailResource workflowNode;
-            // figure out the id is an experiment, node task or job
-            if (id instanceof String) {
-                // FIXME : for .12 we only saveExperiment task related errors
-//                if (isExperimentExist((String) id)) {
-//                    experiment = gatewayResource.getExperiment((String) id);
-//                    errorResource = (ErrorDetailResource) experiment.create(ResourceType.ERROR_DETAIL);
-//                } else if (isWFNodeExist((String) id)) {
-//                    experiment = (ExperimentResource) gatewayResource.create(ResourceType.EXPERIMENT);
-//                    workflowNode = experiment.getWorkflowNode((String) id);
-//                    errorResource = (ErrorDetailResource) workflowNode.create(ResourceType.ERROR_DETAIL);
-//                    errorResource.setExperimentResource(workflowNode.getExperimentResource());
-//                } else
-                if (isTaskDetailExist((String) id)) {
-                    experiment = (ExperimentResource) gatewayResource.create(ResourceType.EXPERIMENT);
-                    workflowNode = (WorkflowNodeDetailResource) experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
-                    taskDetail = workflowNode.getTaskDetail((String) id);
-                    errorResource = (ErrorDetailResource) taskDetail.create(ResourceType.ERROR_DETAIL);
-                    if (error.getErrorId() != null && !error.getErrorId().equals(experimentModelConstants.DEFAULT_ID)) {
-                        List<ErrorDetailResource> errorDetailList = taskDetail.getErrorDetailList();
-                        if (errorDetailList != null && !errorDetailList.isEmpty()) {
-                            for (ErrorDetailResource errorDetailResource : errorDetailList) {
-                                if (errorDetailResource.getErrorId() == Integer.parseInt(error.getErrorId())) {
-                                    errorResource = errorDetailResource;
-                                }
-                            }
-                        }
-                    }
-                    errorResource.setTaskDetailResource(taskDetail);
-                    errorResource.setNodeDetail(taskDetail.getWorkflowNodeDetailResource());
-                    errorResource.setExperimentResource(taskDetail.getWorkflowNodeDetailResource().getExperimentResource());
-                } else {
-//                    logger.error("The id provided is not an experiment id or a workflow id or a task id..");
-                }
+            // FIXME : for .12 we only saveExperiment task related errors
+            if(id instanceof String){
+                TaskDetails taskDetails = experimentDao.getTaskDetail((String) id);
+                taskDetails.getErrors().add(error);
+                experimentDao.updateTaskDetail(taskDetails);
+                return (String) id;
             } else if (id instanceof CompositeIdentifier) {
                 CompositeIdentifier cid = (CompositeIdentifier) id;
-                if (isJobDetailExist(cid)) {
-                    experiment = (ExperimentResource) gatewayResource.create(ResourceType.EXPERIMENT);
-                    workflowNode = (WorkflowNodeDetailResource) experiment.create(ResourceType.WORKFLOW_NODE_DETAIL);
-                    taskDetail = workflowNode.getTaskDetail((String) cid.getTopLevelIdentifier());
-                    JobDetailResource jobDetail = taskDetail.getJobDetail((String) cid.getSecondLevelIdentifier());
-                    errorResource = (ErrorDetailResource) jobDetail.create(ResourceType.ERROR_DETAIL);
-                    if (error.getErrorId() != null && !error.getErrorId().equals(experimentModelConstants.DEFAULT_ID)) {
-                        List<ErrorDetailResource> errorDetailList = taskDetail.getErrorDetailList();
-                        if (errorDetailList != null && !errorDetailList.isEmpty()) {
-                            for (ErrorDetailResource errorDetailResource : errorDetailList) {
-                                if (errorDetailResource.getErrorId() == Integer.parseInt(error.getErrorId())) {
-                                    errorResource = errorDetailResource;
-                                }
-                            }
-                        }
+                TaskDetails taskDetails = experimentDao.getTaskDetail((String) cid.getTopLevelIdentifier());
+                for(JobDetails jobDetails: taskDetails.getJobDetailsList()){
+                    if(jobDetails.getJobId().equals(cid.getSecondLevelIdentifier())){
+                        jobDetails.getErrors().add(error);
+                        experimentDao.updateTaskDetail(taskDetails);
+                        return (String) cid.getSecondLevelIdentifier();
                     }
-                    errorResource.setTaskDetailResource(taskDetail);
-                    errorResource.setNodeDetail(taskDetail.getWorkflowNodeDetailResource());
-                    errorResource.setExperimentResource(taskDetail.getWorkflowNodeDetailResource().getExperimentResource());
-                } else {
-                    logger.error("The id provided is not a job in the system..");
                 }
             } else {
-//                logger.error("The id provided is not an experiment id or a workflow id or a task id or a composite " +
-//                        "identifier for job..");
-            }
-            if (errorResource != null) {
-                errorResource.setCreationTime(AiravataUtils.getTime(error.getCreationTime()));
-                errorResource.setActualErrorMsg(error.getActualErrorMessage());
-                errorResource.setUserFriendlyErrorMsg(error.getUserFriendlyMessage());
-                if (error.getErrorCategory() != null) {
-                    errorResource.setErrorCategory(error.getErrorCategory().toString());
-                }
-                errorResource.setTransientPersistent(error.isTransientOrPersistent());
-                if (error.getCorrectiveAction() != null) {
-                    errorResource.setCorrectiveAction(error.getCorrectiveAction().toString());
-                } else {
-                    errorResource.setCorrectiveAction(CorrectiveAction.CONTACT_SUPPORT.toString());
-                }
-                if (error.getActionableGroup() != null) {
-                    errorResource.setActionableGroup(error.getActionableGroup().toString());
-                } else {
-                    errorResource.setActionableGroup(ActionableGroup.GATEWAYS_ADMINS.toString());
-                }
-                errorResource.save();
-                return String.valueOf(errorResource.getErrorId());
+                logger.error("Unsupported data type...");
             }
         } catch (Exception e) {
             logger.error("Unable to add error details...", e);
@@ -729,7 +659,6 @@ public class ExperimentRegistry {
         }
     }
 
-    //Todo
     /**
      * Method to getExperiment matching experiment list
      *
@@ -739,58 +668,9 @@ public class ExperimentRegistry {
      * @throws RegistryException
      */
     public List<Experiment> getExperimentList(String fieldName, Object value) throws RegistryException {
-        List<Experiment> experiments = new ArrayList();
-        try {
-            if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) {
-                WorkerResource resource = (WorkerResource) gatewayResource.create(ResourceType.GATEWAY_WORKER);
-                resource.setUser((String) value);
-                List<ExperimentResource> resources = resource.getExperiments();
-                for (ExperimentResource experimentResource : resources) {
-                    Experiment experiment = ThriftDataModelConversion.getExperiment(experimentResource);
-                    experiments.add(experiment);
-                }
-                return experiments;
-            } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) {
-                ProjectResource project = workerResource.getProject((String) value);
-                List<ExperimentResource> resources = project.getExperiments();
-                for (ExperimentResource resource : resources) {
-                    Experiment experiment = ThriftDataModelConversion.getExperiment(resource);
-                    experiments.add(experiment);
-                }
-                return experiments;
-            } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY)) {
-                List<ExperimentResource> resources = gatewayResource.getExperiments();
-                for (ExperimentResource resource : resources) {
-                    Experiment experiment = ThriftDataModelConversion.getExperiment(resource);
-                    experiments.add(experiment);
-                }
-                return experiments;
-            }
-            if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.WORKFLOW_NODE_LIST)) {
-                if (value instanceof List<?>) {
-                    return getExperimentList(fieldName, ((List<?>) value).get(0));
-                } else if (value instanceof WorkflowNodeDetails) {
-                    //WorkflowNodeDetailResource nodeDetailResource = getWorkflowNodeDetailResource(((WorkflowNodeDetails) value).getNodeInstanceId());
-//                    if (nodeDetailResource != null) {
-//                        return Arrays.asList(new Experiment[]{ThriftDataModelConversion
-//                                .getExperiment(nodeDetailResource
-//                                        .getExperimentResource())});
-//                    }
-                } else {
-                    logger.error("Unsupported field value to retrieve workflow node detail list...");
-                }
-
-            } else {
-                logger.error("Unsupported field name to retrieve experiment list...");
-            }
-        } catch (Exception e) {
-            logger.error("Error while getting experiment list...", e);
-            throw new RegistryException(e);
-        }
-        return experiments;
+        return getExperimentList(fieldName, value, -1, -1, null, null);
     }
 
-    //Todo
     /**
      * Method to getExperiment matching experiment list with pagination and ordering
      *
@@ -806,28 +686,32 @@ public class ExperimentRegistry {
     public List<Experiment> getExperimentList(String fieldName, Object value, int limit, int offset,
                                               Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException {
         List<Experiment> experiments = new ArrayList();
+        Map<String, String> filters = new HashMap();
         try {
             if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) {
-                WorkerResource resource = (WorkerResource) gatewayResource.create(ResourceType.GATEWAY_WORKER);
-                resource.setUser((String) value);
-                List<ExperimentResource> resources = resource.getExperiments(limit, offset,
-                        orderByIdentifier, resultOrderType);
-                for (ExperimentResource experimentResource : resources) {
-                    Experiment experiment = ThriftDataModelConversion.getExperiment(experimentResource);
-                    experiments.add(experiment);
-                }
-                return experiments;
+                filters.put(fieldName, (String)value);
+                return experimentDao.searchExperiments(filters, limit, offset, orderByIdentifier, resultOrderType);
             } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) {
-                ProjectResource project = workerResource.getProject((String) value);
-                List<ExperimentResource> resources = project.getExperiments(limit, offset,
-                        Constants.FieldConstants.ExperimentConstants.CREATION_TIME, ResultOrderType.DESC);
-                for (ExperimentResource resource : resources) {
-                    Experiment experiment = ThriftDataModelConversion.getExperiment(resource);
-                    experiments.add(experiment);
+                filters.put(fieldName, (String)value);
+                return experimentDao.searchExperiments(filters, limit, offset, orderByIdentifier, resultOrderType);
+            } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY)) {
+                filters.put(fieldName, (String)value);
+                return experimentDao.searchExperiments(filters, limit, offset, orderByIdentifier, resultOrderType);
+            } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.WORKFLOW_NODE_LIST)) {
+                if (value instanceof List<?>) {
+                    return getExperimentList(fieldName, ((List<?>) value).get(0));
+                } else if (value instanceof WorkflowNodeDetails) {
+                    List<Experiment> experimentList = new ArrayList();
+                    experimentList.add(experimentDao.getParentExperimentOfWFNode(
+                            ((WorkflowNodeDetails)value).getNodeInstanceId())
+                    );
+                } else {
+                    logger.error("Unsupported field value to retrieve workflow node detail list...");
                 }
-                return experiments;
+
+            } else {
+                logger.error("Unsupported field name to retrieve experiment list...");
             }
-            logger.error("Unsupported field name to retrieve experiment list...");
         } catch (Exception e) {
             logger.error("Error while getting experiment list...", e);
             throw new RegistryException(e);
@@ -846,13 +730,9 @@ public class ExperimentRegistry {
                 if (value instanceof List<?>) {
                     return getWFNodeDetails(fieldName, ((List<?>) value).get(0));
                 } else if (value instanceof TaskDetails) {
-                    //Fixme
-//                    TaskDetailResource taskDetailResource = getTaskDetailResource(((TaskDetails) value).getTaskId());
-//                    if (taskDetailResource != null) {
-//                        return Arrays.asList(new WorkflowNodeDetails[]{ThriftDataModelConversion
-//                                .getWorkflowNodeDetails(taskDetailResource
-//                                        .getWorkflowNodeDetailResource())});
-//                    }
+                    List<WorkflowNodeDetails> workflowNodeDetailsList = new ArrayList();
+                    workflowNodeDetailsList.add(experimentDao.getParentWFNodeOfTask(((TaskDetails)value).getTaskId()));
+                    return workflowNodeDetailsList;
                 } else {
                     logger.error("Unsupported field value to retrieve workflow node detail list...");
                 }
@@ -1269,27 +1149,14 @@ public class ExperimentRegistry {
         }
     }
 
-    //Todo
     public List<String> getExperimentIds(String fieldName, Object value) throws RegistryException {
         List<String> expIDs = new ArrayList();
         try {
-            if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY)) {
-                if (gatewayResource == null) {
-                    logger.error("You should use an existing gateway in order to retrieve experiments..");
-                    return null;
-                } else {
-                    List<ExperimentResource> resources = gatewayResource.getExperiments();
-                    for (ExperimentResource resource : resources) {
-                        String expID = resource.getExpID();
-                        expIDs.add(expID);
-                    }
-                }
-            } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) {
-                List<ExperimentResource> resources = workerResource.getExperiments();
-                expIDs.addAll(resources.stream().map(ExperimentResource::getExpID).collect(Collectors.toList()));
-            } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) {
-                List<ExperimentResource> resources = workerResource.getExperiments();
-                expIDs.addAll(resources.stream().map(ExperimentResource::getExpID).collect(Collectors.toList()));
+            if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY)
+                        || fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)
+                        || fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) {
+                getExperimentList(fieldName, value).stream().forEach(ex->expIDs.add(ex.getExperimentId()));
+                return expIDs;
             }
         } catch (Exception e) {
             logger.error("Error while retrieving experiment ids..", e);
@@ -1326,7 +1193,6 @@ public class ExperimentRegistry {
         return transferIds;
     }
 
-
     public void removeExperiment(String experimentId) throws RegistryException {
         try {
             Experiment experiment = new Experiment();
@@ -1721,10 +1587,14 @@ public class ExperimentRegistry {
         experimentList.stream().forEach(experiment->{
             ExperimentSummary expSummary = new ExperimentSummary();
             expSummary.setExperimentId(experiment.getExperimentId());
+            expSummary.setProjectId(experiment.getProjectId());
             expSummary.setName(experiment.getName());
             expSummary.setDescription(experiment.getDescription());
+            expSummary.setUserName(experiment.getUserName());
             expSummary.setCreationTime(experiment.getCreationTime());
-            //Todo
+            expSummary.setApplicationId(experiment.getApplicationId());
+            expSummary.setExperimentStatus(experiment.getExperimentStatus());
+            expSummary.setErrors(experiment.getErrors());
             experimentSummaries.add(expSummary);
         });
         return experimentSummaries;
@@ -1770,4 +1640,4 @@ public class ExperimentRegistry {
                 return false;
         }
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/945161ea/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
index 928fe64..620c535 100644
--- a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
+++ b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/impl/ProjectRegistry.java
@@ -21,12 +21,13 @@
 
 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.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.persistance.registry.jpa.mongo.dao.ProjectDao;
+import org.apache.airavata.persistance.registry.jpa.resources.GatewayResource;
+import org.apache.airavata.persistance.registry.jpa.resources.UserResource;
+import org.apache.airavata.persistance.registry.jpa.resources.WorkerResource;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.apache.airavata.registry.cpi.ResultOrderType;
 import org.apache.airavata.registry.cpi.utils.Constants;
@@ -40,7 +41,11 @@ public class ProjectRegistry {
     private WorkerResource workerResource;
     private final static Logger logger = LoggerFactory.getLogger(ProjectRegistry.class);
 
+    private ProjectDao projectDao;
+
     public ProjectRegistry(GatewayResource gatewayResource, UserResource user) throws RegistryException {
+        this.projectDao = new ProjectDao();
+
         if (!ResourceUtils.isGatewayExist(gatewayResource.getGatewayId())){
             this.gatewayResource = gatewayResource;
         }else {
@@ -55,50 +60,17 @@ public class ProjectRegistry {
     }
 
     public String addProject (Project project, String gatewayId) throws RegistryException{
-        String projectId;
         try {
             if (!ResourceUtils.isUserExist(project.getOwner())){
                 ResourceUtils.addUser(project.getOwner(), null);
             }
-            ProjectResource projectResource = new ProjectResource();
-            projectId = getProjectId(project.getName());
-            projectResource.setId(projectId);
-            project.setProjectId(projectId);
-            projectResource.setName(project.getName());
-            projectResource.setDescription(project.getDescription());
-            projectResource.setCreationTime(AiravataUtils.getTime(project.getCreationTime()));
-            GatewayResource gateway = (GatewayResource)ResourceUtils.getGateway(gatewayId);
-            projectResource.setGateway(gateway);
-            WorkerResource worker = new WorkerResource(project.getOwner(), workerResource.getGateway());
-            projectResource.setWorker(worker);
-            projectResource.save();
-            ProjectUserResource resource = (ProjectUserResource)projectResource.create(
-                    ResourceType.PROJECT_USER);
-            resource.setProjectId(project.getProjectId());
-            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)projectResource.
-                            create(ResourceType.PROJECT_USER);
-                    pr.setUserName(username);
-                    pr.save();
-                }
-            }
+            project.setProjectId(getProjectId(project.getName()));
+            projectDao.createProject(project);
+            return project.getProjectId();
         }catch (Exception e){
             logger.error("Error while saving project to registry", e);
            throw new RegistryException(e);
         }
-        return projectId;
     }
 
     private String getProjectId (String projectName){
@@ -108,11 +80,6 @@ public class ProjectRegistry {
 
     public void updateProject (Project project, String projectId) throws RegistryException{
         try {
-            ProjectResource existingProject = workerResource.getProject(projectId);
-            existingProject.setDescription(project.getDescription());
-            existingProject.setName(project.getName());
-            existingProject.setCreationTime(AiravataUtils.getTime(project.getCreationTime()));
-//            existingProject.setGateway(gatewayResource);
             UserResource user = (UserResource)ResourceUtils.getUser(project.getOwner());
             if (!gatewayResource.isExists(ResourceType.GATEWAY_WORKER, user.getUserName())){
                 workerResource = ResourceUtils.addGatewayWorker(gatewayResource, user);
@@ -120,31 +87,7 @@ public class ProjectRegistry {
                 workerResource = (WorkerResource)ResourceUtils.getWorker(
                         gatewayResource.getGatewayName(), user.getUserName());
             }
-            WorkerResource worker = new WorkerResource(project.getOwner(), gatewayResource);
-            existingProject.setWorker(worker);
-            existingProject.save();
-            ProjectUserResource resource = (ProjectUserResource)existingProject.create(
-                    ResourceType.PROJECT_USER);
-            resource.setProjectId(projectId);
-            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();
-                }
-            }
+            projectDao.updateProject(project);
         }catch (Exception e){
             logger.error("Error while saving project to registry", e);
            throw new RegistryException(e);
@@ -153,15 +96,11 @@ public class ProjectRegistry {
 
     public Project getProject (String projectId) throws RegistryException{
         try {
-            ProjectResource project = workerResource.getProject(projectId);
-            if (project != null){
-                return ThriftDataModelConversion.getProject(project);
-            }
+            return projectDao.getProject(projectId);
         }catch (Exception e){
             logger.error("Error while retrieving project from registry", e);
            throw new RegistryException(e);
         }
-        return null;
     }
 
     /**
@@ -188,23 +127,14 @@ public class ProjectRegistry {
      */
     public List<Project> getProjectList (String fieldName, Object value, int limit, int offset,
                                          Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException{
-        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;
-            }
+                Map<String, String> filters = new HashMap();
+                filters.put(fieldName, (String)value);
+                return  projectDao.searchProjects(filters, limit, offset, orderByIdentifier, resultOrderType);
         }catch (Exception e){
             logger.error("Error while retrieving project from registry", e);
             throw new RegistryException(e);
         }
-        return projects;
     }
 
     /**
@@ -233,48 +163,23 @@ public class ProjectRegistry {
      */
     public List<Project> searchProjects(Map<String, String> filters, int limit,
             int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException {
-        Map<String, String> fil = new HashMap<String, String>();
-        if (filters != null && filters.size() != 0){
-            List<Project> projects = new ArrayList<Project>();
-            try {
-                for (String field : filters.keySet()){
-                    if (field.equals(Constants.FieldConstants.ProjectConstants.PROJECT_NAME)){
-                        fil.put(AbstractResource.ProjectConstants.PROJECT_NAME, filters.get(field));
-                    }else if (field.equals(Constants.FieldConstants.ProjectConstants.OWNER)){
-                        fil.put(AbstractResource.ProjectConstants.USERNAME, filters.get(field));
-                    }else if (field.equals(Constants.FieldConstants.ProjectConstants.DESCRIPTION)){
-                        fil.put(AbstractResource.ProjectConstants.DESCRIPTION, filters.get(field));
-                    }else if (field.equals(Constants.FieldConstants.ProjectConstants.GATEWAY_ID)){
-                        fil.put(AbstractResource.ProjectConstants.GATEWAY_ID, filters.get(field));
-                    }
-                }
-                List<ProjectResource> projectResources = workerResource
-                        .searchProjects(fil, limit, offset, orderByIdentifier, resultOrderType);
-                if (projectResources != null && !projectResources.isEmpty()){
-                    for (ProjectResource pr : projectResources){
-                        projects.add(ThriftDataModelConversion.getProject(pr));
-                    }
-                }
-                return projects;
+          try {
+                return  projectDao.searchProjects(filters, limit, offset, orderByIdentifier, resultOrderType);
             }catch (Exception e){
                 logger.error("Error while retrieving project from registry", e);
                 throw new RegistryException(e);
             }
-        }
-        return null;
+
     }
 
     public List<String> getProjectIds (String fieldName, Object value) throws RegistryException{
         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());
-                    }
-                }
+                Map<String, String> filters = new HashMap();
+                filters.put(fieldName, (String)value);
+                projectDao.searchProjects(filters, -1, -1, null, null).stream()
+                .forEach(pr->projectIds.add(pr.getProjectId()));
                 return projectIds;
             }
         }catch (Exception e){
@@ -286,7 +191,9 @@ public class ProjectRegistry {
 
     public void removeProject (String projectId) throws RegistryException {
         try {
-            workerResource.removeProject(projectId);
+            Project project = new Project();
+            project.setProjectId(projectId);
+            projectDao.deleteProject(project);
         } catch (Exception e) {
             logger.error("Error while removing the project..", e);
            throw new RegistryException(e);
@@ -295,11 +202,10 @@ public class ProjectRegistry {
 
     public boolean isProjectExist(String projectId) throws RegistryException {
         try {
-            return workerResource.isProjectExists(projectId);
+            return projectDao.getProject(projectId) != null;
         } catch (Exception e) {
             logger.error("Error while retrieving project...", e);
            throw new RegistryException(e);
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/945161ea/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/Test.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/Test.java b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/Test.java
index 4f0dcca..4e04940 100644
--- a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/Test.java
+++ b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/Test.java
@@ -20,7 +20,6 @@
 */
 package org.apache.airavata.persistance.registry.jpa.mongo;
 
-import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.workspace.experiment.Experiment;
 import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
 import org.apache.airavata.persistance.registry.jpa.mongo.dao.ExperimentDao;
@@ -40,7 +39,6 @@ public class Test {
     private final static Logger logger = LoggerFactory.getLogger(Test.class);
 
     public static void main(String[] args) throws RegistryException, IOException {
-        AiravataUtils.setExecutionAsServer();
         Registry registry = RegistryFactory.getDefaultRegistry();
 //        String experiemtnId = "SLM-Espresso-Stampede_45667ea8-aae3-4a8e-807d-a16312035c35";
 //        long time1 = System.currentTimeMillis();

http://git-wip-us.apache.org/repos/asf/airavata/blob/945161ea/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ExperimentDao.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ExperimentDao.java b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ExperimentDao.java
index 85375ed..af15716 100644
--- a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ExperimentDao.java
+++ b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ExperimentDao.java
@@ -47,14 +47,15 @@ public class ExperimentDao{
     private ModelConversionHelper modelConversionHelper;
 
     private static final String EXPERIMENT_ID = "experiment_id";
-    private static final String EXPERIMENT_NAME= "experiment_name";
-    private static final String EXPERIMENT_DESCRIPTION = "experiment_description";
+    private static final String EXPERIMENT_NAME= "name";
+    private static final String EXPERIMENT_DESCRIPTION = "description";
     private static final String USER_NAME = "user_name";
     private static final String GATEWAY = "gateway_execution_id";
     private static final String APPLICATION_ID = "application_id";
     private static final String EXPERIMENT_STATUS_STATE = "experiment_status.experiment_state";
     private static final String CREATION_TIME = "creation_time";
 
+    //Todo Nested Indexes - Its good if we can get rid of them
     private static final String WORKFLOW_NODE_ID = "workflow_node_details_list.node_instance_id";
     private static final String TASK_ID = "workflow_node_details_list.task_details_list.task_id";
 
@@ -62,7 +63,7 @@ public class ExperimentDao{
     public ExperimentDao(){
         collection = MongoUtil.getAiravataRegistry().getCollection(EXPERIMENTS_COLLECTION_NAME);
         modelConversionHelper = new ModelConversionHelper();
-        //collection.dropIndexes();
+        collection.dropIndexes();
         initIndexes();
     }
 
@@ -74,11 +75,11 @@ public class ExperimentDao{
         collection.createIndex(new BasicDBObject(WORKFLOW_NODE_ID, 1));
         collection.createIndex(new BasicDBObject(TASK_ID, 1));
 
-        //Defining a full-text index on experiment name and experiment description
-        BasicDBObject object = new BasicDBObject();
-        object.put(EXPERIMENT_NAME, "text");
-        object.put(EXPERIMENT_DESCRIPTION, "text");
-        collection.createIndex (object);
+//        //Defining a full-text index on experiment name and experiment description
+//        BasicDBObject object = new BasicDBObject();
+//        object.put(EXPERIMENT_NAME, "text");
+//        object.put(EXPERIMENT_DESCRIPTION, "text");
+//        collection.createIndex (object);
     }
 
     public List<Experiment> getAllExperiments() throws RegistryException{
@@ -153,15 +154,15 @@ public class ExperimentDao{
         BasicDBObjectBuilder queryBuilder = BasicDBObjectBuilder.start();
         for (String field : filters.keySet()) {
             if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_NAME)) {
-                //Fixme This is expensive operation
-                queryBuilder.add(EXPERIMENT_NAME, "/.*" + filters.get(field) + "/.*");
+                queryBuilder.add(EXPERIMENT_NAME, new BasicDBObject(
+                        "$regex", ".*" + filters.get(field) + ".*"));
             } else if (field.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) {
                 queryBuilder.add(USER_NAME, filters.get(field));
             } else if (field.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY)) {
                 queryBuilder.add(GATEWAY, filters.get(field));
             } else if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_DESC)) {
-                //Fixme This is expensive operation
-                queryBuilder.add(EXPERIMENT_DESCRIPTION, "/.*" + filters.get(field) + "/.*");
+                queryBuilder.add(EXPERIMENT_DESCRIPTION, new BasicDBObject(
+                        "$regex", ".*" + filters.get(field) + ".*"));
             } else if (field.equals(Constants.FieldConstants.ExperimentConstants.APPLICATION_ID)) {
                 queryBuilder.add(APPLICATION_ID, filters.get(field));
             } else if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_STATUS)) {
@@ -218,7 +219,7 @@ public class ExperimentDao{
     }
 
     public void updateWFNode(WorkflowNodeDetails workflowNodeDetail) throws RegistryException{
-        Experiment experiment = getExperimentOfWFNode(workflowNodeDetail.getNodeInstanceId());
+        Experiment experiment = getParentExperimentOfWFNode(workflowNodeDetail.getNodeInstanceId());
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             if(wfnd.getNodeInstanceId().equals(workflowNodeDetail.getNodeInstanceId())){
                 experiment.getWorkflowNodeDetailsList().remove(wfnd);
@@ -230,7 +231,7 @@ public class ExperimentDao{
     }
 
     public void deleteWFNode(WorkflowNodeDetails workflowNodeDetail) throws RegistryException{
-        Experiment experiment = getExperimentOfWFNode(workflowNodeDetail.getNodeInstanceId());
+        Experiment experiment = getParentExperimentOfWFNode(workflowNodeDetail.getNodeInstanceId());
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             if(wfnd.getNodeInstanceId().equals(workflowNodeDetail.getNodeInstanceId())){
                 experiment.getWorkflowNodeDetailsList().remove(wfnd);
@@ -241,7 +242,7 @@ public class ExperimentDao{
     }
 
     public WorkflowNodeDetails getWFNode(String nodeId) throws RegistryException{
-        Experiment experiment = getExperimentOfWFNode(nodeId);
+        Experiment experiment = getParentExperimentOfWFNode(nodeId);
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             if(wfnd.getNodeInstanceId().equals(nodeId)){
                 return wfnd;
@@ -250,9 +251,8 @@ public class ExperimentDao{
         return null;
     }
 
-
     public void createTaskDetail(String nodeId, TaskDetails taskDetail) throws RegistryException{
-        Experiment experiment = getExperimentOfWFNode(nodeId);
+        Experiment experiment = getParentExperimentOfWFNode(nodeId);
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             if(wfnd.getNodeInstanceId().equals(nodeId)){
                 wfnd.getTaskDetailsList().add(taskDetail);
@@ -263,7 +263,7 @@ public class ExperimentDao{
     }
 
     public void updateTaskDetail(TaskDetails taskDetail) throws RegistryException{
-        Experiment experiment = getExperimentOfTask(taskDetail.getTaskId());
+        Experiment experiment = getParentExperimentOfTask(taskDetail.getTaskId());
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             for(TaskDetails taskDetails: wfnd.getTaskDetailsList()){
                 if(taskDetails.getTaskId().equals(taskDetail)){
@@ -277,7 +277,7 @@ public class ExperimentDao{
     }
 
     public void deleteTaskDetail(TaskDetails taskDetail) throws RegistryException{
-        Experiment experiment = getExperimentOfTask(taskDetail.getTaskId());
+        Experiment experiment = getParentExperimentOfTask(taskDetail.getTaskId());
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             for(TaskDetails taskDetails: wfnd.getTaskDetailsList()){
                 if(taskDetails.getTaskId().equals(taskDetail)){
@@ -290,7 +290,7 @@ public class ExperimentDao{
     }
 
     public TaskDetails getTaskDetail(String taskId) throws RegistryException{
-        Experiment experiment = getExperimentOfTask(taskId);
+        Experiment experiment = getParentExperimentOfTask(taskId);
         for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
             for(TaskDetails taskDetails: wfnd.getTaskDetailsList()){
                 if(taskDetails.getTaskId().equals(taskId)){
@@ -303,12 +303,12 @@ public class ExperimentDao{
 
 
     /**
-     * Method to getExperiment the parent Experiment of a given workflow node instance id
+     * Method to get parent Experiment of the given workflow node instance id
      * @param nodeInstanceId
      * @return
      * @throws RegistryException
      */
-    public Experiment getExperimentOfWFNode(String nodeInstanceId) throws RegistryException{
+    public Experiment getParentExperimentOfWFNode(String nodeInstanceId) throws RegistryException{
         try {
             DBObject criteria = new BasicDBObject(WORKFLOW_NODE_ID, nodeInstanceId);
             DBObject doc = collection.findOne(criteria);
@@ -324,12 +324,12 @@ public class ExperimentDao{
     }
 
     /**
-     * Method to getExperiment the parent experiment of a given task id
+     * Method to get the parent experiment of the given task id
      * @param taskId
      * @return
      * @throws RegistryException
      */
-    public Experiment getExperimentOfTask(String taskId) throws RegistryException{
+    public Experiment getParentExperimentOfTask(String taskId) throws RegistryException{
         try {
             DBObject criteria = new BasicDBObject(TASK_ID, taskId);
             DBObject doc = collection.findOne(criteria);
@@ -343,4 +343,32 @@ public class ExperimentDao{
         }
         return null;
     }
+
+    /**
+     * Method to get the parent workflow node of the given task id
+     * @param taskId
+     * @return
+     * @throws RegistryException
+     */
+    public WorkflowNodeDetails getParentWFNodeOfTask(String taskId) throws RegistryException{
+        try {
+            DBObject criteria = new BasicDBObject(TASK_ID, taskId);
+            DBObject doc = collection.findOne(criteria);
+            if(doc != null){
+                String json = doc.toString();
+                Experiment experiment = (Experiment)modelConversionHelper.deserializeObject(
+                        Experiment.class, json);
+                for(WorkflowNodeDetails wfnd: experiment.getWorkflowNodeDetailsList()){
+                    for(TaskDetails taskDetails: wfnd.getTaskDetailsList()){
+                        if(taskDetails.getTaskId().equals(taskId)){
+                            return wfnd;
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            throw new RegistryException(e);
+        }
+        return null;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/945161ea/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ProjectDao.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ProjectDao.java b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ProjectDao.java
new file mode 100644
index 0000000..e3ea7eb
--- /dev/null
+++ b/modules/registry/airavata-mongo-registry/src/main/java/org/apache/airavata/persistance/registry/jpa/mongo/dao/ProjectDao.java
@@ -0,0 +1,189 @@
+/*
+ *
+ * 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.mongo.dao;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.mongodb.*;
+import com.mongodb.util.JSON;
+import org.apache.airavata.model.workspace.Project;
+import org.apache.airavata.persistance.registry.jpa.mongo.conversion.ModelConversionHelper;
+import org.apache.airavata.persistance.registry.jpa.mongo.utils.MongoUtil;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.ResultOrderType;
+import org.apache.airavata.registry.cpi.utils.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class ProjectDao {
+    private final static Logger logger = LoggerFactory.getLogger(ProjectDao.class);
+
+    private static final String PROJECTS_COLLECTION_NAME = "projects";
+    private DBCollection collection;
+    private ModelConversionHelper modelConversionHelper;
+
+    private static final String PROJECT_ID = "project_id";
+    private static final String PROJECT_NAME = "name";
+    private static final String PROJECT_DESCRIPTION = "description";
+    private static final String PROJECT_OWNER = "owner";
+    private static final String PROJECT_CREATION_TIME = "creation_time";
+
+    public ProjectDao(){
+        collection = MongoUtil.getAiravataRegistry().getCollection(PROJECTS_COLLECTION_NAME);
+        modelConversionHelper = new ModelConversionHelper();
+        collection.dropIndexes();
+        initIndexes();
+    }
+
+    /**
+     * If indexes are already defined this will simply ignore them
+     */
+    private void initIndexes(){
+        collection.createIndex(new BasicDBObject(PROJECT_ID, 1), new BasicDBObject("unique", true));
+        collection.createIndex(new BasicDBObject(PROJECT_NAME, 1));
+        collection.createIndex(new BasicDBObject(PROJECT_OWNER, 1));
+        collection.createIndex(new BasicDBObject(PROJECT_DESCRIPTION, 1));
+        collection.createIndex(new BasicDBObject(PROJECT_CREATION_TIME, 1));
+    }
+
+    public List<Project> getAllProjects() throws RegistryException{
+        List<Project> projectList = new ArrayList();
+        DBCursor cursor = collection.find();
+        for(DBObject document: cursor){
+            try {
+                projectList.add((Project) modelConversionHelper.deserializeObject(
+                        Project.class, document.toString()));
+            } catch (IOException e) {
+                throw new RegistryException(e);
+            }
+        }
+        return projectList;
+    }
+
+    public void createProject(Project project) throws RegistryException{
+        try {
+            WriteResult result = collection.insert((DBObject) JSON.parse(
+                    modelConversionHelper.serializeObject(project)));
+            logger.debug("No of inserted results "+ result.getN());
+        } catch (JsonProcessingException e) {
+            throw new RegistryException(e);
+        }
+    }
+
+    /**
+     * The following operation replaces the document with item equal to
+     * the given project id. The newly replaced document will only
+     * contain the the _id field and the fields in the replacement document.
+     * @param project
+     * @throws org.apache.airavata.registry.cpi.RegistryException
+     */
+    public void updateProject(Project project) throws RegistryException{
+        try {
+            DBObject query = BasicDBObjectBuilder.start().add(
+                    PROJECT_ID, project.getProjectId()).get();
+            WriteResult result = collection.update(query, (DBObject) JSON.parse(
+                    modelConversionHelper.serializeObject(project)));
+            logger.debug("No of updated results "+ result.getN());
+        } catch (JsonProcessingException e) {
+            throw new RegistryException(e);
+        }
+    }
+
+    public void deleteProject(Project project) throws RegistryException{
+        DBObject query = BasicDBObjectBuilder.start().add(
+                PROJECT_ID, project.getProjectId()).get();
+        WriteResult result = collection.remove(query);
+        logger.debug("No of removed experiments " + result.getN());
+    }
+
+    public Project getProject(String projectId) throws RegistryException{
+        try {
+            DBObject criteria = new BasicDBObject(PROJECT_ID, projectId);
+            DBObject doc = collection.findOne(criteria);
+            if(doc != null){
+                String json = doc.toString();
+                return (Project)modelConversionHelper.deserializeObject(
+                        Project.class, json);
+            }
+        } catch (IOException e) {
+            throw new RegistryException(e);
+        }
+        return null;
+    }
+
+    public List<Project> searchProjects(Map<String, String> filters, int limit,
+        int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException{
+        List<Project> projectList = new ArrayList();
+        BasicDBObjectBuilder queryBuilder = BasicDBObjectBuilder.start();
+        for (String field : filters.keySet()) {
+//            if (field.equals(Constants.FieldConstants.ProjectConstants.PROJECT_NAME)){
+//                fil.put(AbstractResource.ProjectConstants.PROJECT_NAME, filters.get(field));
+//            }else if (field.equals(Constants.FieldConstants.ProjectConstants.OWNER)){
+//                fil.put(AbstractResource.ProjectConstants.USERNAME, filters.get(field));
+//            }else if (field.equals(Constants.FieldConstants.ProjectConstants.DESCRIPTION)){
+//                fil.put(AbstractResource.ProjectConstants.DESCRIPTION, filters.get(field));
+//            }else if (field.equals(Constants.FieldConstants.ProjectConstants.GATEWAY_ID)){
+//                fil.put(AbstractResource.ProjectConstants.GATEWAY_ID, filters.get(field));
+//            }
+        }
+
+        //handling pagination and ordering. ordering is allowed only on PROJECT_CREATION_TIME
+        DBCursor cursor;
+        if(limit > 0 && offset >= 0) {
+            if(orderByIdentifier != null && orderByIdentifier.equals(
+                    Constants.FieldConstants.ProjectConstants.CREATION_TIME)){
+                if(resultOrderType.equals(ResultOrderType.ASC)) {
+                    cursor = collection.find(queryBuilder.get()).sort(new BasicDBObject(PROJECT_CREATION_TIME, 1))
+                            .skip(offset).limit(limit);
+                }else{
+                    cursor = collection.find(queryBuilder.get()).sort(new BasicDBObject(PROJECT_CREATION_TIME, -1))
+                            .skip(offset).limit(limit);
+                }
+            }else {
+                cursor = collection.find(queryBuilder.get()).skip(offset).limit(limit);
+            }
+        }else{
+            if(resultOrderType != null && resultOrderType.equals(
+                    Constants.FieldConstants.ProjectConstants.CREATION_TIME)){
+                if(resultOrderType.equals(ResultOrderType.ASC)) {
+                    cursor = collection.find(queryBuilder.get()).sort(new BasicDBObject(PROJECT_CREATION_TIME, 1));
+                }else{
+                    cursor = collection.find(queryBuilder.get()).sort(new BasicDBObject(PROJECT_CREATION_TIME, -1));
+                }
+            }else {
+                cursor = collection.find(queryBuilder.get());
+            }
+        }
+        for(DBObject document: cursor){
+            try {
+                projectList.add((Project) modelConversionHelper.deserializeObject(
+                        Project.class, document.toString()));
+            } catch (IOException e) {
+                throw new RegistryException(e);
+            }
+        }
+        return projectList;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/945161ea/modules/registry/airavata-mongo-registry/src/test/java/org/apache/airavata/persistence/registry/mongo/ExperimentDaoTest.java
----------------------------------------------------------------------
diff --git a/modules/registry/airavata-mongo-registry/src/test/java/org/apache/airavata/persistence/registry/mongo/ExperimentDaoTest.java b/modules/registry/airavata-mongo-registry/src/test/java/org/apache/airavata/persistence/registry/mongo/ExperimentDaoTest.java
index 6b4d5cf..1def159 100644
--- a/modules/registry/airavata-mongo-registry/src/test/java/org/apache/airavata/persistence/registry/mongo/ExperimentDaoTest.java
+++ b/modules/registry/airavata-mongo-registry/src/test/java/org/apache/airavata/persistence/registry/mongo/ExperimentDaoTest.java
@@ -22,7 +22,6 @@ package org.apache.airavata.persistence.registry.mongo;
 
 import com.mongodb.MongoClient;
 import junit.framework.Assert;
-import org.apache.airavata.common.utils.AiravataUtils;
 import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType;
 import org.apache.airavata.model.workspace.experiment.*;
 import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
@@ -31,6 +30,8 @@ import org.apache.airavata.persistance.registry.jpa.mongo.utils.MongoUtil;
 import org.apache.airavata.registry.cpi.Registry;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.apache.airavata.registry.cpi.RegistryModelType;
+import org.apache.airavata.registry.cpi.ResultOrderType;
+import org.apache.airavata.registry.cpi.utils.Constants;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -40,7 +41,9 @@ import org.slf4j.LoggerFactory;
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 public class ExperimentDaoTest {
@@ -112,7 +115,6 @@ public class ExperimentDaoTest {
 
     @Test
     public void test() throws RegistryException, IOException {
-        AiravataUtils.setExecutionAsServer();
         Registry registry = RegistryFactory.getDefaultRegistry();
         MongoUtil.dropAiravataRegistry();
 
@@ -149,7 +151,6 @@ public class ExperimentDaoTest {
 //        long time2 = System.currentTimeMillis();
 //        System.out.println(time2-time1);
 //        Assert.assertNotNull(experiment);
-        AiravataUtils.setExecutionAsServer();
 
         ExperimentDao experimentDao = new ExperimentDao();
         BufferedReader reader = new BufferedReader(new FileReader("/home/supun/Downloads/WORKFLOW_NODE_DETAIL.csv"));
@@ -159,7 +160,7 @@ public class ExperimentDaoTest {
         long time1 = System.currentTimeMillis();
         while(temp != null && !temp.isEmpty()){
             try{
-                Experiment experiment = experimentDao.getExperimentOfWFNode(temp.trim());
+                Experiment experiment = experimentDao.getParentExperimentOfWFNode(temp.trim());
                 if(experiment != null) {
                     System.out.println(i + " :" + experiment.getExperimentId());
                     count++;
@@ -190,7 +191,6 @@ public class ExperimentDaoTest {
 //        AiravataUtils.setExecutionAsServer();
 //        Registry registry = RegistryFactory.getDefaultRegistry();
 //        MongoUtil.dropAiravataRegistry();
-        AiravataUtils.setExecutionAsServer();
 
         ExperimentDao experimentDao = new ExperimentDao();
         BufferedReader reader = new BufferedReader(new FileReader("/home/supun/Downloads/TASK_DETAIL.csv"));
@@ -200,7 +200,7 @@ public class ExperimentDaoTest {
         long time1 = System.currentTimeMillis();
         while(temp != null && !temp.isEmpty()){
             try{
-                Experiment experiment = experimentDao.getExperimentOfTask(temp.trim());
+                Experiment experiment = experimentDao.getParentExperimentOfTask(temp.trim());
                 if(experiment != null) {
                     //System.out.println(i + " :" + experiment.getExperimentId());
                     count++;
@@ -224,7 +224,6 @@ public class ExperimentDaoTest {
         String nodeId = "tempNode_758b52ba-091b-43a5-a7b7-4c3a239c5d1e";
         String newNodeId = "newNode_758b52ba-091b-43a5-a7b7-4c3a2325d1e";
         String expId = "AlamoTest3_3965f4e2-0213-4434-9c3f-fe898b018666";
-        AiravataUtils.setExecutionAsServer();
         ExperimentDao experimentDao = new ExperimentDao();
         WorkflowNodeDetails wfNode = experimentDao.getWFNode("newNode_758b52ba-091b-43a5-a7b7-4c3a239c5d1e");
         Assert.assertTrue(wfNode.getNodeInstanceId().equals("newNode_758b52ba-091b-43a5-a7b7-4c3a239c5d1e"));
@@ -250,8 +249,7 @@ public class ExperimentDaoTest {
 
     @Test
     public void testTask() throws RegistryException {
-        String taskId = "tempNode_f43e1a37-5aec-4061-ae15-111a050b98e0";
-        AiravataUtils.setExecutionAsServer();
+        String taskId = "tempNode_58e1b2e4-f7d6-4543-9281-43dcb58e2c1a";
         ExperimentDao experimentDao = new ExperimentDao();
         TaskDetails taskDetails = experimentDao.getTaskDetail(taskId);
         Assert.assertTrue(taskDetails.getTaskId().equals(taskId));
@@ -261,8 +259,20 @@ public class ExperimentDaoTest {
         taskDetails = experimentDao.getTaskDetail(taskId);
         Assert.assertTrue(taskDetails.getTaskId().equals(taskId));
 
-        String expid = "AlamoTest1_6107d1f0-d64e-4690-8686-71ce87c4ad24";
+        String expid = "alamotest2_5420547e-877a-4a9c-8752-377c2806906c";
         Experiment experiment = experimentDao.getExperiment(expid);
         System.out.println();
     }
+
+    @Test
+    public void testSearch() throws RegistryException{
+        Map<String, String> filters = new HashMap();
+        filters.put(Constants.FieldConstants.ExperimentConstants.USER_NAME, "Eroma123");
+        filters.put(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_DESC, "Test");
+        List<Experiment> result = experimentDao.searchExperiments(
+                filters, 10, 2, Constants.FieldConstants.ExperimentConstants.CREATION_TIME, ResultOrderType.DESC);
+        Assert.assertNotNull(result);
+        Assert.assertTrue(result.size()==10);
+        Assert.assertTrue(result.get(0).getCreationTime() > result.get(9).getCreationTime());
+    }
 }
\ No newline at end of file