Skip to content

Commit e93616a

Browse files
committed
JavaEngine: split Builder initialization logic
Rather than doing all the work in the constructor, and throwing a bunch of exceptions, let's keep construction as simple as possible, then do all that initialization in its own method. This will make error handling more robust in that we will be able to attempt calls to builder.cleanup() even if something went wrong during initialization.
1 parent e6aa298 commit e93616a

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/main/java/org/scijava/plugins/scripting/java/JavaEngine.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -188,21 +188,19 @@ public Class<?> compile(String script) throws ScriptException {
188188
File file = path == null ? null : new File(path);
189189

190190
final Writer writer = getContext().getErrorWriter();
191+
final Builder builder = new Builder();
191192
try {
192-
193-
final Builder builder;
194-
195193
if (file != null && file.exists()) {
196194
// if the filename set in engine scope bindings is valid,
197195
// ignore the given script and use that file instead.
198-
builder = new Builder(file, writer);
196+
builder.initialize(file, writer);
199197
}
200198
else {
201199
// script may be null, but then we cannot create a StringReader for it,
202200
// therefore null is passed if script is null.
203201
final Reader reader =
204202
(script == null) ? null : new StringReader(script);
205-
builder = new Builder(reader, writer);
203+
builder.initialize(reader, writer);
206204
}
207205
final MavenProject project = builder.project;
208206
String mainClass = builder.mainClass;
@@ -292,10 +290,11 @@ public void compile(final File file) {
292290
* @see #compile(String)
293291
*/
294292
public void compile(final File file, final Writer errorWriter) {
293+
final Writer writer =
294+
(errorWriter == null) ? getContext().getErrorWriter() : errorWriter;
295+
final Builder builder = new Builder();
295296
try {
296-
final Writer writer =
297-
(errorWriter == null) ? getContext().getErrorWriter() : errorWriter;
298-
final Builder builder = new Builder(file, writer);
297+
builder.initialize(file, writer);
299298
try {
300299
builder.project.build();
301300
}
@@ -319,8 +318,9 @@ public void compile(final File file, final Writer errorWriter) {
319318
public void makeJar(final File file, final boolean includeSources,
320319
final File output, final Writer errorWriter)
321320
{
321+
final Builder builder = new Builder();
322322
try {
323-
final Builder builder = new Builder(file, errorWriter);
323+
builder.initialize(file, errorWriter);
324324
try {
325325
builder.project.build(true, true, includeSources);
326326
final File target = builder.project.getTarget();
@@ -368,14 +368,17 @@ private void printOrThrow(Throwable t, Writer errorWriter) {
368368
*/
369369
private class Builder {
370370

371-
private final PrintStream err;
372-
private final File temporaryDirectory;
371+
private PrintStream err;
372+
private File temporaryDirectory;
373373
private String mainClass;
374374
private MavenProject project;
375375

376376
/**
377377
* Constructs a wrapper around a possibly project for a source or maven
378378
* project file.
379+
* <p>
380+
* This method is intended to be called only once.
381+
* </p>
379382
*
380383
* @param file the {@code .java} file to build (or null, if {@code reader}
381384
* is set).
@@ -388,7 +391,7 @@ private class Builder {
388391
* @throws TransformerException
389392
* @throws TransformerFactoryConfigurationError
390393
*/
391-
private Builder(final File file, final Writer errorWriter)
394+
private void initialize(final File file, final Writer errorWriter)
392395
throws ScriptException, IOException, ParserConfigurationException,
393396
SAXException, TransformerConfigurationException, TransformerException,
394397
TransformerFactoryConfigurationError
@@ -411,6 +414,9 @@ private Builder(final File file, final Writer errorWriter)
411414
/**
412415
* Constructs a wrapper around a possibly temporary project for source code
413416
* generated by a Reader.
417+
* <p>
418+
* This method is intended to be called only once.
419+
* </p>
414420
*
415421
* @param reader provides the Java source if {@code file} is {@code null}
416422
* @param errorWriter where to write the error output.
@@ -422,7 +428,7 @@ private Builder(final File file, final Writer errorWriter)
422428
* @throws TransformerException
423429
* @throws TransformerFactoryConfigurationError
424430
*/
425-
private Builder(final Reader reader, final Writer errorWriter)
431+
private void initialize(final Reader reader, final Writer errorWriter)
426432
throws ScriptException, IOException, ParserConfigurationException,
427433
SAXException, TransformerConfigurationException, TransformerException,
428434
TransformerFactoryConfigurationError

0 commit comments

Comments
 (0)