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 <[email protected]>
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());


Reply via email to