package hudson.plugins.accurev.cmd;
import hudson.EnvVars;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.TaskListener;
import hudson.plugins.accurev.AccurevLauncher;
import hudson.plugins.accurev.AccurevSCM;
import hudson.plugins.accurev.AccurevSCM.AccurevServer;
import hudson.plugins.accurev.GetConfigWebURL;
import hudson.plugins.accurev.XmlParserFactory;
import hudson.plugins.accurev.parsers.output.ParseOutputToFile;
import hudson.plugins.accurev.parsers.xml.ParseGetConfig;
import hudson.util.ArgumentListBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xmlpull.v1.XmlPullParserFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.logging.Logger;
public class ChangeLogCmd {
public static boolean captureChangelog(AccurevServer server,
EnvVars accurevEnv,
FilePath workspace,
TaskListener listener,
Launcher launcher,
Date buildDate,
Date startDate,
String stream,
File changelogFile,
Logger logger,
AccurevSCM scm,
Map<String, GetConfigWebURL> webURL) throws IOException {
final String accurevACSYNCEnvVar = "AC_SYNC";
if (!accurevEnv.containsKey(accurevACSYNCEnvVar)) {
final String accurevACSYNC = "IGNORE";
accurevEnv.put(accurevACSYNCEnvVar, accurevACSYNC);
listener.getLogger().println("Setting " + accurevACSYNCEnvVar + " to \"" + accurevACSYNC + '"');
}
ArgumentListBuilder cmd = new ArgumentListBuilder();
cmd.add("hist");
Command.addServer(cmd, server);
cmd.add("-fx");
cmd.add("-a");
cmd.add("-s");
cmd.add(stream);
cmd.add("-t");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String dateRange = formatter.format(buildDate);
if (startDate != null) {
dateRange += "-" + formatter.format(startDate);
} else {
dateRange += ".100";
}
cmd.add(dateRange); // if this breaks windows there's going to be fun
final String commandDescription = "Changelog command";
final Boolean success = AccurevLauncher.runCommand(commandDescription, scm.getAccurevTool(), launcher, cmd,
scm.getOptionalLock(), accurevEnv, workspace, listener, logger, new ParseOutputToFile(), changelogFile);
if (success == null || !success) {
return false;
}
// ==============================================================================================
// See the content of changelogfile
if (changelogFile != null) {
applyWebURL(webURL, changelogFile, scm);
}
// =============================================================================================
listener.getLogger().println("Changelog calculated successfully.");
return true;
}
/**
* Retrieve the settings.xml file to get the webURL.
*
* @param server Server
* @param accurevEnv Accurev Environment
* @param workspace Workspace
* @param listener listener
* @param launcher Launcher
* @param logger logger
* @param scm Accurev SCM
* @return webURL
* @throws IOException Handle it above
*/
public static Map<String, GetConfigWebURL> retrieveWebURL(AccurevServer server,
EnvVars accurevEnv,
FilePath workspace,
TaskListener listener,
Launcher launcher,
Logger logger,
AccurevSCM scm) throws IOException {
final ArgumentListBuilder getConfigCmd = new ArgumentListBuilder();
getConfigCmd.add("getconfig");
Command.addServer(getConfigCmd, server);
getConfigCmd.add("-s");
getConfigCmd.add("-r");
getConfigCmd.add("settings.xml");
XmlPullParserFactory parser = XmlParserFactory.getFactory();
if (parser == null) throw new IOException("No XML Parser");
return AccurevLauncher.runCommand("Get config to fetch webURL",
scm.getAccurevTool(), launcher, getConfigCmd, scm.getOptionalLock(), accurevEnv, workspace, listener, logger,
parser, new ParseGetConfig(), null);
}
/**
* Parses changelog to apply the given webURL
*
* @param webURL webURL
* @param changelogFile changeLogFile
* @param scm Accurev SCM
*/
private static void applyWebURL(Map<String, GetConfigWebURL> webURL,
File changelogFile,
AccurevSCM scm) {
if (webURL == null || webURL.isEmpty()) {
return;
}
GetConfigWebURL webuiURL = webURL.get("webuiURL");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder;
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(changelogFile);
NodeList nodes = document.getElementsByTagName("transaction");
Element depotElement = document.createElement("depot");
if (nodes != null && nodes.getLength() > 0)
nodes.item(0).getParentNode().insertBefore(depotElement, nodes.item(0));
depotElement.appendChild(document.createTextNode(scm.getDepot()));
Element webuiElement = document.createElement("webuiURL");
if (nodes != null && nodes.getLength() > 0)
nodes.item(0).getParentNode().insertBefore(webuiElement, nodes.item(0));
if (webuiURL != null)
webuiElement.appendChild(document.createTextNode((webuiURL.getWebURL().endsWith("/") ? (webuiURL.getWebURL().substring(0, webuiURL.getWebURL().length() - 1)) : (webuiURL.getWebURL()))));
else
webuiElement.appendChild(document.createTextNode(""));
DOMSource source = new DOMSource(document);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
StreamResult result = new StreamResult(changelogFile);
transformer.transform(source, result);
} catch (ParserConfigurationException | IOException | SAXException | TransformerException ignored) {
}
}
}