This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch airavata-v2-refactoring
in repository https://gitbox.apache.org/repos/asf/airavata.git


The following commit(s) were added to refs/heads/airavata-v2-refactoring by 
this push:
     new 39d863eeab Fixed collection mappings
39d863eeab is described below

commit 39d863eeab47f2e2f1aaab70ffe6f3b2137a8ed0
Author: Marcus Christie <[email protected]>
AuthorDate: Mon Jun 12 21:09:43 2023 -0400

    Fixed collection mappings
---
 modules/airavata-apis/airavata-apis-server/pom.xml |  10 ++
 .../java/org/apache/airavata/apis/APIRunner.java   |   2 +
 .../apis/db/entity/ApplicationRunInfoEntity.java   |  57 +++---------
 .../apache/airavata/apis/db/entity/BaseEntity.java | 101 +++++++++++++++++++++
 .../db/entity/DataMovementConfigurationEntity.java |  54 ++---------
 .../airavata/apis/db/entity/ExperimentEntity.java  |  25 ++---
 .../apis/db/entity/RunConfigurationEntity.java     |  63 ++++---------
 .../db/entity/application/ApplicationEntity.java   |  34 +++----
 .../application/input/ApplicationInputEntity.java  |  18 +---
 .../input/ApplicationInputValueEntity.java         |  48 ++--------
 .../output/ApplicationOutputEntity.java            |  52 ++---------
 .../output/ApplicationOutputValueEntity.java       |  49 ++--------
 .../application/runners/DockerRunnerEntity.java    |  12 +--
 .../application/runners/SlurmRunnerEntity.java     |  12 +--
 .../db/entity/backend/ComputeBackendEntity.java    |  47 +---------
 .../db/entity/backend/ServerBackendEntity.java     |  13 +--
 .../entity/backend/iface/SCPInterfaceEntity.java   |  44 +--------
 .../entity/backend/iface/SSHInterfaceEntity.java   |  46 +---------
 .../apis/db/entity/data/FileLocationEntity.java    |  43 +--------
 .../apis/db/entity/data/InDataMovementEntity.java  |  49 +---------
 .../apis/db/entity/data/OutDataMovementEntity.java |  49 +---------
 .../input/CommandLineInputRepository.java          |   1 -
 .../apis/handlers/ExecutionHandlerTest.java        |  34 ++++++-
 23 files changed, 258 insertions(+), 605 deletions(-)

diff --git a/modules/airavata-apis/airavata-apis-server/pom.xml 
b/modules/airavata-apis/airavata-apis-server/pom.xml
index 05be9af07a..d4642ec899 100644
--- a/modules/airavata-apis/airavata-apis-server/pom.xml
+++ b/modules/airavata-apis/airavata-apis-server/pom.xml
@@ -73,6 +73,16 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <version>${spring.boot.data.jpa}</version>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>log4j-to-slf4j</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>com.github.dozermapper</groupId>
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/APIRunner.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/APIRunner.java
index 506504ca2c..c3f9d5a9cb 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/APIRunner.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/APIRunner.java
@@ -5,6 +5,7 @@ import 
org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.PropertySource;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
 
 @SpringBootApplication
 @ComponentScan(basePackages = {"org.apache.airavata",
@@ -12,6 +13,7 @@ import org.springframework.context.annotation.PropertySource;
         "org.apache.airavata.mft.resource.server.handler"
 })
 @EntityScan(basePackages = {"org.apache.airavata"})
