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 */
018package org.apache.oozie;
019
020import java.io.DataInput;
021import java.io.DataOutput;
022import java.io.IOException;
023import java.sql.Timestamp;
024import java.util.Date;
025
026import javax.persistence.Basic;
027import javax.persistence.Column;
028import javax.persistence.DiscriminatorColumn;
029import javax.persistence.DiscriminatorType;
030import javax.persistence.Entity;
031import javax.persistence.Id;
032import javax.persistence.NamedQueries;
033import javax.persistence.NamedQuery;
034import javax.persistence.Table;
035
036import org.apache.hadoop.io.Writable;
037import org.apache.oozie.client.Job.Status;
038import org.apache.oozie.client.rest.JsonBean;
039import org.apache.oozie.util.DateUtils;
040import org.apache.oozie.util.WritableUtils;
041import org.json.simple.JSONObject;
042
043@Entity
044@Table(name = "BUNDLE_ACTIONS")
045@DiscriminatorColumn(name = "bean_type", discriminatorType = DiscriminatorType.STRING)
046@NamedQueries( {
047        @NamedQuery(name = "DELETE_BUNDLE_ACTION", query = "delete from BundleActionBean w where w.bundleActionId = :bundleActionId"),
048
049        @NamedQuery(name = "GET_BUNDLE_ACTIONS_FOR_BUNDLE", query = "select OBJECT(w) from BundleActionBean w where w.bundleId = :bundleId"),
050
051        @NamedQuery(name = "GET_BUNDLE_ACTION_STATUS_PENDING_FOR_BUNDLE", query = "select w.coordId, w.status, w.pending from BundleActionBean w where w.bundleId = :bundleId"),
052
053        @NamedQuery(name = "GET_BUNDLE_ACTIONS", query = "select OBJECT(w) from BundleActionBean w"),
054
055        @NamedQuery(name = "GET_BUNDLE_ACTIONS_BY_LAST_MODIFIED_TIME", query = "select OBJECT(w) from BundleActionBean w where w.lastModifiedTimestamp >= :lastModifiedTime"),
056
057        @NamedQuery(name = "GET_BUNDLE_WAITING_ACTIONS_OLDER_THAN", query = "select OBJECT(a) from BundleActionBean a where a.pending > 0 AND a.lastModifiedTimestamp <= :lastModifiedTime"),
058
059        @NamedQuery(name = "GET_BUNDLE_ACTION", query = "select OBJECT(w) from BundleActionBean w where w.bundleActionId = :bundleActionId"),
060
061        @NamedQuery(name = "GET_BUNDLE_ACTIONS_COUNT", query = "select count(w) from BundleActionBean w"),
062
063        @NamedQuery(name = "GET_BUNDLE_ACTIONS_COUNT_BY_JOB", query = "select count(w) from BundleActionBean w where w.bundleId = :bundleId"),
064
065        @NamedQuery(name = "GET_BUNDLE_ACTIONS_PENDING_TRUE_COUNT", query = "select count(w) from BundleActionBean w where w.bundleId = :bundleId AND w.pending > 0"),
066
067        @NamedQuery(name = "GET_BUNDLE_ACTIONS_NOT_EQUAL_STATUS_COUNT", query = "select count(w) from BundleActionBean w where w.bundleId = :bundleId AND w.status <> :status"),
068
069        @NamedQuery(name = "GET_BUNDLE_ACTIONS_NOT_TERMINATE_STATUS_COUNT", query = "select count(w) from BundleActionBean w where w.bundleId = :bundleId AND (w.status = 'PREP' OR w.status = 'RUNNING' OR w.status = 'RUNNINGWITHERROR' OR w.status = 'SUSPENDED' OR w.status = 'SUSPENDEDWITHERROR' OR w.status = 'PREPSUSPENDED' OR w.status = 'PAUSED' OR  w.status = 'PAUSEDWITHERROR' OR w.status = 'PREPPAUSED')"),
070
071        @NamedQuery(name = "GET_BUNDLE_ACTIONS_FAILED_NULL_COORD_COUNT", query = "select count(w) from BundleActionBean w where w.bundleId = :bundleId AND w.status = 'FAILED' AND w.coordId IS NULL"),
072
073        @NamedQuery(name = "GET_BUNDLE_ACTIONS_OLDER_THAN", query = "select OBJECT(w) from BundleActionBean w order by w.lastModifiedTimestamp"),
074
075        @NamedQuery(name = "DELETE_COMPLETED_ACTIONS_FOR_BUNDLE", query = "delete from BundleActionBean a where a.bundleId = :bundleId and (a.status = 'SUCCEEDED' OR a.status = 'FAILED' OR a.status= 'KILLED' OR a.status = 'DONEWITHERROR')"),
076
077        @NamedQuery(name = "DELETE_ACTIONS_FOR_BUNDLE", query = "delete from BundleActionBean a where a.bundleId = :bundleId")})
078public class BundleActionBean implements Writable, JsonBean {
079
080    @Id
081    @Column(name = "bundle_action_id")
082    private String bundleActionId = null;
083
084    @Column(name = "bundle_id")
085    private String bundleId = null;
086
087    @Column(name = "coord_name")
088    private String coordName = null;
089
090    @Basic
091    @Column(name = "coord_id")
092    private String coordId = null;
093
094    @Basic
095    @Column(name = "status")
096    private String status = null;
097
098    @Basic
099    @Column(name = "critical")
100    private int critical = 0;
101
102    @Basic
103    @Column(name = "pending")
104    private int pending = 0;
105
106    @Basic
107    @Column(name = "last_modified_time")
108    private java.sql.Timestamp lastModifiedTimestamp = null;
109
110    /**
111     * bundleActionId to set
112     *
113     * @param bundleActionId the bundleActionId to set
114     */
115    public void setBundleActionId(String bundleActionId) {
116        this.bundleActionId = bundleActionId;
117    }
118
119    /**
120     * Get the Bundle Action Id.
121     *
122     * @return the bundleActionId
123     */
124    public String getBundleActionId() {
125        return bundleActionId;
126    }
127
128    /**
129     * Get the BundleId
130     *
131     * @return bundleId
132     */
133    public String getBundleId() {
134        return bundleId;
135    }
136
137    /**
138     * Set the Bundle Id.
139     *
140     * @param bundleId
141     */
142    public void setBundleId(String bundleId) {
143        this.bundleId = bundleId;
144    }
145
146    /**
147     * Get the Coordinator name.
148     *
149     * @return coordName
150     */
151    public String getCoordName() {
152        return coordName;
153    }
154
155    /**
156     * Set the Coordinator name.
157     *
158     * @param coordName
159     */
160    public void setCoordName(String coordName) {
161        this.coordName = coordName;
162    }
163
164    /**
165     * Get the coordinator Id.
166     *
167     * @return the coordId
168     */
169    public String getCoordId() {
170        return coordId;
171    }
172
173    /**
174     * Set the coordinator Id.
175     *
176     * @param coordId
177     */
178    public void setCoordId(String coordId) {
179        this.coordId = coordId;
180    }
181
182    /**
183     * Get the Status of the Bundle Action
184     *
185     * @return status object
186     */
187    public Status getStatus() {
188        return Status.valueOf(this.status);
189    }
190
191    /**
192     * Get the Status of the Bundle Action
193     *
194     * @return status string
195     */
196    public String getStatusStr() {
197        return status;
198    }
199
200    /**
201     * Set the Status of the Bundle Action
202     *
203     * @param val
204     */
205    public void setStatus(Status val) {
206        this.status = val.toString();
207    }
208
209    /**
210     * Set Whether this bundle action is critical or not.
211     *
212     * @param critical set critical to true
213     */
214    public void setCritical() {
215        this.critical = 1;
216    }
217
218    /**
219     * Reseset Whether this bundle action is critical or not.
220     *
221     * @param critical set critical to false
222     */
223    public void resetCritical() {
224        this.critical = 0;
225    }
226
227    /**
228     * Return if the action is critical.
229     *
230     * @return if the action is critical.
231     */
232    public boolean isCritical() {
233        return critical == 1 ? true : false;
234    }
235
236    /**
237     * Set some actions are in progress for particular bundle action.
238     *
239     * @param pending set pending to true
240     */
241    public void setPending(int pending) {
242        this.pending = pending;
243    }
244
245    /**
246     * increment pending and return it
247     *
248     * @return pending
249     */
250    public int incrementAndGetPending() {
251        this.pending++;
252        return pending;
253    }
254
255    /**
256     * decrement pending and return it
257     *
258     * @return pending
259     */
260    public int decrementAndGetPending() {
261        this.pending = Math.max(this.pending-1, 0);
262        return pending;
263    }
264
265    /**
266     * Get some actions are in progress for particular bundle action.
267     *
268     * @return pending
269     */
270    public int getPending() {
271        return this.pending;
272    }
273
274    /**
275     * Return if the action is pending.
276     *
277     * @return if the action is pending.
278     */
279    public boolean isPending() {
280        return pending > 0 ? true : false;
281    }
282
283    /**
284     * @return true if in terminal status
285     */
286    public boolean isTerminalStatus() {
287        boolean isTerminal = false;
288        switch (getStatus()) {
289            case SUCCEEDED:
290            case FAILED:
291            case KILLED:
292            case DONEWITHERROR:
293                isTerminal = true;
294                break;
295            default:
296                isTerminal = false;
297                break;
298        }
299        return isTerminal;
300    }
301
302    /**
303     * Set Last modified time.
304     *
305     * @param lastModifiedTimestamp the lastModifiedTimestamp to set
306     */
307    public void setLastModifiedTimestamp(java.sql.Timestamp lastModifiedTimestamp) {
308        this.lastModifiedTimestamp = lastModifiedTimestamp;
309    }
310
311    /**
312     * Set Last modified time.
313     *
314     * @param lastModifiedTime the lastModifiedTime to set
315     */
316    public void setLastModifiedTime(Date lastModifiedTime) {
317        this.lastModifiedTimestamp = DateUtils.convertDateToTimestamp(lastModifiedTime);
318    }
319
320    /**
321     * Get Last modified time.
322     *
323     * @return lastModifiedTime
324     */
325    public Date getLastModifiedTime() {
326        return DateUtils.toDate(lastModifiedTimestamp);
327    }
328
329    /**
330     * Get Last modified time.
331     *
332     * @return lastModifiedTimestamp
333     */
334    public Timestamp getLastModifiedTimestamp() {
335        return lastModifiedTimestamp;
336    }
337
338    /* (non-Javadoc)
339     * @see org.apache.hadoop.io.Writable#write(java.io.DataOutput)
340     */
341    @Override
342    public void write(DataOutput dataOutput) throws IOException {
343        WritableUtils.writeStr(dataOutput, getBundleActionId());
344        WritableUtils.writeStr(dataOutput, getBundleId());
345        WritableUtils.writeStr(dataOutput, getCoordName());
346        WritableUtils.writeStr(dataOutput, getCoordId());
347        WritableUtils.writeStr(dataOutput, getStatusStr());
348        dataOutput.writeInt(critical);
349        dataOutput.writeInt(pending);
350        dataOutput.writeLong((getLastModifiedTimestamp() != null) ? getLastModifiedTimestamp().getTime() : -1);
351    }
352
353    /* (non-Javadoc)
354     * @see org.apache.hadoop.io.Writable#readFields(java.io.DataInput)
355     */
356    @Override
357    public void readFields(DataInput dataInput) throws IOException {
358        setBundleActionId(WritableUtils.readStr(dataInput));
359        setBundleId(WritableUtils.readStr(dataInput));
360        setCoordName(WritableUtils.readStr(dataInput));
361        setCoordId(WritableUtils.readStr(dataInput));
362        setStatus(Status.valueOf(WritableUtils.readStr(dataInput)));
363        critical = dataInput.readInt();
364        pending = dataInput.readInt();
365        long d = dataInput.readLong();
366        if (d != -1) {
367            setLastModifiedTime(new Date(d));
368        }
369    }
370
371    @Override
372    public JSONObject toJSONObject() {
373        return null;
374    }
375
376    @Override
377    public JSONObject toJSONObject(String timeZoneId) {
378        return null;
379    }
380}