Java tutorial
/* * Copyright 2012-2016 the Flamingo Community. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.exem.flamingo.web.oozie.workflowdesigner; import org.apache.commons.beanutils.BeanMap; import org.exem.flamingo.shared.core.rest.Response; import org.exem.flamingo.shared.util.StringUtils; import org.exem.flamingo.web.model.rest.NodeType; import org.exem.flamingo.web.model.rest.Tree; import org.exem.flamingo.web.model.rest.TreeType; import org.exem.flamingo.web.oozie.workflow.tree.TreeService; import org.exem.flamingo.web.oozie.workflowdesigner.model.Action; import org.exem.flamingo.web.oozie.workflowdesigner.model.Data; import org.exem.flamingo.web.oozie.workflowdesigner.model.Workflow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Oozie workflow controller. * * @author Sanghyun Bak * @since 21.10.2016 */ @RestController @RequestMapping("/oozie/workflow") public class OozieWorkflowController { @Autowired OozieWorkflowService oozieWorkflowService; @Autowired TreeService treeService; /** * SLF4J Logging */ private Logger logger = LoggerFactory.getLogger(OozieWorkflowController.class); @Value("#{config['oozie.jobTracker.url']}") private String jobTracker; @Value("#{config['oozie.nameNode.url']}") private String nameNode; @Value("#{config['oozie.xml.store.path']}") private String xmlStorePath; @RequestMapping(value = "run", method = RequestMethod.POST) @ResponseStatus(HttpStatus.OK) public Response Run(@RequestBody Map<String, Object> params) { Response response = new Response(); Map map = new HashMap<String, Object>(); try { String treeIdString = params.get("treeId").toString(); long treeId = Long.parseLong(treeIdString); String designerXml = oozieWorkflowService.loadDesignerXml(treeId); String script = oozieWorkflowService.getLocalVariableParameter(designerXml, "script"); // TODO : ?? DB? , ? // set workflow Workflow workflow = new Workflow(); workflow.setName(params.get("name").toString()); workflow.setStartTo("testStartTo"); workflow.setEndName("testEndName"); // set shell action ArrayList actions = new ArrayList<Action>(); Action shellAction = new Action(); shellAction.setName("testStartTo"); shellAction.setCategory("action"); shellAction.setOkTo("testEndName"); shellAction.setErrorTo("killAction"); // set data Data data = new Data(); data.setType("shell"); data.setExec(script); data.setJobTracker(jobTracker); data.setNameNode(nameNode); // make hierarchical object shellAction.setData(data); //make default kill action Action killAction = new Action("kill", "killAction", "action fail!"); // set actions actions.add(shellAction); actions.add(killAction); // add actions to workflow workflow.setActions(actions); // set object to map map = new BeanMap(workflow); String xmlString = oozieWorkflowService.makeShellActionXml(map); String result = oozieWorkflowService.oozieJobSend(xmlString); logger.info("result : {}", result); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } response.setSuccess(true); return response; } @RequestMapping("/list") public Response listWorkflow(@RequestParam Map param) { Response response = new Response(); List<Map> workflows = oozieWorkflowService.getWorkflows(); response.getList().addAll(workflows); return response; } @RequestMapping(value = "/delete", method = RequestMethod.POST) public Response deleteWorkflow(@RequestBody Map param) { Response response = new Response(); long treeId = Long.parseLong(param.get("id").toString()); try { oozieWorkflowService.deleteWorkflow(treeId); response.setSuccess(true); } catch (Exception e) { response.setSuccess(false); } return response; } //TODO : ? admin ? @RequestMapping("/save") public Response save(@RequestParam(defaultValue = "") String clusterName, @RequestParam(defaultValue = "") String processId, @RequestParam(defaultValue = "") String treeId, @RequestParam(defaultValue = "") String parentTreeId, @RequestBody String xml) { Response response = new Response(); String username = "admin"; Map saved = new HashMap(); if (StringUtils.isEmpty(treeId)) { saved = oozieWorkflowService.saveAsNew(parentTreeId, xml, username); } else { saved = oozieWorkflowService.saveAsUpdate(treeId, processId, xml, username); } response.getMap().put("id", saved.get("id")); response.getMap().put("process_id", saved.get("workflowId")); response.getMap().put("process_definition_id", saved.get("definitionId")); response.getMap().put("deployment_id", saved.get("deploymentId")); response.getMap().put("tree_id", saved.get("treeId")); response.getMap().put("status", saved.get("status")); response.setSuccess(true); return response; } @RequestMapping(value = "/load", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) //public Response load(@RequestParam String clusterName, @RequestParam Long treeId) { public Response load(@RequestParam Long treeId) { Response response = new Response(); String designerXml = oozieWorkflowService.loadDesignerXml(treeId); response.setObject(designerXml); response.setSuccess(true); return response; } /** * ?. ? ? ? . * <ul> * <li> ? ID</li> * <li>? Tree? (; <tt>JOB, WORKFLOW</tt>)</li> * <li>? (; <tt>FOLDER, ITEM</tt>)(</li> * <li>? ?(</li> * <li>ROOT (? <tt>false</tt>)(</li> * </ul> * * @param map ?? Key Value * @return Response REST JAXB Object */ @RequestMapping(value = "newFolder", method = RequestMethod.POST) @ResponseStatus(HttpStatus.OK) @ResponseBody public Response newFolder(@RequestBody Map<String, String> map) { Response response = new Response(); TreeType treeType = TreeType.valueOf(map.get("treeType").toUpperCase()); NodeType nodeType = NodeType.valueOf(map.get("nodeType").toUpperCase()); Tree parent; if ("/".equals(map.get("id"))) { // ROOT ? Tree Type? ROOT . //TODO : SessionUtils.getUsername() admin parent = treeService.getRoot(treeType, "admin"); } else { // . long parentId = Long.parseLong(map.get("id")); parent = treeService.get(parentId); } Tree child = new Tree(); child.setName(map.get("name")); child.setTreeType(treeType); child.setNodeType(nodeType); child.setRoot(false); //TODO : SessionUtils.getUsername() admin child.setUsername("admin"); child.setParent(parent); // ? ? ?? ? . Tree tree = treeService.create(parent, child, nodeType); response.getMap().put("id", tree.getId()); response.getMap().put("text", tree.getName()); response.getMap().put("cls", "folder"); response.getMap().put("leaf", false); response.setSuccess(true); return response; } @RequestMapping(value = "/copy", method = RequestMethod.POST) public Response copy(@RequestBody Map<String, Object> map) { Response response = new Response(); String parentTreeId = map.get("parentTreeId").toString(); String treeId = map.get("treeId").toString(); //TODO : SessionUtils.getUsername() admin Workflow workflow = oozieWorkflowService.getWorkflowByTreeId(Long.parseLong(treeId)); oozieWorkflowService.copy(parentTreeId, workflow, "admin"); response.setSuccess(true); return response; } }