diff --git a/src/main/java/hudson/plugins/jobConfigHistory/FileHistoryDao.java b/src/main/java/hudson/plugins/jobConfigHistory/FileHistoryDao.java
index 00109eb4..32af7430 100644
--- a/src/main/java/hudson/plugins/jobConfigHistory/FileHistoryDao.java
+++ b/src/main/java/hudson/plugins/jobConfigHistory/FileHistoryDao.java
@@ -35,16 +35,6 @@
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-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.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
@@ -353,69 +343,9 @@ private void createNewHistoryEntryAndCopyConfig(final XmlFile configFile,
}
}
- /**
- * Find this in the configFile:
- * <hudson.plugins.jobConfigHistory.JobLocalConfiguration plugin="jobConfigHistory@2.25-SNAPSHOT">
- * <changeReasonComment>MY_CHANGE_REASON_COMMENT</changeReasonComment>
- * </hudson.plugins.jobConfigHistory.JobLocalConfiguration>
- * and delete it, receiving the changeReasonComment, if present.
- *
- * @param configFile the config file
- * @return the String in changeReasonComment, if found. Optional.empty(), else.
- * @throws IOException configFile is read.
- * @throws SAXException parsing the configFile.
- * @throws TransformerException parsing the configFile.
- * @throws ParserConfigurationException configuring the xml parser.
- */
- private Optional removeChangeReasonComment(final XmlFile configFile) throws IOException, SAXException, TransformerException, ParserConfigurationException {
- Document configFiledocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(configFile.getFile());
-
- NodeList jobLocalConfigurationNodes = configFiledocument.getElementsByTagName(JobConfigHistoryConsts.JOB_LOCAL_CONFIGURATION_XML_TAG);
- if (jobLocalConfigurationNodes.getLength() > 1) {
- LOG.log(FINEST, "tag \"{0}\" found twice in {1}, not saving the change reason comment.",
- new Object[]{JobConfigHistoryConsts.JOB_LOCAL_CONFIGURATION_XML_TAG, configFile.getFile()});
- return Optional.empty();
- } else if (jobLocalConfigurationNodes.getLength() == 1) {
- org.w3c.dom.Node jobLocalConfiguration = jobLocalConfigurationNodes.item(0);
- NodeList jlcChildren = jobLocalConfiguration.getChildNodes();
- org.w3c.dom.Node changeReasonCommentNode = null;
- for (int i = 0; i < jlcChildren.getLength(); ++i) {
- org.w3c.dom.Node node = jlcChildren.item(i);
- if (node.getNodeName().equals(JobConfigHistoryConsts.CHANGE_REASON_COMMENT_XML_TAG)) {
- changeReasonCommentNode = node;
- }
- }
- if (changeReasonCommentNode != null) {
- //tag is found. Might contain no comment (getTextContent() returns "").
- String changeReasonComment = changeReasonCommentNode.getTextContent();
- if (changeReasonComment != null) {
- //delete jobLocalConfiguration node from document
- jobLocalConfiguration.getParentNode().removeChild(jobLocalConfiguration);
- //save xml
- TransformerFactory.newInstance().newTransformer()
- .transform(new DOMSource(configFiledocument), new StreamResult(configFile.getFile()));
-
- return changeReasonComment.isEmpty() ? Optional.empty() : Optional.of(changeReasonComment);
- } else return Optional.empty();
- } else return Optional.empty();
- } else {
- //no jobLocalConfiguration node found. Should be there even if the message field was empty!
- LOG.log(FINEST, "tag \"{0}\" not found in {1}, no comment could be found.",
- new Object[]{JobConfigHistoryConsts.JOB_LOCAL_CONFIGURATION_XML_TAG, configFile.getFile()});
- return Optional.empty();
- }
- }
-
@Override
public void saveItem(final XmlFile file) {
- //remove the changeReasonComment entry from the xml file. (before checking duplicates!)
- Optional changeReasonCommentOptional;
- try {
- changeReasonCommentOptional = removeChangeReasonComment(file);
- } catch (IOException | SAXException | TransformerException | ParserConfigurationException e) {
- LOG.log(WARNING, "Error occurred while trying to extract changeReasonComment from config file: {0}", e);
- changeReasonCommentOptional = Optional.empty();
- }
+ Optional changeReasonCommentOptional = JobLocalConfiguration.lastChangeReasonComment(file);
if (checkDuplicate(file)) {
createNewHistoryEntryAndCopyConfig(file,
diff --git a/src/main/java/hudson/plugins/jobConfigHistory/JobLocalConfiguration.java b/src/main/java/hudson/plugins/jobConfigHistory/JobLocalConfiguration.java
index 63057401..1e8fa8df 100644
--- a/src/main/java/hudson/plugins/jobConfigHistory/JobLocalConfiguration.java
+++ b/src/main/java/hudson/plugins/jobConfigHistory/JobLocalConfiguration.java
@@ -1,12 +1,19 @@
package hudson.plugins.jobConfigHistory;
import hudson.Extension;
+import hudson.Util;
+import hudson.XmlFile;
import hudson.model.AbstractProject;
import hudson.model.Item;
import hudson.model.Job;
import hudson.model.JobProperty;
import hudson.model.JobPropertyDescriptor;
import hudson.util.FormValidation;
+import java.io.File;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
@@ -20,6 +27,12 @@ public class JobLocalConfiguration extends JobProperty> {
private static final Logger LOG = Logger
.getLogger(JobLocalConfiguration.class.getName());
+ private static final Map lastChangeReasonCommentByXmlFile = Collections.synchronizedMap(new HashMap<>());
+
+ static Optional lastChangeReasonComment(XmlFile file) {
+ return Optional.ofNullable(lastChangeReasonCommentByXmlFile.remove(file.getFile()));
+ }
+
private final String changeReasonComment;
@@ -48,6 +61,16 @@ public boolean isApplicable(AbstractProject, ?> item) {
return true;
}
+ @Override
+ public JobProperty> newInstance(StaplerRequest req, JSONObject formData) throws FormException {
+ JobLocalConfiguration jp = (JobLocalConfiguration) super.newInstance(req, formData);
+ Job, ?> job = req.findAncestorObject(Job.class);
+ if (job != null) {
+ lastChangeReasonCommentByXmlFile.put(job.getConfigFile().getFile(), Util.fixEmptyAndTrim(jp.changeReasonComment));
+ }
+ return null;
+ }
+
public boolean configure(StaplerRequest request, JSONObject jsonObject) throws FormException {
LOG.info("CONFIGURE");
throw new FormException("form exception", "localValues.changeReasonComment");