You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2023/06/09 18:09:35 UTC

[airavata] branch airavata-v2-refactoring updated: Mapping application inputs and outputs, tests

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 554caf0c6e Mapping application inputs and outputs, tests
554caf0c6e is described below

commit 554caf0c6efe2962d4419dc6e83dd966077d8a5f
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Fri Jun 9 14:09:05 2023 -0400

    Mapping application inputs and outputs, tests
---
 .../application/input/ApplicationInputEntity.java  |  30 +++--
 .../input/ApplicationInputValueEntity.java         |  61 ++++++++++
 .../application/input/CommandLineInputEntity.java  |  31 +----
 .../application/input/EnvironmentInputEntity.java  |  32 +-----
 .../entity/application/input/FileInputEntity.java  |  32 +-----
 .../output/ApplicationOutputEntity.java            |  59 +++++++---
 .../output/ApplicationOutputValueEntity.java       |  61 ++++++++++
 .../application/output/FileOutputEntity.java       |  32 +-----
 .../application/output/StandardErrorEntity.java    |  28 +----
 .../application/output/StandardOutEntity.java      |  28 +----
 .../apis/handlers/ExecutionHandlerTest.java        | 128 ++++++++++++++++-----
 11 files changed, 295 insertions(+), 227 deletions(-)

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 c8cbc7b4b6..2139b8f848 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
@@ -21,16 +21,8 @@ public class ApplicationInputEntity {
     private boolean required;
 
     @OneToOne(cascade = CascadeType.ALL)
-    @JoinColumn(name = "command_line_input_id", referencedColumnName = "input_id")
-    private CommandLineInputEntity commandLineInput;
-
-    @OneToOne(cascade = CascadeType.ALL)
-    @JoinColumn(name = "environment_input_id", referencedColumnName = "input_id")
-    private EnvironmentInputEntity environmentInput;
-
-    @OneToOne(cascade = CascadeType.ALL)
-    @JoinColumn(name = "file_input_id", referencedColumnName = "input_id")
-    private FileInputEntity fileInput;
+    @JoinColumn(name = "input_id")
+    private ApplicationInputValueEntity applicationInputValue;
 
     @ManyToOne
     @JoinColumn(name="application_id", nullable=false)
@@ -68,27 +60,33 @@ public class ApplicationInputEntity {
         this.required = required;
     }
 
+    /*
+     * Helper getters/setters for mapping from/to protobuf messages
+     */
+
     public CommandLineInputEntity getCommandLineInput() {
-        return commandLineInput;
+        return applicationInputValue instanceof CommandLineInputEntity ? (CommandLineInputEntity) applicationInputValue
+                : null;
     }
 
     public void setCommandLineInput(CommandLineInputEntity commandLineInput) {
-        this.commandLineInput = commandLineInput;
+        this.applicationInputValue = commandLineInput;
     }
 
     public EnvironmentInputEntity getEnvironmentInput() {
-        return environmentInput;
+        return applicationInputValue instanceof EnvironmentInputEntity ? (EnvironmentInputEntity) applicationInputValue
+                : null;
     }
 
     public void setEnvironmentInput(EnvironmentInputEntity environmentInput) {
-        this.environmentInput = environmentInput;
+        this.applicationInputValue = environmentInput;
     }
 
     public FileInputEntity getFileInput() {
-        return fileInput;
+        return applicationInputValue instanceof FileInputEntity ? (FileInputEntity) applicationInputValue : null;
     }
 
     public void setFileInput(FileInputEntity fileInput) {
-        this.fileInput = fileInput;
+        this.applicationInputValue = fileInput;
     }
 }
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
new file mode 100644
index 0000000000..50679fe4b6
--- /dev/null
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/ApplicationInputValueEntity.java
@@ -0,0 +1,61 @@
+package org.apache.airavata.apis.db.entity.application.input;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@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;
+
+    @OneToOne(mappedBy = "applicationInputValue")
+    private ApplicationInputEntity applicationInput;
+
+    public String getInputId() {
+        return inputId;
+    }
+
+    public void setInputId(String inputId) {
+        this.inputId = inputId;
+    }
+
+    public ApplicationInputEntity getApplicationInput() {
+        return applicationInput;
+    }
+
+    public void setApplicationInput(ApplicationInputEntity applicationInput) {
+        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/input/CommandLineInputEntity.java b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
index 7ed4301947..abd1f09480 100644
--- a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/CommandLineInputEntity.java
@@ -1,17 +1,10 @@
 package org.apache.airavata.apis.db.entity.application.input;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
 
 @Entity
-public class CommandLineInputEntity {
-
-    @Id
-    @Column(name = "INPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String inputId;
+public class CommandLineInputEntity extends ApplicationInputValueEntity {
 
     @Column
     private int position = 1;
@@ -22,16 +15,6 @@ public class CommandLineInputEntity {
     @Column
     private String value;
 
-    @OneToOne(mappedBy = "commandLineInput")
-    private ApplicationInputEntity applicationInput;
-    public String getInputId() {
-        return inputId;
-    }
-
-    public void setInputId(String inputId) {
-        this.inputId = inputId;
-    }
-
     public int getPosition() {
         return position;
     }
@@ -55,12 +38,4 @@ public class CommandLineInputEntity {
     public void setValue(String value) {
         this.value = value;
     }
-
-    public ApplicationInputEntity getApplicationInput() {
-        return applicationInput;
-    }
-
-    public void setApplicationInput(ApplicationInputEntity applicationInput) {
-        this.applicationInput = applicationInput;
-    }
 }
diff --git a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
index 6d1a501d97..cb6788cde1 100644
--- a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/EnvironmentInputEntity.java
@@ -1,17 +1,10 @@
 package org.apache.airavata.apis.db.entity.application.input;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
 
 @Entity
-public class EnvironmentInputEntity {
-
-    @Id
-    @Column(name = "INPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String inputId;
+public class EnvironmentInputEntity extends ApplicationInputValueEntity {
 
     @Column
     private String key;
@@ -19,25 +12,6 @@ public class EnvironmentInputEntity {
     @Column
     private String value;
 
-    @OneToOne(mappedBy = "environmentInput")
-    private ApplicationInputEntity applicationInput;
-
-    public ApplicationInputEntity getApplicationInput() {
-        return applicationInput;
-    }
-
-    public void setApplicationInput(ApplicationInputEntity applicationInput) {
-        this.applicationInput = applicationInput;
-    }
-
-    public String getInputId() {
-        return inputId;
-    }
-
-    public void setInputId(String inputId) {
-        this.inputId = inputId;
-    }
-
     public String getKey() {
         return key;
     }
diff --git a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
index 597850d372..58e86f12f5 100644
--- a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/input/FileInputEntity.java
@@ -1,17 +1,10 @@
 package org.apache.airavata.apis.db.entity.application.input;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
 
 @Entity
-public class FileInputEntity {
-
-    @Id
-    @Column(name = "INPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String inputId;
+public class FileInputEntity extends ApplicationInputValueEntity {
 
     @Column
     private String friendlyName;
@@ -19,17 +12,6 @@ public class FileInputEntity {
     @Column
     private String destinationPath;
 
-    public String getInputId() {
-        return inputId;
-    }
-
-    @OneToOne(mappedBy = "fileInput")
-    private ApplicationInputEntity applicationInput;
-
-    public void setInputId(String inputId) {
-        this.inputId = inputId;
-    }
-
     public String getFriendlyName() {
         return friendlyName;
     }
@@ -45,12 +27,4 @@ public class FileInputEntity {
     public void setDestinationPath(String destinationPath) {
         this.destinationPath = destinationPath;
     }
-
-    public ApplicationInputEntity getApplicationInput() {
-        return applicationInput;
-    }
-
-    public void setApplicationInput(ApplicationInputEntity applicationInput) {
-        this.applicationInput = applicationInput;
-    }
 }
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 7d5f7ec708..2ee364c7dc 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
@@ -21,16 +21,8 @@ public class ApplicationOutputEntity {
     private boolean required;
 
     @OneToOne(cascade = CascadeType.ALL)
-    @JoinColumn(name = "file_output_id", referencedColumnName = "output_id")
-    private FileOutputEntity fileOutput;
-
-    @OneToOne(cascade = CascadeType.ALL)
-    @JoinColumn(name = "std_error_output_id", referencedColumnName = "output_id")
-    private StandardErrorEntity standardError;
-
-    @OneToOne(cascade = CascadeType.ALL)
-    @JoinColumn(name = "std_out_output_id", referencedColumnName = "output_id")
-    private StandardOutEntity standardOut;
+    @JoinColumn(name = "output_id")
+    private ApplicationOutputValueEntity applicationOutputValue;
 
     @ManyToOne
     @JoinColumn(name="application_id", nullable=false)
@@ -68,27 +60,62 @@ public class ApplicationOutputEntity {
         this.required = required;
     }
 
+    public ApplicationOutputValueEntity getApplicationOutputValue() {
+        return applicationOutputValue;
+    }
+
+    public void setApplicationOutputValue(ApplicationOutputValueEntity applicationOutputValue) {
+        this.applicationOutputValue = applicationOutputValue;
+    }
+
     public FileOutputEntity getFileOutput() {
-        return fileOutput;
+        return applicationOutputValue instanceof FileOutputEntity ? (FileOutputEntity) applicationOutputValue : null;
     }
 
     public void setFileOutput(FileOutputEntity fileOutput) {
-        this.fileOutput = fileOutput;
+        this.applicationOutputValue = fileOutput;
     }
 
     public StandardErrorEntity getStandardError() {
-        return standardError;
+        return applicationOutputValue instanceof StandardErrorEntity ? (StandardErrorEntity) applicationOutputValue
+                : null;
     }
 
     public void setStandardError(StandardErrorEntity standardError) {
-        this.standardError = standardError;
+        this.applicationOutputValue = standardError;
     }
 
     public StandardOutEntity getStandardOut() {
-        return standardOut;
+        return applicationOutputValue instanceof StandardOutEntity ? (StandardOutEntity) applicationOutputValue : null;
     }
 
     public void setStandardOut(StandardOutEntity standardOut) {
-        this.standardOut = 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
new file mode 100644
index 0000000000..7c2a416e6e
--- /dev/null
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/ApplicationOutputValueEntity.java
@@ -0,0 +1,61 @@
+package org.apache.airavata.apis.db.entity.application.output;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@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;
+
+    @OneToOne(mappedBy = "applicationOutputValue")
+    private ApplicationOutputEntity applicationOutput;
+
+    public String getOutputId() {
+        return outputId;
+    }
+
+    public void setOutputId(String outputId) {
+        this.outputId = outputId;
+    }
+
+    public ApplicationOutputEntity getApplicationOutput() {
+        return applicationOutput;
+    }
+
+    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/output/FileOutputEntity.java b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
index 84a0e0c519..9decbdd054 100644
--- a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/FileOutputEntity.java
@@ -1,17 +1,10 @@
 package org.apache.airavata.apis.db.entity.application.output;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
 
 @Entity
-public class FileOutputEntity {
-
-    @Id
-    @Column(name = "OUTPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String outputId;
+public class FileOutputEntity extends ApplicationOutputValueEntity {
 
     @Column
     private String friendlyName;
@@ -19,25 +12,6 @@ public class FileOutputEntity {
     @Column
     private String destinationPath;
 
-    @OneToOne(mappedBy = "fileOutput")
-    private ApplicationOutputEntity applicationOutput;
-
-    public ApplicationOutputEntity getApplicationOutput() {
-        return applicationOutput;
-    }
-
-    public void setApplicationOutput(ApplicationOutputEntity applicationOutput) {
-        this.applicationOutput = applicationOutput;
-    }
-
-    public String getOutputId() {
-        return outputId;
-    }
-
-    public void setOutputId(String outputId) {
-        this.outputId = outputId;
-    }
-
     public String getFriendlyName() {
         return friendlyName;
     }
diff --git a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
index 65e2f5349b..24d68a9498 100644
--- a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardErrorEntity.java
@@ -1,36 +1,14 @@
 package org.apache.airavata.apis.db.entity.application.output;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
 
 @Entity
-public class StandardErrorEntity {
-
-    @Id
-    @Column(name = "OUTPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String outputId;
+public class StandardErrorEntity extends ApplicationOutputValueEntity {
 
     @Column
     private String destinationPath;
 
-    @OneToOne(mappedBy = "standardError")
-    private ApplicationOutputEntity applicationOutput;
-
-    public ApplicationOutputEntity getApplicationOutput() {
-        return applicationOutput;
-    }
-
-    public String getOutputId() {
-        return outputId;
-    }
-
-    public void setOutputId(String outputId) {
-        this.outputId = outputId;
-    }
-
     public String getDestinationPath() {
         return destinationPath;
     }
diff --git a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
index 8a2b148049..83471e4250 100644
--- a/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
+++ b/modules/airavata-apis/airavata-apis-server/src/main/java/org/apache/airavata/apis/db/entity/application/output/StandardOutEntity.java
@@ -1,36 +1,14 @@
 package org.apache.airavata.apis.db.entity.application.output;
 
-import org.hibernate.annotations.GenericGenerator;
-
-import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
 
 @Entity
-public class StandardOutEntity {
-
-    @Id
-    @Column(name = "OUTPUT_ID")
-    @GeneratedValue(generator = "uuid")
-    @GenericGenerator(name = "uuid", strategy = "uuid2")
-    private String outputId;
+public class StandardOutEntity extends ApplicationOutputValueEntity {
 
     @Column
     private String destinationPath;
 
-    @OneToOne(mappedBy = "standardOut")
-    private ApplicationOutputEntity applicationOutput;
-
-    public ApplicationOutputEntity getApplicationOutput() {
-        return applicationOutput;
-    }
-
-    public String getOutputId() {
-        return outputId;
-    }
-
-    public void setOutputId(String outputId) {
-        this.outputId = outputId;
-    }
-
     public String getDestinationPath() {
         return destinationPath;
     }
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 aef1cbc210..d96007e02b 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
@@ -8,8 +8,16 @@ import org.apache.airavata.apis.db.entity.DataMovementConfigurationEntity;
 import org.apache.airavata.apis.db.entity.ExperimentEntity;
 import org.apache.airavata.apis.db.entity.RunConfigurationEntity;
 import org.apache.airavata.apis.db.entity.application.ApplicationEntity;
+import org.apache.airavata.apis.db.entity.application.input.ApplicationInputEntity;
+import org.apache.airavata.apis.db.entity.application.input.CommandLineInputEntity;
+import org.apache.airavata.apis.db.entity.application.input.EnvironmentInputEntity;
+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.backend.ComputeBackendEntity;
 import org.apache.airavata.apis.db.entity.backend.ServerBackendEntity;
+import org.apache.airavata.apis.db.entity.backend.iface.SCPInterfaceEntity;
+import org.apache.airavata.apis.db.entity.backend.iface.SSHInterfaceEntity;
 import org.apache.airavata.apis.db.entity.data.InDataMovementEntity;
 import org.apache.airavata.apis.db.repository.ExperimentRepository;
 import org.junit.jupiter.api.Test;
@@ -17,8 +25,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Optional;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 @SpringBootTest
 @Transactional
@@ -33,40 +44,48 @@ public class ExecutionHandlerTest {
     @Test
     void testExperimentMapping() {
 
-        // TODO: ec2
-        // TODO: local
-        ServerBackend serverBackend = ServerBackend.newBuilder()
-                .setHostName("server-hostname")
-                .build();
-        Application application = Application.newBuilder()
-                .setName("test-application")
-                .build();
-        ApplicationRunInfo applicationRunInfo = ApplicationRunInfo.newBuilder()
-                .setApplication(application)
+        SSHInterface sshInterface = SSHInterface.newBuilder().setHostName("ssh-hostname").setPort(2222)
+                .setSshCredentialId("ssh-credential-id").build();
+        SCPInterface scpInterface = SCPInterface.newBuilder().setHostName("scp-hostname").setPort(4422)
+                .setSshCredentialId("ssh-credential-id").build();
+        ServerBackend serverBackend = ServerBackend.newBuilder().setHostName("server-hostname").setPort(1888)
+                .setCommandInterface(sshInterface).setDataInterface(scpInterface)
+                .setWorkingDirectory("/tmp/working-directory/some_wd/").build();
+        // ApplicationInputs
+        CommandLineInput commandLineInput = CommandLineInput.newBuilder().setPosition(1).setPrefix("--prefix")
+                .setValue("input-value").build();
+        ApplicationInput applicationInput = ApplicationInput.newBuilder().setIndex(1)
+                .setCommandLineInput(commandLineInput).setRequired(true).build();
+        FileInput fileInput = FileInput.newBuilder().setFriendlyName("config file")
+                .setDestinationPath("/scratch/workdirs/W123/config.conf").build();
+        ApplicationInput applicationInput2 = ApplicationInput.newBuilder().setIndex(2).setFileInput(fileInput)
+                .setRequired(true).build();
+        EnvironmentInput environmentInput = EnvironmentInput.newBuilder().setKey("env-key").setValue("env-value")
                 .build();
-        FileLocation sourceLocation = FileLocation.newBuilder()
-                .setStorageId("source-location-storage-id")
+        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();
+        Application application = Application.newBuilder().setName("test-application").addInputs(applicationInput)
+                .addInputs(applicationInput2).addInputs(applicationInput3).addOutputs(applicationOutput)
                 .build();
-        InDataMovement inDataMovement = InDataMovement.newBuilder()
-                .setInputIndex(1)
-                .setSourceLocation(sourceLocation)
+        ApplicationRunInfo applicationRunInfo = ApplicationRunInfo.newBuilder().setApplication(application).build();
+        FileLocation sourceLocation = FileLocation.newBuilder().setStorageId("source-location-storage-id").build();
+        InDataMovement inDataMovement = InDataMovement.newBuilder().setInputIndex(1).setSourceLocation(sourceLocation)
                 .build();
         DataMovementConfiguration dataMovementConfiguration = DataMovementConfiguration.newBuilder()
-                .addInMovements(inDataMovement)
-                .build();
-        RunConfiguration runConfiguration = RunConfiguration.newBuilder()
-                .setServer(serverBackend)
-                .setAppRunInfo(applicationRunInfo)
-                .addDataMovementConfigs(dataMovementConfiguration)
-                .build();
-        Experiment experiment = Experiment.newBuilder()
-                .setCreationTime(System.currentTimeMillis())
-                .setDescription("Sample Exp")
-                .setExperimentName("Exp Name")
-                .setGatewayId("gateway-id")
-                .setProjectId("project-id")
-                .addRunConfigs(runConfiguration)
-                .build();
+                .addInMovements(inDataMovement).build();
+        // TODO: add RunConfiguration for ec2
+        // TODO: add RunConfiguration for local
+        RunConfiguration runConfiguration = RunConfiguration.newBuilder().setServer(serverBackend)
+                .setAppRunInfo(applicationRunInfo).addDataMovementConfigs(dataMovementConfiguration).build();
+        Experiment experiment = Experiment.newBuilder().setCreationTime(System.currentTimeMillis())
+                .setDescription("Sample Exp").setExperimentName("Exp Name").setGatewayId("gateway-id")
+                .setProjectId("project-id").addRunConfigs(runConfiguration).build();
 
         ExperimentRegisterRequest experimentRegisterRequest = ExperimentRegisterRequest.newBuilder()
                 .setExperiment(experiment).build();
@@ -93,11 +112,60 @@ public class ExecutionHandlerTest {
         assertTrue(computeBackendEntity instanceof ServerBackendEntity);
         ServerBackendEntity serverBackendEntity = (ServerBackendEntity) computeBackendEntity;
         assertEquals(serverBackend.getHostName(), serverBackendEntity.getHostName());
+        assertEquals(serverBackend.getPort(), serverBackendEntity.getPort());
+        assertEquals(serverBackend.getWorkingDirectory(), serverBackendEntity.getWorkingDirectory());
+        SSHInterfaceEntity commandInterface = serverBackendEntity.getCommandInterface();
+        assertEquals(sshInterface.getHostName(), commandInterface.getHostName());
+        assertEquals(sshInterface.getPort(), commandInterface.getPort().intValue());
+        assertEquals(sshInterface.getSshCredentialId(), commandInterface.getSshCredentialId());
+        SCPInterfaceEntity scpInterfaceEntity = serverBackendEntity.getDataInterface();
+        assertEquals(scpInterface.getHostName(), scpInterfaceEntity.getHostName());
+        assertEquals(scpInterface.getPort(), scpInterfaceEntity.getPort().intValue());
+        assertEquals(scpInterface.getSshCredentialId(), scpInterfaceEntity.getSshCredentialId());
 
         // ApplicationRunInfo
         ApplicationRunInfoEntity applicationRunInfoEntity = runConfigEntity.getAppRunInfo();
         ApplicationEntity applicationEntity = applicationRunInfoEntity.getApplication();
         assertEquals(application.getName(), applicationEntity.getName());
+        assertEquals(application.getInputsCount(), applicationEntity.getInputs().size());
+        Optional<ApplicationInputEntity> maybeApplicationInputEntity = applicationEntity.getInputs().stream()
+                .filter(i -> i.getIndex() == applicationInput.getIndex()).findFirst();
+        assertTrue(maybeApplicationInputEntity.isPresent());
+        assertEquals(applicationInput.getRequired(), maybeApplicationInputEntity.get().isRequired());
+        // CommandLineInput, index=1
+        CommandLineInputEntity commandLineInputEntity = maybeApplicationInputEntity.get().getCommandLineInput();
+        assertNotNull(commandLineInputEntity);
+        assertEquals(commandLineInput.getPosition(), commandLineInputEntity.getPosition());
+        assertEquals(commandLineInput.getPrefix(), commandLineInputEntity.getPrefix());
+        assertEquals(commandLineInput.getValue(), commandLineInputEntity.getValue());
+        maybeApplicationInputEntity = applicationEntity.getInputs().stream()
+                .filter(i -> i.getIndex() == applicationInput2.getIndex()).findFirst();
+        assertTrue(maybeApplicationInputEntity.isPresent());
+        assertEquals(applicationInput2.getRequired(), maybeApplicationInputEntity.get().isRequired());
+        // FileInput, index=2
+        FileInputEntity fileInputEntity = maybeApplicationInputEntity.get().getFileInput();
+        assertNotNull(fileInputEntity);
+        assertEquals(fileInput.getFriendlyName(), fileInputEntity.getFriendlyName());
+        assertEquals(fileInput.getDestinationPath(), fileInputEntity.getDestinationPath());
+        maybeApplicationInputEntity = applicationEntity.getInputs().stream()
+                .filter(i -> i.getIndex() == applicationInput3.getIndex()).findFirst();
+        assertTrue(maybeApplicationInputEntity.isPresent());
+        assertEquals(applicationInput3.getRequired(), maybeApplicationInputEntity.get().isRequired());
+        // EnvironmentInputEntity, index=3
+        EnvironmentInputEntity environmentInputEntity = maybeApplicationInputEntity.get().getEnvironmentInput();
+        assertNotNull(environmentInputEntity);
+        assertEquals(environmentInput.getKey(), environmentInputEntity.getKey());
+        assertEquals(environmentInput.getValue(), environmentInputEntity.getValue());
+        assertEquals(application.getOutputsCount(), applicationEntity.getOutputs().size());
+        Optional<ApplicationOutputEntity> maybeApplicationOutputEntity = applicationEntity.getOutputs().stream()
+                .filter(o -> o.getIndex() == applicationOutput.getIndex()).findFirst();
+        assertTrue(maybeApplicationOutputEntity.isPresent());
+        assertEquals(applicationOutput.getRequired(), maybeApplicationOutputEntity.get().isRequired());
+        // FileOutput, index=1
+        FileOutputEntity fileOutputEntity = maybeApplicationOutputEntity.get().getFileOutput();
+        assertNotNull(fileOutputEntity);
+        assertEquals(fileOutput.getFriendlyName(), fileOutputEntity.getFriendlyName());
+        assertEquals(fileOutput.getDestinationPath(), fileOutputEntity.getDestinationPath());
 
         // DataMovementConfiguration
         assertEquals(runConfiguration.getDataMovementConfigsCount(), runConfigEntity.getDataMovementConfigs().size());