You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by di...@apache.org on 2018/10/30 02:59:35 UTC

[airavata] branch develop updated: Refactoring parser data models

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

dimuthuupe 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 657d6e4  Refactoring parser data models
657d6e4 is described below

commit 657d6e4120bf0dbd882850f8cb9225e517f7ed04
Author: Dimuthu Wannipurage <di...@datasprouts.com>
AuthorDate: Mon Oct 29 22:59:24 2018 -0400

    Refactoring parser data models
---
 .../{DagElement.java => ParserDagElement.java}     | 318 +++++++++++++++++----
 ...pping.java => ParserDagInputOutputMapping.java} | 272 +++++++++++++++---
 .../model/appcatalog/parser/ParserInput.java       |  96 ++++++-
 .../model/appcatalog/parser/ParserOutput.java      |  96 ++++++-
 .../model/appcatalog/parser/ParsingTemplate.java   |  40 +--
 .../appcatalog/parser/ParsingTemplateInput.java    | 218 +++++++++++++-
 .../helix/impl/workflow/ParserWorkflowManager.java |  18 +-
 .../app-catalog-models/parser_model.thrift         |  29 +-
 8 files changed, 940 insertions(+), 147 deletions(-)

diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/DagElement.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserDagElement.java
similarity index 64%
rename from airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/DagElement.java
rename to airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserDagElement.java
index 6d456f4..313f113 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/DagElement.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserDagElement.java
@@ -25,25 +25,31 @@ package org.apache.airavata.model.appcatalog.parser;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
 @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
