001    /**
002     * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003     * Licensed under the Apache License, Version 2.0 (the "License");
004     * you may not use this file except in compliance with the License.
005     * You may obtain a copy of the License at
006     *
007     *   http://www.apache.org/licenses/LICENSE-2.0
008     *
009     *  Unless required by applicable law or agreed to in writing, software
010     *  distributed under the License is distributed on an "AS IS" BASIS,
011     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012     *  See the License for the specific language governing permissions and
013     *  limitations under the License. See accompanying LICENSE file.
014     */
015    package org.apache.oozie.servlet;
016    
017    import java.io.IOException;
018    import java.util.List;
019    
020    import javax.servlet.ServletInputStream;
021    import javax.servlet.http.HttpServletRequest;
022    import javax.servlet.http.HttpServletResponse;
023    
024    import org.apache.hadoop.conf.Configuration;
025    import org.apache.oozie.BaseEngineException;
026    import org.apache.oozie.BundleEngine;
027    import org.apache.oozie.BundleEngineException;
028    import org.apache.oozie.CoordinatorActionBean;
029    import org.apache.oozie.CoordinatorActionInfo;
030    import org.apache.oozie.CoordinatorEngine;
031    import org.apache.oozie.CoordinatorEngineException;
032    import org.apache.oozie.DagEngine;
033    import org.apache.oozie.DagEngineException;
034    import org.apache.oozie.ErrorCode;
035    import org.apache.oozie.client.rest.JsonBean;
036    import org.apache.oozie.client.rest.JsonCoordinatorJob;
037    import org.apache.oozie.client.rest.JsonTags;
038    import org.apache.oozie.client.rest.RestConstants;
039    import org.apache.oozie.service.BundleEngineService;
040    import org.apache.oozie.service.CoordinatorEngineService;
041    import org.apache.oozie.service.DagEngineService;
042    import org.apache.oozie.service.Services;
043    import org.apache.oozie.util.XLog;
044    import org.json.simple.JSONObject;
045    
046    @SuppressWarnings("serial")
047    public class V1JobServlet extends BaseJobServlet {
048    
049        private static final String INSTRUMENTATION_NAME = "v1job";
050    
051        public V1JobServlet() {
052            super(INSTRUMENTATION_NAME);
053        }
054    
055        /*
056         * protected method to start a job
057         */
058        @Override
059        protected void startJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
060                IOException {
061            /*
062             * Configuration conf = new XConfiguration(request.getInputStream());
063             * String wfPath = conf.get(OozieClient.APP_PATH); String coordPath =
064             * conf.get(OozieClient.COORDINATOR_APP_PATH);
065             *
066             * ServletUtilities.ValidateAppPath(wfPath, coordPath);
067             */
068            String jobId = getResourceName(request);
069            if (jobId.endsWith("-W")) {
070                startWorkflowJob(request, response);
071            }
072            else if (jobId.endsWith("-B")) {
073                startBundleJob(request, response);
074            }
075            else {
076                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0303);
077            }
078    
079        }
080    
081        /*
082         * protected method to resume a job
083         */
084        @Override
085        protected void resumeJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
086                IOException {
087            /*
088             * Configuration conf = new XConfiguration(request.getInputStream());
089             * String wfPath = conf.get(OozieClient.APP_PATH); String coordPath =
090             * conf.get(OozieClient.COORDINATOR_APP_PATH);
091             *
092             * ServletUtilities.ValidateAppPath(wfPath, coordPath);
093             */
094            String jobId = getResourceName(request);
095            if (jobId.endsWith("-W")) {
096                resumeWorkflowJob(request, response);
097            }
098            else if (jobId.endsWith("-B")) {
099                resumeBundleJob(request, response);
100            }
101            else {
102                resumeCoordinatorJob(request, response);
103            }
104        }
105    
106        /*
107         * protected method to suspend a job
108         */
109        @Override
110        protected void suspendJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
111                IOException {
112            /*
113             * Configuration conf = new XConfiguration(request.getInputStream());
114             * String wfPath = conf.get(OozieClient.APP_PATH); String coordPath =
115             * conf.get(OozieClient.COORDINATOR_APP_PATH);
116             *
117             * ServletUtilities.ValidateAppPath(wfPath, coordPath);
118             */
119            String jobId = getResourceName(request);
120            if (jobId.endsWith("-W")) {
121                suspendWorkflowJob(request, response);
122            }
123            else if (jobId.endsWith("-B")) {
124                suspendBundleJob(request, response);
125            }
126            else {
127                suspendCoordinatorJob(request, response);
128            }
129        }
130    
131        /*
132         * protected method to kill a job
133         */
134        @Override
135        protected void killJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
136                IOException {
137            /*
138             * Configuration conf = new XConfiguration(request.getInputStream());
139             * String wfPath = conf.get(OozieClient.APP_PATH); String coordPath =
140             * conf.get(OozieClient.COORDINATOR_APP_PATH);
141             *
142             * ServletUtilities.ValidateAppPath(wfPath, coordPath);
143             */
144            String jobId = getResourceName(request);
145            if (jobId.endsWith("-W")) {
146                killWorkflowJob(request, response);
147            }
148            else if (jobId.endsWith("-B")) {
149                killBundleJob(request, response);
150            }
151            else {
152                killCoordinatorJob(request, response);
153            }
154        }
155    
156        /**
157         * protected method to change a coordinator job
158         * @param request request object
159         * @param response response object
160         * @throws XServletException
161         * @throws IOException
162         */
163        protected void changeJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
164                IOException {
165            String jobId = getResourceName(request);
166            if (jobId.endsWith("-B")) {
167                changeBundleJob(request, response);
168            }
169            else {
170                changeCoordinatorJob(request, response);
171            }
172        }
173    
174        /*
175         * protected method to reRun a job
176         *
177         * @seeorg.apache.oozie.servlet.BaseJobServlet#reRunJob(javax.servlet.http.
178         * HttpServletRequest, javax.servlet.http.HttpServletResponse,
179         * org.apache.hadoop.conf.Configuration)
180         */
181        @Override
182        protected JSONObject reRunJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
183                throws XServletException, IOException {
184            JSONObject json = null;
185            String jobId = getResourceName(request);
186            if (jobId.endsWith("-W")) {
187                reRunWorkflowJob(request, response, conf);
188            }
189            else if (jobId.endsWith("-B")) {
190                rerunBundleJob(request, response, conf);
191            }
192            else {
193                json = reRunCoordinatorActions(request, response, conf);
194            }
195            return json;
196        }
197    
198        /*
199         * protected method to get a job in JsonBean representation
200         */
201        @Override
202        protected JsonBean getJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
203                IOException, BaseEngineException {
204            ServletInputStream is = request.getInputStream();
205            byte[] b = new byte[101];
206            while (is.readLine(b, 0, 100) != -1) {
207                XLog.getLog(getClass()).warn("Printing :" + new String(b));
208            }
209    
210            JsonBean jobBean = null;
211            String jobId = getResourceName(request);
212            if (jobId.endsWith("-B")) {
213                jobBean = getBundleJob(request, response);
214            }
215            else {
216                if (jobId.endsWith("-W")) {
217                    jobBean = getWorkflowJob(request, response);
218                }
219                else {
220                    if (jobId.contains("-W@")) {
221                        jobBean = getWorkflowAction(request, response);
222                    }
223                    else {
224                        if (jobId.contains("-C@")) {
225                            jobBean = getCoordinatorAction(request, response);
226                        }
227                        else {
228                            jobBean = getCoordinatorJob(request, response);
229                        }
230                    }
231                }
232            }
233    
234            return jobBean;
235        }
236    
237        /*
238         * protected method to get a job definition in String format
239         */
240        @Override
241        protected String getJobDefinition(HttpServletRequest request, HttpServletResponse response)
242                throws XServletException, IOException {
243            String jobDefinition = null;
244            String jobId = getResourceName(request);
245            if (jobId.endsWith("-W")) {
246                jobDefinition = getWorkflowJobDefinition(request, response);
247            }
248            else if (jobId.endsWith("-B")) {
249                jobDefinition = getBundleJobDefinition(request, response);
250            }
251            else {
252                jobDefinition = getCoordinatorJobDefinition(request, response);
253            }
254            return jobDefinition;
255        }
256    
257        /*
258         * protected method to stream a job log into response object
259         */
260        @Override
261        protected void streamJobLog(HttpServletRequest request, HttpServletResponse response) throws XServletException,
262                IOException {
263            String jobId = getResourceName(request);
264            if (jobId.endsWith("-W")) {
265                streamWorkflowJobLog(request, response);
266            }
267            else if (jobId.endsWith("-B")) {
268                streamBundleJob(request, response);
269            }
270            else {
271                streamCoordinatorJobLog(request, response);
272            }
273        }
274    
275        /**
276         * Start wf job
277         * 
278         * @param request servlet request
279         * @param response servlet response 
280         * @throws XServletException
281         */
282        private void startWorkflowJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
283            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
284                    getAuthToken(request));
285    
286            String jobId = getResourceName(request);
287            try {
288                dagEngine.start(jobId);
289            }
290            catch (DagEngineException ex) {
291                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
292            }
293        }
294    
295        /**
296         * Start bundle job
297         *
298         * @param request servlet request
299         * @param response servlet response
300         * @throws XServletException
301         */
302        private void startBundleJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
303            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
304                    getAuthToken(request));
305            String jobId = getResourceName(request);
306            try {
307                bundleEngine.start(jobId);
308            }
309            catch (BundleEngineException ex) {
310                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
311            }
312        }
313    
314        /**
315         * Resume workflow job
316         *
317         * @param request servlet request
318         * @param response servlet response
319         * @throws XServletException
320         */
321        private void resumeWorkflowJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
322            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
323                    getAuthToken(request));
324    
325            String jobId = getResourceName(request);
326            try {
327                dagEngine.resume(jobId);
328            }
329            catch (DagEngineException ex) {
330                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
331            }
332        }
333    
334        /**
335         * Resume bundle job
336         *
337         * @param request servlet request
338         * @param response servlet response
339         * @throws XServletException
340         */
341        private void resumeBundleJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
342            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
343                    getAuthToken(request));
344            String jobId = getResourceName(request);
345            try {
346                bundleEngine.resume(jobId);
347            }
348            catch (BundleEngineException ex) {
349                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
350            }
351        }
352    
353        /**
354         * Resume coordinator job
355         *
356         * @param request servlet request
357         * @param response servlet response
358         * @throws XServletException
359         * @throws CoordinatorEngineException
360         */
361        private void resumeCoordinatorJob(HttpServletRequest request, HttpServletResponse response)
362                throws XServletException {
363            String jobId = getResourceName(request);
364            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
365                    getUser(request), getAuthToken(request));
366            try {
367                coordEngine.resume(jobId);
368            }
369            catch (CoordinatorEngineException ex) {
370                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
371            }
372        }
373    
374        /**
375         * Suspend a wf job
376         * 
377         * @param request servlet request
378         * @param response servlet response
379         * @throws XServletException
380         */
381        private void suspendWorkflowJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
382            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
383                    getAuthToken(request));
384    
385            String jobId = getResourceName(request);
386            try {
387                dagEngine.suspend(jobId);
388            }
389            catch (DagEngineException ex) {
390                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
391            }
392        }
393    
394        /**
395         * Suspend bundle job
396         *
397         * @param request servlet request
398         * @param response servlet response
399         * @throws XServletException
400         */
401        private void suspendBundleJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
402            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
403                    getAuthToken(request));
404            String jobId = getResourceName(request);
405            try {
406                bundleEngine.suspend(jobId);
407            }
408            catch (BundleEngineException ex) {
409                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
410            }
411        }
412    
413        /**
414         * Suspend coordinator job
415         *
416         * @param request servlet request
417         * @param response servlet response
418         * @throws XServletException
419         */
420        private void suspendCoordinatorJob(HttpServletRequest request, HttpServletResponse response)
421                throws XServletException {
422            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
423                    getUser(request), getAuthToken(request));
424            String jobId = getResourceName(request);
425            try {
426                coordEngine.suspend(jobId);
427            }
428            catch (CoordinatorEngineException ex) {
429                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
430            }
431        }
432    
433        /**
434         * Kill a wf job
435         * @param request servlet request
436         * @param response servlet response
437         * @throws XServletException
438         */
439        private void killWorkflowJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
440            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
441                    getAuthToken(request));
442    
443            String jobId = getResourceName(request);
444            try {
445                dagEngine.kill(jobId);
446            }
447            catch (DagEngineException ex) {
448                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
449            }
450        }
451    
452        /**
453         * Kill a coord job
454         * @param request servlet request
455         * @param response servlet response
456         * @throws XServletException
457         */
458        private void killCoordinatorJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
459            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
460                    getUser(request), getAuthToken(request));
461            String jobId = getResourceName(request);
462            try {
463                coordEngine.kill(jobId);
464            }
465            catch (CoordinatorEngineException ex) {
466                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
467            }
468        }
469    
470        /**
471         * Kill bundle job
472         *
473         * @param request servlet request
474         * @param response servlet response
475         * @throws XServletException
476         */
477        private void killBundleJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
478            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
479                    getAuthToken(request));
480            String jobId = getResourceName(request);
481            try {
482                bundleEngine.kill(jobId);
483            }
484            catch (BundleEngineException ex) {
485                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
486            }
487        }
488    
489        /**
490         * Change a coordinator job
491         *
492         * @param request servlet request
493         * @param response servlet response
494         * @throws XServletException
495         */
496        private void changeCoordinatorJob(HttpServletRequest request, HttpServletResponse response)
497                throws XServletException {
498            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
499                    getUser(request), getAuthToken(request));
500            String jobId = getResourceName(request);
501            String changeValue = request.getParameter(RestConstants.JOB_CHANGE_VALUE);
502            try {
503                coordEngine.change(jobId, changeValue);
504            }
505            catch (CoordinatorEngineException ex) {
506                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
507            }
508        }
509        
510        /**
511         * Change a bundle job
512         *
513         * @param request servlet request
514         * @param response servlet response
515         * @throws XServletException
516         */
517        private void changeBundleJob(HttpServletRequest request, HttpServletResponse response)
518                throws XServletException {
519            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(
520                    getUser(request), getAuthToken(request));
521            String jobId = getResourceName(request);
522            String changeValue = request.getParameter(RestConstants.JOB_CHANGE_VALUE);
523            try {
524                bundleEngine.change(jobId, changeValue);
525            }
526            catch (BundleEngineException ex) {
527                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
528            }
529        }
530    
531        /**
532         * Rerun a wf job
533         * 
534         * @param request servlet request
535         * @param response servlet response
536         * @param conf configuration object
537         * @throws XServletException
538         */
539        private void reRunWorkflowJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
540                throws XServletException {
541            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
542                    getAuthToken(request));
543    
544            String jobId = getResourceName(request);
545            try {
546                dagEngine.reRun(jobId, conf);
547            }
548            catch (DagEngineException ex) {
549                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
550            }
551        }
552    
553        /**
554         * Rerun bundle job
555         *
556         * @param request servlet request
557         * @param response servlet response
558         * @param conf configration object
559         * @throws XServletException
560         */
561        private void rerunBundleJob(HttpServletRequest request, HttpServletResponse response, Configuration conf)
562                throws XServletException {
563            JSONObject json = new JSONObject();
564            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
565                    getAuthToken(request));
566            String jobId = getResourceName(request);
567    
568            String coordScope = request.getParameter(RestConstants.JOB_BUNDLE_RERUN_COORD_SCOPE_PARAM);
569            String dateScope = request.getParameter(RestConstants.JOB_BUNDLE_RERUN_DATE_SCOPE_PARAM);
570            String refresh = request.getParameter(RestConstants.JOB_COORD_RERUN_REFRESH_PARAM);
571            String noCleanup = request.getParameter(RestConstants.JOB_COORD_RERUN_NOCLEANUP_PARAM);
572    
573            XLog.getLog(getClass()).info(
574                    "Rerun Bundle for jobId=" + jobId + ", coordScope=" + coordScope + ", dateScope=" + dateScope + ", refresh="
575                            + refresh + ", noCleanup=" + noCleanup);
576    
577            try {
578                bundleEngine.reRun(jobId, coordScope, dateScope, Boolean.valueOf(refresh), Boolean.valueOf(noCleanup));
579            }
580            catch (BaseEngineException ex) {
581                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
582            }
583        }
584    
585        /**
586         * Rerun coordinator actions
587         *
588         * @param request servlet request
589         * @param response servlet response
590         * @param conf configuration object
591         * @throws XServletException
592         */
593        @SuppressWarnings("unchecked")
594        private JSONObject reRunCoordinatorActions(HttpServletRequest request, HttpServletResponse response,
595                Configuration conf) throws XServletException {
596            JSONObject json = new JSONObject();
597            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(getUser(request),
598                    getAuthToken(request));
599    
600            String jobId = getResourceName(request);
601    
602            String rerunType = request.getParameter(RestConstants.JOB_COORD_RERUN_TYPE_PARAM);
603            String scope = request.getParameter(RestConstants.JOB_COORD_RERUN_SCOPE_PARAM);
604            String refresh = request.getParameter(RestConstants.JOB_COORD_RERUN_REFRESH_PARAM);
605            String noCleanup = request.getParameter(RestConstants.JOB_COORD_RERUN_NOCLEANUP_PARAM);
606    
607            XLog.getLog(getClass()).info(
608                    "Rerun coordinator for jobId=" + jobId + ", rerunType=" + rerunType + ",scope=" + scope + ",refresh="
609                            + refresh + ", noCleanup=" + noCleanup);
610    
611            try {
612                CoordinatorActionInfo coordInfo = coordEngine.reRun(jobId, rerunType, scope, Boolean.valueOf(refresh),
613                        Boolean.valueOf(noCleanup));
614                List<CoordinatorActionBean> actions = coordInfo.getCoordActions();
615                json.put(JsonTags.COORDINATOR_ACTIONS, CoordinatorActionBean.toJSONArray(actions));
616            }
617            catch (BaseEngineException ex) {
618                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
619            }
620    
621            return json;
622        }
623    
624        /**
625         * Get workflow job
626         *
627         * @param request servlet request
628         * @param response servlet response
629         * @return JsonBean WorkflowJobBean
630         * @throws XServletException
631         */
632        private JsonBean getWorkflowJob(HttpServletRequest request, HttpServletResponse response) throws XServletException {
633            JsonBean jobBean = null;
634            String jobId = getResourceName(request);
635            String startStr = request.getParameter(RestConstants.OFFSET_PARAM);
636            String lenStr = request.getParameter(RestConstants.LEN_PARAM);
637            int start = (startStr != null) ? Integer.parseInt(startStr) : 1;
638            start = (start < 1) ? 1 : start;
639            int len = (lenStr != null) ? Integer.parseInt(lenStr) : 0;
640            len = (len < 1) ? Integer.MAX_VALUE : len;
641            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
642                    getAuthToken(request));
643            try {
644                jobBean = (JsonBean) dagEngine.getJob(jobId, start, len);
645            }
646            catch (DagEngineException ex) {
647                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
648            }
649    
650            return jobBean;
651        }
652    
653        /**
654         * Get wf action info
655         * 
656         * @param request servlet request 
657         * @param response servlet response
658         * @return JsonBean WorkflowActionBean
659         * @throws XServletException
660         */
661        private JsonBean getWorkflowAction(HttpServletRequest request, HttpServletResponse response)
662                throws XServletException {
663            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
664                    getAuthToken(request));
665    
666            JsonBean actionBean = null;
667            String actionId = getResourceName(request);
668            try {
669                actionBean = dagEngine.getWorkflowAction(actionId);
670            }
671            catch (BaseEngineException ex) {
672                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
673            }
674    
675            return actionBean;
676        }
677    
678        /**
679         * Get coord job info
680         * 
681         * @param request servlet request
682         * @param response servlet response
683         * @return JsonBean CoordinatorJobBean
684         * @throws XServletException
685         * @throws BaseEngineException
686         */
687        private JsonBean getCoordinatorJob(HttpServletRequest request, HttpServletResponse response)
688                throws XServletException, BaseEngineException {
689            JsonBean jobBean = null;
690            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
691                    getUser(request), getAuthToken(request));
692            String jobId = getResourceName(request);
693            String startStr = request.getParameter(RestConstants.OFFSET_PARAM);
694            String lenStr = request.getParameter(RestConstants.LEN_PARAM);
695            int start = (startStr != null) ? Integer.parseInt(startStr) : 1;
696            start = (start < 1) ? 1 : start;
697            int len = (lenStr != null) ? Integer.parseInt(lenStr) : 0;
698            len = (len < 1) ? Integer.MAX_VALUE : len;
699            try {
700                JsonCoordinatorJob coordJob = coordEngine.getCoordJob(jobId, start, len);
701                jobBean = coordJob;
702            }
703            catch (CoordinatorEngineException ex) {
704                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
705            }
706    
707            return jobBean;
708        }
709    
710        /**
711         * Get bundle job info
712         *
713         * @param request servlet request
714         * @param response servlet response
715         * @return JsonBean bundle job bean
716         * @throws XServletException
717         * @throws BaseEngineException
718         */
719        private JsonBean getBundleJob(HttpServletRequest request, HttpServletResponse response) throws XServletException,
720                BaseEngineException {
721            JsonBean jobBean = null;
722            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
723                    getAuthToken(request));
724            String jobId = getResourceName(request);
725    
726            try {
727                jobBean = (JsonBean) bundleEngine.getBundleJob(jobId);
728    
729                return jobBean;
730            }
731            catch (BundleEngineException ex) {
732                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
733            }
734        }
735    
736        /**
737         * Get coordinator action
738         *
739         * @param request servlet request
740         * @param response servlet response
741         * @return JsonBean CoordinatorActionBean
742         * @throws XServletException
743         * @throws BaseEngineException
744         */
745        private JsonBean getCoordinatorAction(HttpServletRequest request, HttpServletResponse response)
746                throws XServletException, BaseEngineException {
747            JsonBean actionBean = null;
748            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
749                    getUser(request), getAuthToken(request));
750            String actionId = getResourceName(request);
751            try {
752                actionBean = coordEngine.getCoordAction(actionId);
753            }
754            catch (CoordinatorEngineException ex) {
755                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
756            }
757    
758            return actionBean;
759        }
760    
761        /**
762         * Get wf job definition
763         * 
764         * @param request servlet request
765         * @param response servlet response
766         * @return String wf definition
767         * @throws XServletException
768         */
769        private String getWorkflowJobDefinition(HttpServletRequest request, HttpServletResponse response)
770                throws XServletException {
771            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
772                    getAuthToken(request));
773    
774            String wfDefinition;
775            String jobId = getResourceName(request);
776            try {
777                wfDefinition = dagEngine.getDefinition(jobId);
778            }
779            catch (DagEngineException ex) {
780                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
781            }
782            return wfDefinition;
783        }
784    
785        /**
786         * Get bundle job definition
787         *
788         * @param request servlet request
789         * @param response servlet response
790         * @return String bundle definition
791         * @throws XServletException
792         */
793        private String getBundleJobDefinition(HttpServletRequest request, HttpServletResponse response) throws XServletException {
794            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
795                    getAuthToken(request));
796            String bundleDefinition;
797            String jobId = getResourceName(request);
798            try {
799                bundleDefinition = bundleEngine.getDefinition(jobId);
800            }
801            catch (BundleEngineException ex) {
802                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
803            }
804            return bundleDefinition;
805        }
806    
807        /**
808         * Get coordinator job definition
809         *
810         * @param request servlet request
811         * @param response servlet response
812         * @return String coord definition
813         * @throws XServletException
814         */
815        private String getCoordinatorJobDefinition(HttpServletRequest request, HttpServletResponse response)
816                throws XServletException {
817    
818            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
819                    getUser(request), getAuthToken(request));
820    
821            String jobId = getResourceName(request);
822    
823            String coordDefinition = null;
824            try {
825                coordDefinition = coordEngine.getDefinition(jobId);
826            }
827            catch (BaseEngineException ex) {
828                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
829            }
830            return coordDefinition;
831        }
832    
833        /**
834         * Stream wf job log
835         * 
836         * @param request servlet request
837         * @param response servlet response
838         * @throws XServletException
839         * @throws IOException
840         */
841        private void streamWorkflowJobLog(HttpServletRequest request, HttpServletResponse response)
842                throws XServletException, IOException {
843            DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(getUser(request),
844                    getAuthToken(request));
845            String jobId = getResourceName(request);
846            try {
847                dagEngine.streamLog(jobId, response.getWriter());
848            }
849            catch (DagEngineException ex) {
850                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
851            }
852        }
853    
854        /**
855         * Stream bundle job log
856         *
857         * @param request servlet request
858         * @param response servlet response
859         * @throws XServletException
860         */
861        private void streamBundleJob(HttpServletRequest request, HttpServletResponse response)
862                throws XServletException, IOException {
863            BundleEngine bundleEngine = Services.get().get(BundleEngineService.class).getBundleEngine(getUser(request),
864                    getAuthToken(request));
865            String jobId = getResourceName(request);
866            try {
867                bundleEngine.streamLog(jobId, response.getWriter());
868            }
869            catch (BundleEngineException ex) {
870                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
871            }
872        }
873    
874        /**
875         * Stream coordinator job log
876         *
877         * @param request servlet request 
878         * @param response servlet response
879         * @throws XServletException
880         * @throws IOException
881         */
882        private void streamCoordinatorJobLog(HttpServletRequest request, HttpServletResponse response)
883                throws XServletException, IOException {
884    
885            CoordinatorEngine coordEngine = Services.get().get(CoordinatorEngineService.class).getCoordinatorEngine(
886                    getUser(request), getAuthToken(request));
887    
888            String jobId = getResourceName(request);
889    
890            try {
891                coordEngine.streamLog(jobId, response.getWriter());
892            }
893            catch (BaseEngineException ex) {
894                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
895            }
896        }
897    }