001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package org.apache.hadoop.yarn.api.records.timeline;
020    
021    import java.util.HashMap;
022    import java.util.Map;
023    
024    import javax.xml.bind.annotation.XmlAccessType;
025    import javax.xml.bind.annotation.XmlAccessorType;
026    import javax.xml.bind.annotation.XmlElement;
027    import javax.xml.bind.annotation.XmlRootElement;
028    
029    import org.apache.hadoop.classification.InterfaceAudience.Private;
030    import org.apache.hadoop.classification.InterfaceAudience.Public;
031    import org.apache.hadoop.classification.InterfaceStability.Unstable;
032    
033    /**
034     * The class that contains the information of an event that is related to some
035     * conceptual entity of an application. Users are free to define what the event
036     * means, such as starting an application, getting allocated a container and
037     * etc.
038     */
039    @XmlRootElement(name = "event")
040    @XmlAccessorType(XmlAccessType.NONE)
041    @Public
042    @Unstable
043    public class TimelineEvent implements Comparable<TimelineEvent> {
044    
045      private long timestamp;
046      private String eventType;
047      private HashMap<String, Object> eventInfo = new HashMap<String, Object>();
048    
049      public TimelineEvent() {
050      }
051    
052      /**
053       * Get the timestamp of the event
054       * 
055       * @return the timestamp of the event
056       */
057      @XmlElement(name = "timestamp")
058      public long getTimestamp() {
059        return timestamp;
060      }
061    
062      /**
063       * Set the timestamp of the event
064       * 
065       * @param timestamp
066       *          the timestamp of the event
067       */
068      public void setTimestamp(long timestamp) {
069        this.timestamp = timestamp;
070      }
071    
072      /**
073       * Get the event type
074       * 
075       * @return the event type
076       */
077      @XmlElement(name = "eventtype")
078      public String getEventType() {
079        return eventType;
080      }
081    
082      /**
083       * Set the event type
084       * 
085       * @param eventType
086       *          the event type
087       */
088      public void setEventType(String eventType) {
089        this.eventType = eventType;
090      }
091    
092      /**
093       * Set the information of the event
094       * 
095       * @return the information of the event
096       */
097      public Map<String, Object> getEventInfo() {
098        return eventInfo;
099      }
100    
101      // Required by JAXB
102      @Private
103      @XmlElement(name = "eventinfo")
104      public HashMap<String, Object> getEventInfoJAXB() {
105        return eventInfo;
106      }
107    
108      /**
109       * Add one piece of the information of the event to the existing information
110       * map
111       * 
112       * @param key
113       *          the information key
114       * @param value
115       *          the information value
116       */
117      public void addEventInfo(String key, Object value) {
118        this.eventInfo.put(key, value);
119      }
120    
121      /**
122       * Add a map of the information of the event to the existing information map
123       * 
124       * @param eventInfo
125       *          a map of of the information of the event
126       */
127      public void addEventInfo(Map<String, Object> eventInfo) {
128        this.eventInfo.putAll(eventInfo);
129      }
130    
131      /**
132       * Set the information map to the given map of the information of the event
133       * 
134       * @param eventInfo
135       *          a map of of the information of the event
136       */
137      public void setEventInfo(Map<String, Object> eventInfo) {
138        if (eventInfo != null && !(eventInfo instanceof HashMap)) {
139          this.eventInfo = new HashMap<String, Object>(eventInfo);
140        } else {
141          this.eventInfo = (HashMap<String, Object>) eventInfo;
142        }
143      }
144    
145      @Override
146      public int compareTo(TimelineEvent other) {
147        if (timestamp > other.timestamp) {
148          return -1;
149        } else if (timestamp < other.timestamp) {
150          return 1;
151        } else {
152          return eventType.compareTo(other.eventType);
153        }
154      }
155    
156      @Override
157      public boolean equals(Object o) {
158        if (this == o)
159          return true;
160        if (o == null || getClass() != o.getClass())
161          return false;
162    
163        TimelineEvent event = (TimelineEvent) o;
164    
165        if (timestamp != event.timestamp)
166          return false;
167        if (!eventType.equals(event.eventType))
168          return false;
169        if (eventInfo != null ? !eventInfo.equals(event.eventInfo) :
170            event.eventInfo != null)
171          return false;
172    
173        return true;
174      }
175    
176      @Override
177      public int hashCode() {
178        int result = (int) (timestamp ^ (timestamp >>> 32));
179        result = 31 * result + eventType.hashCode();
180        result = 31 * result + (eventInfo != null ? eventInfo.hashCode() : 0);
181        return result;
182      }
183    }