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.http.HttpServletRequest;
021    import javax.servlet.http.HttpServletResponse;
022    
023    import org.apache.hadoop.conf.Configuration;
024    import org.apache.oozie.DagEngine;
025    import org.apache.oozie.DagEngineException;
026    import org.apache.oozie.ErrorCode;
027    import org.apache.oozie.WorkflowJobBean;
028    import org.apache.oozie.WorkflowsInfo;
029    import org.apache.oozie.client.OozieClient;
030    import org.apache.oozie.client.rest.JsonTags;
031    import org.apache.oozie.client.rest.RestConstants;
032    import org.apache.oozie.service.DagEngineService;
033    import org.apache.oozie.service.Services;
034    import org.json.simple.JSONObject;
035    
036    public class V0JobsServlet extends BaseJobsServlet {
037    
038        private static final String INSTRUMENTATION_NAME = "v0jobs";
039    
040        public V0JobsServlet() {
041            super(INSTRUMENTATION_NAME);
042        }
043    
044    
045        /**
046         * v0 service implementation to submit a workflow job
047         */
048        @Override
049        protected JSONObject submitJob(HttpServletRequest request, Configuration conf) throws XServletException, IOException {
050    
051            JSONObject json = new JSONObject();
052    
053            try {
054                String action = request.getParameter(RestConstants.ACTION_PARAM);
055                if (action != null && !action.equals(RestConstants.JOB_ACTION_START)) {
056                    throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ErrorCode.E0303, RestConstants.ACTION_PARAM, action);
057                }
058                boolean startJob = (action != null);
059                String user = conf.get(OozieClient.USER_NAME);
060                DagEngine dagEngine = Services.get().get(DagEngineService.class).getDagEngine(user, getAuthToken(request));
061                String id = dagEngine.submitJob(conf, startJob);
062                json.put(JsonTags.JOB_ID, id);
063            }
064            catch (DagEngineException ex) {
065                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
066            }
067    
068            return json;
069        }
070    
071        /**
072         * v0 service implementation to get a JSONObject representation of a job from its external ID
073         */
074        @Override
075        protected JSONObject getJobIdForExternalId(HttpServletRequest request, String externalId) throws XServletException, IOException {
076            JSONObject json = new JSONObject();
077            try {
078                DagEngine dagEngine = Services.get().get(DagEngineService.class)
079                .getDagEngine(getUser(request), getAuthToken(request));
080                String jobId = dagEngine.getJobIdForExternalId(externalId);
081                json.put(JsonTags.JOB_ID, jobId);
082            }
083            catch (DagEngineException ex) {
084                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
085            }
086            return json;
087        }
088    
089        /**
090         * v0 service implementation to get a list of workflows, with filtering or interested windows embedded in the
091         * request object
092         */
093        @Override
094        protected JSONObject getJobs(HttpServletRequest request) throws XServletException, IOException {
095            JSONObject json = new JSONObject();
096            try {
097                String filter = request.getParameter(RestConstants.JOBS_FILTER_PARAM);
098                String startStr = request.getParameter(RestConstants.OFFSET_PARAM);
099                String lenStr = request.getParameter(RestConstants.LEN_PARAM);
100                int start = (startStr != null) ? Integer.parseInt(startStr) : 1;
101                start = (start < 1) ? 1 : start;
102                int len = (lenStr != null) ? Integer.parseInt(lenStr) : 50;
103                len = (len < 1) ? 50 : len;
104                DagEngine dagEngine = Services.get().get(DagEngineService.class)
105                .getDagEngine(getUser(request), getAuthToken(request));
106                WorkflowsInfo jobs = dagEngine.getJobs(filter, start, len);
107                List<WorkflowJobBean> jsonWorkflows = jobs.getWorkflows();
108                json.put(JsonTags.WORKFLOWS_JOBS, WorkflowJobBean.toJSONArray(jsonWorkflows));
109                json.put(JsonTags.WORKFLOWS_TOTAL, jobs.getTotal());
110                json.put(JsonTags.WORKFLOWS_OFFSET, jobs.getStart());
111                json.put(JsonTags.WORKFLOWS_LEN, jobs.getLen());
112    
113            }
114            catch (DagEngineException ex) {
115                throw new XServletException(HttpServletResponse.SC_BAD_REQUEST, ex);
116            }
117    
118            return json;
119        }
120    }