提交 071dd591 编写于 作者: K Kohsuke Kawaguchi

really clean up all the atomic*.xmp

上级 dd833177
......@@ -167,7 +167,7 @@ public final class XmlFile {
} catch(StreamException e) {
throw new IOException2(e);
} finally {
w.close();
w.abort();
}
}
......
......@@ -1011,26 +1011,29 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
checkPermission(CONFIGURE);
XmlFile configXmlFile = getConfigFile();
AtomicFileWriter out = new AtomicFileWriter(configXmlFile.getFile());
try {
// this allows us to use UTF-8 for storing data,
// plus it checks any well-formedness issue in the submitted
// data
Transformer t = TransformerFactory.newInstance()
.newTransformer();
t.transform(new StreamSource(req.getReader()),
new StreamResult(out));
out.close();
} catch (TransformerException e) {
throw new IOException2("Failed to persist configuration.xml", e);
}
try {
// this allows us to use UTF-8 for storing data,
// plus it checks any well-formedness issue in the submitted
// data
Transformer t = TransformerFactory.newInstance()
.newTransformer();
t.transform(new StreamSource(req.getReader()),
new StreamResult(out));
out.close();
} catch (TransformerException e) {
throw new IOException2("Failed to persist configuration.xml", e);
}
// try to reflect the changes by reloading
new XmlFile(Items.XSTREAM, out.getTemporaryFile()).unmarshal(this);
onLoad(getParent(), getRootDir().getName());
// try to reflect the changes by reloading
new XmlFile(Items.XSTREAM, out.getTemporaryFile()).unmarshal(this);
onLoad(getParent(), getRootDir().getName());
// if everything went well, commit this new version
out.commit();
// if everything went well, commit this new version
out.commit();
} finally {
out.abort(); // don't leave anything behind
}
return;
}
......
......@@ -95,21 +95,31 @@ public class AtomicFileWriter extends Writer {
}
/**
* When the write operation failed and you'd like to leave the original file intact,
* you can optionally call this method to clean up a temporary file that was created by this writer.
* When the write operation failed, call this method to
* leave the original file intact and remove the temporary file.
* This method can be safely invoked from the "finally" block, even after
* the {@link #commit()} is called, to simplify coding.
*/
public void abort() throws IOException {
core.close();
close();
tmpFile.delete();
}
public void commit() throws IOException {
close();
if(destFile.exists() && !destFile.delete())
if(destFile.exists() && !destFile.delete()) {
tmpFile.delete();
throw new IOException("Unable to delete "+destFile);
}
tmpFile.renameTo(destFile);
}
@Override
protected void finalize() throws Throwable {
// one way or the other, temporary file should be deleted.
tmpFile.delete();
}
/**
* Until the data is committed, this file captures
* the written content.
......
......@@ -79,9 +79,8 @@ public class TextFile {
try {
w.write(text);
w.commit();
} catch (IOException e) {
} finally {
w.abort();
throw e;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册