You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sh...@apache.org on 2015/06/04 22:37:07 UTC

[21/52] [abbrv] [partial] airavata git commit: registry refactoring

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/ComputeResourceImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/ComputeResourceImpl.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/ComputeResourceImpl.java
new file mode 100644
index 0000000..0f14078
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/ComputeResourceImpl.java
@@ -0,0 +1,888 @@
+/*
+ *
+ * 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.registry.core.app.catalog.impl;
+
+import java.util.*;
+
+import org.apache.airavata.model.appcatalog.computeresource.*;
+import org.apache.airavata.registry.core.app.catalog.resources.*;
+import org.apache.airavata.registry.core.app.catalog.util.AppCatalogThriftConversion;
+import org.apache.airavata.registry.core.app.catalog.util.AppCatalogUtils;
+import org.apache.airavata.registry.cpi.AppCatalogException;
+import org.apache.airavata.registry.cpi.ComputeResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ComputeResourceImpl implements ComputeResource {
+    private final static Logger logger = LoggerFactory.getLogger(ComputeResourceImpl.class);
+
+    @Override
+    public String addComputeResource(ComputeResourceDescription description) throws AppCatalogException {
+        try {
+            if (description.getComputeResourceId().equals("") || description.getComputeResourceId().equals(computeResourceModelConstants.DEFAULT_ID)){
+                description.setComputeResourceId(AppCatalogUtils.getID(description.getHostName()));
+            }
+        	return saveComputeResourceDescriptorData(description);
+        } catch (Exception e) {
+            logger.error("Error while saving compute resource...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+	protected String saveComputeResourceDescriptorData(
+			ComputeResourceDescription description) throws AppCatalogException {
+		//TODO remove existing one
+		ComputeResourceAppCatalogResourceAppCat computeHostResource = saveComputeResource(description);
+		saveHostAliases(description, computeHostResource);
+		saveIpAddresses(description, computeHostResource);
+		saveBatchQueues(description, computeHostResource);
+		saveFileSystems(description, computeHostResource);
+		saveJobSubmissionInterfaces(description, computeHostResource);
+		saveDataMovementInterfaces(description, computeHostResource);
+		return computeHostResource.getResourceId();
+	}
+
+	protected ComputeResourceAppCatalogResourceAppCat saveComputeResource(
+			ComputeResourceDescription description) throws AppCatalogException {
+		ComputeResourceAppCatalogResourceAppCat computeHostResource = AppCatalogThriftConversion.getComputeHostResource(description);
+		computeHostResource.save();
+		return computeHostResource;
+	}
+
+	protected void saveDataMovementInterfaces(
+			ComputeResourceDescription description,
+			ComputeResourceAppCatalogResourceAppCat computeHostResource)
+			throws AppCatalogException {
+		List<DataMovementInterface> dataMovemenetInterfaces = description.getDataMovementInterfaces();
+		if (dataMovemenetInterfaces != null && !dataMovemenetInterfaces.isEmpty()) {
+		    for (DataMovementInterface dataMovementInterface : dataMovemenetInterfaces) {
+		    	DataMovementInterfaceAppCatalogResourceAppCat dmir = AppCatalogThriftConversion.getDataMovementInterface(dataMovementInterface);
+		    	dmir.setComputeHostResource(computeHostResource);
+		    	dmir.setComputeResourceId(computeHostResource.getResourceId());
+				dmir.save();
+		    }
+		}
+	}
+
+	protected void saveJobSubmissionInterfaces(
+			ComputeResourceDescription description,
+			ComputeResourceAppCatalogResourceAppCat computeHostResource)
+			throws AppCatalogException {
+		List<JobSubmissionInterface> jobSubmissionInterfaces = description.getJobSubmissionInterfaces();
+		if (jobSubmissionInterfaces != null && !jobSubmissionInterfaces.isEmpty()) {
+		    for (JobSubmissionInterface jobSubmissionInterface : jobSubmissionInterfaces) {
+		    	JobSubmissionInterfaceAppCatalogResourceAppCat jsir = AppCatalogThriftConversion.getJobSubmissionInterface(jobSubmissionInterface);
+				jsir.setComputeHostResource(computeHostResource);
+				jsir.setComputeResourceId(computeHostResource.getResourceId());
+				jsir.save();
+		    }
+		}
+	}
+
+	protected void saveFileSystems(ComputeResourceDescription description,
+			ComputeResourceAppCatalogResourceAppCat computeHostResource)
+			throws AppCatalogException {
+		Map<FileSystems, String> fileSystems = description.getFileSystems();
+		if (fileSystems != null && !fileSystems.isEmpty()) {
+		    for (FileSystems key : fileSystems.keySet()) {
+		    	ComputeResourceFileSystemAppCatalogResourceAppCat computeResourceFileSystemResource = new ComputeResourceFileSystemAppCatalogResourceAppCat();
+		    	computeResourceFileSystemResource.setComputeHostResource(computeHostResource);
+		    	computeResourceFileSystemResource.setComputeResourceId(computeHostResource.getResourceId());
+		    	computeResourceFileSystemResource.setFileSystem(key.toString());
+		    	computeResourceFileSystemResource.setPath(fileSystems.get(key));
+		    	computeResourceFileSystemResource.save();
+		    }
+		}
+	}
+
+	protected void saveBatchQueues(ComputeResourceDescription description,
+			ComputeResourceAppCatalogResourceAppCat computeHostResource)
+			throws AppCatalogException {
+		List<BatchQueue> batchQueueList = description.getBatchQueues();
+		if (batchQueueList != null && !batchQueueList.isEmpty()) {
+		    for (BatchQueue batchQueue : batchQueueList) {
+		    	BatchQueueAppCatalogResourceAppCat bq = AppCatalogThriftConversion.getBatchQueue(batchQueue);
+		    	bq.setComputeResourceId(computeHostResource.getResourceId());
+		    	bq.setComputeHostResource(computeHostResource);
+		        bq.save();
+		    }
+		}
+	}
+
+	protected void saveIpAddresses(ComputeResourceDescription description,
+			ComputeResourceAppCatalogResourceAppCat computeHostResource)
+			throws AppCatalogException {
+		List<String> ipAddresses = description.getIpAddresses();
+        HostIPAddressAppCatalogResourceAppCat resource = new HostIPAddressAppCatalogResourceAppCat();
+        resource.remove(description.getComputeResourceId());
+		if (ipAddresses != null && !ipAddresses.isEmpty()) {
+		    for (String ipAddress : ipAddresses) {
+		        HostIPAddressAppCatalogResourceAppCat ipAddressResource = new HostIPAddressAppCatalogResourceAppCat();
+		        ipAddressResource.setComputeHostResource(computeHostResource);
+		        ipAddressResource.setResourceID(computeHostResource.getResourceId());
+		        ipAddressResource.setIpaddress(ipAddress);
+		        ipAddressResource.save();
+		    }
+		}
+	}
+
+	protected void saveHostAliases(ComputeResourceDescription description,
+			ComputeResourceAppCatalogResourceAppCat computeHostResource)
+			throws AppCatalogException {
+		List<String> hostAliases = description.getHostAliases();
+        // delete previous host aliases
+        HostAliasAppCatalogResourceAppCat resource = new HostAliasAppCatalogResourceAppCat();
+        resource.remove(description.getComputeResourceId());
+		if (hostAliases != null && !hostAliases.isEmpty()) {
+		    for (String alias : hostAliases) {
+		        HostAliasAppCatalogResourceAppCat aliasResource = new HostAliasAppCatalogResourceAppCat();
+		        aliasResource.setComputeHostResource(computeHostResource);
+		        aliasResource.setResourceID(computeHostResource.getResourceId());
+                aliasResource.setAlias(alias);
+		        aliasResource.save();
+		    }
+		}
+	}
+
+    @Override
+    public void updateComputeResource(String computeResourceId, ComputeResourceDescription updatedComputeResource) throws AppCatalogException{
+        try {
+        	saveComputeResourceDescriptorData(updatedComputeResource);
+        } catch (Exception e) {
+            logger.error("Error while updating compute resource...", e);
+            throw new AppCatalogException(e);
+        } 
+    }
+
+    @Override
+    public String addSSHJobSubmission(SSHJobSubmission sshJobSubmission) throws AppCatalogException {
+        try {
+            String submissionId = AppCatalogUtils.getID("SSH");
+            sshJobSubmission.setJobSubmissionInterfaceId(submissionId);
+    		String resourceJobManagerId = addResourceJobManager(sshJobSubmission.getResourceJobManager());
+    		SshJobSubmissionAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getSSHJobSubmission(sshJobSubmission);
+    		resource.setResourceJobManagerId(resourceJobManagerId);
+    		resource.getResourceJobManagerResource().setResourceJobManagerId(resourceJobManagerId);
+            if (sshJobSubmission.getMonitorMode() != null){
+                resource.setMonitorMode(sshJobSubmission.getMonitorMode().toString());
+            }
+            resource.save();
+        	return submissionId;
+        }catch (Exception e) {
+            logger.error("Error while saving SSH Job Submission...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public String addCloudJobSubmission(CloudJobSubmission sshJobSubmission) throws AppCatalogException {
+        try {
+            sshJobSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("Cloud"));
+            CloudSubmissionAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getCloudJobSubmission(sshJobSubmission);
+            resource.save();
+            return resource.getJobSubmissionInterfaceId();
+        }catch (Exception e) {
+            logger.error("Error while saving SSH Job Submission...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+    
+	@Override
+	public String addUNICOREJobSubmission(UnicoreJobSubmission unicoreJobSubmission)
+			throws AppCatalogException {
+		 try {
+             unicoreJobSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("UNICORE"));
+             UnicoreJobSubmissionAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getUnicoreJobSubmission(unicoreJobSubmission);
+             resource.setUnicoreEndpointUrl(unicoreJobSubmission.getUnicoreEndPointURL());
+             if (unicoreJobSubmission.getSecurityProtocol() !=  null){
+                 resource.setSecurityProtocol(unicoreJobSubmission.getSecurityProtocol().toString());
+             }
+             resource.save();
+             return resource.getjobSubmissionInterfaceId();
+         }catch (Exception e){
+	            logger.error("Error while retrieving SSH Job Submission...", e);
+	            throw new AppCatalogException(e);
+	        }
+		 
+	}
+
+    @Override
+    public String addJobSubmissionProtocol(String computeResourceId, JobSubmissionInterface jobSubmissionInterface) throws AppCatalogException {
+        try {
+        	JobSubmissionInterfaceAppCatalogResourceAppCat jsi = AppCatalogThriftConversion.getJobSubmissionInterface(jobSubmissionInterface);
+        	jsi.setComputeResourceId(computeResourceId);
+        	ComputeResourceAppCatalogResourceAppCat computeResourceResource = new ComputeResourceAppCatalogResourceAppCat();
+        	computeResourceResource=(ComputeResourceAppCatalogResourceAppCat)computeResourceResource.get(computeResourceId);
+        	jsi.setComputeHostResource(computeResourceResource);
+            jsi.save();
+            return jsi.getJobSubmissionInterfaceId();
+        }catch (Exception e){
+            logger.error("Error while saving "+jobSubmissionInterface.getJobSubmissionProtocol().toString()+" Job Submission Protocol...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+//    @Override
+//    public String addGSISSHJobSubmission(GSISSHJobSubmission gsisshJobSubmission) throws AppCatalogException {
+//        try {
+//            GSISSHSubmissionResource resource = new GSISSHSubmissionResource();
+//            String hostName = "GSISSH";
+//            resource.setDeploymentId(AppCatalogUtils.getID(hostName));
+//            resource.setSshPort(resource.getSshPort());
+//            resource.setResourceJobManager(gsisshJobSubmission.getResourceJobManager().toString());
+//            resource.setInstalledPath(gsisshJobSubmission.getInstalledPath());
+//            resource.setMonitorMode(gsisshJobSubmission.getMonitorMode());
+//            resource.save();
+//            gsisshJobSubmission.setJobSubmissionDataID(resource.getDeploymentId());
+//
+//            Set<String> exports = gsisshJobSubmission.getExports();
+//            if (exports != null && !exports.isEmpty()){
+//                for (String export : exports){
+//                    GSISSHExportResource exportResource = new GSISSHExportResource();
+//                    exportResource.setDeploymentId(resource.getDeploymentId());
+//                    exportResource.setExport(export);
+//                    exportResource.setAppDeploymentResource(resource);
+//                    exportResource.save();
+//                }
+//            }
+//
+//            List<String> preJobCommands = gsisshJobSubmission.getPreJobCommands();
+//            if (preJobCommands != null && !preJobCommands.isEmpty()){
+//                for (String command : preJobCommands){
+//                    GSISSHPreJobCommandResource commandResource = new GSISSHPreJobCommandResource();
+//                    commandResource.setDeploymentId(resource.getDeploymentId());
+//                    commandResource.setCommand(command);
+//                    commandResource.setAppDeploymentResource(resource);
+//                    commandResource.save();
+//                }
+//            }
+//
+//            List<String> postJobCommands = gsisshJobSubmission.getPostJobCommands();
+//            if (postJobCommands != null && !postJobCommands.isEmpty()){
+//                for (String command : postJobCommands){
+//                    GSISSHPostJobCommandResource commandResource = new GSISSHPostJobCommandResource();
+//                    commandResource.setDeploymentId(resource.getDeploymentId());
+//                    commandResource.setCommand(command);
+//                    commandResource.setAppDeploymentResource(resource);
+//                    commandResource.save();
+//                }
+//            }
+//            return resource.getDeploymentId();
+//        }catch (Exception e) {
+//            logger.error("Error while saving GSISSH Job Submission...", e);
+//            throw new AppCatalogException(e);
+//        }
+//    }
+//
+//    @Override
+//    public void addGSISSHJobSubmissionProtocol(String computeResourceId, String jobSubmissionId) throws AppCatalogException {
+//        try {
+//            JobSubmissionProtocolResource resource = new JobSubmissionProtocolResource();
+//            resource.setResourceID(computeResourceId);
+//            resource.setDeploymentId(jobSubmissionId);
+//            ComputeResourceDescription computeResource = getComputeResource(computeResourceId);
+//            resource.setComputeHostResource(AppCatalogThriftConversion.getComputeHostResource(computeResource));
+//            resource.setJobType(JobSubmissionProtocol.GSISSH.toString());
+//            resource.save();
+//        }catch (Exception e){
+//            logger.error("Error while saving GSISSH Job Submission Protocol...", e);
+//            throw new AppCatalogException(e);
+//        }
+//    }
+
+    @Override
+    public String addGlobusJobSubmission(GlobusJobSubmission globusJobSubmission) throws AppCatalogException {
+//        try {
+//            GlobusJobSubmissionResource resource = new GlobusJobSubmissionResource();
+//            String hostName = "GLOBUS";
+//            resource.setDeploymentId(AppCatalogUtils.getID(hostName));
+//            resource.setSecurityProtocol(globusJobSubmission.getSecurityProtocol().toString());
+//            resource.setResourceJobManager(globusJobSubmission.getResourceJobManager().toString());
+//            resource.save();
+//            globusJobSubmission.setJobSubmissionDataID(resource.getDeploymentId());
+//            List<String> globusGateKeeperEndPoint = globusJobSubmission.getGlobusGateKeeperEndPoint();
+//            if (globusGateKeeperEndPoint != null && !globusGateKeeperEndPoint.isEmpty()) {
+//                for (String endpoint : globusGateKeeperEndPoint) {
+//                    GlobusGKEndpointResource endpointResource = new GlobusGKEndpointResource();
+//                    endpointResource.setDeploymentId(resource.getDeploymentId());
+//                    endpointResource.setEndpoint(endpoint);
+//                    endpointResource.setGlobusJobSubmissionResource(resource);
+//                    endpointResource.save();
+//                }
+//            }
+//            return resource.getDeploymentId();
+//        } catch (Exception e) {
+//            logger.error("Error while saving Globus Job Submission...", e);
+//            throw new AppCatalogException(e);
+//        }
+    	return null;
+    }
+
+    @Override
+    public String addScpDataMovement(SCPDataMovement scpDataMovement) throws AppCatalogException {
+        try {
+        	scpDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("SCP"));
+        	ScpDataMovementAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getSCPDataMovementDescription(scpDataMovement);
+            resource.save();
+            return resource.getDataMovementInterfaceId();
+        }catch (Exception e){
+            logger.error("Error while saving SCP Data Movement...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public String addUnicoreDataMovement(UnicoreDataMovement unicoreDataMovement) throws AppCatalogException {
+        try {
+            unicoreDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("UNICORE"));
+            UnicoreDataMovementAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getUnicoreDMResource(unicoreDataMovement);
+            resource.save();
+            return resource.getDataMovementId();
+        }catch (Exception e){
+            logger.error("Error while saving UNICORE Data Movement...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public String addDataMovementProtocol(String computeResourceId, DataMovementInterface dataMovementInterface) throws AppCatalogException {
+        try {
+        	DataMovementInterfaceAppCatalogResourceAppCat dmi = AppCatalogThriftConversion.getDataMovementInterface(dataMovementInterface);
+        	dmi.setComputeResourceId(computeResourceId);
+        	ComputeResourceAppCatalogResourceAppCat computeResourceResource = new ComputeResourceAppCatalogResourceAppCat();
+        	computeResourceResource=(ComputeResourceAppCatalogResourceAppCat)computeResourceResource.get(computeResourceId);
+        	dmi.setComputeHostResource(computeResourceResource);
+        	dmi.save();
+            return dmi.getDataMovementInterfaceId();
+        }catch (Exception e){
+            logger.error("Error while saving "+dataMovementInterface.getDataMovementProtocol().toString()+" data movement Protocol...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public String addGridFTPDataMovement(GridFTPDataMovement gridFTPDataMovement) throws AppCatalogException {
+        try {
+        	gridFTPDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("GRIDFTP"));
+        	GridftpDataMovementAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getGridFTPDataMovementDescription(gridFTPDataMovement);
+            resource.save();
+            List<String> gridFTPEndPoint = gridFTPDataMovement.getGridFTPEndPoints();
+            if (gridFTPEndPoint != null && !gridFTPEndPoint.isEmpty()) {
+                for (String endpoint : gridFTPEndPoint) {
+                    GridftpEndpointAppCatalogResourceAppCat endpointResource = new GridftpEndpointAppCatalogResourceAppCat();
+                    endpointResource.setDataMovementInterfaceId(resource.getDataMovementInterfaceId());
+                    endpointResource.setEndpoint(endpoint);
+                    endpointResource.setGridftpDataMovementResource(resource);
+                    endpointResource.save();
+                }
+            }
+            return resource.getDataMovementInterfaceId();
+        }catch (Exception e){
+            logger.error("Error while saving GridFTP Data Movement...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public ComputeResourceDescription getComputeResource(String resourceId) throws AppCatalogException {
+        try {
+            ComputeResourceAppCatalogResourceAppCat resource = new ComputeResourceAppCatalogResourceAppCat();
+            ComputeResourceAppCatalogResourceAppCat computeResource = (ComputeResourceAppCatalogResourceAppCat)resource.get(resourceId);
+            return AppCatalogThriftConversion.getComputeHostDescription(computeResource);
+        }catch (Exception e){
+            logger.error("Error while retrieving compute resource...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public List<ComputeResourceDescription> getComputeResourceList(Map<String, String> filters) throws AppCatalogException {
+        List<ComputeResourceDescription> computeResourceDescriptions = new ArrayList<ComputeResourceDescription>();
+        try {
+        	//TODO check if this is correct way to do this
+            ComputeResourceAppCatalogResourceAppCat resource = new ComputeResourceAppCatalogResourceAppCat();
+            for (String fieldName : filters.keySet() ){
+                if (fieldName.equals(AppCatAbstractResource.ComputeResourceConstants.HOST_NAME)){
+                    List<AppCatalogResource> resources = resource.get(AppCatAbstractResource.ComputeResourceConstants.HOST_NAME, filters.get(fieldName));
+                    if (resources != null && !resources.isEmpty()){
+                        computeResourceDescriptions = AppCatalogThriftConversion.getComputeDescriptionList(resources);
+                    }
+                }else {
+                    logger.error("Unsupported field name for compute resource.", new IllegalArgumentException());
+                    throw new IllegalArgumentException("Unsupported field name for compute resource.");
+                }
+            }
+        }catch (Exception e){
+            logger.error("Error while retrieving compute resource list...", e);
+            throw new AppCatalogException(e);
+        }
+        return computeResourceDescriptions;
+    }
+
+    @Override
+    public List<ComputeResourceDescription> getAllComputeResourceList() throws AppCatalogException {
+        List<ComputeResourceDescription> computeResourceDescriptions = new ArrayList<ComputeResourceDescription>();
+        try {
+            ComputeResourceAppCatalogResourceAppCat resource = new ComputeResourceAppCatalogResourceAppCat();
+            List<AppCatalogResource> resources = resource.getAll();
+            if (resources != null && !resources.isEmpty()){
+                computeResourceDescriptions = AppCatalogThriftConversion.getComputeDescriptionList(resources);
+            }
+        }catch (Exception e){
+            logger.error("Error while retrieving compute resource list...", e);
+            throw new AppCatalogException(e);
+        }
+        return computeResourceDescriptions;
+    }
+
+    @Override
+    public Map<String, String> getAllComputeResourceIdList() throws AppCatalogException {
+        try {
+            Map<String, String> computeResourceMap = new HashMap<String, String>();
+            ComputeResourceAppCatalogResourceAppCat resource = new ComputeResourceAppCatalogResourceAppCat();
+            List<AppCatalogResource> allComputeResources = resource.getAll();
+            if (allComputeResources != null && !allComputeResources.isEmpty()){
+                for (AppCatalogResource cm : allComputeResources){
+                    ComputeResourceAppCatalogResourceAppCat cmr = (ComputeResourceAppCatalogResourceAppCat)cm;
+                    computeResourceMap.put(cmr.getResourceId(), cmr.getHostName());
+                }
+            }
+            return computeResourceMap;
+        }catch (Exception e){
+            logger.error("Error while retrieving compute resource list...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+//    @Override
+//    public GSISSHJobSubmission getGSISSHJobSubmission(String submissionId) throws AppCatalogException {
+//        try {
+//            GSISSHSubmissionResource resource = new GSISSHSubmissionResource();
+//            GSISSHSubmissionResource submissionResource = (GSISSHSubmissionResource)resource.get(submissionId);
+//            return AppCatalogThriftConversion.getGSISSHSubmissionDescription(submissionResource);
+//        }catch (Exception e){
+//            logger.error("Error while retrieving GSISSH Job Submission...", e);
+//            throw new AppCatalogException(e);
+//        }
+//    }
+//
+//    @Override
+//    public List<GSISSHJobSubmission> getGSISSHJobSubmissionList(Map<String, String> filters) throws AppCatalogException {
+//        try {
+//            GSISSHSubmissionResource resource = new GSISSHSubmissionResource();
+//            for (String fieldName : filters.keySet() ){
+//                if (fieldName.equals(AbstractResource.GSISSHSubmissionConstants.RESOURCE_JOB_MANAGER)){
+//                    List<Resource> resources = resource.get(AbstractResource.GSISSHSubmissionConstants.RESOURCE_JOB_MANAGER, filters.get(fieldName));
+//                    if (resources != null && !resources.isEmpty()){
+//                        return AppCatalogThriftConversion.getGSISSHSubmissionList(resources);
+//                    }
+//                }else {
+//                    logger.error("Unsupported field name for GSISSH Submission.", new IllegalArgumentException());
+//                    throw new IllegalArgumentException("Unsupported field name for GSISSH Submission.");
+//                }
+//            }
+//        }catch (Exception e){
+//            logger.error("Error while retrieving GSISSH Submission list...", e);
+//            throw new AppCatalogException(e);
+//        }
+//        return null;
+//    }
+//
+//    @Override
+//    public GlobusJobSubmission getGlobusJobSubmission(String submissionId) throws AppCatalogException {
+//        try {
+//        	GlobusJobSubmissionResource globusJobSubmissionResource = new GlobusJobSubmissionResource();
+//        	globusJobSubmissionResource=(GlobusJobSubmissionResource)globusJobSubmissionResource.get(submissionId);
+//        	AppCatalogThriftConversion.getglo
+//            GlobusJobSubmissionResource resource = globusJobSubmissionResource;
+//            GlobusJobSubmissionResource submissionResource = (GlobusJobSubmissionResource)resource.get(submissionId);
+//            return AppCatalogThriftConversion.getGlobusJobSubmissionDescription(submissionResource);
+//        }catch (Exception e){
+//            logger.error("Error while retrieving Globus Job Submission...", e);
+//            throw new AppCatalogException(e);
+//        }
+//    }
+//
+//    @Override
+//    public List<GlobusJobSubmission> getGlobusJobSubmissionList(Map<String, String> filters) throws AppCatalogException {
+//        try {
+//            GlobusJobSubmissionResource resource = new GlobusJobSubmissionResource();
+//            for (String fieldName : filters.keySet() ){
+//                if (fieldName.equals(AbstractResource.GlobusJobSubmissionConstants.RESOURCE_JOB_MANAGER)){
+//                    List<Resource> resources = resource.get(AbstractResource.GlobusJobSubmissionConstants.RESOURCE_JOB_MANAGER, filters.get(fieldName));
+//                    if (resources != null && !resources.isEmpty()){
+//                        return AppCatalogThriftConversion.getGlobusSubmissionList(resources);
+//                    }
+//                }else if (fieldName.equals(AbstractResource.GlobusJobSubmissionConstants.SECURITY_PROTOCAL)){
+//                    List<Resource> resources = resource.get(AbstractResource.GlobusJobSubmissionConstants.SECURITY_PROTOCAL, filters.get(fieldName));
+//                    if (resources != null && !resources.isEmpty()){
+//                        return AppCatalogThriftConversion.getGlobusSubmissionList(resources);
+//                    }
+//                }else {
+//                    logger.error("Unsupported field name for Globus Submission.", new IllegalArgumentException());
+//                    throw new IllegalArgumentException("Unsupported field name for Globus Submission.");
+//                }
+//            }
+//        }catch (Exception e){
+//            logger.error("Error while retrieving Globus Submission list...", e);
+//            throw new AppCatalogException(e);
+//        }
+//        return null;
+//    }
+
+    @Override
+    public SSHJobSubmission getSSHJobSubmission(String submissionId) throws AppCatalogException {
+        try {
+            SshJobSubmissionAppCatalogResourceAppCat resource = new SshJobSubmissionAppCatalogResourceAppCat();
+            resource = (SshJobSubmissionAppCatalogResourceAppCat)resource.get(submissionId);
+            return AppCatalogThriftConversion.getSSHJobSubmissionDescription(resource);
+        }catch (Exception e){
+            logger.error("Error while retrieving SSH Job Submission...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    //    @Override
+	//    public List<GridFTPDataMovement> getGridFTPDataMovementList(Map<String, String> filters) throws AppCatalogException {
+	//        try {
+	//            GridftpDataMovementResource resource = new GridftpDataMovementResource();
+	//            for (String fieldName : filters.keySet() ){
+	//                if (fieldName.equals(AbstractResource.GridFTPDataMovementConstants.SECURITY_PROTOCOL)){
+	//                    List<Resource> resources = resource.get(AbstractResource.GridFTPDataMovementConstants.SECURITY_PROTOCOL, filters.get(fieldName));
+	//                    if (resources != null && !resources.isEmpty()){
+	//                        return AppCatalogThriftConversion.getGridFTPDataMovementList(resources);
+	//                    }
+	//                }else {
+	//                    logger.error("Unsupported field name for GridFTP Data movement.", new IllegalArgumentException());
+	//                    throw new IllegalArgumentException("Unsupported field name for GridFTP Data movement.");
+	//                }
+	//            }
+	//        }catch (Exception e){
+	//            logger.error("Error while retrieving GridFTP Data movement list...", e);
+	//            throw new AppCatalogException(e);
+	//        }
+	//        return null;
+	//    }
+	
+	    @Override
+		public UnicoreJobSubmission getUNICOREJobSubmission(String submissionId)
+				throws AppCatalogException {
+	    	try {
+	            UnicoreJobSubmissionAppCatalogResourceAppCat resource = new UnicoreJobSubmissionAppCatalogResourceAppCat();
+	            resource = (UnicoreJobSubmissionAppCatalogResourceAppCat)resource.get(submissionId);
+	            return AppCatalogThriftConversion.getUnicoreJobSubmissionDescription(resource);
+	        }catch (Exception e){
+	            logger.error("Error while retrieving UNICORE Job Submission model instance...", e);
+	            throw new AppCatalogException(e);
+	        }
+		}
+
+    @Override
+    public UnicoreDataMovement getUNICOREDataMovement(String dataMovementId)
+            throws AppCatalogException {
+        try {
+            UnicoreDataMovementAppCatalogResourceAppCat resource = new UnicoreDataMovementAppCatalogResourceAppCat();
+            resource = (UnicoreDataMovementAppCatalogResourceAppCat)resource.get(dataMovementId);
+            return AppCatalogThriftConversion.getUnicoreDMDescription(resource);
+        }catch (Exception e){
+            logger.error("Error while retrieving UNICORE data movement...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+	@Override
+    public CloudJobSubmission getCloudJobSubmission(String submissionId) throws AppCatalogException {
+        try {
+            CloudSubmissionAppCatalogResourceAppCat resource = new CloudSubmissionAppCatalogResourceAppCat();
+            resource = (CloudSubmissionAppCatalogResourceAppCat)resource.get(submissionId);
+            return AppCatalogThriftConversion.getCloudJobSubmissionDescription(resource);
+        }catch (Exception e){
+            logger.error("Error while retrieving SSH Job Submission...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+//
+//    @Override
+//    public List<SSHJobSubmission> getSSHJobSubmissionList(Map<String, String> filters) throws AppCatalogException {
+//        try {
+//            SshJobSubmissionResource resource = new SshJobSubmissionResource();
+//            for (String fieldName : filters.keySet() ){
+//               if (fieldName.equals(AbstractResource.SSHSubmissionConstants.RESOURCE_JOB_MANAGER)){
+//                    List<Resource> resources = resource.get(AbstractResource.SSHSubmissionConstants.RESOURCE_JOB_MANAGER, filters.get(fieldName));
+//                    if (resources != null && !resources.isEmpty()){
+//                        return AppCatalogThriftConversion.getSSHSubmissionList(resources);
+//                    }
+//                }else {
+//                    logger.error("Unsupported field name for SSH Submission.", new IllegalArgumentException());
+//                    throw new IllegalArgumentException("Unsupported field name for SSH Submission.");
+//                }
+//            }
+//        }catch (Exception e){
+//            logger.error("Error while retrieving SSH Submission list...", e);
+//            throw new AppCatalogException(e);
+//        }
+//        return null;
+//    }
+
+    @Override
+    public SCPDataMovement getSCPDataMovement(String dataMoveId) throws AppCatalogException {
+        try {
+            ScpDataMovementAppCatalogResourceAppCat resource = new ScpDataMovementAppCatalogResourceAppCat();
+            ScpDataMovementAppCatalogResourceAppCat dataMovementResource = (ScpDataMovementAppCatalogResourceAppCat)resource.get(dataMoveId);
+            return AppCatalogThriftConversion.getSCPDataMovementDescription(dataMovementResource);
+        }catch (Exception e){
+            logger.error("Error while retrieving SCP Data Movement...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+//    @Override
+//    public List<SCPDataMovement> getSCPDataMovementList(Map<String, String> filters) throws AppCatalogException {
+//        try {
+//            ScpDataMovementResource resource = new ScpDataMovementResource();
+//            for (String fieldName : filters.keySet() ){
+//                if (fieldName.equals(AbstractResource.SCPDataMovementConstants.SECURITY_PROTOCOL)){
+//                    List<Resource> resources = resource.get(AbstractResource.SCPDataMovementConstants.SECURITY_PROTOCOL, filters.get(fieldName));
+//                    if (resources != null && !resources.isEmpty()){
+//                        return AppCatalogThriftConversion.getSCPDataMovementList(resources);
+//                    }
+//                }else {
+//                    logger.error("Unsupported field name for SCP Data movement.", new IllegalArgumentException());
+//                    throw new IllegalArgumentException("Unsupported field name for SCP Data movement.");
+//                }
+//            }
+//        }catch (Exception e){
+//            logger.error("Error while retrieving SCP Data movement list...", e);
+//            throw new AppCatalogException(e);
+//        }
+//        return null;
+//    }
+
+    @Override
+    public GridFTPDataMovement getGridFTPDataMovement(String dataMoveId) throws AppCatalogException {
+        try {
+            GridftpDataMovementAppCatalogResourceAppCat resource = new GridftpDataMovementAppCatalogResourceAppCat();
+            GridftpDataMovementAppCatalogResourceAppCat dataMovementResource = (GridftpDataMovementAppCatalogResourceAppCat)resource.get(dataMoveId);
+            return AppCatalogThriftConversion.getGridFTPDataMovementDescription(dataMovementResource);
+        }catch (Exception e){
+            logger.error("Error while retrieving Grid FTP Data Movement...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+//    @Override
+//    public List<GridFTPDataMovement> getGridFTPDataMovementList(Map<String, String> filters) throws AppCatalogException {
+//        try {
+//            GridftpDataMovementResource resource = new GridftpDataMovementResource();
+//            for (String fieldName : filters.keySet() ){
+//                if (fieldName.equals(AbstractResource.GridFTPDataMovementConstants.SECURITY_PROTOCOL)){
+//                    List<Resource> resources = resource.get(AbstractResource.GridFTPDataMovementConstants.SECURITY_PROTOCOL, filters.get(fieldName));
+//                    if (resources != null && !resources.isEmpty()){
+//                        return AppCatalogThriftConversion.getGridFTPDataMovementList(resources);
+//                    }
+//                }else {
+//                    logger.error("Unsupported field name for GridFTP Data movement.", new IllegalArgumentException());
+//                    throw new IllegalArgumentException("Unsupported field name for GridFTP Data movement.");
+//                }
+//            }
+//        }catch (Exception e){
+//            logger.error("Error while retrieving GridFTP Data movement list...", e);
+//            throw new AppCatalogException(e);
+//        }
+//        return null;
+//    }
+
+    @Override
+    public boolean isComputeResourceExists(String resourceId) throws AppCatalogException {
+        try {
+            ComputeResourceAppCatalogResourceAppCat resource = new ComputeResourceAppCatalogResourceAppCat();
+            return resource.isExists(resourceId);
+        }catch (Exception e){
+            logger.error("Error while retrieving compute resource...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void removeComputeResource(String resourceId) throws AppCatalogException {
+        try {
+            ComputeResourceAppCatalogResourceAppCat resource = new ComputeResourceAppCatalogResourceAppCat();
+            resource.remove(resourceId);
+        }catch (Exception e){
+            logger.error("Error while removing compute resource...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void removeJobSubmissionInterface(String computeResourceId, String jobSubmissionInterfaceId) throws AppCatalogException {
+        try {
+            JobSubmissionInterfaceAppCatalogResourceAppCat resource = new JobSubmissionInterfaceAppCatalogResourceAppCat();
+            Map<String, String> ids = new HashMap<String, String>();
+            ids.put(AppCatAbstractResource.JobSubmissionInterfaceConstants.COMPUTE_RESOURCE_ID, computeResourceId);
+            ids.put(AppCatAbstractResource.JobSubmissionInterfaceConstants.JOB_SUBMISSION_INTERFACE_ID, jobSubmissionInterfaceId);
+            resource.remove(ids);
+        }catch (Exception e){
+            logger.error("Error while removing job submission interface..", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void removeDataMovementInterface(String computeResourceId, String dataMovementInterfaceId) throws AppCatalogException {
+        try {
+            DataMovementInterfaceAppCatalogResourceAppCat resource = new DataMovementInterfaceAppCatalogResourceAppCat();
+            Map<String, String> ids = new HashMap<String, String>();
+            ids.put(AppCatAbstractResource.DataMovementInterfaceConstants.COMPUTE_RESOURCE_ID, computeResourceId);
+            ids.put(AppCatAbstractResource.DataMovementInterfaceConstants.DATA_MOVEMENT_INTERFACE_ID, dataMovementInterfaceId);
+            resource.remove(ids);
+        }catch (Exception e){
+            logger.error("Error while removing data movement interface..", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void removeBatchQueue(String computeResourceId, String queueName) throws AppCatalogException {
+        try {
+            BatchQueueAppCatalogResourceAppCat resource = new BatchQueueAppCatalogResourceAppCat();
+            Map<String, String> ids = new HashMap<String, String>();
+            ids.put(AppCatAbstractResource.BatchQueueConstants.COMPUTE_RESOURCE_ID, computeResourceId);
+            ids.put(AppCatAbstractResource.BatchQueueConstants.QUEUE_NAME, queueName);
+            resource.remove(ids);
+        }catch (Exception e){
+            logger.error("Error while removing batch queue..", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+	public String addResourceJobManager(ResourceJobManager resourceJobManager)
+			throws AppCatalogException {
+		resourceJobManager.setResourceJobManagerId(AppCatalogUtils.getID("RJM"));
+		ResourceJobManagerAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getResourceJobManager(resourceJobManager);
+		resource.save();
+		Map<JobManagerCommand, String> jobManagerCommands = resourceJobManager.getJobManagerCommands();
+		if (jobManagerCommands!=null && jobManagerCommands.size() != 0) {
+			for (JobManagerCommand commandType : jobManagerCommands.keySet()) {
+				JobManagerCommandAppCatalogResourceAppCat r = new JobManagerCommandAppCatalogResourceAppCat();
+				r.setCommandType(commandType.toString());
+				r.setCommand(jobManagerCommands.get(commandType));
+				r.setResourceJobManagerId(resource.getResourceJobManagerId());
+				r.save();
+			}
+		}
+		return resource.getResourceJobManagerId();
+	}
+
+    @Override
+    public void updateResourceJobManager(String resourceJobManagerId, ResourceJobManager updatedResourceJobManager) throws AppCatalogException {
+        try {
+            ResourceJobManagerAppCatalogResourceAppCat resource = AppCatalogThriftConversion.getResourceJobManager(updatedResourceJobManager);
+            resource.setResourceJobManagerId(resourceJobManagerId);
+            resource.save();
+            Map<JobManagerCommand, String> jobManagerCommands = updatedResourceJobManager.getJobManagerCommands();
+            if (jobManagerCommands!=null && jobManagerCommands.size() != 0) {
+                for (JobManagerCommand commandType : jobManagerCommands.keySet()) {
+                    JobManagerCommandAppCatalogResourceAppCat r = new JobManagerCommandAppCatalogResourceAppCat();
+                    Map<String, String> ids = new HashMap<String, String>();
+                    ids.put(AppCatAbstractResource.JobManagerCommandConstants.RESOURCE_JOB_MANAGER_ID, resourceJobManagerId);
+                    ids.put(AppCatAbstractResource.JobManagerCommandConstants.COMMAND_TYPE, commandType.toString());
+                    JobManagerCommandAppCatalogResourceAppCat existingCommand;
+                    if (r.isExists(ids)){
+                        existingCommand = (JobManagerCommandAppCatalogResourceAppCat)r.get(ids);
+                    }else {
+                        existingCommand = new JobManagerCommandAppCatalogResourceAppCat();
+                    }
+                    existingCommand.setCommandType(commandType.toString());
+                    existingCommand.setCommand(jobManagerCommands.get(commandType));
+                    existingCommand.setResourceJobManagerId(resource.getResourceJobManagerId());
+                    existingCommand.save();
+                }
+            }
+        }catch (Exception e){
+            logger.error("Error while updating resource job manager..", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public ResourceJobManager getResourceJobManager(String resourceJobManagerId) throws AppCatalogException {
+        try {
+            ResourceJobManagerAppCatalogResourceAppCat resource = new ResourceJobManagerAppCatalogResourceAppCat();
+            ResourceJobManagerAppCatalogResourceAppCat jobManagerResource = (ResourceJobManagerAppCatalogResourceAppCat)resource.get(resourceJobManagerId);
+            return AppCatalogThriftConversion.getResourceJobManager(jobManagerResource);
+        }catch (Exception e){
+            logger.error("Error while retrieving resource job manager..", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void deleteResourceJobManager(String resourceJobManagerId) throws AppCatalogException {
+        try {
+            ResourceJobManagerAppCatalogResourceAppCat resource = new ResourceJobManagerAppCatalogResourceAppCat();
+            resource.remove(resourceJobManagerId);
+        }catch (Exception e){
+            logger.error("Error while deleting resource job manager..", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+	public String addLocalJobSubmission(LOCALSubmission localSubmission)
+			throws AppCatalogException {
+		localSubmission.setJobSubmissionInterfaceId(AppCatalogUtils.getID("LOCAL"));
+		String resourceJobManagerId = addResourceJobManager(localSubmission.getResourceJobManager());
+		LocalSubmissionAppCatalogResourceAppCat localJobSubmission = AppCatalogThriftConversion.getLocalJobSubmission(localSubmission);
+		localJobSubmission.setResourceJobManagerId(resourceJobManagerId);
+		localJobSubmission.getResourceJobManagerResource().setResourceJobManagerId(resourceJobManagerId);
+    	localJobSubmission.save();
+    	return localJobSubmission.getJobSubmissionInterfaceId();
+	}
+
+	@Override
+	public String addLocalDataMovement(LOCALDataMovement localDataMovement)
+			throws AppCatalogException {
+		localDataMovement.setDataMovementInterfaceId(AppCatalogUtils.getID("LOCAL"));
+		LocalDataMovementAppCatalogResourceAppCat ldm = AppCatalogThriftConversion.getLocalDataMovement(localDataMovement);
+		ldm.save();
+    	return ldm.getDataMovementInterfaceId();
+	}
+
+	@Override
+	public LOCALSubmission getLocalJobSubmission(String submissionId)
+			throws AppCatalogException {
+		LocalSubmissionAppCatalogResourceAppCat localSubmissionResource = new LocalSubmissionAppCatalogResourceAppCat();
+		localSubmissionResource= (LocalSubmissionAppCatalogResourceAppCat)localSubmissionResource.get(submissionId);
+		return AppCatalogThriftConversion.getLocalJobSubmission(localSubmissionResource);
+	}
+
+	@Override
+	public LOCALDataMovement getLocalDataMovement(String datamovementId)
+			throws AppCatalogException {
+		LocalDataMovementAppCatalogResourceAppCat localDataMovementResource = new LocalDataMovementAppCatalogResourceAppCat();
+		localDataMovementResource = (LocalDataMovementAppCatalogResourceAppCat) localDataMovementResource.get(datamovementId);
+		return AppCatalogThriftConversion.getLocalDataMovement(localDataMovementResource);
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
new file mode 100644
index 0000000..05cbcdc
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/GwyResourceProfileImpl.java
@@ -0,0 +1,252 @@
+/*
+ *
+ * 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.registry.core.app.catalog.impl;
+
+import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
+import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
+import org.apache.airavata.model.appcatalog.gatewayprofile.gatewayResourceProfileModelConstants;
+import org.apache.airavata.registry.core.app.catalog.resources.*;
+import org.apache.airavata.registry.core.app.catalog.util.AppCatalogThriftConversion;
+import org.apache.airavata.registry.cpi.AppCatalogException;
+import org.apache.airavata.registry.cpi.GwyResourceProfile;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class GwyResourceProfileImpl implements GwyResourceProfile {
+    private final static Logger logger = LoggerFactory.getLogger(GwyResourceProfileImpl.class);
+
+    @Override
+    public String addGatewayResourceProfile(org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile gatewayProfile) throws AppCatalogException {
+        try {
+            GatewayProfileAppCatalogResourceAppCat profileResource = new GatewayProfileAppCatalogResourceAppCat();
+            if (!gatewayProfile.getGatewayID().equals("") && !gatewayProfile.getGatewayID().equals(gatewayResourceProfileModelConstants.DEFAULT_ID)){
+                profileResource.setGatewayID(gatewayProfile.getGatewayID());
+            }
+//            profileResource.setGatewayID(gatewayProfile.getGatewayID());
+            profileResource.save();
+            List<ComputeResourcePreference> computeResourcePreferences = gatewayProfile.getComputeResourcePreferences();
+            if (computeResourcePreferences != null && !computeResourcePreferences.isEmpty()){
+                for (ComputeResourcePreference preference : computeResourcePreferences ){
+                    ComputeHostPreferenceAppCatalogResourceAppCat resource = new ComputeHostPreferenceAppCatalogResourceAppCat();
+                    resource.setGatewayProfile(profileResource);
+                    resource.setResourceId(preference.getComputeResourceId());
+                    ComputeResourceAppCatalogResourceAppCat computeHostResource = new ComputeResourceAppCatalogResourceAppCat();
+                    resource.setComputeHostResource((ComputeResourceAppCatalogResourceAppCat)computeHostResource.get(preference.getComputeResourceId()));
+                    resource.setGatewayId(profileResource.getGatewayID());
+                    resource.setOverrideByAiravata(preference.isOverridebyAiravata());
+                    resource.setLoginUserName(preference.getLoginUserName());
+                    if (preference.getPreferredJobSubmissionProtocol() != null){
+                        resource.setPreferredJobProtocol(preference.getPreferredJobSubmissionProtocol().toString());
+                    }
+
+                    if (preference.getPreferredDataMovementProtocol() != null){
+                        resource.setPreferedDMProtocol(preference.getPreferredDataMovementProtocol().toString());
+                    }
+
+                    resource.setBatchQueue(preference.getPreferredBatchQueue());
+                    resource.setProjectNumber(preference.getAllocationProjectNumber());
+                    resource.setScratchLocation(preference.getScratchLocation());
+                    resource.save();
+                }
+            }
+            return profileResource.getGatewayID();
+        }catch (Exception e) {
+            logger.error("Error while saving gateway profile...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void updateGatewayResourceProfile(String gatewayId, org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile updatedProfile) throws AppCatalogException {
+        try {
+            GatewayProfileAppCatalogResourceAppCat profileResource = new GatewayProfileAppCatalogResourceAppCat();
+            GatewayProfileAppCatalogResourceAppCat existingGP = (GatewayProfileAppCatalogResourceAppCat)profileResource.get(gatewayId);
+            existingGP.save();
+
+            List<ComputeResourcePreference> computeResourcePreferences = updatedProfile.getComputeResourcePreferences();
+            if (computeResourcePreferences != null && !computeResourcePreferences.isEmpty()){
+                for (ComputeResourcePreference preference : computeResourcePreferences ){
+                    ComputeHostPreferenceAppCatalogResourceAppCat resource = new ComputeHostPreferenceAppCatalogResourceAppCat();
+                    resource.setGatewayProfile(existingGP);
+                    resource.setResourceId(preference.getComputeResourceId());
+                    ComputeResourceAppCatalogResourceAppCat computeHostResource = new ComputeResourceAppCatalogResourceAppCat();
+                    resource.setComputeHostResource((ComputeResourceAppCatalogResourceAppCat)computeHostResource.get(preference.getComputeResourceId()));
+                    resource.setGatewayId(gatewayId);
+                    resource.setLoginUserName(preference.getLoginUserName());
+                    resource.setOverrideByAiravata(preference.isOverridebyAiravata());
+                    if (preference.getPreferredJobSubmissionProtocol() != null){
+                        resource.setPreferredJobProtocol(preference.getPreferredJobSubmissionProtocol().toString());
+                    }
+
+                    if (preference.getPreferredDataMovementProtocol() != null){
+                        resource.setPreferedDMProtocol(preference.getPreferredDataMovementProtocol().toString());
+                    }
+                    resource.setBatchQueue(preference.getPreferredBatchQueue());
+                    resource.setProjectNumber(preference.getAllocationProjectNumber());
+                    resource.setScratchLocation(preference.getScratchLocation());
+                    resource.save();
+                }
+            }
+        }catch (Exception e) {
+            logger.error("Error while updating gateway profile...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public GatewayResourceProfile getGatewayProfile(String gatewayId) throws AppCatalogException {
+        try {
+            GatewayProfileAppCatalogResourceAppCat resource = new GatewayProfileAppCatalogResourceAppCat();
+            GatewayProfileAppCatalogResourceAppCat gwresource = (GatewayProfileAppCatalogResourceAppCat)resource.get(gatewayId);
+            ComputeHostPreferenceAppCatalogResourceAppCat prefResource = new ComputeHostPreferenceAppCatalogResourceAppCat();
+            List<AppCatalogResource> computePrefList = prefResource.get(AppCatAbstractResource.ComputeResourcePreferenceConstants.GATEWAY_ID, gatewayId);
+            List<ComputeResourcePreference> computeResourcePreferences = AppCatalogThriftConversion.getComputeResourcePreferences(computePrefList);
+            return AppCatalogThriftConversion.getGatewayResourceProfile(gwresource, computeResourcePreferences);
+        }catch (Exception e) {
+            logger.error("Error while retrieving gateway profile...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public boolean removeGatewayResourceProfile(String gatewayId) throws AppCatalogException {
+       try {
+           GatewayProfileAppCatalogResourceAppCat resource = new GatewayProfileAppCatalogResourceAppCat();
+           resource.remove(gatewayId);
+           return true;
+       }catch (Exception e) {
+           logger.error("Error while deleting gateway profile...", e);
+           throw new AppCatalogException(e);
+       }
+    }
+
+    @Override
+    public boolean removeComputeResourcePreferenceFromGateway(String gatewayId, String preferenceId) throws AppCatalogException {
+        try {
+            ComputeHostPreferenceAppCatalogResourceAppCat resource = new ComputeHostPreferenceAppCatalogResourceAppCat();
+            Map<String, String> ids = new HashMap<String, String>();
+            ids.put(AppCatAbstractResource.ComputeResourcePreferenceConstants.GATEWAY_ID, gatewayId);
+            ids.put(AppCatAbstractResource.ComputeResourcePreferenceConstants.RESOURCE_ID, preferenceId);
+            resource.remove(ids);
+            return true;
+        }catch (Exception e) {
+            logger.error("Error while deleting gateway profile...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public boolean isGatewayResourceProfileExists(String gatewayId) throws AppCatalogException {
+        try {
+            GatewayProfileAppCatalogResourceAppCat resource = new GatewayProfileAppCatalogResourceAppCat();
+            return resource.isExists(gatewayId);
+        }catch (Exception e) {
+            logger.error("Error while retrieving gateway profile...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    /**
+     * @param gatewayId
+     * @param hostId
+     * @return ComputeResourcePreference
+     */
+    @Override
+    public ComputeResourcePreference getComputeResourcePreference(String gatewayId, String hostId) throws AppCatalogException {
+        try {
+            ComputeHostPreferenceAppCatalogResourceAppCat prefResource = new ComputeHostPreferenceAppCatalogResourceAppCat();
+            List<AppCatalogResource> computePrefList = prefResource.get(AppCatAbstractResource.ComputeResourcePreferenceConstants.GATEWAY_ID, gatewayId);
+            for (AppCatalogResource resource : computePrefList){
+                ComputeHostPreferenceAppCatalogResourceAppCat cmP = (ComputeHostPreferenceAppCatalogResourceAppCat) resource;
+                if (cmP.getResourceId() != null && !cmP.getResourceId().equals("")){
+                    if (cmP.getResourceId().equals(hostId)){
+                        return AppCatalogThriftConversion.getComputeResourcePreference(cmP);
+                    }
+                }
+            }
+        }catch (Exception e) {
+            logger.error("Error while retrieving compute resource preference...", e);
+            throw new AppCatalogException(e);
+        }
+        return null;
+    }
+
+    /**
+     * @param gatewayId
+     * @return
+     */
+    @Override
+    public List<ComputeResourcePreference> getAllComputeResourcePreferences(String gatewayId) throws AppCatalogException {
+        try {
+            ComputeHostPreferenceAppCatalogResourceAppCat prefResource = new ComputeHostPreferenceAppCatalogResourceAppCat();
+            List<AppCatalogResource> computePrefList = prefResource.get(AppCatAbstractResource.ComputeResourcePreferenceConstants.GATEWAY_ID, gatewayId);
+            return AppCatalogThriftConversion.getComputeResourcePreferences(computePrefList);
+        }catch (Exception e) {
+            logger.error("Error while retrieving compute resource preference...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public List<String> getGatewayProfileIds(String gatewayName) throws AppCatalogException {
+        try {
+            GatewayProfileAppCatalogResourceAppCat profileResource = new GatewayProfileAppCatalogResourceAppCat();
+            List<AppCatalogResource> resourceList = profileResource.get(AppCatAbstractResource.GatewayProfileConstants.GATEWAY_ID, gatewayName);
+            List<String> gatewayIds = new ArrayList<String>();
+            if (resourceList != null && !resourceList.isEmpty()){
+                for (AppCatalogResource resource : resourceList){
+                    gatewayIds.add(((GatewayProfileAppCatalogResourceAppCat)resource).getGatewayID());
+                }
+            }
+            return gatewayIds;
+        }catch (Exception e) {
+            logger.error("Error while retrieving gateway ids...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public List<GatewayResourceProfile> getAllGatewayProfiles() throws AppCatalogException {
+        try {
+            List<GatewayResourceProfile> gatewayResourceProfileList = new ArrayList<GatewayResourceProfile>();
+            GatewayProfileAppCatalogResourceAppCat profileResource = new GatewayProfileAppCatalogResourceAppCat();
+            List<AppCatalogResource> resourceList = profileResource.getAll();
+            if (resourceList != null && !resourceList.isEmpty()){
+                for (AppCatalogResource resource : resourceList){
+                    GatewayProfileAppCatalogResourceAppCat gatewayProfileResource = (GatewayProfileAppCatalogResourceAppCat)resource;
+                    List<ComputeResourcePreference> computeResourcePreferences = getAllComputeResourcePreferences(gatewayProfileResource.getGatewayID());
+                    GatewayResourceProfile gatewayResourceProfile = AppCatalogThriftConversion.getGatewayResourceProfile(gatewayProfileResource, computeResourcePreferences);
+                    gatewayResourceProfileList.add(gatewayResourceProfile);
+                }
+            }
+            return gatewayResourceProfileList;
+        }catch (Exception e) {
+            logger.error("Error while retrieving gateway ids...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/WorkflowCatalogImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/WorkflowCatalogImpl.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/WorkflowCatalogImpl.java
new file mode 100644
index 0000000..3a400cc
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/WorkflowCatalogImpl.java
@@ -0,0 +1,232 @@
+/*
+ *
+ * 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.registry.core.app.catalog.impl;
+
+import org.apache.airavata.model.Workflow;
+import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType;
+import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType;
+import org.apache.airavata.registry.core.app.catalog.resources.*;
+import org.apache.airavata.registry.core.app.catalog.util.AppCatalogThriftConversion;
+import org.apache.airavata.registry.core.app.catalog.util.AppCatalogUtils;
+import org.apache.airavata.registry.cpi.AppCatalogException;
+import org.apache.airavata.registry.cpi.WorkflowCatalog;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WorkflowCatalogImpl implements WorkflowCatalog {
+    private final static Logger logger = LoggerFactory.getLogger(WorkflowCatalogImpl.class);
+
+    @Override
+    public List<String> getAllWorkflows(String gatewayId) throws AppCatalogException {
+        List<String> workflowIds = new ArrayList<String>();
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            resource.setGatewayId(gatewayId);
+            workflowIds = resource.getAllIds();
+        } catch (Exception e) {
+            logger.error("Error while retrieving all the workflow template ids...", e);
+            throw new AppCatalogException(e);
+        }
+        return workflowIds;
+    }
+
+    @Override
+    public Workflow getWorkflow(String workflowTemplateId) throws AppCatalogException {
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            WorkflowAppCatalogResourceAppCat wfResource = (WorkflowAppCatalogResourceAppCat)resource.get(workflowTemplateId);
+            return AppCatalogThriftConversion.getWorkflow(wfResource);
+        } catch (Exception e) {
+            logger.error("Error while retrieving the workflow...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void deleteWorkflow(String workflowTemplateId) throws AppCatalogException {
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            resource.remove(workflowTemplateId);
+        } catch (Exception e) {
+            logger.error("Error while deleting the workflow...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public String registerWorkflow(Workflow workflow, String gatewayId) throws AppCatalogException {
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            resource.setWfTemplateId(AppCatalogUtils.getID(workflow.getName()));
+            resource.setWfName(workflow.getName());
+            resource.setGraph(workflow.getGraph());
+            resource.setGatewayId(gatewayId);
+            if (workflow.getImage() != null){
+                resource.setImage(new String(workflow.getImage()));
+            }
+            resource.save();
+            workflow.setTemplateId(resource.getWfTemplateId());
+            List<InputDataObjectType> workflowInputs = workflow.getWorkflowInputs();
+            if (workflowInputs != null && workflowInputs.size() != 0){
+                for (InputDataObjectType input : workflowInputs){
+                    WorkflowInputAppCatalogResourceAppCat wfInputResource = new WorkflowInputAppCatalogResourceAppCat();
+                    wfInputResource.setWorkflowResource(resource);
+                    wfInputResource.setInputKey(input.getName());
+                    wfInputResource.setInputVal(input.getValue());
+                    wfInputResource.setWfTemplateId(resource.getWfTemplateId());
+                    wfInputResource.setDataType(input.getType().toString());
+                    wfInputResource.setAppArgument(input.getApplicationArgument());
+                    wfInputResource.setStandardInput(input.isStandardInput());
+                    wfInputResource.setUserFriendlyDesc(input.getUserFriendlyDescription());
+                    wfInputResource.setMetadata(input.getMetaData());
+                    wfInputResource.save();
+                }
+            }
+            List<OutputDataObjectType> workflowOutputs = workflow.getWorkflowOutputs();
+            if (workflowOutputs != null && workflowOutputs.size() != 0){
+                for (OutputDataObjectType output : workflowOutputs){
+                    WorkflowOutputAppCatalogResourceAppCat outputResource = new WorkflowOutputAppCatalogResourceAppCat();
+                    outputResource.setWorkflowResource(resource);
+                    outputResource.setOutputKey(output.getName());
+                    outputResource.setOutputVal(output.getValue());
+                    outputResource.setWfTemplateId(resource.getWfTemplateId());
+                    outputResource.setDataType(output.getType().toString());
+                    outputResource.save();
+                }
+            }
+            return resource.getWfTemplateId();
+        } catch (Exception e) {
+            logger.error("Error while saving the workflow...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public void updateWorkflow(String workflowTemplateId, Workflow workflow) throws AppCatalogException {
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            WorkflowAppCatalogResourceAppCat existingWF = (WorkflowAppCatalogResourceAppCat)resource.get(workflowTemplateId);
+            existingWF.setWfName(workflow.getName());
+            existingWF.setGraph(workflow.getGraph());
+            if (workflow.getImage() != null){
+                existingWF.setImage(new String(workflow.getImage()));
+            }
+            existingWF.save();
+            List<InputDataObjectType> existingwFInputs = workflow.getWorkflowInputs();
+            if (existingwFInputs != null && existingwFInputs.size() != 0){
+                for (InputDataObjectType input : existingwFInputs){
+                    WorkflowInputAppCatalogResourceAppCat wfInputResource = new WorkflowInputAppCatalogResourceAppCat();
+                    Map<String, String> ids = new HashMap<String, String>();
+                    ids.put(AppCatAbstractResource.WFInputConstants.WF_TEMPLATE_ID,existingWF.getWfTemplateId());
+                    ids.put(AppCatAbstractResource.WFInputConstants.INPUT_KEY,input.getName());
+                    WorkflowInputAppCatalogResourceAppCat existingInput = (WorkflowInputAppCatalogResourceAppCat)wfInputResource.get(ids);
+                    existingInput.setWorkflowResource(existingWF);
+                    existingInput.setInputKey(input.getName());
+                    existingInput.setInputVal(input.getValue());
+                    existingInput.setWfTemplateId(existingWF.getWfTemplateId());
+                    existingInput.setDataType(input.getType().toString());
+                    existingInput.setAppArgument(input.getApplicationArgument());
+                    existingInput.setStandardInput(input.isStandardInput());
+                    existingInput.setUserFriendlyDesc(input.getUserFriendlyDescription());
+                    existingInput.setMetadata(input.getMetaData());
+                    existingInput.save();
+                }
+            }
+            List<OutputDataObjectType> workflowOutputs = workflow.getWorkflowOutputs();
+            if (workflowOutputs != null && workflowOutputs.size() != 0){
+                for (OutputDataObjectType output : workflowOutputs){
+                    WorkflowOutputAppCatalogResourceAppCat outputResource = new WorkflowOutputAppCatalogResourceAppCat();
+                    Map<String, String> ids = new HashMap<String, String>();
+                    ids.put(AppCatAbstractResource.WFOutputConstants.WF_TEMPLATE_ID,existingWF.getWfTemplateId());
+                    ids.put(AppCatAbstractResource.WFOutputConstants.OUTPUT_KEY,output.getName());
+                    WorkflowOutputAppCatalogResourceAppCat existingOutput = (WorkflowOutputAppCatalogResourceAppCat)outputResource.get(ids);
+                    existingOutput.setWorkflowResource(existingWF);
+                    existingOutput.setOutputKey(output.getName());
+                    existingOutput.setOutputVal(output.getValue());
+                    existingOutput.setWfTemplateId(existingWF.getWfTemplateId());
+                    existingOutput.setDataType(output.getType().toString());
+                    existingOutput.save();
+                }
+            }
+        } catch (Exception e) {
+            logger.error("Error while updating the workflow...", e);
+            throw new AppCatalogException(e);
+        }
+    }
+
+    @Override
+    public String getWorkflowTemplateId(String workflowName) throws AppCatalogException {
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            List<AppCatalogResource> resourceList = resource.get(AppCatAbstractResource.WorkflowConstants.WF_NAME, workflowName);
+            if (resourceList != null && !resourceList.isEmpty()){
+                WorkflowAppCatalogResourceAppCat wfResource = (WorkflowAppCatalogResourceAppCat)resourceList.get(0);
+                return wfResource.getWfTemplateId();
+            }
+        } catch (Exception e) {
+            logger.error("Error while retrieving the workflow with the workflow name...", e);
+            throw new AppCatalogException(e);
+        }
+        return null;
+    }
+
+    @Override
+    public boolean isWorkflowExistWithName(String workflowName) throws AppCatalogException {
+        try {
+            WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+            List<AppCatalogResource> resourceList = resource.get(AppCatAbstractResource.WorkflowConstants.WF_NAME, workflowName);
+            if (resourceList != null && !resourceList.isEmpty()){
+                return true;
+            }
+        } catch (Exception e) {
+            logger.error("Error while retrieving the workflow with the workflow name...", e);
+            throw new AppCatalogException(e);
+        }
+        return false;
+    }
+
+    @Override
+    public void updateWorkflowOutputs(String workflowTemplateId, List<OutputDataObjectType> workflowOutputs) throws AppCatalogException {
+        WorkflowAppCatalogResourceAppCat resource = new WorkflowAppCatalogResourceAppCat();
+        WorkflowAppCatalogResourceAppCat existingWF = (WorkflowAppCatalogResourceAppCat)resource.get(workflowTemplateId);
+        if (workflowOutputs != null && workflowOutputs.size() != 0) {
+            for (OutputDataObjectType output : workflowOutputs) {
+                WorkflowOutputAppCatalogResourceAppCat outputResource = new WorkflowOutputAppCatalogResourceAppCat();
+                Map<String, String> ids = new HashMap<String, String>();
+                ids.put(AppCatAbstractResource.WFOutputConstants.WF_TEMPLATE_ID, existingWF.getWfTemplateId());
+                ids.put(AppCatAbstractResource.WFOutputConstants.OUTPUT_KEY, output.getName());
+                WorkflowOutputAppCatalogResourceAppCat existingOutput = (WorkflowOutputAppCatalogResourceAppCat) outputResource.get(ids);
+                existingOutput.setWorkflowResource(existingWF);
+                existingOutput.setOutputKey(output.getName());
+                existingOutput.setOutputVal(output.getValue());
+                existingOutput.setWfTemplateId(existingWF.getWfTemplateId());
+                existingOutput.setDataType(output.getType().toString());
+                existingOutput.save();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment.java
new file mode 100644
index 0000000..3d5a842
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment.java
@@ -0,0 +1,76 @@
+/*
+ *
+ * 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.registry.core.app.catalog.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "APP_ENVIRONMENT")
+@IdClass(AppEnvironment_PK.class)
+public class AppEnvironment implements Serializable {
+    @Id
+    @Column(name = "DEPLOYMENT_ID")
+    private String deploymentID;
+    @Id
+    @Column(name = "NAME")
+    private String name;
+
+    @Column(name = "VALUE")
+    private String value;
+
+    @ManyToOne(cascade= CascadeType.MERGE)
+    @JoinColumn(name = "DEPLOYMENT_ID")
+    private ApplicationDeployment applicationDeployment;
+
+    public String getDeploymentID() {
+        return deploymentID;
+    }
+
+    public void setDeploymentID(String deploymentID) {
+        this.deploymentID = deploymentID;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public ApplicationDeployment getApplicationDeployment() {
+        return applicationDeployment;
+    }
+
+    public void setApplicationDeployment(ApplicationDeployment applicationDeployment) {
+        this.applicationDeployment = applicationDeployment;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment_PK.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment_PK.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment_PK.java
new file mode 100644
index 0000000..3859ebd
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppEnvironment_PK.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * 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.registry.core.app.catalog.model;
+
+import java.io.Serializable;
+
+public class AppEnvironment_PK implements Serializable {
+    private String deploymentID;
+    private String name;
+
+    public AppEnvironment_PK(String deploymentID, String name) {
+        this.deploymentID = deploymentID;
+        this.name = name;
+    }
+
+    public AppEnvironment_PK() {
+        ;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return 1;
+    }
+
+    public String getDeploymentID() {
+        return deploymentID;
+    }
+
+    public void setDeploymentID(String deploymentID) {
+        this.deploymentID = deploymentID;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppInput_PK.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppInput_PK.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppInput_PK.java
new file mode 100644
index 0000000..fe9254c
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppInput_PK.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * 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.registry.core.app.catalog.model;
+
+import java.io.Serializable;
+
+public class AppInput_PK implements Serializable {
+    private String interfaceID;
+    private String inputKey;
+
+    public AppInput_PK(String interfaceID, String inputKey) {
+        this.interfaceID = interfaceID;
+        this.inputKey = inputKey;
+    }
+
+    public AppInput_PK() {
+        ;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return 1;
+    }
+
+    public String getInterfaceID() {
+        return interfaceID;
+    }
+
+    public void setInterfaceID(String interfaceID) {
+        this.interfaceID = interfaceID;
+    }
+
+    public String getInputKey() {
+        return inputKey;
+    }
+
+    public void setInputKey(String inputKey) {
+        this.inputKey = inputKey;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/ec8c6202/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppModuleMapping.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppModuleMapping.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppModuleMapping.java
new file mode 100644
index 0000000..6c17af6
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/AppModuleMapping.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.registry.core.app.catalog.model;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "APP_MODULE_MAPPING")
+@IdClass(AppModuleMapping_PK.class)
+public class AppModuleMapping implements Serializable {
+    @Id
+    @Column(name = "INTERFACE_ID")
+    private String interfaceID;
+    @Id
+    @Column(name = "MODULE_ID")
+    private String moduleID;
+
+    @ManyToOne(cascade= CascadeType.MERGE)
+    @JoinColumn(name = "INTERFACE_ID")
+    private ApplicationInterface applicationInterface;
+
+    @ManyToOne(cascade= CascadeType.MERGE)
+    @JoinColumn(name = "MODULE_ID")
+    private ApplicationModule applicationModule;
+
+    public String getInterfaceID() {
+        return interfaceID;
+    }
+
+    public void setInterfaceID(String interfaceID) {
+        this.interfaceID = interfaceID;
+    }
+
+    public String getModuleID() {
+        return moduleID;
+    }
+
+    public void setModuleID(String moduleID) {
+        this.moduleID = moduleID;
+    }
+
+    public ApplicationInterface getApplicationInterface() {
+        return applicationInterface;
+    }
+
+    public void setApplicationInterface(ApplicationInterface applicationInterface) {
+        this.applicationInterface = applicationInterface;
+    }
+
+    public ApplicationModule getApplicationModule() {
+        return applicationModule;
+    }
+
+    public void setApplicationModule(ApplicationModule applicationModule) {
+        this.applicationModule = applicationModule;
+    }
+}