+@EnableJpaAuditing
 @PropertySource(value = "classpath:api.properties")
 public class APIRunner {
 
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ApplicationRunInfoEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ApplicationRunInfoEntity.java
index 3d10974436..62ff3847ae 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ApplicationRunInfoEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ApplicationRunInfoEntity.java
@@ -3,38 +3,28 @@ package org.apache.airavata.apis.db.entity;
 import org.apache.airavata.apis.db.entity.application.ApplicationEntity;
 import 
org.apache.airavata.apis.db.entity.application.runners.DockerRunnerEntity;
 import 
org.apache.airavata.apis.db.entity.application.runners.SlurmRunnerEntity;
-import org.hibernate.annotations.GenericGenerator;
 
-import javax.persistence.*;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
 
 @Entity
-public class ApplicationRunInfoEntity {
+public class ApplicationRunInfoEntity extends BaseEntity {
 
-    @Id
-    @Column(name = "APP_RUNNER_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String appRunnerId;
 
-    @OneToOne
-    @JoinColumn(name = "application_id", referencedColumnName = 
"application_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "application_id")
     private ApplicationEntity application;
 
-    @OneToOne
-    @JoinColumn(name = "docker_runner_id", referencedColumnName = 
"docker_runner_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "docker_runner_id")
     DockerRunnerEntity dockerRunner;
 
-    @OneToOne
-    @JoinColumn(name = "slurm_runner_id", referencedColumnName = 
"slurm_runner_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "slurm_runner_id")
     SlurmRunnerEntity slurmRunner;
 
-    public String getAppRunnerId() {
-        return appRunnerId;
-    }
-
-    public void setAppRunnerId(String appRunnerId) {
-        this.appRunnerId = appRunnerId;
-    }
 
     public ApplicationEntity getApplication() {
         return application;
@@ -60,29 +50,4 @@ public class ApplicationRunInfoEntity {
         this.slurmRunner = slurmRunner;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((appRunnerId == null) ? 0 : 
appRunnerId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ApplicationRunInfoEntity other = (ApplicationRunInfoEntity) obj;
-        if (appRunnerId == null) {
-            if (other.appRunnerId != null)
-                return false;
-        } else if (!appRunnerId.equals(other.appRunnerId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/BaseEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/BaseEntity.java
new file mode 100644
index 0000000000..18a99f8819
--- /dev/null
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/BaseEntity.java
@@ -0,0 +1,101 @@
+/*
+ *
+ * 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.apis.db.entity;
+
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.Column;
+import javax.persistence.EntityListeners;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+import java.time.Instant;
+import java.util.UUID;
+
+@MappedSuperclass
+@EntityListeners(AuditingEntityListener.class)
+public abstract class BaseEntity {
+
+    @Id
+    @Column(length = 36)
+    String id = UUID.randomUUID().toString();
+
+    @Column(nullable = false, updatable = false)
+    @CreatedDate
+    Instant createdAt;
+
+    @Column
+    @LastModifiedDate
+    Instant lastModifiedAt;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Instant getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Instant createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Instant getLastModifiedAt() {
+        return lastModifiedAt;
+    }
+
+    public void setLastModifiedAt(Instant lastModifiedAt) {
+        this.lastModifiedAt = lastModifiedAt;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((id == null) ? 0 : id.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        BaseEntity other = (BaseEntity) obj;
+        if (id == null) {
+            if (other.id != null)
+                return false;
+        } else if (!id.equals(other.id))
+            return false;
+        return true;
+    }
+
+}
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/DataMovementConfigurationEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/DataMovementConfigurationEntity.java
index 0c49bb42b5..b4c471b70e 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/DataMovementConfigurationEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/DataMovementConfigurationEntity.java
@@ -2,45 +2,33 @@ package org.apache.airavata.apis.db.entity;
 
 import org.apache.airavata.apis.db.entity.data.InDataMovementEntity;
 import org.apache.airavata.apis.db.entity.data.OutDataMovementEntity;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 
 import java.util.Set;
 
 @Entity
-public class DataMovementConfigurationEntity {
+public class DataMovementConfigurationEntity extends BaseEntity {
 
-    @Id
-    @Column(name = "DM_CONFIG_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String dmConfig;
-
-    @OneToMany(mappedBy = "dataMovementConfiguration")
+    @OneToMany(mappedBy = "dataMovementConfiguration", cascade = 
CascadeType.ALL)
     Set<InDataMovementEntity> inMovements;
 
-    @OneToMany(mappedBy = "dataMovementConfiguration")
+    @OneToMany(mappedBy = "dataMovementConfiguration", cascade = 
CascadeType.ALL)
     Set<OutDataMovementEntity> outMovements;
 
     @ManyToOne
-    @JoinColumn(name = "run_config_id")
+    @JoinColumn(name = "run_config_id", nullable = false)
     RunConfigurationEntity runConfiguration;
 
-    public String getDmConfig() {
-        return dmConfig;
-    }
-
-    public void setDmConfig(String dmConfig) {
-        this.dmConfig = dmConfig;
-    }
-
     public Set<InDataMovementEntity> getInMovements() {
         return inMovements;
     }
 
     public void setInMovements(Set<InDataMovementEntity> inMovements) {
         this.inMovements = inMovements;
+        for (InDataMovementEntity inMovement : inMovements) {
+            inMovement.setDataMovementConfiguration(this);
+        }
     }
 
     public Set<OutDataMovementEntity> getOutMovements() {
@@ -49,6 +37,9 @@ public class DataMovementConfigurationEntity {
 
     public void setOutMovements(Set<OutDataMovementEntity> outMovements) {
         this.outMovements = outMovements;
+        for (OutDataMovementEntity outMovement : outMovements) {
+            outMovement.setDataMovementConfiguration(this);
+        }
     }
 
     public RunConfigurationEntity getRunConfiguration() {
@@ -59,29 +50,4 @@ public class DataMovementConfigurationEntity {
         this.runConfiguration = runConfiguration;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((dmConfig == null) ? 0 : 
dmConfig.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        DataMovementConfigurationEntity other = 
(DataMovementConfigurationEntity) obj;
-        if (dmConfig == null) {
-            if (other.dmConfig != null)
-                return false;
-        } else if (!dmConfig.equals(other.dmConfig))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ExperimentEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ExperimentEntity.java
index 49f86691cf..a8b1e73fc8 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ExperimentEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/ExperimentEntity.java
@@ -1,18 +1,14 @@
 package org.apache.airavata.apis.db.entity;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
 
 import java.util.List;
 
 @Entity
-public class ExperimentEntity {
-    @Id
-    @Column(name = "EXPERIMENT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String experimentId;
+public class ExperimentEntity extends BaseEntity {
 
     @Column(name = "PROJECT_ID")
     String projectId;
@@ -29,15 +25,11 @@ public class ExperimentEntity {
     @Column(name = "DESCRIPTION")
     String description;
 
-    @OneToMany(mappedBy = "experiment")
+    @OneToMany(mappedBy = "experiment", cascade = CascadeType.ALL)
     List<RunConfigurationEntity> runConfigs;
 
     public String getExperimentId() {
-        return experimentId;
-    }
-
-    public void setExperimentId(String experimentId) {
-        this.experimentId = experimentId;
+        return getId().toString();
     }
 
     public String getProjectId() {
@@ -86,5 +78,8 @@ public class ExperimentEntity {
 
     public void setRunConfigs(List<RunConfigurationEntity> runConfigs) {
         this.runConfigs = runConfigs;
+        for (RunConfigurationEntity runConfig : runConfigs) {
+            runConfig.setExperiment(this);
+        }
     }
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/RunConfigurationEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/RunConfigurationEntity.java
index 16ea643656..503abe89cd 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/RunConfigurationEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/RunConfigurationEntity.java
@@ -4,45 +4,29 @@ import 
org.apache.airavata.apis.db.entity.backend.ComputeBackendEntity;
 import org.apache.airavata.apis.db.entity.backend.EC2BackendEntity;
 import org.apache.airavata.apis.db.entity.backend.LocalBackendEntity;
 import org.apache.airavata.apis.db.entity.backend.ServerBackendEntity;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 
 import java.util.List;
 
 @Entity
-public class RunConfigurationEntity {
+public class RunConfigurationEntity extends BaseEntity {
 
-    @Id
-    @Column(name = "RUN_CONFIG_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String runConfigId;
-
-    @OneToOne
+    @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "backend_id")
     ComputeBackendEntity computeBackend;
 
-    @OneToOne
+    @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "app_runner_id")
     ApplicationRunInfoEntity appRunInfo;
 
-    @OneToMany(mappedBy = "runConfiguration")
+    @OneToMany(mappedBy = "runConfiguration", cascade = CascadeType.ALL)
     List<DataMovementConfigurationEntity> dataMovementConfigs;
 
     @ManyToOne
-    @JoinColumn(name = "experiment_id")
+    @JoinColumn(name = "experiment_id", nullable = false)
     ExperimentEntity experiment;
 
-    public String getRunConfigId() {
-        return runConfigId;
-    }
-
-    public void setRunConfigId(String runConfigId) {
-        this.runConfigId = runConfigId;
-    }
-
-
     public ApplicationRunInfoEntity getAppRunInfo() {
         return appRunInfo;
     }
@@ -57,6 +41,9 @@ public class RunConfigurationEntity {
 
     public void setDataMovementConfigs(List<DataMovementConfigurationEntity> 
dataMovementConfigs) {
         this.dataMovementConfigs = dataMovementConfigs;
+        for (DataMovementConfigurationEntity dataMovementConfig : 
dataMovementConfigs) {
+            dataMovementConfig.setRunConfiguration(this);
+        }
     }
 
     public ComputeBackendEntity getComputeBackend() {
@@ -67,6 +54,14 @@ public class RunConfigurationEntity {
         this.computeBackend = computeBackend;
     }
 
+    public ExperimentEntity getExperiment() {
+        return experiment;
+    }
+
+    public void setExperiment(ExperimentEntity experiment) {
+        this.experiment = experiment;
+    }
+
     /*
      * Helper getters/setters for mapping from/to protobuf messages
      */
@@ -94,30 +89,4 @@ public class RunConfigurationEntity {
     public void setLocal(LocalBackendEntity localBackendEntity) {
         this.computeBackend = localBackendEntity;
     }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((runConfigId == null) ? 0 : 
runConfigId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        RunConfigurationEntity other = (RunConfigurationEntity) obj;
-        if (runConfigId == null) {
-            if (other.runConfigId != null)
-                return false;
-        } else if (!runConfigId.equals(other.runConfigId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/ApplicationEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/ApplicationEntity.java
index d3dd767d37..eebf7633f5 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/ApplicationEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/ApplicationEntity.java
@@ -1,32 +1,26 @@
 package org.apache.airavata.apis.db.entity.application;
 
+import org.apache.airavata.apis.db.entity.BaseEntity;
 import 
org.apache.airavata.apis.db.entity.application.input.ApplicationInputEntity;
 import 
org.apache.airavata.apis.db.entity.application.output.ApplicationOutputEntity;
-import org.hibernate.annotations.GenericGenerator;
 
-import javax.persistence.*;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+
 import java.util.Set;
 
 @Entity
-public class ApplicationEntity {
-
-    @Id
-    @Column(name = "APPLICATION_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String applicationId;
+public class ApplicationEntity extends BaseEntity {
 
     @Column(name = "APPLICATION_NAME")
     private String name;
 
-    public String getApplicationId() {
-        return applicationId;
-    }
-
-    @OneToMany(mappedBy="application")
+    @OneToMany(mappedBy = "application", cascade = CascadeType.ALL)
     private Set<ApplicationInputEntity> inputs;
 
-    @OneToMany(mappedBy="application")
+    @OneToMany(mappedBy = "application", cascade = CascadeType.ALL)
     private Set<ApplicationOutputEntity> outputs;
 
     public Set<ApplicationInputEntity> getInputs() {
@@ -35,6 +29,9 @@ public class ApplicationEntity {
 
     public void setInputs(Set<ApplicationInputEntity> inputs) {
         this.inputs = inputs;
+        for (ApplicationInputEntity input : inputs) {
+            input.setApplication(this);
+        }
     }
 
     public Set<ApplicationOutputEntity> getOutputs() {
@@ -43,10 +40,9 @@ public class ApplicationEntity {
 
     public void setOutputs(Set<ApplicationOutputEntity> outputs) {
         this.outputs = outputs;
-    }
-
-    public void setApplicationId(String applicationId) {
-        this.applicationId = applicationId;
+        for (ApplicationOutputEntity output : outputs) {
+            output.setApplication(this);
+        }
     }
 
     public String getName() {
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
index 2139b8f848..ba8645d16e 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputEntity.java
@@ -1,18 +1,12 @@
 package org.apache.airavata.apis.db.entity.application.input;
 
+import org.apache.airavata.apis.db.entity.BaseEntity;
 import org.apache.airavata.apis.db.entity.application.ApplicationEntity;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 
 @Entity
-public class ApplicationInputEntity {
-
-    @Id
-    @Column(name = "APPLICATION_INPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String applicationInputId;
+public class ApplicationInputEntity extends BaseEntity {
 
     @Column
     private int index;
@@ -36,14 +30,6 @@ public class ApplicationInputEntity {
         this.application = application;
     }
 
-    public String getApplicationInputId() {
-        return applicationInputId;
-    }
-
-    public void setApplicationInputId(String applicationInputId) {
-        this.applicationInputId = applicationInputId;
-    }
-
     public int getIndex() {
         return index;
     }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
index 50679fe4b6..22d0a67dd9 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
@@ -1,30 +1,19 @@
 package org.apache.airavata.apis.db.entity.application.input;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.OneToOne;
 
 @Entity
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public abstract class ApplicationInputValueEntity {
-
-    @Id
-    @Column(name = "INPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String inputId;
+public abstract class ApplicationInputValueEntity extends BaseEntity {
 
     @OneToOne(mappedBy = "applicationInputValue")
     private ApplicationInputEntity applicationInput;
 
-    public String getInputId() {
-        return inputId;
-    }
-
-    public void setInputId(String inputId) {
-        this.inputId = inputId;
-    }
-
     public ApplicationInputEntity getApplicationInput() {
         return applicationInput;
     }
@@ -33,29 +22,4 @@ public abstract class ApplicationInputValueEntity {
         this.applicationInput = applicationInput;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((inputId == null) ? 0 : inputId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ApplicationInputValueEntity other = (ApplicationInputValueEntity) obj;
-        if (inputId == null) {
-            if (other.inputId != null)
-                return false;
-        } else if (!inputId.equals(other.inputId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
index 2ee364c7dc..96893ed75c 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputEntity.java
@@ -1,18 +1,12 @@
 package org.apache.airavata.apis.db.entity.application.output;
 
+import org.apache.airavata.apis.db.entity.BaseEntity;
 import org.apache.airavata.apis.db.entity.application.ApplicationEntity;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 
 @Entity
-public class ApplicationOutputEntity {
-
-    @Id
-    @Column(name = "APPLICATION_OUTPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String applicationOutputId;
+public class ApplicationOutputEntity extends BaseEntity {
 
     @Column
     private int index;
@@ -36,14 +30,6 @@ public class ApplicationOutputEntity {
         this.application = application;
     }
 
-    public String getApplicationOutputId() {
-        return applicationOutputId;
-    }
-
-    public void setApplicationOutputId(String applicationOutputId) {
-        this.applicationOutputId = applicationOutputId;
-    }
-
     public int getIndex() {
         return index;
     }
@@ -76,46 +62,20 @@ public class ApplicationOutputEntity {
         this.applicationOutputValue = fileOutput;
     }
 
-    public StandardErrorEntity getStandardError() {
+    public StandardErrorEntity getStdErr() {
         return applicationOutputValue instanceof StandardErrorEntity ? 
(StandardErrorEntity) applicationOutputValue
                 : null;
     }
 
-    public void setStandardError(StandardErrorEntity standardError) {
+    public void setStdErr(StandardErrorEntity standardError) {
         this.applicationOutputValue = standardError;
     }
 
-    public StandardOutEntity getStandardOut() {
+    public StandardOutEntity getStdOut() {
         return applicationOutputValue instanceof StandardOutEntity ? 
(StandardOutEntity) applicationOutputValue : null;
     }
 
-    public void setStandardOut(StandardOutEntity standardOut) {
+    public void setStdOut(StandardOutEntity standardOut) {
         this.applicationOutputValue = standardOut;
     }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((applicationOutputId == null) ? 0 : 
applicationOutputId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ApplicationOutputEntity other = (ApplicationOutputEntity) obj;
-        if (applicationOutputId == null) {
-            if (other.applicationOutputId != null)
-                return false;
-        } else if (!applicationOutputId.equals(other.applicationOutputId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
index 7c2a416e6e..f3fd9a69cc 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
@@ -1,30 +1,19 @@
 package org.apache.airavata.apis.db.entity.application.output;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.OneToOne;
 
 @Entity
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public abstract class ApplicationOutputValueEntity {
-
-    @Id
-    @Column(name = "OUTPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String outputId;
+public abstract class ApplicationOutputValueEntity extends BaseEntity {
 
     @OneToOne(mappedBy = "applicationOutputValue")
     private ApplicationOutputEntity applicationOutput;
 
-    public String getOutputId() {
-        return outputId;
-    }
-
-    public void setOutputId(String outputId) {
-        this.outputId = outputId;
-    }
-
     public ApplicationOutputEntity getApplicationOutput() {
         return applicationOutput;
     }
@@ -32,30 +21,4 @@ public abstract class ApplicationOutputValueEntity {
     public void setApplicationOutput(ApplicationOutputEntity 
applicationOutput) {
         this.applicationOutput = applicationOutput;
     }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((outputId == null) ? 0 : 
outputId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ApplicationOutputValueEntity other = (ApplicationOutputValueEntity) 
obj;
-        if (outputId == null) {
-            if (other.outputId != null)
-                return false;
-        } else if (!outputId.equals(other.outputId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/DockerRunnerEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/DockerRunnerEntity.java
index fa4fb5cb1d..6346c03f32 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/DockerRunnerEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/DockerRunnerEntity.java
@@ -1,18 +1,10 @@
 package org.apache.airavata.apis.db.entity.application.runners;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
-import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 
 @Entity
-public class DockerRunnerEntity {
+public class DockerRunnerEntity extends BaseEntity {
 
-    @Id
-    @Column(name = "DOCKER_RUNNER_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String dockerRunnerId;
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/SlurmRunnerEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/SlurmRunnerEntity.java
index 6d194765fc..05c0b70124 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/SlurmRunnerEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/runners/SlurmRunnerEntity.java
@@ -1,17 +1,9 @@
 package org.apache.airavata.apis.db.entity.application.runners;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
-import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 
 @Entity
-public class SlurmRunnerEntity {
-    @Id
-    @Column(name = "SLURM_RUNNER_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String slurmRunnerId;
+public class SlurmRunnerEntity extends BaseEntity {
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ComputeBackendEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ComputeBackendEntity.java
index 83d6b2c5e7..a9f5dc7f63 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ComputeBackendEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ComputeBackendEntity.java
@@ -1,50 +1,13 @@
 package org.apache.airavata.apis.db.entity.backend;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
-import javax.persistence.*;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
 
 @Entity
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public abstract class ComputeBackendEntity {
-
-    @Id
-    @Column(name = "BACKEND_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String backendId;
-
-    public String getBackendId() {
-        return backendId;
-    }
-
-    public void setBackendId(String backendId) {
-        this.backendId = backendId;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((backendId == null) ? 0 : 
backendId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ComputeBackendEntity other = (ComputeBackendEntity) obj;
-        if (backendId == null) {
-            if (other.backendId != null)
-                return false;
-        } else if (!backendId.equals(other.backendId))
-            return false;
-        return true;
-    }
+public abstract class ComputeBackendEntity extends BaseEntity {
 
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ServerBackendEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ServerBackendEntity.java
index ddde970def..e823d20d32 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ServerBackendEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/ServerBackendEntity.java
@@ -3,10 +3,7 @@ package org.apache.airavata.apis.db.entity.backend;
 import org.apache.airavata.apis.db.entity.backend.iface.SCPInterfaceEntity;
 import org.apache.airavata.apis.db.entity.backend.iface.SSHInterfaceEntity;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
+import javax.persistence.*;
 
 @Entity
 public class ServerBackendEntity extends ComputeBackendEntity {
@@ -18,12 +15,12 @@ public class ServerBackendEntity extends 
ComputeBackendEntity {
     @Column
     int port;
 
-    @OneToOne
-    @JoinColumn(name = "command_interface_id", referencedColumnName = 
"ssh_iface_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "command_interface_id")
     SSHInterfaceEntity commandInterface;
 
-    @OneToOne
-    @JoinColumn(name = "data_interface_id", referencedColumnName = 
"scp_iface_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "data_interface_id")
     SCPInterfaceEntity dataInterface;
 
     @Column
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SCPInterfaceEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SCPInterfaceEntity.java
index 912d78a567..2d28db992e 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SCPInterfaceEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SCPInterfaceEntity.java
@@ -1,19 +1,12 @@
 package org.apache.airavata.apis.db.entity.backend.iface;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 
 @Entity
-public class SCPInterfaceEntity {
-    @Id
-    @Column(name = "SCP_IFACE_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String scpInterfaceId;
+public class SCPInterfaceEntity extends BaseEntity {
 
     @Column
     String interfaceId;
@@ -27,14 +20,6 @@ public class SCPInterfaceEntity {
     @Column
     String sshCredentialId;
 
-    public String getScpInterfaceId() {
-        return scpInterfaceId;
-    }
-
-    public void setScpInterfaceId(String scpInterfaceId) {
-        this.scpInterfaceId = scpInterfaceId;
-    }
-
     public String getInterfaceId() {
         return interfaceId;
     }
@@ -67,29 +52,4 @@ public class SCPInterfaceEntity {
         this.sshCredentialId = sshCredentialId;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((scpInterfaceId == null) ? 0 : 
scpInterfaceId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        SCPInterfaceEntity other = (SCPInterfaceEntity) obj;
-        if (scpInterfaceId == null) {
-            if (other.scpInterfaceId != null)
-                return false;
-        } else if (!scpInterfaceId.equals(other.scpInterfaceId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SSHInterfaceEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SSHInterfaceEntity.java
index e2e37174ff..8713b51e89 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SSHInterfaceEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/backend/iface/SSHInterfaceEntity.java
@@ -1,20 +1,12 @@
 package org.apache.airavata.apis.db.entity.backend.iface;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 
 @Entity
-public class SSHInterfaceEntity {
-
-    @Id
-    @Column(name = "SSH_IFACE_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String sshInterfaceId;
+public class SSHInterfaceEntity extends BaseEntity {
 
     @Column
     String hostName;
@@ -23,14 +15,6 @@ public class SSHInterfaceEntity {
     @Column
     String sshCredentialId;
 
-    public String getSshInterfaceId() {
-        return sshInterfaceId;
-    }
-
-    public void setSshInterfaceId(String sshInterfaceId) {
-        this.sshInterfaceId = sshInterfaceId;
-    }
-
     public String getHostName() {
         return hostName;
     }
@@ -55,30 +39,4 @@ public class SSHInterfaceEntity {
         this.sshCredentialId = sshCredentialId;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((sshInterfaceId == null) ? 0 : 
sshInterfaceId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        SSHInterfaceEntity other = (SSHInterfaceEntity) obj;
-        if (sshInterfaceId == null) {
-            if (other.sshInterfaceId != null)
-                return false;
-        } else if (!sshInterfaceId.equals(other.sshInterfaceId))
-            return false;
-        return true;
-    }
-
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/FileLocationEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/FileLocationEntity.java
index 018f33ae1c..a3decd1bf1 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/FileLocationEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/FileLocationEntity.java
@@ -1,20 +1,13 @@
 package org.apache.airavata.apis.db.entity.data;
 
-import org.hibernate.annotations.GenericGenerator;
+import org.apache.airavata.apis.db.entity.BaseEntity;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
 
 @Entity
-public class FileLocationEntity {
+public class FileLocationEntity extends BaseEntity {
 
-    @Id
-    @Column(name = "FILE_LOCATION_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String fileLocationId;
     @Column
     private String storageId;
     @Column
@@ -22,13 +15,6 @@ public class FileLocationEntity {
     @Column
     private String storageCredentialId;
 
-    public String getFileLocationId() {
-        return fileLocationId;
-    }
-
-    public void setFileLocationId(String fileLocationId) {
-        this.fileLocationId = fileLocationId;
-    }
 
     public String getStorageId() {
         return storageId;
@@ -54,29 +40,4 @@ public class FileLocationEntity {
         this.storageCredentialId = storageCredentialId;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((fileLocationId == null) ? 0 : 
fileLocationId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        FileLocationEntity other = (FileLocationEntity) obj;
-        if (fileLocationId == null) {
-            if (other.fileLocationId != null)
-                return false;
-        } else if (!fileLocationId.equals(other.fileLocationId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/InDataMovementEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/InDataMovementEntity.java
index f646f36f70..433a380db1 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/InDataMovementEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/InDataMovementEntity.java
@@ -1,39 +1,25 @@
 package org.apache.airavata.apis.db.entity.data;
 
 
+import org.apache.airavata.apis.db.entity.BaseEntity;
 import org.apache.airavata.apis.db.entity.DataMovementConfigurationEntity;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 
 @Entity
-public class InDataMovementEntity {
-
-    @Id
-    @Column(name = "IN_DM_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String inDataMovementId;
+public class InDataMovementEntity extends BaseEntity {
 
     @Column
     int inputIndex;
 
-    @OneToOne
-    @JoinColumn(name = "source_location_id", referencedColumnName = 
"file_location_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "source_location_id")
     FileLocationEntity sourceLocation;
 
     @ManyToOne
-    @JoinColumn(name = "dm_config_id", referencedColumnName = "dm_config_id")
+    @JoinColumn(name = "dm_config_id", nullable = false)
     DataMovementConfigurationEntity dataMovementConfiguration;
 
-    public String getInDataMovementId() {
-        return inDataMovementId;
-    }
-
-    public void setInDataMovementId(String inDataMovementId) {
-        this.inDataMovementId = inDataMovementId;
-    }
-
     public int getInputIndex() {
         return inputIndex;
     }
@@ -58,29 +44,4 @@ public class InDataMovementEntity {
         this.dataMovementConfiguration = dataMovementConfiguration;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((inDataMovementId == null) ? 0 : 
inDataMovementId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        InDataMovementEntity other = (InDataMovementEntity) obj;
-        if (inDataMovementId == null) {
-            if (other.inDataMovementId != null)
-                return false;
-        } else if (!inDataMovementId.equals(other.inDataMovementId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/OutDataMovementEntity.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/OutDataMovementEntity.java
index 7a7fe28aa0..a0a7b06216 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/OutDataMovementEntity.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/data/OutDataMovementEntity.java
@@ -1,38 +1,24 @@
 package org.apache.airavata.apis.db.entity.data;
 
+import org.apache.airavata.apis.db.entity.BaseEntity;
 import org.apache.airavata.apis.db.entity.DataMovementConfigurationEntity;
-import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
 
 @Entity
-public class OutDataMovementEntity {
-
-    @Id
-    @Column(name = "OUT_DM_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String outDataMovementId;
+public class OutDataMovementEntity extends BaseEntity {
 
     @Column
     int outputIndex = 1;
 
-    @OneToOne
-    @JoinColumn(name = "destination_location_id", referencedColumnName = 
"file_location_id")
+    @OneToOne(cascade = CascadeType.ALL)
+    @JoinColumn(name = "destination_location_id")
     FileLocationEntity destinationLocation;
 
     @ManyToOne
-    @JoinColumn(name = "dm_config_id", referencedColumnName = "dm_config_id")
+    @JoinColumn(name = "dm_config_id", nullable = false)
     DataMovementConfigurationEntity dataMovementConfiguration;
 
-    public String getOutDataMovementId() {
-        return outDataMovementId;
-    }
-
-    public void setOutDataMovementId(String outDataMovementId) {
-        this.outDataMovementId = outDataMovementId;
-    }
-
     public int getOutputIndex() {
         return outputIndex;
     }
@@ -57,29 +43,4 @@ public class OutDataMovementEntity {
         this.dataMovementConfiguration = dataMovementConfiguration;
     }
 
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((outDataMovementId == null) ? 0 : 
outDataMovementId.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        OutDataMovementEntity other = (OutDataMovementEntity) obj;
-        if (outDataMovementId == null) {
-            if (other.outDataMovementId != null)
-                return false;
-        } else if (!outDataMovementId.equals(other.outDataMovementId))
-            return false;
-        return true;
-    }
-
 }
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/repository/application/input/CommandLineInputRepository.java
 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/repository/application/input/CommandLineInputRepository.java
index 9da2174854..8ce47a9e04 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/repository/application/input/CommandLineInputRepository.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/repository/application/input/CommandLineInputRepository.java
@@ -1,6 +1,5 @@
 package org.apache.airavata.apis.db.repository.application.input;
 
-import 
org.apache.airavata.apis.db.entity.application.input.ApplicationInputEntity;
 import 
org.apache.airavata.apis.db.entity.application.input.CommandLineInputEntity;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Repository;
diff --git 
a/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
 
b/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
index d96007e02b..26e66cd1ba 100644
--- 
a/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
+++ 
b/modules/airavata-apis/airavata-apis-server/src/test/java/org/apache/airavata/apis/handlers/ExecutionHandlerTest.java
@@ -14,6 +14,8 @@ import 
org.apache.airavata.apis.db.entity.application.input.EnvironmentInputEnti
 import org.apache.airavata.apis.db.entity.application.input.FileInputEntity;
 import 
org.apache.airavata.apis.db.entity.application.output.ApplicationOutputEntity;
 import org.apache.airavata.apis.db.entity.application.output.FileOutputEntity;
+import 
org.apache.airavata.apis.db.entity.application.output.StandardErrorEntity;
+import org.apache.airavata.apis.db.entity.application.output.StandardOutEntity;
 import org.apache.airavata.apis.db.entity.backend.ComputeBackendEntity;
 import org.apache.airavata.apis.db.entity.backend.ServerBackendEntity;
 import org.apache.airavata.apis.db.entity.backend.iface.SCPInterfaceEntity;
@@ -25,6 +27,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.EntityManager;
+
 import java.util.Optional;
 
 import static org.junit.Assert.assertEquals;
@@ -41,6 +45,9 @@ public class ExecutionHandlerTest {
     @Autowired
     ExperimentRepository experimentRepository;
 
+    @Autowired
+    EntityManager entityManager;
+
     @Test
     void testExperimentMapping() {
 
@@ -65,13 +72,19 @@ public class ExecutionHandlerTest {
         ApplicationInput applicationInput3 = 
ApplicationInput.newBuilder().setIndex(3)
                 
.setEnvironmentInput(environmentInput).setRequired(false).build();
         // ApplicationOutputs
-        // TODO: add StandardOut and StandardError outputs as well
         FileOutput fileOutput = 
FileOutput.newBuilder().setFriendlyName("output-file")
                 .setDestinationPath("/scratch/workdir/output.file").build();
         ApplicationOutput applicationOutput = 
ApplicationOutput.newBuilder().setIndex(1).setFileOutput(fileOutput)
                 .setRequired(true).build();
+        StandardOut standardOut = 
StandardOut.newBuilder().setDestinationPath("/scratch/workdir/stdout").build();
+        ApplicationOutput applicationOutput2 = 
ApplicationOutput.newBuilder().setIndex(2).setStdOut(standardOut)
+                .setRequired(false).build();
+        StandardError standardError = 
StandardError.newBuilder().setDestinationPath("/scratch/workdir/stderr").build();
+        ApplicationOutput applicationOutput3 = 
ApplicationOutput.newBuilder().setIndex(3).setStdErr(standardError)
+                .setRequired(false).build();
         Application application = 
Application.newBuilder().setName("test-application").addInputs(applicationInput)
                 
.addInputs(applicationInput2).addInputs(applicationInput3).addOutputs(applicationOutput)
+                .addOutputs(applicationOutput2).addOutputs(applicationOutput3)
                 .build();
         ApplicationRunInfo applicationRunInfo = 
ApplicationRunInfo.newBuilder().setApplication(application).build();
         FileLocation sourceLocation = 
FileLocation.newBuilder().setStorageId("source-location-storage-id").build();
@@ -95,6 +108,9 @@ public class ExecutionHandlerTest {
 
         assertTrue(responseObserver.isCompleted());
         String experimentId = responseObserver.getNext().getExperimentId();
+        // Force flushing experiment to database, then reload from database
+        entityManager.flush();
+        entityManager.clear();
         ExperimentEntity experimentEntity = 
experimentRepository.findById(experimentId).get();
 
         assertEquals(experiment.getCreationTime(), 
experimentEntity.getCreationTime());
@@ -166,6 +182,22 @@ public class ExecutionHandlerTest {
         assertNotNull(fileOutputEntity);
         assertEquals(fileOutput.getFriendlyName(), 
fileOutputEntity.getFriendlyName());
         assertEquals(fileOutput.getDestinationPath(), 
fileOutputEntity.getDestinationPath());
+        maybeApplicationOutputEntity = applicationEntity.getOutputs().stream()
+                .filter(o -> o.getIndex() == 
applicationOutput2.getIndex()).findFirst();
+        assertTrue(maybeApplicationOutputEntity.isPresent());
+        assertEquals(applicationOutput2.getRequired(), 
maybeApplicationOutputEntity.get().isRequired());
+        // StandardOut, index=2
+        StandardOutEntity standardOutEntity = 
maybeApplicationOutputEntity.get().getStdOut();
+        assertNotNull(standardOutEntity);
+        assertEquals(standardOut.getDestinationPath(), 
standardOutEntity.getDestinationPath());
+        maybeApplicationOutputEntity = applicationEntity.getOutputs().stream()
+                .filter(o -> o.getIndex() == 
applicationOutput3.getIndex()).findFirst();
+        assertTrue(maybeApplicationOutputEntity.isPresent());
+        assertEquals(applicationOutput3.getRequired(), 
maybeApplicationOutputEntity.get().isRequired());
+        // StandardError, index=3
+        StandardErrorEntity standardErrorEntity = 
maybeApplicationOutputEntity.get().getStdErr();
+        assertNotNull(standardErrorEntity);
+        assertEquals(standardError.getDestinationPath(), 
standardErrorEntity.getDestinationPath());
 
         // DataMovementConfiguration
         assertEquals(runConfiguration.getDataMovementConfigsCount(), 
runConfigEntity.getDataMovementConfigs().size());

Reply via email to