-public class DagElement implements org.apache.thrift.TBase<DagElement, DagElement._Fields>, java.io.Serializable, Cloneable, Comparable<DagElement> {
-  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("DagElement");
+public class ParserDagElement implements org.apache.thrift.TBase<ParserDagElement, ParserDagElement._Fields>, java.io.Serializable, Cloneable, Comparable<ParserDagElement> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ParserDagElement");
 
-  private static final org.apache.thrift.protocol.TField PARENT_PARSER_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parentParserId", org.apache.thrift.protocol.TType.STRING, (short)1);
-  private static final org.apache.thrift.protocol.TField CHILD_PARSER_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("childParserId", org.apache.thrift.protocol.TType.STRING, (short)2);
-  private static final org.apache.thrift.protocol.TField INPUT_OUTPUT_MAPPING_FIELD_DESC = new org.apache.thrift.protocol.TField("inputOutputMapping", org.apache.thrift.protocol.TType.LIST, (short)3);
+  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField PARENT_PARSER_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parentParserId", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField CHILD_PARSER_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("childParserId", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField INPUT_OUTPUT_MAPPING_FIELD_DESC = new org.apache.thrift.protocol.TField("inputOutputMapping", org.apache.thrift.protocol.TType.LIST, (short)4);
+  private static final org.apache.thrift.protocol.TField PARSING_TEMPLATE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parsingTemplateId", org.apache.thrift.protocol.TType.STRING, (short)5);
 
-  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new DagElementStandardSchemeFactory();
-  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new DagElementTupleSchemeFactory();
+  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ParserDagElementStandardSchemeFactory();
+  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ParserDagElementTupleSchemeFactory();
 
+  private java.lang.String id; // required
   private java.lang.String parentParserId; // required
   private java.lang.String childParserId; // required
-  private java.util.List<InputOutputMapping> inputOutputMapping; // required
+  private java.util.List<ParserDagInputOutputMapping> inputOutputMapping; // required
+  private java.lang.String parsingTemplateId; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    PARENT_PARSER_ID((short)1, "parentParserId"),
-    CHILD_PARSER_ID((short)2, "childParserId"),
-    INPUT_OUTPUT_MAPPING((short)3, "inputOutputMapping");
+    ID((short)1, "id"),
+    PARENT_PARSER_ID((short)2, "parentParserId"),
+    CHILD_PARSER_ID((short)3, "childParserId"),
+    INPUT_OUTPUT_MAPPING((short)4, "inputOutputMapping"),
+    PARSING_TEMPLATE_ID((short)5, "parsingTemplateId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -58,12 +64,16 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
      */
     public static _Fields findByThriftId(int fieldId) {
       switch(fieldId) {
-        case 1: // PARENT_PARSER_ID
+        case 1: // ID
+          return ID;
+        case 2: // PARENT_PARSER_ID
           return PARENT_PARSER_ID;
-        case 2: // CHILD_PARSER_ID
+        case 3: // CHILD_PARSER_ID
           return CHILD_PARSER_ID;
-        case 3: // INPUT_OUTPUT_MAPPING
+        case 4: // INPUT_OUTPUT_MAPPING
           return INPUT_OUTPUT_MAPPING;
+        case 5: // PARSING_TEMPLATE_ID
+          return PARSING_TEMPLATE_ID;
         default:
           return null;
       }
@@ -107,35 +117,46 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
   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);
+    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData("id", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.PARENT_PARSER_ID, new org.apache.thrift.meta_data.FieldMetaData("parentParserId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.CHILD_PARSER_ID, new org.apache.thrift.meta_data.FieldMetaData("childParserId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.INPUT_OUTPUT_MAPPING, new org.apache.thrift.meta_data.FieldMetaData("inputOutputMapping", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
-            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, InputOutputMapping.class))));
+            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ParserDagInputOutputMapping.class))));
+    tmpMap.put(_Fields.PARSING_TEMPLATE_ID, new org.apache.thrift.meta_data.FieldMetaData("parsingTemplateId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        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(DagElement.class, metaDataMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ParserDagElement.class, metaDataMap);
   }
 
-  public DagElement() {
+  public ParserDagElement() {
   }
 
-  public DagElement(
+  public ParserDagElement(
+    java.lang.String id,
     java.lang.String parentParserId,
     java.lang.String childParserId,
-    java.util.List<InputOutputMapping> inputOutputMapping)
+    java.util.List<ParserDagInputOutputMapping> inputOutputMapping,
+    java.lang.String parsingTemplateId)
   {
     this();
+    this.id = id;
     this.parentParserId = parentParserId;
     this.childParserId = childParserId;
     this.inputOutputMapping = inputOutputMapping;
+    this.parsingTemplateId = parsingTemplateId;
   }
 
   /**
    * Performs a deep copy on <i>other</i>.
    */
-  public DagElement(DagElement other) {
+  public ParserDagElement(ParserDagElement other) {
+    if (other.isSetId()) {
+      this.id = other.id;
+    }
     if (other.isSetParentParserId()) {
       this.parentParserId = other.parentParserId;
     }
@@ -143,23 +164,51 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
       this.childParserId = other.childParserId;
     }
     if (other.isSetInputOutputMapping()) {
-      java.util.List<InputOutputMapping> __this__inputOutputMapping = new java.util.ArrayList<InputOutputMapping>(other.inputOutputMapping.size());
-      for (InputOutputMapping other_element : other.inputOutputMapping) {
-        __this__inputOutputMapping.add(new InputOutputMapping(other_element));
+      java.util.List<ParserDagInputOutputMapping> __this__inputOutputMapping = new java.util.ArrayList<ParserDagInputOutputMapping>(other.inputOutputMapping.size());
+      for (ParserDagInputOutputMapping other_element : other.inputOutputMapping) {
+        __this__inputOutputMapping.add(new ParserDagInputOutputMapping(other_element));
       }
       this.inputOutputMapping = __this__inputOutputMapping;
     }
+    if (other.isSetParsingTemplateId()) {
+      this.parsingTemplateId = other.parsingTemplateId;
+    }
   }
 
-  public DagElement deepCopy() {
-    return new DagElement(this);
+  public ParserDagElement deepCopy() {
+    return new ParserDagElement(this);
   }
 
   @Override
   public void clear() {
+    this.id = null;
     this.parentParserId = null;
     this.childParserId = null;
     this.inputOutputMapping = null;
+    this.parsingTemplateId = null;
+  }
+
+  public java.lang.String getId() {
+    return this.id;
+  }
+
+  public void setId(java.lang.String id) {
+    this.id = id;
+  }
+
+  public void unsetId() {
+    this.id = null;
+  }
+
+  /** Returns true if field id is set (has been assigned a value) and false otherwise */
+  public boolean isSetId() {
+    return this.id != null;
+  }
+
+  public void setIdIsSet(boolean value) {
+    if (!value) {
+      this.id = null;
+    }
   }
 
   public java.lang.String getParentParserId() {
@@ -212,22 +261,22 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
     return (this.inputOutputMapping == null) ? 0 : this.inputOutputMapping.size();
   }
 
-  public java.util.Iterator<InputOutputMapping> getInputOutputMappingIterator() {
+  public java.util.Iterator<ParserDagInputOutputMapping> getInputOutputMappingIterator() {
     return (this.inputOutputMapping == null) ? null : this.inputOutputMapping.iterator();
   }
 
-  public void addToInputOutputMapping(InputOutputMapping elem) {
+  public void addToInputOutputMapping(ParserDagInputOutputMapping elem) {
     if (this.inputOutputMapping == null) {
-      this.inputOutputMapping = new java.util.ArrayList<InputOutputMapping>();
+      this.inputOutputMapping = new java.util.ArrayList<ParserDagInputOutputMapping>();
     }
     this.inputOutputMapping.add(elem);
   }
 
-  public java.util.List<InputOutputMapping> getInputOutputMapping() {
+  public java.util.List<ParserDagInputOutputMapping> getInputOutputMapping() {
     return this.inputOutputMapping;
   }
 
-  public void setInputOutputMapping(java.util.List<InputOutputMapping> inputOutputMapping) {
+  public void setInputOutputMapping(java.util.List<ParserDagInputOutputMapping> inputOutputMapping) {
     this.inputOutputMapping = inputOutputMapping;
   }
 
@@ -246,8 +295,39 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
     }
   }
 
+  public java.lang.String getParsingTemplateId() {
+    return this.parsingTemplateId;
+  }
+
+  public void setParsingTemplateId(java.lang.String parsingTemplateId) {
+    this.parsingTemplateId = parsingTemplateId;
+  }
+
+  public void unsetParsingTemplateId() {
+    this.parsingTemplateId = null;
+  }
+
+  /** Returns true if field parsingTemplateId is set (has been assigned a value) and false otherwise */
+  public boolean isSetParsingTemplateId() {
+    return this.parsingTemplateId != null;
+  }
+
+  public void setParsingTemplateIdIsSet(boolean value) {
+    if (!value) {
+      this.parsingTemplateId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
+    case ID:
+      if (value == null) {
+        unsetId();
+      } else {
+        setId((java.lang.String)value);
+      }
+      break;
+
     case PARENT_PARSER_ID:
       if (value == null) {
         unsetParentParserId();
@@ -268,7 +348,15 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
       if (value == null) {
         unsetInputOutputMapping();
       } else {
-        setInputOutputMapping((java.util.List<InputOutputMapping>)value);
+        setInputOutputMapping((java.util.List<ParserDagInputOutputMapping>)value);
+      }
+      break;
+
+    case PARSING_TEMPLATE_ID:
+      if (value == null) {
+        unsetParsingTemplateId();
+      } else {
+        setParsingTemplateId((java.lang.String)value);
       }
       break;
 
@@ -277,6 +365,9 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
 
   public java.lang.Object getFieldValue(_Fields field) {
     switch (field) {
+    case ID:
+      return getId();
+
     case PARENT_PARSER_ID:
       return getParentParserId();
 
@@ -286,6 +377,9 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
     case INPUT_OUTPUT_MAPPING:
       return getInputOutputMapping();
 
+    case PARSING_TEMPLATE_ID:
+      return getParsingTemplateId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -297,12 +391,16 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
     }
 
     switch (field) {
+    case ID:
+      return isSetId();
     case PARENT_PARSER_ID:
       return isSetParentParserId();
     case CHILD_PARSER_ID:
       return isSetChildParserId();
     case INPUT_OUTPUT_MAPPING:
       return isSetInputOutputMapping();
+    case PARSING_TEMPLATE_ID:
+      return isSetParsingTemplateId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -311,17 +409,26 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
   public boolean equals(java.lang.Object that) {
     if (that == null)
       return false;
-    if (that instanceof DagElement)
-      return this.equals((DagElement)that);
+    if (that instanceof ParserDagElement)
+      return this.equals((ParserDagElement)that);
     return false;
   }
 
-  public boolean equals(DagElement that) {
+  public boolean equals(ParserDagElement that) {
     if (that == null)
       return false;
     if (this == that)
       return true;
 
+    boolean this_present_id = true && this.isSetId();
+    boolean that_present_id = true && that.isSetId();
+    if (this_present_id || that_present_id) {
+      if (!(this_present_id && that_present_id))
+        return false;
+      if (!this.id.equals(that.id))
+        return false;
+    }
+
     boolean this_present_parentParserId = true && this.isSetParentParserId();
     boolean that_present_parentParserId = true && that.isSetParentParserId();
     if (this_present_parentParserId || that_present_parentParserId) {
@@ -349,6 +456,15 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
         return false;
     }
 
+    boolean this_present_parsingTemplateId = true && this.isSetParsingTemplateId();
+    boolean that_present_parsingTemplateId = true && that.isSetParsingTemplateId();
+    if (this_present_parsingTemplateId || that_present_parsingTemplateId) {
+      if (!(this_present_parsingTemplateId && that_present_parsingTemplateId))
+        return false;
+      if (!this.parsingTemplateId.equals(that.parsingTemplateId))
+        return false;
+    }
+
     return true;
   }
 
@@ -356,6 +472,10 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
   public int hashCode() {
     int hashCode = 1;
 
+    hashCode = hashCode * 8191 + ((isSetId()) ? 131071 : 524287);
+    if (isSetId())
+      hashCode = hashCode * 8191 + id.hashCode();
+
     hashCode = hashCode * 8191 + ((isSetParentParserId()) ? 131071 : 524287);
     if (isSetParentParserId())
       hashCode = hashCode * 8191 + parentParserId.hashCode();
@@ -368,17 +488,31 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
     if (isSetInputOutputMapping())
       hashCode = hashCode * 8191 + inputOutputMapping.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetParsingTemplateId()) ? 131071 : 524287);
+    if (isSetParsingTemplateId())
+      hashCode = hashCode * 8191 + parsingTemplateId.hashCode();
+
     return hashCode;
   }
 
   @Override
-  public int compareTo(DagElement other) {
+  public int compareTo(ParserDagElement other) {
     if (!getClass().equals(other.getClass())) {
       return getClass().getName().compareTo(other.getClass().getName());
     }
 
     int lastComparison = 0;
 
+    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     lastComparison = java.lang.Boolean.valueOf(isSetParentParserId()).compareTo(other.isSetParentParserId());
     if (lastComparison != 0) {
       return lastComparison;
@@ -409,6 +543,16 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetParsingTemplateId()).compareTo(other.isSetParsingTemplateId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetParsingTemplateId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parsingTemplateId, other.parsingTemplateId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -426,9 +570,17 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
 
   @Override
   public java.lang.String toString() {
-    java.lang.StringBuilder sb = new java.lang.StringBuilder("DagElement(");
+    java.lang.StringBuilder sb = new java.lang.StringBuilder("ParserDagElement(");
     boolean first = true;
 
+    sb.append("id:");
+    if (this.id == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.id);
+    }
+    first = false;
+    if (!first) sb.append(", ");
     sb.append("parentParserId:");
     if (this.parentParserId == null) {
       sb.append("null");
@@ -452,12 +604,24 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
       sb.append(this.inputOutputMapping);
     }
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("parsingTemplateId:");
+    if (this.parsingTemplateId == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.parsingTemplateId);
+    }
+    first = false;
     sb.append(")");
     return sb.toString();
   }
 
   public void validate() throws org.apache.thrift.TException {
     // check for required fields
+    if (!isSetId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'id' is unset! Struct:" + toString());
+    }
+
     if (!isSetParentParserId()) {
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'parentParserId' is unset! Struct:" + toString());
     }
@@ -470,6 +634,10 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'inputOutputMapping' is unset! Struct:" + toString());
     }
 
+    if (!isSetParsingTemplateId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'parsingTemplateId' is unset! Struct:" + toString());
+    }
+
     // check for sub-struct validity
   }
 
@@ -489,15 +657,15 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
     }
   }
 
-  private static class DagElementStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-    public DagElementStandardScheme getScheme() {
-      return new DagElementStandardScheme();
+  private static class ParserDagElementStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+    public ParserDagElementStandardScheme getScheme() {
+      return new ParserDagElementStandardScheme();
     }
   }
 
-  private static class DagElementStandardScheme extends org.apache.thrift.scheme.StandardScheme<DagElement> {
+  private static class ParserDagElementStandardScheme extends org.apache.thrift.scheme.StandardScheme<ParserDagElement> {
 
-    public void read(org.apache.thrift.protocol.TProtocol iprot, DagElement struct) throws org.apache.thrift.TException {
+    public void read(org.apache.thrift.protocol.TProtocol iprot, ParserDagElement struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TField schemeField;
       iprot.readStructBegin();
       while (true)
@@ -507,7 +675,15 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
           break;
         }
         switch (schemeField.id) {
-          case 1: // PARENT_PARSER_ID
+          case 1: // ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.id = iprot.readString();
+              struct.setIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // PARENT_PARSER_ID
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.parentParserId = iprot.readString();
               struct.setParentParserIdIsSet(true);
@@ -515,7 +691,7 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 2: // CHILD_PARSER_ID
+          case 3: // CHILD_PARSER_ID
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.childParserId = iprot.readString();
               struct.setChildParserIdIsSet(true);
@@ -523,15 +699,15 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 3: // INPUT_OUTPUT_MAPPING
+          case 4: // INPUT_OUTPUT_MAPPING
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
                 org.apache.thrift.protocol.TList _list16 = iprot.readListBegin();
-                struct.inputOutputMapping = new java.util.ArrayList<InputOutputMapping>(_list16.size);
-                InputOutputMapping _elem17;
+                struct.inputOutputMapping = new java.util.ArrayList<ParserDagInputOutputMapping>(_list16.size);
+                ParserDagInputOutputMapping _elem17;
                 for (int _i18 = 0; _i18 < _list16.size; ++_i18)
                 {
-                  _elem17 = new InputOutputMapping();
+                  _elem17 = new ParserDagInputOutputMapping();
                   _elem17.read(iprot);
                   struct.inputOutputMapping.add(_elem17);
                 }
@@ -542,6 +718,14 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 5: // PARSING_TEMPLATE_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.parsingTemplateId = iprot.readString();
+              struct.setParsingTemplateIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -551,10 +735,15 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
       struct.validate();
     }
 
-    public void write(org.apache.thrift.protocol.TProtocol oprot, DagElement struct) throws org.apache.thrift.TException {
+    public void write(org.apache.thrift.protocol.TProtocol oprot, ParserDagElement struct) throws org.apache.thrift.TException {
       struct.validate();
 
       oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.id != null) {
+        oprot.writeFieldBegin(ID_FIELD_DESC);
+        oprot.writeString(struct.id);
+        oprot.writeFieldEnd();
+      }
       if (struct.parentParserId != null) {
         oprot.writeFieldBegin(PARENT_PARSER_ID_FIELD_DESC);
         oprot.writeString(struct.parentParserId);
@@ -569,7 +758,7 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
         oprot.writeFieldBegin(INPUT_OUTPUT_MAPPING_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.inputOutputMapping.size()));
-          for (InputOutputMapping _iter19 : struct.inputOutputMapping)
+          for (ParserDagInputOutputMapping _iter19 : struct.inputOutputMapping)
           {
             _iter19.write(oprot);
           }
@@ -577,53 +766,64 @@ public class DagElement implements org.apache.thrift.TBase<DagElement, DagElemen
         }
         oprot.writeFieldEnd();
       }
+      if (struct.parsingTemplateId != null) {
+        oprot.writeFieldBegin(PARSING_TEMPLATE_ID_FIELD_DESC);
+        oprot.writeString(struct.parsingTemplateId);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
 
   }
 
-  private static class DagElementTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-    public DagElementTupleScheme getScheme() {
-      return new DagElementTupleScheme();
+  private static class ParserDagElementTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+    public ParserDagElementTupleScheme getScheme() {
+      return new ParserDagElementTupleScheme();
     }
   }
 
-  private static class DagElementTupleScheme extends org.apache.thrift.scheme.TupleScheme<DagElement> {
+  private static class ParserDagElementTupleScheme extends org.apache.thrift.scheme.TupleScheme<ParserDagElement> {
 
     @Override
-    public void write(org.apache.thrift.protocol.TProtocol prot, DagElement struct) throws org.apache.thrift.TException {
+    public void write(org.apache.thrift.protocol.TProtocol prot, ParserDagElement struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      oprot.writeString(struct.id);
       oprot.writeString(struct.parentParserId);
       oprot.writeString(struct.childParserId);
       {
         oprot.writeI32(struct.inputOutputMapping.size());
-        for (InputOutputMapping _iter20 : struct.inputOutputMapping)
+        for (ParserDagInputOutputMapping _iter20 : struct.inputOutputMapping)
         {
           _iter20.write(oprot);
         }
       }
+      oprot.writeString(struct.parsingTemplateId);
     }
 
     @Override
-    public void read(org.apache.thrift.protocol.TProtocol prot, DagElement struct) throws org.apache.thrift.TException {
+    public void read(org.apache.thrift.protocol.TProtocol prot, ParserDagElement struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      struct.id = iprot.readString();
+      struct.setIdIsSet(true);
       struct.parentParserId = iprot.readString();
       struct.setParentParserIdIsSet(true);
       struct.childParserId = iprot.readString();
       struct.setChildParserIdIsSet(true);
       {
         org.apache.thrift.protocol.TList _list21 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-        struct.inputOutputMapping = new java.util.ArrayList<InputOutputMapping>(_list21.size);
-        InputOutputMapping _elem22;
+        struct.inputOutputMapping = new java.util.ArrayList<ParserDagInputOutputMapping>(_list21.size);
+        ParserDagInputOutputMapping _elem22;
         for (int _i23 = 0; _i23 < _list21.size; ++_i23)
         {
-          _elem22 = new InputOutputMapping();
+          _elem22 = new ParserDagInputOutputMapping();
           _elem22.read(iprot);
           struct.inputOutputMapping.add(_elem22);
         }
       }
       struct.setInputOutputMappingIsSet(true);
+      struct.parsingTemplateId = iprot.readString();
+      struct.setParsingTemplateIdIsSet(true);
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/InputOutputMapping.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserDagInputOutputMapping.java
similarity index 59%
rename from airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/InputOutputMapping.java
rename to airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserDagInputOutputMapping.java
index 2d66ed1..2cfe536 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/InputOutputMapping.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserDagInputOutputMapping.java
@@ -25,22 +25,28 @@ package org.apache.airavata.model.appcatalog.parser;
 
 @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
 @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
-public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMapping, InputOutputMapping._Fields>, java.io.Serializable, Cloneable, Comparable<InputOutputMapping> {
-  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("InputOutputMapping");
+public class ParserDagInputOutputMapping implements org.apache.thrift.TBase<ParserDagInputOutputMapping, ParserDagInputOutputMapping._Fields>, java.io.Serializable, Cloneable, Comparable<ParserDagInputOutputMapping> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ParserDagInputOutputMapping");
 
-  private static final org.apache.thrift.protocol.TField INPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("inputId", org.apache.thrift.protocol.TType.STRING, (short)1);
-  private static final org.apache.thrift.protocol.TField OUTPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("outputId", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField INPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("inputId", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField OUTPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("outputId", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField PARSER_DAG_ELEMENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parserDagElementId", org.apache.thrift.protocol.TType.STRING, (short)4);
 
-  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new InputOutputMappingStandardSchemeFactory();
-  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new InputOutputMappingTupleSchemeFactory();
+  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ParserDagInputOutputMappingStandardSchemeFactory();
+  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ParserDagInputOutputMappingTupleSchemeFactory();
 
+  private java.lang.String id; // required
   private java.lang.String inputId; // required
   private java.lang.String outputId; // required
+  private java.lang.String parserDagElementId; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    INPUT_ID((short)1, "inputId"),
-    OUTPUT_ID((short)2, "outputId");
+    ID((short)1, "id"),
+    INPUT_ID((short)2, "inputId"),
+    OUTPUT_ID((short)3, "outputId"),
+    PARSER_DAG_ELEMENT_ID((short)4, "parserDagElementId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -55,10 +61,14 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
      */
     public static _Fields findByThriftId(int fieldId) {
       switch(fieldId) {
-        case 1: // INPUT_ID
+        case 1: // ID
+          return ID;
+        case 2: // INPUT_ID
           return INPUT_ID;
-        case 2: // OUTPUT_ID
+        case 3: // OUTPUT_ID
           return OUTPUT_ID;
+        case 4: // PARSER_DAG_ELEMENT_ID
+          return PARSER_DAG_ELEMENT_ID;
         default:
           return null;
       }
@@ -102,46 +112,85 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
   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);
+    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData("id", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.INPUT_ID, new org.apache.thrift.meta_data.FieldMetaData("inputId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.OUTPUT_ID, new org.apache.thrift.meta_data.FieldMetaData("outputId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.PARSER_DAG_ELEMENT_ID, new org.apache.thrift.meta_data.FieldMetaData("parserDagElementId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        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(InputOutputMapping.class, metaDataMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ParserDagInputOutputMapping.class, metaDataMap);
   }
 
-  public InputOutputMapping() {
+  public ParserDagInputOutputMapping() {
   }
 
-  public InputOutputMapping(
+  public ParserDagInputOutputMapping(
+    java.lang.String id,
     java.lang.String inputId,
-    java.lang.String outputId)
+    java.lang.String outputId,
+    java.lang.String parserDagElementId)
   {
     this();
+    this.id = id;
     this.inputId = inputId;
     this.outputId = outputId;
+    this.parserDagElementId = parserDagElementId;
   }
 
   /**
    * Performs a deep copy on <i>other</i>.
    */
-  public InputOutputMapping(InputOutputMapping other) {
+  public ParserDagInputOutputMapping(ParserDagInputOutputMapping other) {
+    if (other.isSetId()) {
+      this.id = other.id;
+    }
     if (other.isSetInputId()) {
       this.inputId = other.inputId;
     }
     if (other.isSetOutputId()) {
       this.outputId = other.outputId;
     }
+    if (other.isSetParserDagElementId()) {
+      this.parserDagElementId = other.parserDagElementId;
+    }
   }
 
-  public InputOutputMapping deepCopy() {
-    return new InputOutputMapping(this);
+  public ParserDagInputOutputMapping deepCopy() {
+    return new ParserDagInputOutputMapping(this);
   }
 
   @Override
   public void clear() {
+    this.id = null;
     this.inputId = null;
     this.outputId = null;
+    this.parserDagElementId = null;
+  }
+
+  public java.lang.String getId() {
+    return this.id;
+  }
+
+  public void setId(java.lang.String id) {
+    this.id = id;
+  }
+
+  public void unsetId() {
+    this.id = null;
+  }
+
+  /** Returns true if field id is set (has been assigned a value) and false otherwise */
+  public boolean isSetId() {
+    return this.id != null;
+  }
+
+  public void setIdIsSet(boolean value) {
+    if (!value) {
+      this.id = null;
+    }
   }
 
   public java.lang.String getInputId() {
@@ -190,8 +239,39 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
     }
   }
 
+  public java.lang.String getParserDagElementId() {
+    return this.parserDagElementId;
+  }
+
+  public void setParserDagElementId(java.lang.String parserDagElementId) {
+    this.parserDagElementId = parserDagElementId;
+  }
+
+  public void unsetParserDagElementId() {
+    this.parserDagElementId = null;
+  }
+
+  /** Returns true if field parserDagElementId is set (has been assigned a value) and false otherwise */
+  public boolean isSetParserDagElementId() {
+    return this.parserDagElementId != null;
+  }
+
+  public void setParserDagElementIdIsSet(boolean value) {
+    if (!value) {
+      this.parserDagElementId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
+    case ID:
+      if (value == null) {
+        unsetId();
+      } else {
+        setId((java.lang.String)value);
+      }
+      break;
+
     case INPUT_ID:
       if (value == null) {
         unsetInputId();
@@ -208,17 +288,31 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
       }
       break;
 
+    case PARSER_DAG_ELEMENT_ID:
+      if (value == null) {
+        unsetParserDagElementId();
+      } else {
+        setParserDagElementId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
   public java.lang.Object getFieldValue(_Fields field) {
     switch (field) {
+    case ID:
+      return getId();
+
     case INPUT_ID:
       return getInputId();
 
     case OUTPUT_ID:
       return getOutputId();
 
+    case PARSER_DAG_ELEMENT_ID:
+      return getParserDagElementId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -230,10 +324,14 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
     }
 
     switch (field) {
+    case ID:
+      return isSetId();
     case INPUT_ID:
       return isSetInputId();
     case OUTPUT_ID:
       return isSetOutputId();
+    case PARSER_DAG_ELEMENT_ID:
+      return isSetParserDagElementId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -242,17 +340,26 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
   public boolean equals(java.lang.Object that) {
     if (that == null)
       return false;
-    if (that instanceof InputOutputMapping)
-      return this.equals((InputOutputMapping)that);
+    if (that instanceof ParserDagInputOutputMapping)
+      return this.equals((ParserDagInputOutputMapping)that);
     return false;
   }
 
-  public boolean equals(InputOutputMapping that) {
+  public boolean equals(ParserDagInputOutputMapping that) {
     if (that == null)
       return false;
     if (this == that)
       return true;
 
+    boolean this_present_id = true && this.isSetId();
+    boolean that_present_id = true && that.isSetId();
+    if (this_present_id || that_present_id) {
+      if (!(this_present_id && that_present_id))
+        return false;
+      if (!this.id.equals(that.id))
+        return false;
+    }
+
     boolean this_present_inputId = true && this.isSetInputId();
     boolean that_present_inputId = true && that.isSetInputId();
     if (this_present_inputId || that_present_inputId) {
@@ -271,6 +378,15 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
         return false;
     }
 
+    boolean this_present_parserDagElementId = true && this.isSetParserDagElementId();
+    boolean that_present_parserDagElementId = true && that.isSetParserDagElementId();
+    if (this_present_parserDagElementId || that_present_parserDagElementId) {
+      if (!(this_present_parserDagElementId && that_present_parserDagElementId))
+        return false;
+      if (!this.parserDagElementId.equals(that.parserDagElementId))
+        return false;
+    }
+
     return true;
   }
 
@@ -278,6 +394,10 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
   public int hashCode() {
     int hashCode = 1;
 
+    hashCode = hashCode * 8191 + ((isSetId()) ? 131071 : 524287);
+    if (isSetId())
+      hashCode = hashCode * 8191 + id.hashCode();
+
     hashCode = hashCode * 8191 + ((isSetInputId()) ? 131071 : 524287);
     if (isSetInputId())
       hashCode = hashCode * 8191 + inputId.hashCode();
@@ -286,17 +406,31 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
     if (isSetOutputId())
       hashCode = hashCode * 8191 + outputId.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetParserDagElementId()) ? 131071 : 524287);
+    if (isSetParserDagElementId())
+      hashCode = hashCode * 8191 + parserDagElementId.hashCode();
+
     return hashCode;
   }
 
   @Override
-  public int compareTo(InputOutputMapping other) {
+  public int compareTo(ParserDagInputOutputMapping other) {
     if (!getClass().equals(other.getClass())) {
       return getClass().getName().compareTo(other.getClass().getName());
     }
 
     int lastComparison = 0;
 
+    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     lastComparison = java.lang.Boolean.valueOf(isSetInputId()).compareTo(other.isSetInputId());
     if (lastComparison != 0) {
       return lastComparison;
@@ -317,6 +451,16 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetParserDagElementId()).compareTo(other.isSetParserDagElementId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetParserDagElementId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parserDagElementId, other.parserDagElementId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -334,9 +478,17 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
 
   @Override
   public java.lang.String toString() {
-    java.lang.StringBuilder sb = new java.lang.StringBuilder("InputOutputMapping(");
+    java.lang.StringBuilder sb = new java.lang.StringBuilder("ParserDagInputOutputMapping(");
     boolean first = true;
 
+    sb.append("id:");
+    if (this.id == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.id);
+    }
+    first = false;
+    if (!first) sb.append(", ");
     sb.append("inputId:");
     if (this.inputId == null) {
       sb.append("null");
@@ -352,12 +504,24 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
       sb.append(this.outputId);
     }
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("parserDagElementId:");
+    if (this.parserDagElementId == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.parserDagElementId);
+    }
+    first = false;
     sb.append(")");
     return sb.toString();
   }
 
   public void validate() throws org.apache.thrift.TException {
     // check for required fields
+    if (!isSetId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'id' is unset! Struct:" + toString());
+    }
+
     if (!isSetInputId()) {
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'inputId' is unset! Struct:" + toString());
     }
@@ -366,6 +530,10 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'outputId' is unset! Struct:" + toString());
     }
 
+    if (!isSetParserDagElementId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'parserDagElementId' is unset! Struct:" + toString());
+    }
+
     // check for sub-struct validity
   }
 
@@ -385,15 +553,15 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
     }
   }
 
-  private static class InputOutputMappingStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-    public InputOutputMappingStandardScheme getScheme() {
-      return new InputOutputMappingStandardScheme();
+  private static class ParserDagInputOutputMappingStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+    public ParserDagInputOutputMappingStandardScheme getScheme() {
+      return new ParserDagInputOutputMappingStandardScheme();
     }
   }
 
-  private static class InputOutputMappingStandardScheme extends org.apache.thrift.scheme.StandardScheme<InputOutputMapping> {
+  private static class ParserDagInputOutputMappingStandardScheme extends org.apache.thrift.scheme.StandardScheme<ParserDagInputOutputMapping> {
 
-    public void read(org.apache.thrift.protocol.TProtocol iprot, InputOutputMapping struct) throws org.apache.thrift.TException {
+    public void read(org.apache.thrift.protocol.TProtocol iprot, ParserDagInputOutputMapping struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TField schemeField;
       iprot.readStructBegin();
       while (true)
@@ -403,7 +571,15 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
           break;
         }
         switch (schemeField.id) {
-          case 1: // INPUT_ID
+          case 1: // ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.id = iprot.readString();
+              struct.setIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // INPUT_ID
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.inputId = iprot.readString();
               struct.setInputIdIsSet(true);
@@ -411,7 +587,7 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 2: // OUTPUT_ID
+          case 3: // OUTPUT_ID
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.outputId = iprot.readString();
               struct.setOutputIdIsSet(true);
@@ -419,6 +595,14 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // PARSER_DAG_ELEMENT_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.parserDagElementId = iprot.readString();
+              struct.setParserDagElementIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -428,10 +612,15 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
       struct.validate();
     }
 
-    public void write(org.apache.thrift.protocol.TProtocol oprot, InputOutputMapping struct) throws org.apache.thrift.TException {
+    public void write(org.apache.thrift.protocol.TProtocol oprot, ParserDagInputOutputMapping struct) throws org.apache.thrift.TException {
       struct.validate();
 
       oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.id != null) {
+        oprot.writeFieldBegin(ID_FIELD_DESC);
+        oprot.writeString(struct.id);
+        oprot.writeFieldEnd();
+      }
       if (struct.inputId != null) {
         oprot.writeFieldBegin(INPUT_ID_FIELD_DESC);
         oprot.writeString(struct.inputId);
@@ -442,34 +631,45 @@ public class InputOutputMapping implements org.apache.thrift.TBase<InputOutputMa
         oprot.writeString(struct.outputId);
         oprot.writeFieldEnd();
       }
+      if (struct.parserDagElementId != null) {
+        oprot.writeFieldBegin(PARSER_DAG_ELEMENT_ID_FIELD_DESC);
+        oprot.writeString(struct.parserDagElementId);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
 
   }
 
-  private static class InputOutputMappingTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-    public InputOutputMappingTupleScheme getScheme() {
-      return new InputOutputMappingTupleScheme();
+  private static class ParserDagInputOutputMappingTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+    public ParserDagInputOutputMappingTupleScheme getScheme() {
+      return new ParserDagInputOutputMappingTupleScheme();
     }
   }
 
-  private static class InputOutputMappingTupleScheme extends org.apache.thrift.scheme.TupleScheme<InputOutputMapping> {
+  private static class ParserDagInputOutputMappingTupleScheme extends org.apache.thrift.scheme.TupleScheme<ParserDagInputOutputMapping> {
 
     @Override
-    public void write(org.apache.thrift.protocol.TProtocol prot, InputOutputMapping struct) throws org.apache.thrift.TException {
+    public void write(org.apache.thrift.protocol.TProtocol prot, ParserDagInputOutputMapping struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      oprot.writeString(struct.id);
       oprot.writeString(struct.inputId);
       oprot.writeString(struct.outputId);
+      oprot.writeString(struct.parserDagElementId);
     }
 
     @Override
-    public void read(org.apache.thrift.protocol.TProtocol prot, InputOutputMapping struct) throws org.apache.thrift.TException {
+    public void read(org.apache.thrift.protocol.TProtocol prot, ParserDagInputOutputMapping struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      struct.id = iprot.readString();
+      struct.setIdIsSet(true);
       struct.inputId = iprot.readString();
       struct.setInputIdIsSet(true);
       struct.outputId = iprot.readString();
       struct.setOutputIdIsSet(true);
+      struct.parserDagElementId = iprot.readString();
+      struct.setParserDagElementIdIsSet(true);
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserInput.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserInput.java
index 4d818c7..438f905 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserInput.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserInput.java
@@ -31,6 +31,7 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
   private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.STRING, (short)1);
   private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)2);
   private static final org.apache.thrift.protocol.TField REQUIRED_FILE_FIELD_DESC = new org.apache.thrift.protocol.TField("requiredFile", org.apache.thrift.protocol.TType.BOOL, (short)3);
+  private static final org.apache.thrift.protocol.TField PARSER_INFO_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parserInfoId", org.apache.thrift.protocol.TType.BOOL, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ParserInputStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ParserInputTupleSchemeFactory();
@@ -38,12 +39,14 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
   private java.lang.String id; // required
   private java.lang.String name; // required
   private boolean requiredFile; // required
+  private boolean parserInfoId; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
     ID((short)1, "id"),
     NAME((short)2, "name"),
-    REQUIRED_FILE((short)3, "requiredFile");
+    REQUIRED_FILE((short)3, "requiredFile"),
+    PARSER_INFO_ID((short)4, "parserInfoId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -64,6 +67,8 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
           return NAME;
         case 3: // REQUIRED_FILE
           return REQUIRED_FILE;
+        case 4: // PARSER_INFO_ID
+          return PARSER_INFO_ID;
         default:
           return null;
       }
@@ -105,6 +110,7 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
 
   // isset id assignments
   private static final int __REQUIREDFILE_ISSET_ID = 0;
+  private static final int __PARSERINFOID_ISSET_ID = 1;
   private byte __isset_bitfield = 0;
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
@@ -115,6 +121,8 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.REQUIRED_FILE, new org.apache.thrift.meta_data.FieldMetaData("requiredFile", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
+    tmpMap.put(_Fields.PARSER_INFO_ID, new org.apache.thrift.meta_data.FieldMetaData("parserInfoId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ParserInput.class, metaDataMap);
   }
@@ -125,13 +133,16 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
   public ParserInput(
     java.lang.String id,
     java.lang.String name,
-    boolean requiredFile)
+    boolean requiredFile,
+    boolean parserInfoId)
   {
     this();
     this.id = id;
     this.name = name;
     this.requiredFile = requiredFile;
     setRequiredFileIsSet(true);
+    this.parserInfoId = parserInfoId;
+    setParserInfoIdIsSet(true);
   }
 
   /**
@@ -146,6 +157,7 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       this.name = other.name;
     }
     this.requiredFile = other.requiredFile;
+    this.parserInfoId = other.parserInfoId;
   }
 
   public ParserInput deepCopy() {
@@ -158,6 +170,8 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
     this.name = null;
     setRequiredFileIsSet(false);
     this.requiredFile = false;
+    setParserInfoIdIsSet(false);
+    this.parserInfoId = false;
   }
 
   public java.lang.String getId() {
@@ -228,6 +242,28 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
     __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __REQUIREDFILE_ISSET_ID, value);
   }
 
+  public boolean isParserInfoId() {
+    return this.parserInfoId;
+  }
+
+  public void setParserInfoId(boolean parserInfoId) {
+    this.parserInfoId = parserInfoId;
+    setParserInfoIdIsSet(true);
+  }
+
+  public void unsetParserInfoId() {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PARSERINFOID_ISSET_ID);
+  }
+
+  /** Returns true if field parserInfoId is set (has been assigned a value) and false otherwise */
+  public boolean isSetParserInfoId() {
+    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PARSERINFOID_ISSET_ID);
+  }
+
+  public void setParserInfoIdIsSet(boolean value) {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PARSERINFOID_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case ID:
@@ -254,6 +290,14 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       }
       break;
 
+    case PARSER_INFO_ID:
+      if (value == null) {
+        unsetParserInfoId();
+      } else {
+        setParserInfoId((java.lang.Boolean)value);
+      }
+      break;
+
     }
   }
 
@@ -268,6 +312,9 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
     case REQUIRED_FILE:
       return isRequiredFile();
 
+    case PARSER_INFO_ID:
+      return isParserInfoId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -285,6 +332,8 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       return isSetName();
     case REQUIRED_FILE:
       return isSetRequiredFile();
+    case PARSER_INFO_ID:
+      return isSetParserInfoId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -331,6 +380,15 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
         return false;
     }
 
+    boolean this_present_parserInfoId = true;
+    boolean that_present_parserInfoId = true;
+    if (this_present_parserInfoId || that_present_parserInfoId) {
+      if (!(this_present_parserInfoId && that_present_parserInfoId))
+        return false;
+      if (this.parserInfoId != that.parserInfoId)
+        return false;
+    }
+
     return true;
   }
 
@@ -348,6 +406,8 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
 
     hashCode = hashCode * 8191 + ((requiredFile) ? 131071 : 524287);
 
+    hashCode = hashCode * 8191 + ((parserInfoId) ? 131071 : 524287);
+
     return hashCode;
   }
 
@@ -389,6 +449,16 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetParserInfoId()).compareTo(other.isSetParserInfoId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetParserInfoId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parserInfoId, other.parserInfoId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -428,6 +498,10 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
     sb.append("requiredFile:");
     sb.append(this.requiredFile);
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("parserInfoId:");
+    sb.append(this.parserInfoId);
+    first = false;
     sb.append(")");
     return sb.toString();
   }
@@ -446,6 +520,10 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'requiredFile' is unset! Struct:" + toString());
     }
 
+    if (!isSetParserInfoId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'parserInfoId' is unset! Struct:" + toString());
+    }
+
     // check for sub-struct validity
   }
 
@@ -509,6 +587,14 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // PARSER_INFO_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+              struct.parserInfoId = iprot.readBool();
+              struct.setParserInfoIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -535,6 +621,9 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       oprot.writeFieldBegin(REQUIRED_FILE_FIELD_DESC);
       oprot.writeBool(struct.requiredFile);
       oprot.writeFieldEnd();
+      oprot.writeFieldBegin(PARSER_INFO_ID_FIELD_DESC);
+      oprot.writeBool(struct.parserInfoId);
+      oprot.writeFieldEnd();
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -555,6 +644,7 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       oprot.writeString(struct.id);
       oprot.writeString(struct.name);
       oprot.writeBool(struct.requiredFile);
+      oprot.writeBool(struct.parserInfoId);
     }
 
     @Override
@@ -566,6 +656,8 @@ public class ParserInput implements org.apache.thrift.TBase<ParserInput, ParserI
       struct.setNameIsSet(true);
       struct.requiredFile = iprot.readBool();
       struct.setRequiredFileIsSet(true);
+      struct.parserInfoId = iprot.readBool();
+      struct.setParserInfoIdIsSet(true);
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserOutput.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserOutput.java
index 3b2b094..3a5c025 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserOutput.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParserOutput.java
@@ -31,6 +31,7 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
   private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.STRING, (short)1);
   private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)2);
   private static final org.apache.thrift.protocol.TField REQUIRED_FILE_FIELD_DESC = new org.apache.thrift.protocol.TField("requiredFile", org.apache.thrift.protocol.TType.BOOL, (short)3);
+  private static final org.apache.thrift.protocol.TField PARSER_INFO_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parserInfoId", org.apache.thrift.protocol.TType.BOOL, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ParserOutputStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ParserOutputTupleSchemeFactory();
@@ -38,12 +39,14 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
   private java.lang.String id; // required
   private java.lang.String name; // required
   private boolean requiredFile; // required
+  private boolean parserInfoId; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
     ID((short)1, "id"),
     NAME((short)2, "name"),
-    REQUIRED_FILE((short)3, "requiredFile");
+    REQUIRED_FILE((short)3, "requiredFile"),
+    PARSER_INFO_ID((short)4, "parserInfoId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -64,6 +67,8 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
           return NAME;
         case 3: // REQUIRED_FILE
           return REQUIRED_FILE;
+        case 4: // PARSER_INFO_ID
+          return PARSER_INFO_ID;
         default:
           return null;
       }
@@ -105,6 +110,7 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
 
   // isset id assignments
   private static final int __REQUIREDFILE_ISSET_ID = 0;
+  private static final int __PARSERINFOID_ISSET_ID = 1;
   private byte __isset_bitfield = 0;
   public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
@@ -115,6 +121,8 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.REQUIRED_FILE, new org.apache.thrift.meta_data.FieldMetaData("requiredFile", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
+    tmpMap.put(_Fields.PARSER_INFO_ID, new org.apache.thrift.meta_data.FieldMetaData("parserInfoId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ParserOutput.class, metaDataMap);
   }
@@ -125,13 +133,16 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
   public ParserOutput(
     java.lang.String id,
     java.lang.String name,
-    boolean requiredFile)
+    boolean requiredFile,
+    boolean parserInfoId)
   {
     this();
     this.id = id;
     this.name = name;
     this.requiredFile = requiredFile;
     setRequiredFileIsSet(true);
+    this.parserInfoId = parserInfoId;
+    setParserInfoIdIsSet(true);
   }
 
   /**
@@ -146,6 +157,7 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       this.name = other.name;
     }
     this.requiredFile = other.requiredFile;
+    this.parserInfoId = other.parserInfoId;
   }
 
   public ParserOutput deepCopy() {
@@ -158,6 +170,8 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
     this.name = null;
     setRequiredFileIsSet(false);
     this.requiredFile = false;
+    setParserInfoIdIsSet(false);
+    this.parserInfoId = false;
   }
 
   public java.lang.String getId() {
@@ -228,6 +242,28 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
     __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __REQUIREDFILE_ISSET_ID, value);
   }
 
+  public boolean isParserInfoId() {
+    return this.parserInfoId;
+  }
+
+  public void setParserInfoId(boolean parserInfoId) {
+    this.parserInfoId = parserInfoId;
+    setParserInfoIdIsSet(true);
+  }
+
+  public void unsetParserInfoId() {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PARSERINFOID_ISSET_ID);
+  }
+
+  /** Returns true if field parserInfoId is set (has been assigned a value) and false otherwise */
+  public boolean isSetParserInfoId() {
+    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PARSERINFOID_ISSET_ID);
+  }
+
+  public void setParserInfoIdIsSet(boolean value) {
+    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PARSERINFOID_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case ID:
@@ -254,6 +290,14 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       }
       break;
 
+    case PARSER_INFO_ID:
+      if (value == null) {
+        unsetParserInfoId();
+      } else {
+        setParserInfoId((java.lang.Boolean)value);
+      }
+      break;
+
     }
   }
 
@@ -268,6 +312,9 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
     case REQUIRED_FILE:
       return isRequiredFile();
 
+    case PARSER_INFO_ID:
+      return isParserInfoId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -285,6 +332,8 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       return isSetName();
     case REQUIRED_FILE:
       return isSetRequiredFile();
+    case PARSER_INFO_ID:
+      return isSetParserInfoId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -331,6 +380,15 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
         return false;
     }
 
+    boolean this_present_parserInfoId = true;
+    boolean that_present_parserInfoId = true;
+    if (this_present_parserInfoId || that_present_parserInfoId) {
+      if (!(this_present_parserInfoId && that_present_parserInfoId))
+        return false;
+      if (this.parserInfoId != that.parserInfoId)
+        return false;
+    }
+
     return true;
   }
 
@@ -348,6 +406,8 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
 
     hashCode = hashCode * 8191 + ((requiredFile) ? 131071 : 524287);
 
+    hashCode = hashCode * 8191 + ((parserInfoId) ? 131071 : 524287);
+
     return hashCode;
   }
 
@@ -389,6 +449,16 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetParserInfoId()).compareTo(other.isSetParserInfoId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetParserInfoId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parserInfoId, other.parserInfoId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -428,6 +498,10 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
     sb.append("requiredFile:");
     sb.append(this.requiredFile);
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("parserInfoId:");
+    sb.append(this.parserInfoId);
+    first = false;
     sb.append(")");
     return sb.toString();
   }
@@ -446,6 +520,10 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'requiredFile' is unset! Struct:" + toString());
     }
 
+    if (!isSetParserInfoId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'parserInfoId' is unset! Struct:" + toString());
+    }
+
     // check for sub-struct validity
   }
 
@@ -509,6 +587,14 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // PARSER_INFO_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
+              struct.parserInfoId = iprot.readBool();
+              struct.setParserInfoIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -535,6 +621,9 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       oprot.writeFieldBegin(REQUIRED_FILE_FIELD_DESC);
       oprot.writeBool(struct.requiredFile);
       oprot.writeFieldEnd();
+      oprot.writeFieldBegin(PARSER_INFO_ID_FIELD_DESC);
+      oprot.writeBool(struct.parserInfoId);
+      oprot.writeFieldEnd();
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -555,6 +644,7 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       oprot.writeString(struct.id);
       oprot.writeString(struct.name);
       oprot.writeBool(struct.requiredFile);
+      oprot.writeBool(struct.parserInfoId);
     }
 
     @Override
@@ -566,6 +656,8 @@ public class ParserOutput implements org.apache.thrift.TBase<ParserOutput, Parse
       struct.setNameIsSet(true);
       struct.requiredFile = iprot.readBool();
       struct.setRequiredFileIsSet(true);
+      struct.parserInfoId = iprot.readBool();
+      struct.setParserInfoIdIsSet(true);
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplate.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplate.java
index ca09f47..413d846 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplate.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplate.java
@@ -39,7 +39,7 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
   private java.lang.String id; // required
   private java.lang.String applicationInterface; // required
   private java.util.List<ParsingTemplateInput> initialInputs; // required
-  private java.util.List<DagElement> parserDag; // required
+  private java.util.List<ParserDagElement> parserDag; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
@@ -121,7 +121,7 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
             new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ParsingTemplateInput.class))));
     tmpMap.put(_Fields.PARSER_DAG, new org.apache.thrift.meta_data.FieldMetaData("parserDag", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
-            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, DagElement.class))));
+            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, ParserDagElement.class))));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ParsingTemplate.class, metaDataMap);
   }
