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    package org.apache.oozie;
019    
020    import java.io.DataInput;
021    import java.io.DataOutput;
022    import java.io.IOException;
023    import java.sql.Timestamp;
024    import java.util.Date;
025    
026    import javax.persistence.Basic;
027    import javax.persistence.Column;
028    import javax.persistence.Entity;
029    import javax.persistence.Lob;
030    import javax.persistence.NamedQueries;
031    import javax.persistence.NamedQuery;
032    
033    import org.apache.hadoop.io.Writable;
034    import org.apache.oozie.client.BundleJob;
035    import org.apache.oozie.client.Job;
036    import org.apache.oozie.client.rest.JsonBundleJob;
037    import org.apache.oozie.util.DateUtils;
038    import org.apache.oozie.util.WritableUtils;
039    import org.apache.openjpa.persistence.jdbc.Index;
040    
041    @Entity
042    @NamedQueries( {
043            @NamedQuery(name = "UPDATE_BUNDLE_JOB", query = "update BundleJobBean w set w.appName = :appName, w.appPath = :appPath, w.conf = :conf, w.externalId = :externalId, w.timeOut = :timeOut, w.createdTimestamp = :createdTimestamp, w.endTimestamp = :endTimestamp, w.jobXml = :jobXml, w.lastModifiedTimestamp = :lastModifiedTimestamp, w.origJobXml = :origJobXml, w.startTimestamp = :startTimestamp, w.status = :status, w.timeUnitStr = :timeUnit, w.pending = :pending where w.id = :id"),
044    
045            @NamedQuery(name = "UPDATE_BUNDLE_JOB_STATUS", query = "update BundleJobBean w set w.status = :status, w.lastModifiedTimestamp = :lastModifiedTimestamp, w.pending = :pending where w.id = :id"),
046    
047            @NamedQuery(name = "DELETE_BUNDLE_JOB", query = "delete from BundleJobBean w where w.id = :id"),
048    
049            @NamedQuery(name = "GET_BUNDLE_JOBS", query = "select OBJECT(w) from BundleJobBean w"),
050    
051            @NamedQuery(name = "GET_BUNDLE_JOB", query = "select OBJECT(w) from BundleJobBean w where w.id = :id"),
052    
053            @NamedQuery(name = "GET_BUNDLE_JOBS_COUNT", query = "select count(w) from BundleJobBean w"),
054    
055            @NamedQuery(name = "GET_BUNDLE_JOBS_COLUMNS", query = "select w.id, w.appName, w.appPath, w.conf, w.status, w.kickoffTimestamp, w.startTimestamp, w.endTimestamp, w.pauseTimestamp, w.createdTimestamp, w.user, w.group, w.timeUnitStr, w.timeOut from BundleJobBean w order by w.createdTimestamp desc"),
056    
057            @NamedQuery(name = "GET_BUNDLE_JOBS_RUNNING_OR_PENDING", query = "select OBJECT(w) from BundleJobBean w where w.status = 'RUNNING' OR w.status = 'RUNNINGWITHERROR' OR w.pending = 1 order by w.lastModifiedTimestamp"),
058    
059            @NamedQuery(name = "GET_BUNDLE_JOBS_NEED_START", query = "select OBJECT(w) from BundleJobBean w where w.status = 'PREP' AND (w.kickoffTimestamp IS NULL OR (w.kickoffTimestamp IS NOT NULL AND w.kickoffTimestamp <= :currentTime)) order by w.lastModifiedTimestamp"),
060    
061            @NamedQuery(name = "GET_BUNDLE_JOBS_PAUSED", query = "select OBJECT(w) from BundleJobBean w where w.status = 'PAUSED' OR w.status = 'PAUSEDWITHERROR' OR w.status = 'PREPPAUSED' order by w.lastModifiedTimestamp"),
062    
063            @NamedQuery(name = "GET_BUNDLE_JOBS_UNPAUSED", query = "select OBJECT(w) from BundleJobBean w where w.status = 'RUNNING' OR w.status = 'RUNNINGWITHERROR' OR w.status = 'PREP' order by w.lastModifiedTimestamp"),
064    
065            @NamedQuery(name = "GET_BUNDLE_JOBS_OLDER_THAN", query = "select OBJECT(w) from BundleJobBean w where w.startTimestamp <= :matTime AND (w.status = 'PREP' OR w.status = 'RUNNING' or w.status = 'RUNNINGWITHERROR')  order by w.lastModifiedTimestamp"),
066    
067            @NamedQuery(name = "GET_BUNDLE_JOBS_OLDER_THAN_STATUS", query = "select OBJECT(w) from BundleJobBean w where w.status = :status AND w.lastModifiedTimestamp <= :lastModTime order by w.lastModifiedTimestamp"),
068    
069            @NamedQuery(name = "GET_COMPLETED_BUNDLE_JOBS_OLDER_THAN", query = "select w.id from BundleJobBean w where ( w.status = 'SUCCEEDED' OR w.status = 'FAILED' OR w.status = 'KILLED' OR w.status = 'DONEWITHERROR') AND w.lastModifiedTimestamp <= :lastModTime order by w.lastModifiedTimestamp"),
070    
071            @NamedQuery(name = "BULK_MONITOR_BUNDLE_QUERY", query = "SELECT b.id, b.status, b.user FROM BundleJobBean b WHERE b.appName = :appName"),
072    
073            // Join query
074            @NamedQuery(name = "BULK_MONITOR_ACTIONS_QUERY", query = "SELECT a.id, a.actionNumber, a.errorCode, a.errorMessage, a.externalId, " +
075                    "a.externalStatus, a.status, a.createdTimestamp, a.nominalTimestamp, a.missingDependencies, " +
076                    "c.id, c.appName, c.status FROM CoordinatorActionBean a, CoordinatorJobBean c " +
077                    "WHERE a.jobId = c.id AND c.bundleId = :bundleId ORDER BY a.jobId, a.createdTimestamp"),
078    
079            @NamedQuery(name = "BULK_MONITOR_COUNT_QUERY", query = "SELECT COUNT(a) FROM CoordinatorActionBean a, CoordinatorJobBean c"),
080    
081            @NamedQuery(name = "GET_BUNDLE_JOB_FOR_USER", query = "select w.user from BundleJobBean w where w.id = :id") })
082    public class BundleJobBean extends JsonBundleJob implements Writable {
083    
084        @Basic
085        @Index
086        @Column(name = "status")
087        private String status = Job.Status.PREP.toString();
088    
089        @Basic
090        @Column(name = "kickoff_time")
091        private java.sql.Timestamp kickoffTimestamp = null;
092    
093        @Basic
094        @Column(name = "start_time")
095        private java.sql.Timestamp startTimestamp = null;
096    
097        @Basic
098        @Column(name = "end_time")
099        private java.sql.Timestamp endTimestamp = null;
100    
101        @Basic
102        @Column(name = "pause_time")
103        private java.sql.Timestamp pauseTimestamp = null;
104    
105        @Basic
106        @Index
107        @Column(name = "created_time")
108        private java.sql.Timestamp createdTimestamp = null;
109    
110        @Basic
111        @Column(name = "time_unit")
112        private String timeUnitStr = BundleJob.Timeunit.NONE.toString();
113    
114        @Basic
115        @Column(name = "pending")
116        private int pending = 0;
117    
118        @Basic
119        @Index
120        @Column(name = "last_modified_time")
121        private java.sql.Timestamp lastModifiedTimestamp = null;
122    
123        @Basic
124        @Index
125        @Column(name = "suspended_time")
126        private java.sql.Timestamp suspendedTimestamp = null;
127    
128        @Column(name = "job_xml")
129        @Lob
130        private String jobXml = null;
131    
132        @Column(name = "orig_job_xml")
133        @Lob
134        private String origJobXml = null;
135    
136        /**
137         * @return the kickoffTimestamp
138         */
139        public java.sql.Timestamp getKickoffTimestamp() {
140            return kickoffTimestamp;
141        }
142    
143        /**
144         * @return the startTimestamp
145         */
146        public java.sql.Timestamp getstartTimestamp() {
147            return startTimestamp;
148        }
149    
150        /**
151         * @param kickoffTimestamp the kickoffTimestamp to set
152         */
153        public void setKickoffTimestamp(java.sql.Timestamp kickoffTimestamp) {
154            super.setKickoffTime(DateUtils.toDate(kickoffTimestamp));
155            this.kickoffTimestamp = kickoffTimestamp;
156        }
157    
158        /**
159         * @param startTimestamp the startTimestamp to set
160         */
161        public void setStartTimestamp(java.sql.Timestamp startTimestamp) {
162            super.setStartTime(DateUtils.toDate(startTimestamp));
163            this.startTimestamp = startTimestamp;
164        }
165    
166        /**
167         * Set startTime
168         *
169         * @param startTime the startTime to set
170         */
171        @Override
172        public void setStartTime(Date startTime) {
173            super.setStartTime(startTime);
174            this.startTimestamp = DateUtils.convertDateToTimestamp(startTime);
175        }
176    
177        /**
178         * @return the endTimestamp
179         */
180        public java.sql.Timestamp getEndTimestamp() {
181            return endTimestamp;
182        }
183    
184        /**
185         * @param endTimestamp the endTimestamp to set
186         */
187        public void setEndTimestamp(java.sql.Timestamp endTimestamp) {
188            super.setEndTime(DateUtils.toDate(endTimestamp));
189            this.endTimestamp = endTimestamp;
190        }
191    
192        /**
193         * @return the pauseTimestamp
194         */
195        public java.sql.Timestamp getPauseTimestamp() {
196            return pauseTimestamp;
197        }
198    
199        /**
200         * @param pauseTimestamp the pauseTimestamp to set
201         */
202        public void setPauseTimestamp(java.sql.Timestamp pauseTimestamp) {
203            super.setPauseTime(DateUtils.toDate(pauseTimestamp));
204            this.pauseTimestamp = pauseTimestamp;
205        }
206    
207        /**
208         * @return the createdTimestamp
209         */
210        public java.sql.Timestamp getCreatedTimestamp() {
211            return createdTimestamp;
212        }
213    
214        /**
215         * @return the createdTime
216         */
217        @Override
218        public Date getCreatedTime() {
219            return DateUtils.toDate(createdTimestamp);
220        }
221    
222        /**
223         * @return the timeUnitStr
224         */
225        public String getTimeUnitStr() {
226            return timeUnitStr;
227        }
228    
229        /**
230         * @return the pending
231         */
232        public int getPending() {
233            return pending;
234        }
235    
236        /**
237         * Set pending to true
238         *
239         * @param pending set pending to true
240         */
241        @Override
242        public void setPending() {
243            super.setPending();
244            this.pending = 1;
245        }
246    
247        /**
248         * Set pending to false
249         *
250         * @param pending set pending to false
251         */
252        @Override
253        public void resetPending() {
254            super.resetPending();
255            this.pending = 0;
256        }
257    
258        /**
259         * Return if the action is pending.
260         *
261         * @return if the action is pending.
262         */
263        public boolean isPending() {
264            return pending == 1 ? true : false;
265        }
266    
267        /**
268         * @return the lastModifiedTimestamp
269         */
270        public java.sql.Timestamp getLastModifiedTimestamp() {
271            return lastModifiedTimestamp;
272        }
273    
274        /**
275         * @param lastModifiedTimestamp the lastModifiedTimestamp to set
276         */
277        public void setLastModifiedTimestamp(java.sql.Timestamp lastModifiedTimestamp) {
278            this.lastModifiedTimestamp = lastModifiedTimestamp;
279        }
280    
281        /**
282         * @return the suspendedTimestamp
283         */
284        public Timestamp getSuspendedTimestamp() {
285            return suspendedTimestamp;
286        }
287    
288        /**
289         * @param suspendedTimestamp the suspendedTimestamp to set
290         */
291        public void setSuspendedTimestamp(Timestamp suspendedTimestamp) {
292            this.suspendedTimestamp = suspendedTimestamp;
293        }
294    
295        /**
296         * @return the jobXml
297         */
298        public String getJobXml() {
299            return jobXml;
300        }
301    
302        /**
303         * @param jobXml the jobXml to set
304         */
305        public void setJobXml(String jobXml) {
306            this.jobXml = jobXml;
307        }
308    
309        /**
310         * @return the origJobXml
311         */
312        public String getOrigJobXml() {
313            return origJobXml;
314        }
315    
316        /**
317         * @param origJobXml the origJobXml to set
318         */
319        public void setOrigJobXml(String origJobXml) {
320            this.origJobXml = origJobXml;
321        }
322    
323        /**
324         * @param createTime the createdTime to set
325         */
326        @Override
327        public void setCreatedTime(Date createTime) {
328            super.setCreatedTime(createTime);
329            this.createdTimestamp = DateUtils.convertDateToTimestamp(createTime);
330        }
331    
332        /**
333         * @param lastModifiedTime
334         */
335        public void setLastModifiedTime(Date lastModifiedTime) {
336            this.lastModifiedTimestamp = DateUtils.convertDateToTimestamp(lastModifiedTime);
337        }
338    
339        /**
340         * Get last modified time
341         *
342         * @return last modified time
343         */
344        public Date getLastModifiedTime() {
345            return DateUtils.toDate(lastModifiedTimestamp);
346        }
347    
348        /* (non-Javadoc)
349         * @see org.apache.hadoop.io.Writable#write(java.io.DataOutput)
350         */
351        @Override
352        public void write(DataOutput dataOutput) throws IOException {
353            WritableUtils.writeStr(dataOutput, getAppPath());
354            WritableUtils.writeStr(dataOutput, getAppName());
355            WritableUtils.writeStr(dataOutput, getId());
356            WritableUtils.writeStr(dataOutput, getConf());
357            WritableUtils.writeStr(dataOutput, getStatusStr());
358            WritableUtils.writeStr(dataOutput, getTimeUnit().toString());
359            dataOutput.writeLong((getKickoffTime() != null) ? getKickoffTime().getTime() : -1);
360            dataOutput.writeLong((getStartTime() != null) ? getStartTime().getTime() : -1);
361            dataOutput.writeLong((getEndTime() != null) ? getEndTime().getTime() : -1);
362            WritableUtils.writeStr(dataOutput, getUser());
363            WritableUtils.writeStr(dataOutput, getGroup());
364            WritableUtils.writeStr(dataOutput, getExternalId());
365            dataOutput.writeInt(getTimeout());
366        }
367    
368        /* (non-Javadoc)
369         * @see org.apache.hadoop.io.Writable#readFields(java.io.DataInput)
370         */
371        @Override
372        public void readFields(DataInput dataInput) throws IOException {
373    
374            setAppPath(WritableUtils.readStr(dataInput));
375            setAppName(WritableUtils.readStr(dataInput));
376            setId(WritableUtils.readStr(dataInput));
377            setConf(WritableUtils.readStr(dataInput));
378            setStatus(BundleJob.Status.valueOf(WritableUtils.readStr(dataInput)));
379            setTimeUnit(BundleJob.Timeunit.valueOf(WritableUtils.readStr(dataInput)));
380    
381            long d = dataInput.readLong();
382            if (d != -1) {
383                setKickoffTime(new Date(d));
384            }
385            d = dataInput.readLong();
386            if (d != -1) {
387                setStartTime(new Date(d));
388            }
389            d = dataInput.readLong();
390            if (d != -1) {
391                setEndTime(new Date(d));
392            }
393            setUser(WritableUtils.readStr(dataInput));
394            setGroup(WritableUtils.readStr(dataInput));
395            setExternalId(WritableUtils.readStr(dataInput));
396            setTimeOut(dataInput.readInt());
397        }
398    
399        /* (non-Javadoc)
400         * @see org.apache.oozie.client.rest.JsonBundleJob#getStatus()
401         */
402        @Override
403        public Status getStatus() {
404            return Status.valueOf(this.status);
405        }
406    
407        /**
408         * @return status string
409         */
410        public String getStatusStr() {
411            return status;
412        }
413    
414        /* (non-Javadoc)
415         * @see org.apache.oozie.client.rest.JsonBundleJob#getEndTime()
416         */
417        @Override
418        public Date getEndTime() {
419            return DateUtils.toDate(endTimestamp);
420        }
421    
422        /* (non-Javadoc)
423         * @see org.apache.oozie.client.rest.JsonBundleJob#getKickoffTime()
424         */
425        @Override
426        public Date getKickoffTime() {
427            return DateUtils.toDate(kickoffTimestamp);
428        }
429    
430        /* (non-Javadoc)
431         * @see org.apache.oozie.client.rest.JsonBundleJob#getTimeUnit()
432         */
433        @Override
434        public Timeunit getTimeUnit() {
435            return Timeunit.valueOf(this.timeUnitStr);
436        }
437    
438        /* (non-Javadoc)
439         * @see org.apache.oozie.client.rest.JsonBundleJob#setEndTime(java.util.Date)
440         */
441        @Override
442        public void setEndTime(Date endTime) {
443            super.setEndTime(endTime);
444            this.endTimestamp = DateUtils.convertDateToTimestamp(endTime);
445        }
446    
447        /* (non-Javadoc)
448         * @see org.apache.oozie.client.rest.JsonBundleJob#setKickoffTime(java.util.Date)
449         */
450        @Override
451        public void setKickoffTime(Date kickoffTime) {
452            super.setKickoffTime(kickoffTime);
453            this.kickoffTimestamp = DateUtils.convertDateToTimestamp(kickoffTime);
454        }
455    
456        @Override
457        /* (non-Javadoc)
458         * @see org.apache.oozie.client.rest.JsonBundleJob#getPauseTime()
459         */
460        public Date getPauseTime() {
461            return DateUtils.toDate(pauseTimestamp);
462        }
463    
464        /* (non-Javadoc)
465         * @see org.apache.oozie.client.rest.JsonBundleJob#setPauseTime(java.util.Date)
466         */
467        @Override
468        public void setPauseTime(Date pauseTime) {
469            super.setPauseTime(pauseTime);
470            this.pauseTimestamp = DateUtils.convertDateToTimestamp(pauseTime);
471        }
472    
473        /* (non-Javadoc)
474         * @see org.apache.oozie.client.rest.JsonBundleJob#setStatus(org.apache.oozie.client.BundleJob.Status)
475         */
476        @Override
477        public void setStatus(org.apache.oozie.client.BundleJob.Status val) {
478            super.setStatus(val);
479            this.status = val.toString();
480        }
481    
482        /* (non-Javadoc)
483         * @see org.apache.oozie.client.rest.JsonBundleJob#setTimeUnit(org.apache.oozie.client.BundleJob.Timeunit)
484         */
485        @Override
486        public void setTimeUnit(Timeunit timeUnit) {
487            super.setTimeUnit(timeUnit);
488            this.timeUnitStr = timeUnit.toString();
489        }
490    
491        /**
492         * @param return the suspendTime
493         */
494        public void setSuspendedTime(Date suspendTime) {
495            this.suspendedTimestamp = DateUtils.convertDateToTimestamp(suspendTime);
496        }
497    
498    }