/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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.apache.oozie.ambari.view; import java.io.IOException; import java.io.StringReader; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import com.google.gson.JsonElement; import com.google.gson.JsonParser; public class OozieUtils { private final static Logger LOGGER = LoggerFactory .getLogger(OozieUtils.class); private Utils utils = new Utils(); public String generateConfigXml(Map<String, String> map) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element configElement = doc.createElement("configuration"); doc.appendChild(configElement); for (Map.Entry<String, String> entry : map.entrySet()) { Element propElement = doc.createElement("property"); configElement.appendChild(propElement); Element nameElem = doc.createElement("name"); nameElem.setTextContent(entry.getKey()); Element valueElem = doc.createElement("value"); valueElem.setTextContent(entry.getValue()); propElement.appendChild(nameElem); propElement.appendChild(valueElem); } return utils.generateXml(doc); } catch (ParserConfigurationException e) { LOGGER.error("error in generating config xml", e); throw new RuntimeException(e); } } public String getJobPathPropertyKey(JobType jobType) { switch (jobType) { case WORKFLOW: return "oozie.wf.application.path"; case COORDINATOR: return "oozie.coord.application.path"; case BUNDLE: return "oozie.bundle.application.path"; } throw new RuntimeException("Unknown Job Type"); } public JobType deduceJobType(String xml) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = null; db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); Document doc = db.parse(is); String rootNode = doc.getDocumentElement().getNodeName(); if ("workflow-app".equals(rootNode)) { return JobType.WORKFLOW; } else if ("coordinator-app".equals(rootNode)) { return JobType.COORDINATOR; } else if ("bundle-app".equals(rootNode)) { return JobType.BUNDLE; } throw new RuntimeException("invalid xml submitted"); } catch (Exception e) { throw new RuntimeException(e); } } public String deduceWorkflowNameFromJson(String json) { JsonElement jsonElement = new JsonParser().parse(json); String name = jsonElement.getAsJsonObject().get("name").getAsString(); return name; } public String deduceWorkflowSchemaVersionFromJson(String json) { JsonElement jsonElement = new JsonParser().parse(json); return jsonElement.getAsJsonObject().get("xmlns").getAsString(); } public String deduceWorkflowNameFromXml(String xml) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); Document doc = db.parse(is); String name = doc.getDocumentElement().getAttributeNode("name").getValue(); return name; } catch (Exception e) { throw new RuntimeException(e); } } public String generateWorkflowXml(String actionNodeXml) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); Element workflowElement = doc.createElement("workflow-app"); workflowElement.setAttribute("name", "testWorkflow"); workflowElement.setAttribute("xmlns", "uri:oozie:workflow:0.5"); doc.appendChild(workflowElement); Element startElement = doc.createElement("start"); startElement.setAttribute("to", "testAction"); workflowElement.appendChild(startElement); Element actionElement = doc.createElement("action"); actionElement.setAttribute("name", "testAction"); Element actionSettingsElement = db.parse( new InputSource(new StringReader(actionNodeXml))) .getDocumentElement(); actionElement.appendChild(doc.importNode(actionSettingsElement, true)); workflowElement.appendChild(actionElement); Element actionOkTransitionElement = doc.createElement("ok"); actionOkTransitionElement.setAttribute("to", "end"); actionElement.appendChild(actionOkTransitionElement); Element actionErrorTransitionElement = doc.createElement("error"); actionErrorTransitionElement.setAttribute("to", "kill"); actionElement.appendChild(actionErrorTransitionElement); Element killElement = doc.createElement("kill"); killElement.setAttribute("name", "kill"); Element killMessageElement = doc.createElement("message"); killMessageElement.setTextContent("Kill node message"); killElement.appendChild(killMessageElement); workflowElement.appendChild(killElement); Element endElement = doc.createElement("end"); endElement.setAttribute("name", "end"); workflowElement.appendChild(endElement); return utils.generateXml(doc); } catch (ParserConfigurationException | SAXException | IOException e) { LOGGER.error("error in generating workflow xml", e); throw new RuntimeException(e); } } public String getNoOpWorkflowXml(String json,JobType jobType) { String schema=deduceWorkflowSchemaVersionFromJson(json); String name=deduceWorkflowNameFromJson(json); switch (jobType){ case WORKFLOW: return String.format("<workflow-app xmlns=\"%s\" name=\"%s\"><start to=\"end\"/><end name=\"end\"/></workflow-app>",schema,name); case COORDINATOR: return String.format("<coordinator-app xmlns=\"%s\" name=\"%s\"></coordinator-app>",schema,name); case BUNDLE: return String.format("<bundle-app xmlns=\"%s\" name=\"%s\"></bundle-app>",schema,name); } return null; } }