http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/ExperimentOutputParsedEvent.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/ExperimentOutputParsedEvent.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/ExperimentOutputParsedEvent.java
new file mode 100644
index 0000000..c841b3a
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/ExperimentOutputParsedEvent.java
@@ -0,0 +1,573 @@
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.datacat.models.Messaging;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ExperimentOutputParsedEvent implements 
org.apache.thrift.TBase<ExperimentOutputParsedEvent, 
ExperimentOutputParsedEvent._Fields>, java.io.Serializable, Cloneable, 
Comparable<ExperimentOutputParsedEvent> {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new 
org.apache.thrift.protocol.TStruct("ExperimentOutputParsedEvent");
+
+    private static final org.apache.thrift.protocol.TField 
EXPERIMENT_ID_FIELD_DESC = new 
org.apache.thrift.protocol.TField("experimentId", 
org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField 
DOCUMENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("documentID", 
org.apache.thrift.protocol.TType.STRING, (short)2);
+    private static final org.apache.thrift.protocol.TField STATUS_FIELD_DESC = 
new org.apache.thrift.protocol.TField("status", 
org.apache.thrift.protocol.TType.STRING, (short)3);
+
+    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes 
= new HashMap<Class<? extends IScheme>, SchemeFactory>();
+    static {
+        schemes.put(StandardScheme.class, new 
ExperimentOutputParsedEventStandardSchemeFactory());
+        schemes.put(TupleScheme.class, new 
ExperimentOutputParsedEventTupleSchemeFactory());
+    }
+
+    public String experimentId; // required
+    public String documentID; // required
+    public String status; // 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 {
+        EXPERIMENT_ID((short)1, "experimentId"),
+        DOCUMENT_ID((short)2, "documentID"),
+        STATUS((short)3, "status");
+
+        private static final Map<String, _Fields> byName = new HashMap<String, 
_Fields>();
+
+        static {
+            for (_Fields field : EnumSet.allOf(_Fields.class)) {
+                byName.put(field.getFieldName(), field);
+            }
+        }
+
+        /**
+         * Find the _Fields constant that matches fieldId, or null if its not 
found.
+         */
+        public static _Fields findByThriftId(int fieldId) {
+            switch(fieldId) {
+                case 1: // EXPERIMENT_ID
+                    return EXPERIMENT_ID;
+                case 2: // DOCUMENT_ID
+                    return DOCUMENT_ID;
+                case 3: // STATUS
+                    return STATUS;
+                default:
+                    return null;
+            }
+        }
+
+        /**
+         * Find the _Fields constant that matches fieldId, throwing an 
exception
+         * if it is not found.
+         */
+        public static _Fields findByThriftIdOrThrow(int fieldId) {
+            _Fields fields = findByThriftId(fieldId);
+            if (fields == null) throw new IllegalArgumentException("Field " + 
fieldId + " doesn't exist!");
+            return fields;
+        }
+
+        /**
+         * Find the _Fields constant that matches name, or null if its not 
found.
+         */
+        public static _Fields findByName(String name) {
+            return byName.get(name);
+        }
+
+        private final short _thriftId;
+        private final String _fieldName;
+
+        _Fields(short thriftId, String fieldName) {
+            _thriftId = thriftId;
+            _fieldName = fieldName;
+        }
+
+        public short getThriftFieldId() {
+            return _thriftId;
+        }
+
+        public String getFieldName() {
+            return _fieldName;
+        }
+    }
+
+    // isset id assignments
+    public static final Map<_Fields, 
org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+        Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new 
EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+        tmpMap.put(_Fields.EXPERIMENT_ID, new 
org.apache.thrift.meta_data.FieldMetaData("experimentId", 
org.apache.thrift.TFieldRequirementType.REQUIRED,
+                new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+        tmpMap.put(_Fields.DOCUMENT_ID, new 
org.apache.thrift.meta_data.FieldMetaData("documentID", 
org.apache.thrift.TFieldRequirementType.REQUIRED,
+                new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+        tmpMap.put(_Fields.STATUS, new 
org.apache.thrift.meta_data.FieldMetaData("status", 
org.apache.thrift.TFieldRequirementType.REQUIRED,
+                new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+        metaDataMap = Collections.unmodifiableMap(tmpMap);
+        
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ExperimentOutputParsedEvent.class,
 metaDataMap);
+    }
+
+    public ExperimentOutputParsedEvent() {
+    }
+
+    public ExperimentOutputParsedEvent(
+            String experimentId,
+            String documentID,
+            String status)
+    {
+        this();
+        this.experimentId = experimentId;
+        this.documentID = documentID;
+        this.status = status;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public ExperimentOutputParsedEvent(ExperimentOutputParsedEvent other) {
+        if (other.isSetExperimentId()) {
+            this.experimentId = other.experimentId;
+        }
+        if (other.isSetDocumentID()) {
+            this.documentID = other.documentID;
+        }
+        if (other.isSetStatus()) {
+            this.status = other.status;
+        }
+    }
+
+    public ExperimentOutputParsedEvent deepCopy() {
+        return new ExperimentOutputParsedEvent(this);
+    }
+
+    @Override
+    public void clear() {
+        this.experimentId = null;
+        this.documentID = null;
+        this.status = null;
+    }
+
+    public String getExperimentId() {
+        return this.experimentId;
+    }
+
+    public ExperimentOutputParsedEvent setExperimentId(String experimentId) {
+        this.experimentId = experimentId;
+        return this;
+    }
+
+    public void unsetExperimentId() {
+        this.experimentId = null;
+    }
+
+    /** Returns true if field experimentId is set (has been assigned a value) 
and false otherwise */
+    public boolean isSetExperimentId() {
+        return this.experimentId != null;
+    }
+
+    public void setExperimentIdIsSet(boolean value) {
+        if (!value) {
+            this.experimentId = null;
+        }
+    }
+
+    public String getDocumentID() {
+        return this.documentID;
+    }
+
+    public ExperimentOutputParsedEvent setDocumentID(String documentID) {
+        this.documentID = documentID;
+        return this;
+    }
+
+    public void unsetDocumentID() {
+        this.documentID = null;
+    }
+
+    /** Returns true if field documentID is set (has been assigned a value) 
and false otherwise */
+    public boolean isSetDocumentID() {
+        return this.documentID != null;
+    }
+
+    public void setDocumentIDIsSet(boolean value) {
+        if (!value) {
+            this.documentID = null;
+        }
+    }
+
+    public String getStatus() {
+        return this.status;
+    }
+
+    public ExperimentOutputParsedEvent setStatus(String status) {
+        this.status = status;
+        return this;
+    }
+
+    public void unsetStatus() {
+        this.status = null;
+    }
+
+    /** Returns true if field status is set (has been assigned a value) and 
false otherwise */
+    public boolean isSetStatus() {
+        return this.status != null;
+    }
+
+    public void setStatusIsSet(boolean value) {
+        if (!value) {
+            this.status = null;
+        }
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+        switch (field) {
+            case EXPERIMENT_ID:
+                if (value == null) {
+                    unsetExperimentId();
+                } else {
+                    setExperimentId((String)value);
+                }
+                break;
+
+            case DOCUMENT_ID:
+                if (value == null) {
+                    unsetDocumentID();
+                } else {
+                    setDocumentID((String)value);
+                }
+                break;
+
+            case STATUS:
+                if (value == null) {
+                    unsetStatus();
+                } else {
+                    setStatus((String)value);
+                }
+                break;
+
+        }
+    }
+
+    public Object getFieldValue(_Fields field) {
+        switch (field) {
+            case EXPERIMENT_ID:
+                return getExperimentId();
+
+            case DOCUMENT_ID:
+                return getDocumentID();
+
+            case STATUS:
+                return getStatus();
+
+        }
+        throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been 
assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+        if (field == null) {
+            throw new IllegalArgumentException();
+        }
+
+        switch (field) {
+            case EXPERIMENT_ID:
+                return isSetExperimentId();
+            case DOCUMENT_ID:
+                return isSetDocumentID();
+            case STATUS:
+                return isSetStatus();
+        }
+        throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (that == null)
+            return false;
+        if (that instanceof ExperimentOutputParsedEvent)
+            return this.equals((ExperimentOutputParsedEvent)that);
+        return false;
+    }
+
+    public boolean equals(ExperimentOutputParsedEvent that) {
+        if (that == null)
+            return false;
+
+        boolean this_present_experimentId = true && this.isSetExperimentId();
+        boolean that_present_experimentId = true && that.isSetExperimentId();
+        if (this_present_experimentId || that_present_experimentId) {
+            if (!(this_present_experimentId && that_present_experimentId))
+                return false;
+            if (!this.experimentId.equals(that.experimentId))
+                return false;
+        }
+
+        boolean this_present_documentID = true && this.isSetDocumentID();
+        boolean that_present_documentID = true && that.isSetDocumentID();
+        if (this_present_documentID || that_present_documentID) {
+            if (!(this_present_documentID && that_present_documentID))
+                return false;
+            if (!this.documentID.equals(that.documentID))
+                return false;
+        }
+
+        boolean this_present_status = true && this.isSetStatus();
+        boolean that_present_status = true && that.isSetStatus();
+        if (this_present_status || that_present_status) {
+            if (!(this_present_status && that_present_status))
+                return false;
+            if (!this.status.equals(that.status))
+                return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return 0;
+    }
+
+    @Override
+    public int compareTo(ExperimentOutputParsedEvent other) {
+        if (!getClass().equals(other.getClass())) {
+            return getClass().getName().compareTo(other.getClass().getName());
+        }
+
+        int lastComparison = 0;
+
+        lastComparison = 
Boolean.valueOf(isSetExperimentId()).compareTo(other.isSetExperimentId());
+        if (lastComparison != 0) {
+            return lastComparison;
+        }
+        if (isSetExperimentId()) {
+            lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.experimentId, other.experimentId);
+            if (lastComparison != 0) {
+                return lastComparison;
+            }
+        }
+        lastComparison = 
Boolean.valueOf(isSetDocumentID()).compareTo(other.isSetDocumentID());
+        if (lastComparison != 0) {
+            return lastComparison;
+        }
+        if (isSetDocumentID()) {
+            lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.documentID, other.documentID);
+            if (lastComparison != 0) {
+                return lastComparison;
+            }
+        }
+        lastComparison = 
Boolean.valueOf(isSetStatus()).compareTo(other.isSetStatus());
+        if (lastComparison != 0) {
+            return lastComparison;
+        }
+        if (isSetStatus()) {
+            lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.status, other.status);
+            if (lastComparison != 0) {
+                return lastComparison;
+            }
+        }
+        return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+        return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws 
org.apache.thrift.TException {
+        schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws 
org.apache.thrift.TException {
+        schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("ExperimentOutputParsedEvent(");
+        boolean first = true;
+
+        sb.append("experimentId:");
+        if (this.experimentId == null) {
+            sb.append("null");
+        } else {
+            sb.append(this.experimentId);
+        }
+        first = false;
+        if (!first) sb.append(", ");
+        sb.append("documentID:");
+        if (this.documentID == null) {
+            sb.append("null");
+        } else {
+            sb.append(this.documentID);
+        }
+        first = false;
+        if (!first) sb.append(", ");
+        sb.append("status:");
+        if (this.status == null) {
+            sb.append("null");
+        } else {
+            sb.append(this.status);
+        }
+        first = false;
+        sb.append(")");
+        return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+        // check for required fields
+        if (experimentId == null) {
+            throw new org.apache.thrift.protocol.TProtocolException("Required 
field 'experimentId' was not present! Struct: " + toString());
+        }
+        if (documentID == null) {
+            throw new org.apache.thrift.protocol.TProtocolException("Required 
field 'documentID' was not present! Struct: " + toString());
+        }
+        if (status == null) {
+            throw new org.apache.thrift.protocol.TProtocolException("Required 
field 'status' was not present! Struct: " + toString());
+        }
+        // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws 
java.io.IOException {
+        try {
+            write(new org.apache.thrift.protocol.TCompactProtocol(new 
org.apache.thrift.transport.TIOStreamTransport(out)));
+        } catch (org.apache.thrift.TException te) {
+            throw new java.io.IOException(te);
+        }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws 
java.io.IOException, ClassNotFoundException {
+        try {
+            read(new org.apache.thrift.protocol.TCompactProtocol(new 
org.apache.thrift.transport.TIOStreamTransport(in)));
+        } catch (org.apache.thrift.TException te) {
+            throw new java.io.IOException(te);
+        }
+    }
+
+    private static class ExperimentOutputParsedEventStandardSchemeFactory 
implements SchemeFactory {
+        public ExperimentOutputParsedEventStandardScheme getScheme() {
+            return new ExperimentOutputParsedEventStandardScheme();
+        }
+    }
+
+    private static class ExperimentOutputParsedEventStandardScheme extends 
StandardScheme<ExperimentOutputParsedEvent> {
+
+        public void read(org.apache.thrift.protocol.TProtocol iprot, 
ExperimentOutputParsedEvent struct) throws org.apache.thrift.TException {
+            org.apache.thrift.protocol.TField schemeField;
+            iprot.readStructBegin();
+            while (true)
+            {
+                schemeField = iprot.readFieldBegin();
+                if (schemeField.type == org.apache.thrift.protocol.TType.STOP) 
{
+                    break;
+                }
+                switch (schemeField.id) {
+                    case 1: // EXPERIMENT_ID
+                        if (schemeField.type == 
org.apache.thrift.protocol.TType.STRING) {
+                            struct.experimentId = iprot.readString();
+                            struct.setExperimentIdIsSet(true);
+                        } else {
+                            
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+                        }
+                        break;
+                    case 2: // DOCUMENT_ID
+                        if (schemeField.type == 
org.apache.thrift.protocol.TType.STRING) {
+                            struct.documentID = iprot.readString();
+                            struct.setDocumentIDIsSet(true);
+                        } else {
+                            
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+                        }
+                        break;
+                    case 3: // STATUS
+                        if (schemeField.type == 
org.apache.thrift.protocol.TType.STRING) {
+                            struct.status = iprot.readString();
+                            struct.setStatusIsSet(true);
+                        } else {
+                            
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+                        }
+                        break;
+                    default:
+                        org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+                }
+                iprot.readFieldEnd();
+            }
+            iprot.readStructEnd();
+
+            // check for required fields of primitive type, which can't be 
checked in the validate method
+            struct.validate();
+        }
+
+        public void write(org.apache.thrift.protocol.TProtocol oprot, 
ExperimentOutputParsedEvent struct) throws org.apache.thrift.TException {
+            struct.validate();
+
+            oprot.writeStructBegin(STRUCT_DESC);
+            if (struct.experimentId != null) {
+                oprot.writeFieldBegin(EXPERIMENT_ID_FIELD_DESC);
+                oprot.writeString(struct.experimentId);
+                oprot.writeFieldEnd();
+            }
+            if (struct.documentID != null) {
+                oprot.writeFieldBegin(DOCUMENT_ID_FIELD_DESC);
+                oprot.writeString(struct.documentID);
+                oprot.writeFieldEnd();
+            }
+            if (struct.status != null) {
+                oprot.writeFieldBegin(STATUS_FIELD_DESC);
+                oprot.writeString(struct.status);
+                oprot.writeFieldEnd();
+            }
+            oprot.writeFieldStop();
+            oprot.writeStructEnd();
+        }
+
+    }
+
+    private static class ExperimentOutputParsedEventTupleSchemeFactory 
implements SchemeFactory {
+        public ExperimentOutputParsedEventTupleScheme getScheme() {
+            return new ExperimentOutputParsedEventTupleScheme();
+        }
+    }
+
+    private static class ExperimentOutputParsedEventTupleScheme extends 
TupleScheme<ExperimentOutputParsedEvent> {
+
+        @Override
+        public void write(org.apache.thrift.protocol.TProtocol prot, 
ExperimentOutputParsedEvent struct) throws org.apache.thrift.TException {
+            TTupleProtocol oprot = (TTupleProtocol) prot;
+            oprot.writeString(struct.experimentId);
+            oprot.writeString(struct.documentID);
+            oprot.writeString(struct.status);
+        }
+
+        @Override
+        public void read(org.apache.thrift.protocol.TProtocol prot, 
ExperimentOutputParsedEvent struct) throws org.apache.thrift.TException {
+            TTupleProtocol iprot = (TTupleProtocol) prot;
+            struct.experimentId = iprot.readString();
+            struct.setExperimentIdIsSet(true);
+            struct.documentID = iprot.readString();
+            struct.setDocumentIDIsSet(true);
+            struct.status = iprot.readString();
+            struct.setStatusIsSet(true);
+        }
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/Message.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/Message.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/Message.java
new file mode 100644
index 0000000..cdf11e9
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/Message.java
@@ -0,0 +1,814 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.datacat.models.Messaging;
+
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+import org.apache.thrift.scheme.TupleScheme;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+
+@SuppressWarnings("all") public class Message implements 
org.apache.thrift.TBase<Message, Message._Fields>, java.io.Serializable, 
Cloneable, Comparable<Message> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new 
org.apache.thrift.protocol.TStruct("Message");
+
+  private static final org.apache.thrift.protocol.TField EVENT_FIELD_DESC = 
new org.apache.thrift.protocol.TField("event", 
org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField MESSAGE_ID_FIELD_DESC 
= new org.apache.thrift.protocol.TField("messageId", 
org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField 
MESSAGE_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("messageType", 
org.apache.thrift.protocol.TType.I32, (short)3);
+  private static final org.apache.thrift.protocol.TField 
UPDATED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("updatedTime", 
org.apache.thrift.protocol.TType.I64, (short)4);
+  private static final org.apache.thrift.protocol.TField 
MESSAGE_LEVEL_FIELD_DESC = new 
org.apache.thrift.protocol.TField("messageLevel", 
org.apache.thrift.protocol.TType.I32, (short)5);
+
+  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = 
new HashMap<Class<? extends IScheme>, SchemeFactory>();
+  static {
+    schemes.put(StandardScheme.class, new MessageStandardSchemeFactory());
+    schemes.put(TupleScheme.class, new MessageTupleSchemeFactory());
+  }
+
+  private ByteBuffer event; // required
+  private String messageId; // required
+  private MessageType messageType; // required
+  private long updatedTime; // optional
+  private MessageLevel messageLevel; // optional
+
+  /** The set of fields this struct contains, along with convenience methods 
for finding and manipulating them. */
+  @SuppressWarnings("all") public enum _Fields implements 
org.apache.thrift.TFieldIdEnum {
+    EVENT((short)1, "event"),
+    MESSAGE_ID((short)2, "messageId"),
+    /**
+     * 
+     * @see MessageType
+     */
+    MESSAGE_TYPE((short)3, "messageType"),
+    UPDATED_TIME((short)4, "updatedTime"),
+    /**
+     * 
+     * @see MessageLevel
+     */
+    MESSAGE_LEVEL((short)5, "messageLevel");
+
+    private static final Map<String, _Fields> byName = new HashMap<String, 
_Fields>();
+
+    static {
+      for (_Fields field : EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not 
found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // EVENT
+          return EVENT;
+        case 2: // MESSAGE_ID
+          return MESSAGE_ID;
+        case 3: // MESSAGE_TYPE
+          return MESSAGE_TYPE;
+        case 4: // UPDATED_TIME
+          return UPDATED_TIME;
+        case 5: // MESSAGE_LEVEL
+          return MESSAGE_LEVEL;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new IllegalArgumentException("Field " + 
fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final String _fieldName;
+
+    _Fields(short thriftId, String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  private static final int __UPDATEDTIME_ISSET_ID = 0;
+  private byte __isset_bitfield = 0;
+  private _Fields optionals[] = {_Fields.UPDATED_TIME, _Fields.MESSAGE_LEVEL};
+  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> 
metaDataMap;
+  static {
+    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new 
EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.EVENT, new 
org.apache.thrift.meta_data.FieldMetaData("event", 
org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING
        , true)));
+    tmpMap.put(_Fields.MESSAGE_ID, new 
org.apache.thrift.meta_data.FieldMetaData("messageId", 
org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.MESSAGE_TYPE, new 
org.apache.thrift.meta_data.FieldMetaData("messageType", 
org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new 
org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, 
MessageType.class)));
+    tmpMap.put(_Fields.UPDATED_TIME, new 
org.apache.thrift.meta_data.FieldMetaData("updatedTime", 
org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new 
org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.MESSAGE_LEVEL, new 
org.apache.thrift.meta_data.FieldMetaData("messageLevel", 
org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new 
org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, 
MessageLevel.class)));
+    metaDataMap = Collections.unmodifiableMap(tmpMap);
+    
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(Message.class, 
metaDataMap);
+  }
+
+  public Message() {
+    this.messageId = "DO_NOT_SET_AT_CLIENTS";
+
+  }
+
+  public Message(
+    ByteBuffer event,
+    String messageId,
+    MessageType messageType)
+  {
+    this();
+    this.event = event;
+    this.messageId = messageId;
+    this.messageType = messageType;
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public Message(Message other) {
+    __isset_bitfield = other.__isset_bitfield;
+    if (other.isSetEvent()) {
+      this.event = org.apache.thrift.TBaseHelper.copyBinary(other.event);
+;
+    }
+    if (other.isSetMessageId()) {
+      this.messageId = other.messageId;
+    }
+    if (other.isSetMessageType()) {
+      this.messageType = other.messageType;
+    }
+    this.updatedTime = other.updatedTime;
+    if (other.isSetMessageLevel()) {
+      this.messageLevel = other.messageLevel;
+    }
+  }
+
+  public Message deepCopy() {
+    return new Message(this);
+  }
+
+  @Override
+  public void clear() {
+    this.event = null;
+    this.messageId = "DO_NOT_SET_AT_CLIENTS";
+
+    this.messageType = null;
+    setUpdatedTimeIsSet(false);
+    this.updatedTime = 0;
+    this.messageLevel = null;
+  }
+
+  public byte[] getEvent() {
+    setEvent(org.apache.thrift.TBaseHelper.rightSize(event));
+    return event == null ? null : event.array();
+  }
+
+  public ByteBuffer bufferForEvent() {
+    return event;
+  }
+
+  public void setEvent(byte[] event) {
+    setEvent(event == null ? (ByteBuffer)null : ByteBuffer.wrap(event));
+  }
+
+  public void setEvent(ByteBuffer event) {
+    this.event = event;
+  }
+
+  public void unsetEvent() {
+    this.event = null;
+  }
+
+  /** Returns true if field event is set (has been assigned a value) and false 
otherwise */
+  public boolean isSetEvent() {
+    return this.event != null;
+  }
+
+  public void setEventIsSet(boolean value) {
+    if (!value) {
+      this.event = null;
+    }
+  }
+
+  public String getMessageId() {
+    return this.messageId;
+  }
+
+  public void setMessageId(String messageId) {
+    this.messageId = messageId;
+  }
+
+  public void unsetMessageId() {
+    this.messageId = null;
+  }
+
+  /** Returns true if field messageId is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetMessageId() {
+    return this.messageId != null;
+  }
+
+  public void setMessageIdIsSet(boolean value) {
+    if (!value) {
+      this.messageId = null;
+    }
+  }
+
+  /**
+   * 
+   * @see MessageType
+   */
+  public MessageType getMessageType() {
+    return this.messageType;
+  }
+
+  /**
+   * 
+   * @see MessageType
+   */
+  public void setMessageType(MessageType messageType) {
+    this.messageType = messageType;
+  }
+
+  public void unsetMessageType() {
+    this.messageType = null;
+  }
+
+  /** Returns true if field messageType is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetMessageType() {
+    return this.messageType != null;
+  }
+
+  public void setMessageTypeIsSet(boolean value) {
+    if (!value) {
+      this.messageType = null;
+    }
+  }
+
+  public long getUpdatedTime() {
+    return this.updatedTime;
+  }
+
+  public void setUpdatedTime(long updatedTime) {
+    this.updatedTime = updatedTime;
+    setUpdatedTimeIsSet(true);
+  }
+
+  public void unsetUpdatedTime() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, 
__UPDATEDTIME_ISSET_ID);
+  }
+
+  /** Returns true if field updatedTime is set (has been assigned a value) and 
false otherwise */
+  public boolean isSetUpdatedTime() {
+    return EncodingUtils.testBit(__isset_bitfield, __UPDATEDTIME_ISSET_ID);
+  }
+
+  public void setUpdatedTimeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, 
__UPDATEDTIME_ISSET_ID, value);
+  }
+
+  /**
+   * 
+   * @see MessageLevel
+   */
+  public MessageLevel getMessageLevel() {
+    return this.messageLevel;
+  }
+
+  /**
+   * 
+   * @see MessageLevel
+   */
+  public void setMessageLevel(MessageLevel messageLevel) {
+    this.messageLevel = messageLevel;
+  }
+
+  public void unsetMessageLevel() {
+    this.messageLevel = null;
+  }
+
+  /** Returns true if field messageLevel is set (has been assigned a value) 
and false otherwise */
+  public boolean isSetMessageLevel() {
+    return this.messageLevel != null;
+  }
+
+  public void setMessageLevelIsSet(boolean value) {
+    if (!value) {
+      this.messageLevel = null;
+    }
+  }
+
+  public void setFieldValue(_Fields field, Object value) {
+    switch (field) {
+    case EVENT:
+      if (value == null) {
+        unsetEvent();
+      } else {
+        setEvent((ByteBuffer)value);
+      }
+      break;
+
+    case MESSAGE_ID:
+      if (value == null) {
+        unsetMessageId();
+      } else {
+        setMessageId((String)value);
+      }
+      break;
+
+    case MESSAGE_TYPE:
+      if (value == null) {
+        unsetMessageType();
+      } else {
+        setMessageType((MessageType)value);
+      }
+      break;
+
+    case UPDATED_TIME:
+      if (value == null) {
+        unsetUpdatedTime();
+      } else {
+        setUpdatedTime((Long)value);
+      }
+      break;
+
+    case MESSAGE_LEVEL:
+      if (value == null) {
+        unsetMessageLevel();
+      } else {
+        setMessageLevel((MessageLevel)value);
+      }
+      break;
+
+    }
+  }
+
+  public Object getFieldValue(_Fields field) {
+    switch (field) {
+    case EVENT:
+      return getEvent();
+
+    case MESSAGE_ID:
+      return getMessageId();
+
+    case MESSAGE_TYPE:
+      return getMessageType();
+
+    case UPDATED_TIME:
+      return Long.valueOf(getUpdatedTime());
+
+    case MESSAGE_LEVEL:
+      return getMessageLevel();
+
+    }
+    throw new IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned 
a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new IllegalArgumentException();
+    }
+
+    switch (field) {
+    case EVENT:
+      return isSetEvent();
+    case MESSAGE_ID:
+      return isSetMessageId();
+    case MESSAGE_TYPE:
+      return isSetMessageType();
+    case UPDATED_TIME:
+      return isSetUpdatedTime();
+    case MESSAGE_LEVEL:
+      return isSetMessageLevel();
+    }
+    throw new IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof Message)
+      return this.equals((Message)that);
+    return false;
+  }
+
+  public boolean equals(Message that) {
+    if (that == null)
+      return false;
+
+    boolean this_present_event = true && this.isSetEvent();
+    boolean that_present_event = true && that.isSetEvent();
+    if (this_present_event || that_present_event) {
+      if (!(this_present_event && that_present_event))
+        return false;
+      if (!this.event.equals(that.event))
+        return false;
+    }
+
+    boolean this_present_messageId = true && this.isSetMessageId();
+    boolean that_present_messageId = true && that.isSetMessageId();
+    if (this_present_messageId || that_present_messageId) {
+      if (!(this_present_messageId && that_present_messageId))
+        return false;
+      if (!this.messageId.equals(that.messageId))
+        return false;
+    }
+
+    boolean this_present_messageType = true && this.isSetMessageType();
+    boolean that_present_messageType = true && that.isSetMessageType();
+    if (this_present_messageType || that_present_messageType) {
+      if (!(this_present_messageType && that_present_messageType))
+        return false;
+      if (!this.messageType.equals(that.messageType))
+        return false;
+    }
+
+    boolean this_present_updatedTime = true && this.isSetUpdatedTime();
+    boolean that_present_updatedTime = true && that.isSetUpdatedTime();
+    if (this_present_updatedTime || that_present_updatedTime) {
+      if (!(this_present_updatedTime && that_present_updatedTime))
+        return false;
+      if (this.updatedTime != that.updatedTime)
+        return false;
+    }
+
+    boolean this_present_messageLevel = true && this.isSetMessageLevel();
+    boolean that_present_messageLevel = true && that.isSetMessageLevel();
+    if (this_present_messageLevel || that_present_messageLevel) {
+      if (!(this_present_messageLevel && that_present_messageLevel))
+        return false;
+      if (!this.messageLevel.equals(that.messageLevel))
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return 0;
+  }
+
+  @Override
+  public int compareTo(Message other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+
+    lastComparison = 
Boolean.valueOf(isSetEvent()).compareTo(other.isSetEvent());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetEvent()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.event, 
other.event);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetMessageId()).compareTo(other.isSetMessageId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetMessageId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.messageId, 
other.messageId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetMessageType()).compareTo(other.isSetMessageType());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetMessageType()) {
+      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.messageType, other.messageType);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetUpdatedTime()).compareTo(other.isSetUpdatedTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetUpdatedTime()) {
+      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.updatedTime, other.updatedTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = 
Boolean.valueOf(isSetMessageLevel()).compareTo(other.isSetMessageLevel());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetMessageLevel()) {
+      lastComparison = 
org.apache.thrift.TBaseHelper.compareTo(this.messageLevel, other.messageLevel);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.thrift.protocol.TProtocol iprot) throws 
TException {
+    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+  }
+
+  public void write(org.apache.thrift.protocol.TProtocol oprot) throws 
TException {
+    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder("Message(");
+    boolean first = true;
+
+    sb.append("event:");
+    if (this.event == null) {
+      sb.append("null");
+    } else {
+      org.apache.thrift.TBaseHelper.toString(this.event, sb);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("messageId:");
+    if (this.messageId == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.messageId);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("messageType:");
+    if (this.messageType == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.messageType);
+    }
+    first = false;
+    if (isSetUpdatedTime()) {
+      if (!first) sb.append(", ");
+      sb.append("updatedTime:");
+      sb.append(this.updatedTime);
+      first = false;
+    }
+    if (isSetMessageLevel()) {
+      if (!first) sb.append(", ");
+      sb.append("messageLevel:");
+      if (this.messageLevel == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.messageLevel);
+      }
+      first = false;
+    }
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws TException {
+    // check for required fields
+    if (!isSetEvent()) {
+      throw new TProtocolException("Required field 'event' is unset! Struct:" 
+ toString());
+    }
+
+    if (!isSetMessageId()) {
+      throw new TProtocolException("Required field 'messageId' is unset! 
Struct:" + toString());
+    }
+
+    if (!isSetMessageType()) {
+      throw new TProtocolException("Required field 'messageType' is unset! 
Struct:" + toString());
+    }
+
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws 
java.io.IOException {
+    try {
+      write(new org.apache.thrift.protocol.TCompactProtocol(new 
org.apache.thrift.transport.TIOStreamTransport(out)));
+    } catch (TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws 
java.io.IOException, ClassNotFoundException {
+    try {
+      // it doesn't seem like you should have to do this, but java 
serialization is wacky, and doesn't call the default constructor.
+      __isset_bitfield = 0;
+      read(new org.apache.thrift.protocol.TCompactProtocol(new 
org.apache.thrift.transport.TIOStreamTransport(in)));
+    } catch (TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class MessageStandardSchemeFactory implements SchemeFactory {
+    public MessageStandardScheme getScheme() {
+      return new MessageStandardScheme();
+    }
+  }
+
+  private static class MessageStandardScheme extends StandardScheme<Message> {
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot, Message 
struct) throws TException {
+      org.apache.thrift.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // EVENT
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.event = iprot.readBinary();
+              struct.setEventIsSet(true);
+            } else {
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 2: // MESSAGE_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.messageId = iprot.readString();
+              struct.setMessageIdIsSet(true);
+            } else {
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 3: // MESSAGE_TYPE
+            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
+              struct.messageType = MessageType.findByValue(iprot.readI32());
+              struct.setMessageTypeIsSet(true);
+            } else {
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 4: // UPDATED_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.updatedTime = iprot.readI64();
+              struct.setUpdatedTimeIsSet(true);
+            } else {
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          case 5: // MESSAGE_LEVEL
+            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
+              struct.messageLevel = MessageLevel.findByValue(iprot.readI32());
+              struct.setMessageLevelIsSet(true);
+            } else {
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+            }
+            break;
+          default:
+            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, 
schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+      struct.validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot, Message 
struct) throws TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.event != null) {
+        oprot.writeFieldBegin(EVENT_FIELD_DESC);
+        oprot.writeBinary(struct.event);
+        oprot.writeFieldEnd();
+      }
+      if (struct.messageId != null) {
+        oprot.writeFieldBegin(MESSAGE_ID_FIELD_DESC);
+        oprot.writeString(struct.messageId);
+        oprot.writeFieldEnd();
+      }
+      if (struct.messageType != null) {
+        oprot.writeFieldBegin(MESSAGE_TYPE_FIELD_DESC);
+        oprot.writeI32(struct.messageType.getValue());
+        oprot.writeFieldEnd();
+      }
+      if (struct.isSetUpdatedTime()) {
+        oprot.writeFieldBegin(UPDATED_TIME_FIELD_DESC);
+        oprot.writeI64(struct.updatedTime);
+        oprot.writeFieldEnd();
+      }
+      if (struct.messageLevel != null) {
+        if (struct.isSetMessageLevel()) {
+          oprot.writeFieldBegin(MESSAGE_LEVEL_FIELD_DESC);
+          oprot.writeI32(struct.messageLevel.getValue());
+          oprot.writeFieldEnd();
+        }
+      }
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class MessageTupleSchemeFactory implements SchemeFactory {
+    public MessageTupleScheme getScheme() {
+      return new MessageTupleScheme();
+    }
+  }
+
+  private static class MessageTupleScheme extends TupleScheme<Message> {
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol prot, Message 
struct) throws TException {
+      TTupleProtocol oprot = (TTupleProtocol) prot;
+      oprot.writeBinary(struct.event);
+      oprot.writeString(struct.messageId);
+      oprot.writeI32(struct.messageType.getValue());
+      BitSet optionals = new BitSet();
+      if (struct.isSetUpdatedTime()) {
+        optionals.set(0);
+      }
+      if (struct.isSetMessageLevel()) {
+        optionals.set(1);
+      }
+      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetUpdatedTime()) {
+        oprot.writeI64(struct.updatedTime);
+      }
+      if (struct.isSetMessageLevel()) {
+        oprot.writeI32(struct.messageLevel.getValue());
+      }
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol prot, Message 
struct) throws TException {
+      TTupleProtocol iprot = (TTupleProtocol) prot;
+      struct.event = iprot.readBinary();
+      struct.setEventIsSet(true);
+      struct.messageId = iprot.readString();
+      struct.setMessageIdIsSet(true);
+      struct.messageType = MessageType.findByValue(iprot.readI32());
+      struct.setMessageTypeIsSet(true);
+      BitSet incoming = iprot.readBitSet(2);
+      if (incoming.get(0)) {
+        struct.updatedTime = iprot.readI64();
+        struct.setUpdatedTimeIsSet(true);
+      }
+      if (incoming.get(1)) {
+        struct.messageLevel = MessageLevel.findByValue(iprot.readI32());
+        struct.setMessageLevelIsSet(true);
+      }
+    }
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageLevel.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageLevel.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageLevel.java
new file mode 100644
index 0000000..96ae0bf
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageLevel.java
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.datacat.models.Messaging;
+
+
+import org.apache.thrift.TEnum;
+
+@SuppressWarnings("all") public enum MessageLevel implements TEnum {
+  INFO(0),
+  DEBUG(1),
+  ERROR(2),
+  ACK(3);
+
+  private final int value;
+
+  private MessageLevel(int value) {
+    this.value = value;
+  }
+
+  /**
+   * Get the integer value of this enum value, as defined in the Thrift IDL.
+   */
+  public int getValue() {
+    return value;
+  }
+
+  /**
+   * Find a the enum type by its integer value, as defined in the Thrift IDL.
+   * @return null if the value is not found.
+   */
+  public static MessageLevel findByValue(int value) { 
+    switch (value) {
+      case 0:
+        return INFO;
+      case 1:
+        return DEBUG;
+      case 2:
+        return ERROR;
+      case 3:
+        return ACK;
+      default:
+        return null;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageType.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageType.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageType.java
new file mode 100644
index 0000000..d1993e9
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/Messaging/MessageType.java
@@ -0,0 +1,53 @@
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.datacat.models.Messaging;
+
+
+public enum MessageType implements org.apache.thrift.TEnum {
+    EXPERIMENT(0),
+    TASK(1),
+    WORKFLOWNODE(2),
+    JOB(3),
+    EXPERIMENT_OUTPUT(4),
+    OUTPUT_PARSED(5);
+
+    private final int value;
+
+    private MessageType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Get the integer value of this enum value, as defined in the Thrift IDL.
+     */
+    public int getValue() {
+        return value;
+    }
+
+    /**
+     * Find a the enum type by its integer value, as defined in the Thrift IDL.
+     * @return null if the value is not found.
+     */
+    public static MessageType findByValue(int value) {
+        switch (value) {
+            case 0:
+                return EXPERIMENT;
+            case 1:
+                return TASK;
+            case 2:
+                return WORKFLOWNODE;
+            case 3:
+                return JOB;
+            case 4:
+                return EXPERIMENT_OUTPUT;
+            case 5:
+                return OUTPUT_PARSED;
+            default:
+                return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/MetadataFields.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/MetadataFields.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/MetadataFields.java
new file mode 100644
index 0000000..8450d22
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/MetadataFields.java
@@ -0,0 +1,33 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+public class MetadataFields {
+    public static final String ID = "id";
+    public static final String EXPERIMENT_NAME = "experimentName";
+    public static final String EXPERIMENT_ID = "experimentId";
+    public static final String OUTPUT_PATH = "outputPath";
+    public static final String OWNER_ID = "ownerId";
+    public static final String GATEWAY_ID = "gatewayId";
+    public static final String APPLICATION_NAME = "applicationName";
+    public static final String HOST = "host";
+    public static final String CREATED_DATE = "createdDate";
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMetadataDTO.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMetadataDTO.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMetadataDTO.java
new file mode 100644
index 0000000..53b1c57
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMetadataDTO.java
@@ -0,0 +1,142 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+import java.util.Map;
+
+public class OutputMetadataDTO {
+
+    private String id = "";
+
+    private String experimentName = "";
+
+    private String outputPath = "";
+
+    private String ownerId = "";
+
+    public String gatewayId = "";
+
+    private String applicationName = "";
+
+    private String experimentId = "";
+
+    private String createdDate = "";
+
+    private String host = "";
+
+    //This field is added for the requirements of Solr (it is easy to encode 
json to object when this field
+    // is present).
+    private String _version_ = "";
+
+    //Custom Metadata fields
+    //The content of this field depends on the parsers
+    //The relevant parsers populate this data entity
+    private Map<String, String> customMetaData;
+
+    public String getOutputPath() {
+        return outputPath;
+    }
+
+    public void setOutputPath(String outputPath) {
+        this.outputPath = outputPath;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getExperimentName() {
+        return experimentName;
+    }
+
+    public void setExperimentName(String experimentName) {
+        this.experimentName = experimentName;
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getExperimentId() {
+        return experimentId;
+    }
+
+    public void setExperimentId(String experimentId) {
+        this.experimentId = experimentId;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public String getCreatedDate() {
+        return createdDate;
+    }
+
+    public void setCreatedDate(String createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public String getOwnerId() {
+        return ownerId;
+    }
+
+    public void setOwnerId(String ownerId) {
+        this.ownerId = ownerId;
+    }
+
+    public String get_version_() {
+        return _version_;
+    }
+
+    public void set_version_(String _version_) {
+        this._version_ = _version_;
+    }
+
+    public Map<String, String> getCustomMetaData() {
+        return customMetaData;
+    }
+
+    public void setCustomMetaData(Map<String, String> customMetaData) {
+        this.customMetaData = customMetaData;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessage.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessage.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessage.java
new file mode 100644
index 0000000..ee1ac49
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessage.java
@@ -0,0 +1,104 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+public class OutputMonitorMessage {
+
+    private String experimentID;
+
+    private String experimentName;
+
+    private String ownerId;
+
+    private String gatewayId;
+
+    private String outputPath;
+
+    private String applicationName;
+
+    private String host;
+
+    private String fileMonitorMessageType;
+
+    public String getExperimentID() {
+        return experimentID;
+    }
+
+    public void setExperimentID(String experimentID) {
+        this.experimentID = experimentID;
+    }
+
+    public String getOutputPath() {
+        return outputPath;
+    }
+
+    public void setOutputPath(String outputPath) {
+        this.outputPath = outputPath;
+    }
+
+    public String getFileMonitorMessageType() {
+        return fileMonitorMessageType;
+    }
+
+    public void setFileMonitorMessageType(String fileMonitorMessageType) {
+        this.fileMonitorMessageType = fileMonitorMessageType;
+    }
+
+    public String getExperimentName() {
+        return experimentName;
+    }
+
+    public void setExperimentName(String experimentName) {
+        this.experimentName = experimentName;
+    }
+
+    public String getOwnerId() {
+        return ownerId;
+    }
+
+    public void setOwnerId(String ownerId) {
+        this.ownerId = ownerId;
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessageType.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessageType.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessageType.java
new file mode 100644
index 0000000..2563822
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/OutputMonitorMessageType.java
@@ -0,0 +1,29 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+public class OutputMonitorMessageType {
+    public static final String FILE_CREATED = "FILE_CREATED";
+
+    public static final String FILE_MODIFIED = "FILE_MODIFIED";
+
+    public static final String FILE_DELETED = "FILE_DELETED";
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryParameter.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryParameter.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryParameter.java
new file mode 100644
index 0000000..8b7716d
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryParameter.java
@@ -0,0 +1,64 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+import java.io.Serializable;
+
+public class PrimaryQueryParameter implements Serializable {
+
+    private String field;
+    private String firstParameter;
+    //In some cases we need a second parameter e.g. range query
+    private String secondParameter;
+    private PrimaryQueryType primaryQueryType;
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getFirstParameter() {
+        return firstParameter;
+    }
+
+    public void setFirstParameter(String firstParameter) {
+        this.firstParameter = firstParameter;
+    }
+
+    public String getSecondParameter() {
+        return secondParameter;
+    }
+
+    public void setSecondParameter(String secondParameter) {
+        this.secondParameter = secondParameter;
+    }
+
+    public PrimaryQueryType getPrimaryQueryType() {
+        return primaryQueryType;
+    }
+
+    public void setPrimaryQueryType(PrimaryQueryType primaryQueryType) {
+        this.primaryQueryType = primaryQueryType;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryType.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryType.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryType.java
new file mode 100644
index 0000000..5ef1827
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/PrimaryQueryType.java
@@ -0,0 +1,31 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+public enum PrimaryQueryType {
+    EQUALS,
+    PHRASE,
+    WILDCARD,
+    SUBSTRING,
+    RANGE,
+    FULL_TEXT
+}
+

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/models/src/main/java/org/apache/airavata/datacat/models/QueryObject.java
----------------------------------------------------------------------
diff --git 
a/datacat/models/src/main/java/org/apache/airavata/datacat/models/QueryObject.java
 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/QueryObject.java
new file mode 100644
index 0000000..eaaf329
--- /dev/null
+++ 
b/datacat/models/src/main/java/org/apache/airavata/datacat/models/QueryObject.java
@@ -0,0 +1,96 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.models;
+
+import java.util.List;
+
+public class QueryObject {
+
+    private String username;
+
+    private boolean queryStringSet =false;
+
+    private String queryString;
+
+    private String[] userGroups;
+
+    private List<PrimaryQueryParameter> primaryQueryParameterList;
+
+    private int startRow=0;
+
+    private int numberOfRows =0;
+
+    public String getQueryString() {
+        return queryString;
+    }
+
+    public void setQueryString(String queryString) {
+        this.queryString = queryString;
+    }
+
+    public boolean isQueryStringSet() {
+        return queryStringSet;
+    }
+
+    public void setQueryStringSet(boolean stringQuery) {
+        this.queryStringSet = stringQuery;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String[] getUserGroups() {
+        return userGroups;
+    }
+
+    public void setUserGroups(String[] userGroups) {
+        this.userGroups = userGroups;
+    }
+
+    public List<PrimaryQueryParameter> getPrimaryQueryParameterList() {
+        return primaryQueryParameterList;
+    }
+
+    public void setPrimaryQueryParameterList(List<PrimaryQueryParameter> 
primaryQueryParameterList) {
+        this.primaryQueryParameterList = primaryQueryParameterList;
+    }
+
+    public int getStartRow() {
+        return startRow;
+    }
+
+    public void setStartRow(int startRow) {
+        this.startRow = startRow;
+    }
+
+    public int getNumberOfRows() {
+        return numberOfRows;
+    }
+
+    public void setNumberOfRows(int numberOfRows) {
+        this.numberOfRows = numberOfRows;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/parsers/pom.xml
----------------------------------------------------------------------
diff --git a/datacat/parsers/pom.xml b/datacat/parsers/pom.xml
new file mode 100644
index 0000000..97b0fb5
--- /dev/null
+++ b/datacat/parsers/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <parent>
+        <artifactId>datacat</artifactId>
+        <groupId>org.apache.airavata.datacat</groupId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>parsers</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>edu.princeton.cup</groupId>
+            <artifactId>java-cup</artifactId>
+            <version>${java-cup.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata.datacat</groupId>
+            <artifactId>models</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${apache-commons.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/DefaultParser.java
----------------------------------------------------------------------
diff --git 
a/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/DefaultParser.java
 
b/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/DefaultParser.java
new file mode 100644
index 0000000..fae872d
--- /dev/null
+++ 
b/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/DefaultParser.java
@@ -0,0 +1,63 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+package org.apache.airavata.datacat.parsers;
+
+import org.apache.airavata.datacat.models.OutputMetadataDTO;
+import org.apache.airavata.datacat.models.OutputMonitorMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * This is a test parser to to work with PHP Reference Gateway.
+ */
+public class DefaultParser implements IParser {
+    private final static Logger logger = 
LoggerFactory.getLogger(DefaultParser.class);
+
+    @Override
+    public OutputMetadataDTO parse(OutputMonitorMessage outputMonitorMessage) {
+        //only a sample set of metadata is set.
+        OutputMetadataDTO outputMetadataDTO = new OutputMetadataDTO();
+        
outputMetadataDTO.setExperimentId(outputMonitorMessage.getExperimentID());
+        
outputMetadataDTO.setExperimentName(outputMonitorMessage.getExperimentName());
+        outputMetadataDTO.setOutputPath(outputMonitorMessage.getOutputPath());
+        outputMetadataDTO.setOwnerId(outputMonitorMessage.getOwnerId());
+        outputMetadataDTO.setGatewayId(outputMonitorMessage.getGatewayId());
+        
outputMetadataDTO.setApplicationName(outputMonitorMessage.getApplicationName());
+        outputMetadataDTO.setHost(outputMonitorMessage.getHost());
+
+        //For Solr requirement date is in the format of yyyy-MM-ddTHH:mm:ssZ
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date now = new Date();
+        //rounding off the day
+        String date = dateFormat.format(now).split(" ")[0] + "T" + 
dateFormat.format(now).split(" ")[1] + "Z/DAY";
+        outputMetadataDTO.setCreatedDate(date);
+
+        HashMap<String, String> customMetadata = new HashMap<>();
+        outputMetadataDTO.setCustomMetaData(customMetadata);
+
+        return outputMetadataDTO;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata-sandbox/blob/4231ac35/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/IParser.java
----------------------------------------------------------------------
diff --git 
a/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/IParser.java
 
b/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/IParser.java
new file mode 100644
index 0000000..8bf534d
--- /dev/null
+++ 
b/datacat/parsers/src/main/java/org/apache/airavata/datacat/parsers/IParser.java
@@ -0,0 +1,30 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.airavata.datacat.parsers;
+
+import org.apache.airavata.datacat.models.OutputMetadataDTO;
+import org.apache.airavata.datacat.models.OutputMonitorMessage;
+
+public interface IParser {
+
+    public OutputMetadataDTO parse(OutputMonitorMessage outputMonitorMessage);
+
+}

Reply via email to