/** * Copyright © 2016 enioka. All rights reserved * * 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 com.enioka.jqm.tools; import java.io.FileOutputStream; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import com.enioka.jqm.jdbc.Db; import com.enioka.jqm.jdbc.DbConn; import com.enioka.jqm.model.Cl; import com.enioka.jqm.model.ClHandler; import com.enioka.jqm.model.JobDef; import com.enioka.jqm.model.JobDefParameter; class XmlJobDefExporter { private XmlJobDefExporter() { // Static helper class } /** * Exports all available queues to an XML file. */ static void export(String path, DbConn cnx) throws JqmEngineException { if (cnx == null) { throw new IllegalArgumentException("database connection cannot be null"); } export(path, JobDef.select(cnx, "jd_select_all"), cnx); } /** * Exports several (given) job def to an XML file. */ static void export(String xmlPath, List<JobDef> jobDefList, DbConn cnx) throws JqmEngineException { // Argument tests if (xmlPath == null) { throw new IllegalArgumentException("file path cannot be null"); } if (jobDefList == null || jobDefList.isEmpty()) { throw new IllegalArgumentException("job def list cannot be null or empty"); } if (cnx == null) { throw new IllegalArgumentException("database connection name cannot be null"); } Collections.sort(jobDefList, new Comparator<JobDef>() { @Override public int compare(JobDef o1, JobDef o2) { return o1.getJarPath().compareTo(o2.getJarPath()); } }); // Create XML document Element root = new Element("jqm"); Document document = new Document(root); Element jobDefinitions = null; String currentJarPath = null; Set<Cl> cls = new HashSet<Cl>(); for (JobDef j : jobDefList) { if (currentJarPath == null || !j.getJarPath().equals(currentJarPath)) { currentJarPath = j.getJarPath(); Element jar = new Element("jar"); addTextElementToParentElement(jar, "path", currentJarPath); addTextElementToParentElement(jar, "pathType", j.getPathType().toString()); jobDefinitions = new Element("jobdefinitions"); jar.addContent(jobDefinitions); root.addContent(jar); } Element jobDefinition = getJobDefinitionElement(j, cnx); jobDefinitions.addContent(jobDefinition); if (j.getClassLoader(cnx) != null) { cls.add(j.getClassLoader()); } } for (Cl cl : cls) { root.addContent(getClElement(cl)); } // Done: save the file try { XMLOutputter out = new XMLOutputter(Format.getPrettyFormat()); out.output(document, new FileOutputStream(xmlPath)); } catch (java.io.IOException e) { throw new JqmEngineException("Coul not save the XML file", e); } } private static Element getJobDefinitionElement(JobDef j, DbConn cnx) { Element jobDefinition = new Element("jobDefinition"); addTextElementToParentElement(jobDefinition, "name", j.getApplicationName()); addTextElementToParentElement(jobDefinition, "queue", j.getQueue(cnx).getName()); addTextElementToParentElement(jobDefinition, "description", j.getDescription() == null ? "" : j.getDescription()); addTextElementToParentElement(jobDefinition, "canBeRestarted", j.isCanBeRestarted() ? "true" : "false"); addTextElementToParentElement(jobDefinition, "javaClassName", j.getJavaClassName()); addTextElementToParentElement(jobDefinition, "application", j.getApplication()); addTextElementToParentElement(jobDefinition, "module", j.getModule()); addTextElementToParentElement(jobDefinition, "keyword1", j.getKeyword1()); addTextElementToParentElement(jobDefinition, "keyword2", j.getKeyword2()); addTextElementToParentElement(jobDefinition, "keyword3", j.getKeyword3()); if (j.getMaxTimeRunning() != null) addTextElementToParentElement(jobDefinition, "reasonableRuntimeLimitMinute", j.getMaxTimeRunning() + ""); addTextElementToParentElement(jobDefinition, "highlander", j.isHighlander() ? "true" : "false"); if (j.getClassLoader(cnx) != null) { addTextElementToParentElement(jobDefinition, "executionContext", j.getClassLoader().getName()); } List<JobDefParameter> jobDefParameters = j.getParameters(cnx); if (jobDefParameters != null && !jobDefParameters.isEmpty()) { Element parameters = new Element("parameters"); for (JobDefParameter p : jobDefParameters) { Element parameter = new Element("parameter"); parameters.addContent(parameter); addTextElementToParentElement(parameter, "key", p.getKey()); addTextElementToParentElement(parameter, "value", p.getValue()); } jobDefinition.addContent(parameters); } return jobDefinition; } private static Element getClElement(Cl cl) { Element res = new Element("context"); addTextElementToParentElement(res, "name", cl.getName()); addTextElementToParentElement(res, "childFirst", cl.isChildFirst()); addTextElementToParentElement(res, "hiddenJavaClasses", cl.getHiddenClasses()); addTextElementToParentElement(res, "tracingEnabled", cl.isTracingEnabled()); addTextElementToParentElement(res, "persistent", cl.isPersistent()); addTextElementToParentElement(res, "runners", cl.getAllowedRunners()); Element handlers = new Element("eventHandlers"); res.addContent(handlers); for (ClHandler h : cl.getHandlers()) { Element handler = new Element("handler"); handlers.addContent(handler); addTextElementToParentElement(handler, "className", h.getClassName()); addTextElementToParentElement(handler, "event", h.getEventType().toString()); Element parameters = new Element("parameters"); handler.addContent(parameters); for (Map.Entry<String, String> prm : h.getParameters().entrySet()) { Element p = new Element("parameter"); parameters.addContent(p); addTextElementToParentElement(p, "key", prm.getKey()); addTextElementToParentElement(p, "value", prm.getValue()); } } return res; } private static void addTextElementToParentElement(Element parent, String elementName, boolean content) { addTextElementToParentElement(parent, elementName, content ? "true" : "false"); } private static void addTextElementToParentElement(Element parent, String elementName, String content) { if (content != null) { Element e = new Element(elementName); e.setText(content); parent.addContent(e); } } }