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 2019/06/10 18:47:49 UTC

[airavata] branch develop updated: AIRAVATA-3029 Adding METADATA to outputs

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 8bdbdfc  AIRAVATA-3029 Adding METADATA to outputs
8bdbdfc is described below

commit 8bdbdfcb3c9521fd6a5f90ba9e95f8d2647fe9b2
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Mon Jun 10 14:45:53 2019 -0400

    AIRAVATA-3029 Adding METADATA to outputs
---
 .../lib/Airavata/Model/Application/Io/Types.php    |  23 +++++
 .../lib/airavata/model/application/io/ttypes.py    |  14 ++-
 .../model/application/io/OutputDataObjectType.java | 113 ++++++++++++++++++++-
 .../appcatalog/ApplicationOutputEntity.java        |  11 ++
 .../expcatalog/ExperimentOutputEntity.java         |  13 ++-
 .../entities/expcatalog/ProcessOutputEntity.java   |  13 ++-
 .../src/main/resources/appcatalog-derby.sql        |   1 +
 .../src/main/resources/appcatalog-mysql.sql        |   1 +
 .../src/main/resources/expcatalog-derby.sql        |   2 +
 .../src/main/resources/expcatalog-mysql.sql        |   2 +
 .../ApplicationInterfaceRepositoryTest.java        |   1 +
 .../next/DeltaScripts/appCatalog_schema_delta.sql  |   3 +
 .../experimentCatalog_schema_delta.sql             |   4 +
 .../application_io_models.thrift                   |   3 +-
 14 files changed, 196 insertions(+), 8 deletions(-)

diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php
index c417a5b..fb4977e 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Application/Io/Types.php
@@ -490,6 +490,10 @@ class OutputDataObjectType {
    * @var string
    */
   public $storageResourceId = null;
+  /**
+   * @var string
+   */
+  public $metaData = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -538,6 +542,10 @@ class OutputDataObjectType {
           'var' => 'storageResourceId',
           'type' => TType::STRING,
           ),
+        12 => array(
+          'var' => 'metaData',
+          'type' => TType::STRING,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -574,6 +582,9 @@ class OutputDataObjectType {
       if (isset($vals['storageResourceId'])) {
         $this->storageResourceId = $vals['storageResourceId'];
       }
+      if (isset($vals['metaData'])) {
+        $this->metaData = $vals['metaData'];
+      }
     }
   }
 
@@ -673,6 +684,13 @@ class OutputDataObjectType {
             $xfer += $input->skip($ftype);
           }
           break;
+        case 12:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->metaData);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -741,6 +759,11 @@ class OutputDataObjectType {
       $xfer += $output->writeString($this->storageResourceId);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->metaData !== null) {
+      $xfer += $output->writeFieldBegin('metaData', TType::STRING, 12);
+      $xfer += $output->writeString($this->metaData);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/ttypes.py
index 10e1d47..8c9017a 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/airavata/model/application/io/ttypes.py
@@ -318,6 +318,7 @@ class OutputDataObjectType(object):
      - searchQuery
      - outputStreaming
      - storageResourceId
+     - metaData
     """
 
     thrift_spec = (
@@ -333,9 +334,10 @@ class OutputDataObjectType(object):
         (9, TType.STRING, 'searchQuery', 'UTF8', None, ),  # 9
         (10, TType.BOOL, 'outputStreaming', None, None, ),  # 10
         (11, TType.STRING, 'storageResourceId', 'UTF8', None, ),  # 11
+        (12, TType.STRING, 'metaData', 'UTF8', None, ),  # 12
     )
 
-    def __init__(self, name=None, value=None, type=None, applicationArgument=None, isRequired=None, requiredToAddedToCommandLine=None, dataMovement=None, location=None, searchQuery=None, outputStreaming=None, storageResourceId=None,):
+    def __init__(self, name=None, value=None, type=None, applicationArgument=None, isRequired=None, requiredToAddedToCommandLine=None, dataMovement=None, location=None, searchQuery=None, outputStreaming=None, storageResourceId=None, metaData=None,):
         self.name = name
         self.value = value
         self.type = type
@@ -347,6 +349,7 @@ class OutputDataObjectType(object):
         self.searchQuery = searchQuery
         self.outputStreaming = outputStreaming
         self.storageResourceId = storageResourceId
+        self.metaData = metaData
 
     def read(self, iprot):
         if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
@@ -412,6 +415,11 @@ class OutputDataObjectType(object):
                     self.storageResourceId = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
                 else:
                     iprot.skip(ftype)
+            elif fid == 12:
+                if ftype == TType.STRING:
+                    self.metaData = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString()
+                else:
+                    iprot.skip(ftype)
             else:
                 iprot.skip(ftype)
             iprot.readFieldEnd()
@@ -466,6 +474,10 @@ class OutputDataObjectType(object):
             oprot.writeFieldBegin('storageResourceId', TType.STRING, 11)
             oprot.writeString(self.storageResourceId.encode('utf-8') if sys.version_info[0] == 2 else self.storageResourceId)
             oprot.writeFieldEnd()
+        if self.metaData is not None:
+            oprot.writeFieldBegin('metaData', TType.STRING, 12)
+            oprot.writeString(self.metaData.encode('utf-8') if sys.version_info[0] == 2 else self.metaData)
+            oprot.writeFieldEnd()
         oprot.writeFieldStop()
         oprot.writeStructEnd()
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/OutputDataObjectType.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/OutputDataObjectType.java
index 1c24ed1..3087dfb 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/OutputDataObjectType.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/application/io/OutputDataObjectType.java
@@ -65,6 +65,7 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
   private static final org.apache.thrift.protocol.TField SEARCH_QUERY_FIELD_DESC = new org.apache.thrift.protocol.TField("searchQuery", org.apache.thrift.protocol.TType.STRING, (short)9);
   private static final org.apache.thrift.protocol.TField OUTPUT_STREAMING_FIELD_DESC = new org.apache.thrift.protocol.TField("outputStreaming", org.apache.thrift.protocol.TType.BOOL, (short)10);
   private static final org.apache.thrift.protocol.TField STORAGE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("storageResourceId", org.apache.thrift.protocol.TType.STRING, (short)11);
+  private static final org.apache.thrift.protocol.TField META_DATA_FIELD_DESC = new org.apache.thrift.protocol.TField("metaData", org.apache.thrift.protocol.TType.STRING, (short)12);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new OutputDataObjectTypeStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new OutputDataObjectTypeTupleSchemeFactory();
@@ -80,6 +81,7 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
   private java.lang.String searchQuery; // optional
   private boolean outputStreaming; // optional
   private java.lang.String storageResourceId; // optional
+  private java.lang.String metaData; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -97,7 +99,8 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
     LOCATION((short)8, "location"),
     SEARCH_QUERY((short)9, "searchQuery"),
     OUTPUT_STREAMING((short)10, "outputStreaming"),
-    STORAGE_RESOURCE_ID((short)11, "storageResourceId");
+    STORAGE_RESOURCE_ID((short)11, "storageResourceId"),
+    META_DATA((short)12, "metaData");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -134,6 +137,8 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
           return OUTPUT_STREAMING;
         case 11: // STORAGE_RESOURCE_ID
           return STORAGE_RESOURCE_ID;
+        case 12: // META_DATA
+          return META_DATA;
         default:
           return null;
       }
@@ -179,7 +184,7 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
   private static final int __DATAMOVEMENT_ISSET_ID = 2;
   private static final int __OUTPUTSTREAMING_ISSET_ID = 3;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.VALUE,_Fields.TYPE,_Fields.APPLICATION_ARGUMENT,_Fields.IS_REQUIRED,_Fields.REQUIRED_TO_ADDED_TO_COMMAND_LINE,_Fields.DATA_MOVEMENT,_Fields.LOCATION,_Fields.SEARCH_QUERY,_Fields.OUTPUT_STREAMING,_Fields.STORAGE_RESOURCE_ID};
+  private static final _Fields optionals[] = {_Fields.VALUE,_Fields.TYPE,_Fields.APPLICATION_ARGUMENT,_Fields.IS_REQUIRED,_Fields.REQUIRED_TO_ADDED_TO_COMMAND_LINE,_Fields.DATA_MOVEMENT,_Fields.LOCATION,_Fields.SEARCH_QUERY,_Fields.OUTPUT_STREAMING,_Fields.STORAGE_RESOURCE_ID,_Fields.META_DATA};
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -205,6 +210,8 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     tmpMap.put(_Fields.STORAGE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("storageResourceId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.META_DATA, new org.apache.thrift.meta_data.FieldMetaData("metaData", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(OutputDataObjectType.class, metaDataMap);
   }
@@ -249,6 +256,9 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
     if (other.isSetStorageResourceId()) {
       this.storageResourceId = other.storageResourceId;
     }
+    if (other.isSetMetaData()) {
+      this.metaData = other.metaData;
+    }
   }
 
   public OutputDataObjectType deepCopy() {
@@ -272,6 +282,7 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
     setOutputStreamingIsSet(false);
     this.outputStreaming = false;
     this.storageResourceId = null;
+    this.metaData = null;
   }
 
   public java.lang.String getName() {
@@ -531,6 +542,29 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
     }
   }
 
+  public java.lang.String getMetaData() {
+    return this.metaData;
+  }
+
+  public void setMetaData(java.lang.String metaData) {
+    this.metaData = metaData;
+  }
+
+  public void unsetMetaData() {
+    this.metaData = null;
+  }
+
+  /** Returns true if field metaData is set (has been assigned a value) and false otherwise */
+  public boolean isSetMetaData() {
+    return this.metaData != null;
+  }
+
+  public void setMetaDataIsSet(boolean value) {
+    if (!value) {
+      this.metaData = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case NAME:
@@ -621,6 +655,14 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
       }
       break;
 
+    case META_DATA:
+      if (value == null) {
+        unsetMetaData();
+      } else {
+        setMetaData((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
@@ -659,6 +701,9 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
     case STORAGE_RESOURCE_ID:
       return getStorageResourceId();
 
+    case META_DATA:
+      return getMetaData();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -692,6 +737,8 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
       return isSetOutputStreaming();
     case STORAGE_RESOURCE_ID:
       return isSetStorageResourceId();
+    case META_DATA:
+      return isSetMetaData();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -810,6 +857,15 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
         return false;
     }
 
+    boolean this_present_metaData = true && this.isSetMetaData();
+    boolean that_present_metaData = true && that.isSetMetaData();
+    if (this_present_metaData || that_present_metaData) {
+      if (!(this_present_metaData && that_present_metaData))
+        return false;
+      if (!this.metaData.equals(that.metaData))
+        return false;
+    }
+
     return true;
   }
 
@@ -861,6 +917,10 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
     if (isSetStorageResourceId())
       hashCode = hashCode * 8191 + storageResourceId.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetMetaData()) ? 131071 : 524287);
+    if (isSetMetaData())
+      hashCode = hashCode * 8191 + metaData.hashCode();
+
     return hashCode;
   }
 
@@ -982,6 +1042,16 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetMetaData()).compareTo(other.isSetMetaData());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetMetaData()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.metaData, other.metaData);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1093,6 +1163,16 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
       }
       first = false;
     }
+    if (isSetMetaData()) {
+      if (!first) sb.append(", ");
+      sb.append("metaData:");
+      if (this.metaData == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.metaData);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1230,6 +1310,14 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 12: // META_DATA
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.metaData = iprot.readString();
+              struct.setMetaDataIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1310,6 +1398,13 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
           oprot.writeFieldEnd();
         }
       }
+      if (struct.metaData != null) {
+        if (struct.isSetMetaData()) {
+          oprot.writeFieldBegin(META_DATA_FIELD_DESC);
+          oprot.writeString(struct.metaData);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -1359,7 +1454,10 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
       if (struct.isSetStorageResourceId()) {
         optionals.set(9);
       }
-      oprot.writeBitSet(optionals, 10);
+      if (struct.isSetMetaData()) {
+        optionals.set(10);
+      }
+      oprot.writeBitSet(optionals, 11);
       if (struct.isSetValue()) {
         oprot.writeString(struct.value);
       }
@@ -1390,6 +1488,9 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
       if (struct.isSetStorageResourceId()) {
         oprot.writeString(struct.storageResourceId);
       }
+      if (struct.isSetMetaData()) {
+        oprot.writeString(struct.metaData);
+      }
     }
 
     @Override
@@ -1397,7 +1498,7 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.name = iprot.readString();
       struct.setNameIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(10);
+      java.util.BitSet incoming = iprot.readBitSet(11);
       if (incoming.get(0)) {
         struct.value = iprot.readString();
         struct.setValueIsSet(true);
@@ -1438,6 +1539,10 @@ public class OutputDataObjectType implements org.apache.thrift.TBase<OutputDataO
         struct.storageResourceId = iprot.readString();
         struct.setStorageResourceIdIsSet(true);
       }
+      if (incoming.get(10)) {
+        struct.metaData = iprot.readString();
+        struct.setMetaDataIsSet(true);
+      }
     }
   }
 
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationOutputEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationOutputEntity.java
index 5b54d2d..a408655 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationOutputEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ApplicationOutputEntity.java
@@ -72,6 +72,9 @@ public class ApplicationOutputEntity implements Serializable {
     @Column(name = "SEARCH_QUERY")
     private String searchQuery;
 
+    @Column(name = "METADATA", length = 4096)
+    private String metaData;
+
     @ManyToOne(targetEntity = ApplicationInterfaceEntity.class)
     @JoinColumn(name = "INTERFACE_ID", nullable = false, updatable = false)
     @ForeignKey(deleteAction = ForeignKeyAction.CASCADE)
@@ -168,6 +171,14 @@ public class ApplicationOutputEntity implements Serializable {
         this.searchQuery = searchQuery;
     }
 
+    public String getMetaData() {
+        return metaData;
+    }
+
+    public void setMetaData(String metaData) {
+        this.metaData = metaData;
+    }
+
     public ApplicationInterfaceEntity getApplicationInterface() {
         return applicationInterface;
     }
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java
index 01ca250..6e11e7b 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ExperimentOutputEntity.java
@@ -74,6 +74,9 @@ public class ExperimentOutputEntity implements Serializable {
     @Column(name = "STORAGE_RESOURCE_ID")
     private String storageResourceId;
 
+    @Column(name = "METADATA", length = 4096)
+    private String metaData;
+
     @ManyToOne(targetEntity = ExperimentEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumn(name = "EXPERIMENT_ID", referencedColumnName = "EXPERIMENT_ID")
     private ExperimentEntity experiment;
@@ -178,6 +181,14 @@ public class ExperimentOutputEntity implements Serializable {
         this.storageResourceId = storageResourceId;
     }
 
+    public String getMetaData() {
+        return metaData;
+    }
+
+    public void setMetaData(String metaData) {
+        this.metaData = metaData;
+    }
+
     public ExperimentEntity getExperiment() {
         return experiment;
     }
@@ -185,4 +196,4 @@ public class ExperimentOutputEntity implements Serializable {
     public void setExperiment(ExperimentEntity experiment) {
         this.experiment = experiment;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java
index f331872..66f59c9 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/ProcessOutputEntity.java
@@ -74,6 +74,9 @@ public class ProcessOutputEntity implements Serializable {
     @Column(name = "STORAGE_RESOURCE_ID")
     private String storageResourceId;
 
+    @Column(name = "METADATA", length = 4096)
+    private String metaData;
+
     @ManyToOne(targetEntity = ProcessEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     @JoinColumn(name = "PROCESS_ID", referencedColumnName = "PROCESS_ID")
     private ProcessEntity process;
@@ -177,6 +180,14 @@ public class ProcessOutputEntity implements Serializable {
         this.storageResourceId = storageResourceId;
     }
 
+    public void setMetaData(String metaData) {
+        this.metaData = metaData;
+    }
+
+    public String getMetaData() {
+        return metaData;
+    }
+
     public ProcessEntity getProcess() {
         return process;
     }
@@ -184,4 +195,4 @@ public class ProcessOutputEntity implements Serializable {
     public void setProcess(ProcessEntity process) {
         this.process = process;
     }
-}
\ No newline at end of file
+}
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
index 3cf7ea8..4bb49a0 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-derby.sql
@@ -344,6 +344,7 @@ CREATE TABLE APPLICATION_OUTPUT
          SEARCH_QUERY VARCHAR(255),
          APP_ARGUMENT VARCHAR(255),
          OUTPUT_STREAMING SMALLINT,
+         METADATA VARCHAR(4096),
          PRIMARY KEY(INTERFACE_ID,OUTPUT_KEY),
          FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
 );
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
index 32adfb0..b24c433 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
@@ -337,6 +337,7 @@ CREATE TABLE APPLICATION_OUTPUT
          SEARCH_QUERY VARCHAR(255),
          APP_ARGUMENT VARCHAR(255),
          OUTPUT_STREAMING SMALLINT,
+         METADATA VARCHAR(4096),
          PRIMARY KEY(INTERFACE_ID,OUTPUT_KEY),
          FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
index bb74d19..64ab519 100644
--- a/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
@@ -148,6 +148,7 @@ CREATE TABLE EXPERIMENT_OUTPUT
         SEARCH_QUERY varchar(255),
         OUTPUT_STREAMING SMALLINT,
         STORAGE_RESOURCE_ID varchar(255),
+        METADATA varchar(4096),
         PRIMARY KEY(EXPERIMENT_ID,OUTPUT_NAME),
         FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
 );
@@ -274,6 +275,7 @@ CREATE TABLE PROCESS_OUTPUT
         SEARCH_QUERY varchar(255),
         OUTPUT_STREAMING SMALLINT,
         STORAGE_RESOURCE_ID varchar(255),
+        METADATA varchar(4096),
         PRIMARY KEY(PROCESS_ID,OUTPUT_NAME),
         FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
 );
diff --git a/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
index 41ab189..598deeb 100644
--- a/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
@@ -148,6 +148,7 @@ CREATE TABLE EXPERIMENT_OUTPUT
         SEARCH_QUERY varchar(255),
         OUTPUT_STREAMING SMALLINT,
         STORAGE_RESOURCE_ID varchar(255),
+        METADATA varchar(4096),
         PRIMARY KEY(EXPERIMENT_ID,OUTPUT_NAME),
         FOREIGN KEY (EXPERIMENT_ID) REFERENCES EXPERIMENT(EXPERIMENT_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
@@ -276,6 +277,7 @@ CREATE TABLE PROCESS_OUTPUT
         SEARCH_QUERY varchar(255),
         OUTPUT_STREAMING SMALLINT,
         STORAGE_RESOURCE_ID varchar(255),
+        METADATA varchar(4096),
         PRIMARY KEY(PROCESS_ID,OUTPUT_NAME),
         FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepositoryTest.java b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepositoryTest.java
index 942db12..5ac61e9 100644
--- a/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepositoryTest.java
+++ b/modules/registry/registry-core/src/test/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepositoryTest.java
@@ -277,6 +277,7 @@ public class ApplicationInterfaceRepositoryTest extends TestBase {
         output.setSearchQuery("Search query");
         output.setRequiredToAddedToCommandLine(true);
         output.setOutputStreaming(true);
+        output.setMetaData("outputMetaData");
         // TODO missing field
         //output.setStorageResourceId("Storage resource id");
 
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
index b9bff30..8600fbb 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/appCatalog_schema_delta.sql
@@ -303,3 +303,6 @@ DROP TABLE IF EXISTS `GATEWAY_CLIENT_CREDENTIAL`;
 -- ALTER TABLE `PARSING_TEMPLATE_INPUT` DROP IF EXISTS `PARSER_INPUT_ID`;
 
 ALTER TABLE `UNICORE_DATAMOVEMENT` DROP IF EXISTS `SECURITY_PROTOCOL`;
+
+-- AIRAVATA-3029: Add METADATA to APPLICATION_OUTPUT
+ALTER TABLE `APPLICATION_OUTPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
diff --git a/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql b/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql
index fe7d122..a9d9a38 100644
--- a/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/next/DeltaScripts/experimentCatalog_schema_delta.sql
@@ -97,3 +97,7 @@ ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS STATIC_WORKING_DI
 ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_ALLOCATION_PROJECT_NUMBER varchar(255);
 ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_LOGIN_USER_NAME varchar(255);
 ALTER TABLE PROCESS_RESOURCE_SCHEDULE ADD COLUMN IF NOT EXISTS OVERRIDE_SCRATCH_LOCATION varchar(255);
+
+-- AIRAVATA-3029: Add METADATA to EXPERIMENT_INPUT and PROCESS_INPUT
+ALTER TABLE `EXPERIMENT_INPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
+ALTER TABLE `PROCESS_INPUT` ADD COLUMN IF NOT EXISTS METADATA VARCHAR(4096);
diff --git a/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift b/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift
index 7a6d571..f8537c7 100644
--- a/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift
+++ b/thrift-interface-descriptions/data-models/app-catalog-models/application_io_models.thrift
@@ -119,4 +119,5 @@ struct OutputDataObjectType {
     9: optional string searchQuery,
     10: optional bool outputStreaming,
     11: optional string storageResourceId,
-}
\ No newline at end of file
+    12: optional string metaData,
+}