@@ -133,7 +133,7 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
     java.lang.String id,
     java.lang.String applicationInterface,
     java.util.List<ParsingTemplateInput> initialInputs,
-    java.util.List<DagElement> parserDag)
+    java.util.List<ParserDagElement> parserDag)
   {
     this();
     this.id = id;
@@ -160,9 +160,9 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
       this.initialInputs = __this__initialInputs;
     }
     if (other.isSetParserDag()) {
-      java.util.List<DagElement> __this__parserDag = new java.util.ArrayList<DagElement>(other.parserDag.size());
-      for (DagElement other_element : other.parserDag) {
-        __this__parserDag.add(new DagElement(other_element));
+      java.util.List<ParserDagElement> __this__parserDag = new java.util.ArrayList<ParserDagElement>(other.parserDag.size());
+      for (ParserDagElement other_element : other.parserDag) {
+        __this__parserDag.add(new ParserDagElement(other_element));
       }
       this.parserDag = __this__parserDag;
     }
@@ -268,22 +268,22 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
     return (this.parserDag == null) ? 0 : this.parserDag.size();
   }
 
-  public java.util.Iterator<DagElement> getParserDagIterator() {
+  public java.util.Iterator<ParserDagElement> getParserDagIterator() {
     return (this.parserDag == null) ? null : this.parserDag.iterator();
   }
 
-  public void addToParserDag(DagElement elem) {
+  public void addToParserDag(ParserDagElement elem) {
     if (this.parserDag == null) {
-      this.parserDag = new java.util.ArrayList<DagElement>();
+      this.parserDag = new java.util.ArrayList<ParserDagElement>();
     }
     this.parserDag.add(elem);
   }
 
-  public java.util.List<DagElement> getParserDag() {
+  public java.util.List<ParserDagElement> getParserDag() {
     return this.parserDag;
   }
 
-  public void setParserDag(java.util.List<DagElement> parserDag) {
+  public void setParserDag(java.util.List<ParserDagElement> parserDag) {
     this.parserDag = parserDag;
   }
 
@@ -332,7 +332,7 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
       if (value == null) {
         unsetParserDag();
       } else {
-        setParserDag((java.util.List<DagElement>)value);
+        setParserDag((java.util.List<ParserDagElement>)value);
       }
       break;
 
@@ -650,11 +650,11 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
                 org.apache.thrift.protocol.TList _list27 = iprot.readListBegin();
-                struct.parserDag = new java.util.ArrayList<DagElement>(_list27.size);
-                DagElement _elem28;
+                struct.parserDag = new java.util.ArrayList<ParserDagElement>(_list27.size);
+                ParserDagElement _elem28;
                 for (int _i29 = 0; _i29 < _list27.size; ++_i29)
                 {
-                  _elem28 = new DagElement();
+                  _elem28 = new ParserDagElement();
                   _elem28.read(iprot);
                   struct.parserDag.add(_elem28);
                 }
@@ -704,7 +704,7 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
         oprot.writeFieldBegin(PARSER_DAG_FIELD_DESC);
         {
           oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.parserDag.size()));
-          for (DagElement _iter31 : struct.parserDag)
+          for (ParserDagElement _iter31 : struct.parserDag)
           {
             _iter31.write(oprot);
           }
@@ -740,7 +740,7 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
       }
       {
         oprot.writeI32(struct.parserDag.size());
-        for (DagElement _iter33 : struct.parserDag)
+        for (ParserDagElement _iter33 : struct.parserDag)
         {
           _iter33.write(oprot);
         }
@@ -768,11 +768,11 @@ public class ParsingTemplate implements org.apache.thrift.TBase<ParsingTemplate,
       struct.setInitialInputsIsSet(true);
       {
         org.apache.thrift.protocol.TList _list37 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
-        struct.parserDag = new java.util.ArrayList<DagElement>(_list37.size);
-        DagElement _elem38;
+        struct.parserDag = new java.util.ArrayList<ParserDagElement>(_list37.size);
+        ParserDagElement _elem38;
         for (int _i39 = 0; _i39 < _list37.size; ++_i39)
         {
-          _elem38 = new DagElement();
+          _elem38 = new ParserDagElement();
           _elem38.read(iprot);
           struct.parserDag.add(_elem38);
         }
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplateInput.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplateInput.java
index d8fee76..e62ec5f 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplateInput.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/appcatalog/parser/ParsingTemplateInput.java
@@ -28,19 +28,25 @@ package org.apache.airavata.model.appcatalog.parser;
 public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemplateInput, ParsingTemplateInput._Fields>, java.io.Serializable, Cloneable, Comparable<ParsingTemplateInput> {
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ParsingTemplateInput");
 
-  private static final org.apache.thrift.protocol.TField INPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("inputId", org.apache.thrift.protocol.TType.STRING, (short)1);
-  private static final org.apache.thrift.protocol.TField EXPRESSION_FIELD_DESC = new org.apache.thrift.protocol.TField("expression", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField INPUT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("inputId", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField EXPRESSION_FIELD_DESC = new org.apache.thrift.protocol.TField("expression", org.apache.thrift.protocol.TType.STRING, (short)3);
+  private static final org.apache.thrift.protocol.TField PARSING_TEMPLATE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("parsingTemplateId", org.apache.thrift.protocol.TType.STRING, (short)4);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new ParsingTemplateInputStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new ParsingTemplateInputTupleSchemeFactory();
 
+  private java.lang.String id; // required
   private java.lang.String inputId; // required
   private java.lang.String expression; // required
+  private java.lang.String parsingTemplateId; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-    INPUT_ID((short)1, "inputId"),
-    EXPRESSION((short)2, "expression");
+    ID((short)1, "id"),
+    INPUT_ID((short)2, "inputId"),
+    EXPRESSION((short)3, "expression"),
+    PARSING_TEMPLATE_ID((short)4, "parsingTemplateId");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -55,10 +61,14 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
      */
     public static _Fields findByThriftId(int fieldId) {
       switch(fieldId) {
-        case 1: // INPUT_ID
+        case 1: // ID
+          return ID;
+        case 2: // INPUT_ID
           return INPUT_ID;
-        case 2: // EXPRESSION
+        case 3: // EXPRESSION
           return EXPRESSION;
+        case 4: // PARSING_TEMPLATE_ID
+          return PARSING_TEMPLATE_ID;
         default:
           return null;
       }
@@ -102,10 +112,14 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
   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);
+    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData("id", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.INPUT_ID, new org.apache.thrift.meta_data.FieldMetaData("inputId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.EXPRESSION, new org.apache.thrift.meta_data.FieldMetaData("expression", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.PARSING_TEMPLATE_ID, new org.apache.thrift.meta_data.FieldMetaData("parsingTemplateId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        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(ParsingTemplateInput.class, metaDataMap);
   }
@@ -114,24 +128,34 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
   }
 
   public ParsingTemplateInput(
+    java.lang.String id,
     java.lang.String inputId,
-    java.lang.String expression)
+    java.lang.String expression,
+    java.lang.String parsingTemplateId)
   {
     this();
+    this.id = id;
     this.inputId = inputId;
     this.expression = expression;
+    this.parsingTemplateId = parsingTemplateId;
   }
 
   /**
    * Performs a deep copy on <i>other</i>.
    */
   public ParsingTemplateInput(ParsingTemplateInput other) {
+    if (other.isSetId()) {
+      this.id = other.id;
+    }
     if (other.isSetInputId()) {
       this.inputId = other.inputId;
     }
     if (other.isSetExpression()) {
       this.expression = other.expression;
     }
+    if (other.isSetParsingTemplateId()) {
+      this.parsingTemplateId = other.parsingTemplateId;
+    }
   }
 
   public ParsingTemplateInput deepCopy() {
@@ -140,8 +164,33 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
 
   @Override
   public void clear() {
+    this.id = null;
     this.inputId = null;
     this.expression = null;
+    this.parsingTemplateId = null;
+  }
+
+  public java.lang.String getId() {
+    return this.id;
+  }
+
+  public void setId(java.lang.String id) {
+    this.id = id;
+  }
+
+  public void unsetId() {
+    this.id = null;
+  }
+
+  /** Returns true if field id is set (has been assigned a value) and false otherwise */
+  public boolean isSetId() {
+    return this.id != null;
+  }
+
+  public void setIdIsSet(boolean value) {
+    if (!value) {
+      this.id = null;
+    }
   }
 
   public java.lang.String getInputId() {
@@ -190,8 +239,39 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
     }
   }
 
+  public java.lang.String getParsingTemplateId() {
+    return this.parsingTemplateId;
+  }
+
+  public void setParsingTemplateId(java.lang.String parsingTemplateId) {
+    this.parsingTemplateId = parsingTemplateId;
+  }
+
+  public void unsetParsingTemplateId() {
+    this.parsingTemplateId = null;
+  }
+
+  /** Returns true if field parsingTemplateId is set (has been assigned a value) and false otherwise */
+  public boolean isSetParsingTemplateId() {
+    return this.parsingTemplateId != null;
+  }
+
+  public void setParsingTemplateIdIsSet(boolean value) {
+    if (!value) {
+      this.parsingTemplateId = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
+    case ID:
+      if (value == null) {
+        unsetId();
+      } else {
+        setId((java.lang.String)value);
+      }
+      break;
+
     case INPUT_ID:
       if (value == null) {
         unsetInputId();
@@ -208,17 +288,31 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
       }
       break;
 
+    case PARSING_TEMPLATE_ID:
+      if (value == null) {
+        unsetParsingTemplateId();
+      } else {
+        setParsingTemplateId((java.lang.String)value);
+      }
+      break;
+
     }
   }
 
   public java.lang.Object getFieldValue(_Fields field) {
     switch (field) {
+    case ID:
+      return getId();
+
     case INPUT_ID:
       return getInputId();
 
     case EXPRESSION:
       return getExpression();
 
+    case PARSING_TEMPLATE_ID:
+      return getParsingTemplateId();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -230,10 +324,14 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
     }
 
     switch (field) {
+    case ID:
+      return isSetId();
     case INPUT_ID:
       return isSetInputId();
     case EXPRESSION:
       return isSetExpression();
+    case PARSING_TEMPLATE_ID:
+      return isSetParsingTemplateId();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -253,6 +351,15 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
     if (this == that)
       return true;
 
+    boolean this_present_id = true && this.isSetId();
+    boolean that_present_id = true && that.isSetId();
+    if (this_present_id || that_present_id) {
+      if (!(this_present_id && that_present_id))
+        return false;
+      if (!this.id.equals(that.id))
+        return false;
+    }
+
     boolean this_present_inputId = true && this.isSetInputId();
     boolean that_present_inputId = true && that.isSetInputId();
     if (this_present_inputId || that_present_inputId) {
@@ -271,6 +378,15 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
         return false;
     }
 
+    boolean this_present_parsingTemplateId = true && this.isSetParsingTemplateId();
+    boolean that_present_parsingTemplateId = true && that.isSetParsingTemplateId();
+    if (this_present_parsingTemplateId || that_present_parsingTemplateId) {
+      if (!(this_present_parsingTemplateId && that_present_parsingTemplateId))
+        return false;
+      if (!this.parsingTemplateId.equals(that.parsingTemplateId))
+        return false;
+    }
+
     return true;
   }
 
@@ -278,6 +394,10 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
   public int hashCode() {
     int hashCode = 1;
 
+    hashCode = hashCode * 8191 + ((isSetId()) ? 131071 : 524287);
+    if (isSetId())
+      hashCode = hashCode * 8191 + id.hashCode();
+
     hashCode = hashCode * 8191 + ((isSetInputId()) ? 131071 : 524287);
     if (isSetInputId())
       hashCode = hashCode * 8191 + inputId.hashCode();
@@ -286,6 +406,10 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
     if (isSetExpression())
       hashCode = hashCode * 8191 + expression.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetParsingTemplateId()) ? 131071 : 524287);
+    if (isSetParsingTemplateId())
+      hashCode = hashCode * 8191 + parsingTemplateId.hashCode();
+
     return hashCode;
   }
 
@@ -297,6 +421,16 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
 
     int lastComparison = 0;
 
+    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     lastComparison = java.lang.Boolean.valueOf(isSetInputId()).compareTo(other.isSetInputId());
     if (lastComparison != 0) {
       return lastComparison;
@@ -317,6 +451,16 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetParsingTemplateId()).compareTo(other.isSetParsingTemplateId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetParsingTemplateId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.parsingTemplateId, other.parsingTemplateId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -337,6 +481,14 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
     java.lang.StringBuilder sb = new java.lang.StringBuilder("ParsingTemplateInput(");
     boolean first = true;
 
+    sb.append("id:");
+    if (this.id == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.id);
+    }
+    first = false;
+    if (!first) sb.append(", ");
     sb.append("inputId:");
     if (this.inputId == null) {
       sb.append("null");
@@ -352,12 +504,24 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
       sb.append(this.expression);
     }
     first = false;
+    if (!first) sb.append(", ");
+    sb.append("parsingTemplateId:");
+    if (this.parsingTemplateId == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.parsingTemplateId);
+    }
+    first = false;
     sb.append(")");
     return sb.toString();
   }
 
   public void validate() throws org.apache.thrift.TException {
     // check for required fields
+    if (!isSetId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'id' is unset! Struct:" + toString());
+    }
+
     if (!isSetInputId()) {
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'inputId' is unset! Struct:" + toString());
     }
@@ -366,6 +530,10 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'expression' is unset! Struct:" + toString());
     }
 
+    if (!isSetParsingTemplateId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'parsingTemplateId' is unset! Struct:" + toString());
+    }
+
     // check for sub-struct validity
   }
 
@@ -403,7 +571,15 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
           break;
         }
         switch (schemeField.id) {
-          case 1: // INPUT_ID
+          case 1: // ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.id = iprot.readString();
+              struct.setIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // INPUT_ID
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.inputId = iprot.readString();
               struct.setInputIdIsSet(true);
@@ -411,7 +587,7 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 2: // EXPRESSION
+          case 3: // EXPRESSION
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.expression = iprot.readString();
               struct.setExpressionIsSet(true);
@@ -419,6 +595,14 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 4: // PARSING_TEMPLATE_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.parsingTemplateId = iprot.readString();
+              struct.setParsingTemplateIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -432,6 +616,11 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
       struct.validate();
 
       oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.id != null) {
+        oprot.writeFieldBegin(ID_FIELD_DESC);
+        oprot.writeString(struct.id);
+        oprot.writeFieldEnd();
+      }
       if (struct.inputId != null) {
         oprot.writeFieldBegin(INPUT_ID_FIELD_DESC);
         oprot.writeString(struct.inputId);
@@ -442,6 +631,11 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
         oprot.writeString(struct.expression);
         oprot.writeFieldEnd();
       }
+      if (struct.parsingTemplateId != null) {
+        oprot.writeFieldBegin(PARSING_TEMPLATE_ID_FIELD_DESC);
+        oprot.writeString(struct.parsingTemplateId);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -459,17 +653,23 @@ public class ParsingTemplateInput implements org.apache.thrift.TBase<ParsingTemp
     @Override
     public void write(org.apache.thrift.protocol.TProtocol prot, ParsingTemplateInput struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      oprot.writeString(struct.id);
       oprot.writeString(struct.inputId);
       oprot.writeString(struct.expression);
+      oprot.writeString(struct.parsingTemplateId);
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, ParsingTemplateInput struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
+      struct.id = iprot.readString();
+      struct.setIdIsSet(true);
       struct.inputId = iprot.readString();
       struct.setInputIdIsSet(true);
       struct.expression = iprot.readString();
       struct.setExpressionIsSet(true);
+      struct.parsingTemplateId = iprot.readString();
+      struct.setParsingTemplateIdIsSet(true);
     }
   }
 
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
index 86517bf..1d07437 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/workflow/ParserWorkflowManager.java
@@ -31,7 +31,7 @@ import org.apache.airavata.helix.impl.task.parsing.models.ParsingTaskInputs;
 import org.apache.airavata.helix.impl.task.parsing.models.ParsingTaskOutput;
 import org.apache.airavata.helix.impl.task.parsing.models.ParsingTaskOutputs;
 import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
-import org.apache.airavata.model.appcatalog.parser.DagElement;
+import org.apache.airavata.model.appcatalog.parser.ParserDagElement;
 import org.apache.airavata.model.appcatalog.parser.ParserInfo;
 import org.apache.airavata.model.appcatalog.parser.ParsingTemplate;
 import org.apache.airavata.model.appcatalog.parser.ParsingTemplateInput;
@@ -94,20 +94,20 @@ public class ParserWorkflowManager extends WorkflowManager {
             // FIXME is it ApplicationInterfaceId or ApplicationName
             List<ParsingTemplate> parsingTemplates = registryClient.getParsingTemplatesForExperiment(completionMessage.getExperimentId());
 
-            Map<String, Map<String, Set<DagElement>>> parentToChildParsers = new HashMap<>();
+            Map<String, Map<String, Set<ParserDagElement>>> parentToChildParsers = new HashMap<>();
             Map<String, Map<String, Set<String>>> childToParentParsers = new HashMap<>();
 
             for (ParsingTemplate template : parsingTemplates) {
-                for (DagElement dagElement: template.getParserDag()) {
+                for (ParserDagElement dagElement: template.getParserDag()) {
 
-                    Map<String, Set<DagElement>> parentToChildLocal = new HashMap<>();
+                    Map<String, Set<ParserDagElement>> parentToChildLocal = new HashMap<>();
                     if (parentToChildParsers.containsKey(template.getId())) {
                         parentToChildLocal = parentToChildParsers.get(template.getId());
                     } else {
                         parentToChildParsers.put(template.getId(), parentToChildLocal);
                     }
 
-                    Set<DagElement> childLocal = new HashSet<>();
+                    Set<ParserDagElement> childLocal = new HashSet<>();
                     if (parentToChildLocal.containsKey(dagElement.getParentParserId())) {
                         childLocal = parentToChildLocal.get(dagElement.getParentParserId());
                     } else {
@@ -139,8 +139,8 @@ public class ParserWorkflowManager extends WorkflowManager {
                 String parentParserId = null;
                 for (String parentId : parentToChildParsers.get(template.getId()).keySet()) {
                     boolean found = false;
-                    for (Set<DagElement> dagElements : parentToChildParsers.get(template.getId()).values()) {
-                        Optional<DagElement> first = dagElements.stream().filter(dagElement -> dagElement.getChildParserId().equals(parentId)).findFirst();
+                    for (Set<ParserDagElement> dagElements : parentToChildParsers.get(template.getId()).values()) {
+                        Optional<ParserDagElement> first = dagElements.stream().filter(dagElement -> dagElement.getChildParserId().equals(parentId)).findFirst();
                         if (first.isPresent()) {
                             found = true;
                             break;
@@ -226,11 +226,11 @@ public class ParserWorkflowManager extends WorkflowManager {
         return parsingTask;
     }
 
-    private void createParserDagRecursively(List<AbstractTask> allTasks, ParserInfo parentParserInfo, DataParsingTask parentTask, Map<String, Set<DagElement>> parentToChild,
+    private void createParserDagRecursively(List<AbstractTask> allTasks, ParserInfo parentParserInfo, DataParsingTask parentTask, Map<String, Set<ParserDagElement>> parentToChild,
                                             ProcessCompletionMessage completionMessage, RegistryService.Client registryClient) throws Exception {
         if (parentToChild.containsKey(parentParserInfo.getId())) {
 
-            for (DagElement dagElement : parentToChild.get(parentParserInfo.getId())) {
+            for (ParserDagElement dagElement : parentToChild.get(parentParserInfo.getId())) {
                 ParserInfo childParserInfo = registryClient.getParserInfo(dagElement.getChildParserId());
                 DataParsingTask parsingTask = new DataParsingTask();
                 parsingTask.setTaskId(normalizeTaskId(completionMessage.getExperimentId() + "-" + childParserInfo.getId() + "-" + UUID.randomUUID().toString()));
diff --git a/thrift-interface-descriptions/data-models/app-catalog-models/parser_model.thrift b/thrift-interface-descriptions/data-models/app-catalog-models/parser_model.thrift
index ef0ad06..bacbf27 100644
--- a/thrift-interface-descriptions/data-models/app-catalog-models/parser_model.thrift
+++ b/thrift-interface-descriptions/data-models/app-catalog-models/parser_model.thrift
@@ -27,12 +27,14 @@ struct ParserInput {
     1: required string id;
     2: required string name;
     3: required bool requiredFile;
+    4: required bool parserInfoId
 }
 
 struct ParserOutput {
     1: required string id;
     2: required string name;
     3: required bool requiredFile;
+    4: required bool parserInfoId;
 }
 
 struct ParserInfo {
@@ -45,25 +47,32 @@ struct ParserInfo {
     7: required list<ParserOutput> outputFiles;
 }
 
-struct InputOutputMapping {
-    1: required string inputId;
-    2: required string outputId;
+struct ParserDagInputOutputMapping {
+    1: required string id;
+    2: required string inputId;
+    3: required string outputId;
+    4: required string parserDagElementId;
 }
 
-struct DagElement {
-    1: required string parentParserId;
-    2: required string childParserId;
-    3: required list<InputOutputMapping> inputOutputMapping;
+struct ParserDagElement {
+    1: required string id;
+    2: required string parentParserId;
+    3: required string childParserId;
+    4: required list<ParserDagInputOutputMapping> inputOutputMapping;
+    5: required string parsingTemplateId;
+
 }
 
 struct ParsingTemplateInput {
-    1: required string inputId
-    2: required string expression;
+    1: required string id;
+    2: required string inputId
+    3: required string expression;
+    4: required string parsingTemplateId;
 }
 
 struct ParsingTemplate {
     1: required string id;
     2: required string applicationInterface;
     3: required list<ParsingTemplateInput> initialInputs;
-    4: required list<DagElement> parserDag;
+    4: required list<ParserDagElement> parserDag;
 }
\ No newline at end of file