diff --git a/main/src/com/google/refine/operations/column/ColumnAdditionByFetchingURLsOperation.java b/main/src/com/google/refine/operations/column/ColumnAdditionByFetchingURLsOperation.java index 0029baa9a..32d4188f4 100644 --- a/main/src/com/google/refine/operations/column/ColumnAdditionByFetchingURLsOperation.java +++ b/main/src/com/google/refine/operations/column/ColumnAdditionByFetchingURLsOperation.java @@ -148,14 +148,6 @@ public class ColumnAdditionByFetchingURLsOperation extends EngineDependentOperat @Override public Process createProcess(Project project, Properties options) throws Exception { - Column column = project.columnModel.getColumnByName(_baseColumnName); - if (column == null) { - throw new Exception("No column named " + _baseColumnName); - } - if (project.columnModel.getColumnByName(_newColumnName) != null) { - throw new Exception("Another column already named " + _newColumnName); - } - Engine engine = createEngine(project); engine.initializeFromJSON(_engineConfig); @@ -209,6 +201,16 @@ public class ColumnAdditionByFetchingURLsOperation extends EngineDependentOperat @Override public void run() { + Column column = _project.columnModel.getColumnByName(_baseColumnName); + if (column == null) { + _project.processManager.onFailedProcess(this, new Exception("No column named " + _baseColumnName)); + return; + } + if (_project.columnModel.getColumnByName(_newColumnName) != null) { + _project.processManager.onFailedProcess(this, new Exception("Another column already named " + _newColumnName)); + return; + } + List urls = new ArrayList(_project.rows.size()); FilteredRows filteredRows = _engine.getAllFilteredRows(); diff --git a/main/src/com/google/refine/process/ProcessManager.java b/main/src/com/google/refine/process/ProcessManager.java index bbc11328d..2abb37c84 100644 --- a/main/src/com/google/refine/process/ProcessManager.java +++ b/main/src/com/google/refine/process/ProcessManager.java @@ -46,6 +46,7 @@ import com.google.refine.history.HistoryProcess; public class ProcessManager implements Jsonizable { protected List _processes = new LinkedList(); + protected List _latestExceptions = null; public ProcessManager() { @@ -62,11 +63,22 @@ public class ProcessManager implements Jsonizable { } writer.endArray(); + if (_latestExceptions != null) { + writer.key("exceptions"); writer.array(); + for (Exception e : _latestExceptions) { + writer.object(); + writer.key("message"); writer.value(e.getLocalizedMessage()); + writer.endObject(); + } + writer.endArray(); + } + writer.endObject(); } public HistoryEntry queueProcess(Process process) throws Exception { if (process.isImmediate() && _processes.size() == 0) { + _latestExceptions = null; return process.performImmediate(); } else { _processes.add(process); @@ -78,6 +90,7 @@ public class ProcessManager implements Jsonizable { public boolean queueProcess(HistoryProcess process) throws Exception { if (process.isImmediate() && _processes.size() == 0) { + _latestExceptions = null; return process.performImmediate() != null; } else { _processes.add(process); @@ -96,6 +109,18 @@ public class ProcessManager implements Jsonizable { update(); } + public void onFailedProcess(Process p, Exception exception) { + List exceptions = new LinkedList(); + exceptions.add(exception); + onFailedProcess(p, exceptions); + } + + public void onFailedProcess(Process p, List exceptions) { + _latestExceptions = exceptions; + _processes.remove(p); + // Do not call update(); Just pause? + } + public void cancelAll() { for (Process p : _processes) { if (!p.isImmediate() && p.isRunning()) { @@ -103,12 +128,14 @@ public class ProcessManager implements Jsonizable { } } _processes.clear(); + _latestExceptions = null; } protected void update() { while (_processes.size() > 0) { Process p = _processes.get(0); if (p.isImmediate()) { + _latestExceptions = null; try { p.performImmediate(); } catch (Exception e) { @@ -120,6 +147,7 @@ public class ProcessManager implements Jsonizable { _processes.remove(0); } else { if (!p.isRunning()) { + _latestExceptions = null; p.startPerforming(this); } break; diff --git a/main/webapp/modules/core/scripts/project/process-panel.js b/main/webapp/modules/core/scripts/project/process-panel.js index 0109442c1..b4a4bed50 100644 --- a/main/webapp/modules/core/scripts/project/process-panel.js +++ b/main/webapp/modules/core/scripts/project/process-panel.js @@ -191,6 +191,28 @@ ProcessPanel.prototype._render = function(newData) { } this._data = newData; + if (this._data.exceptions) { + var messages = $.map(this._data.exceptions, function(e) { + return e.message; + }).join('\n'); + + if (this._data.processes.length == 0) { + window.alert('The last operation encountered some errors:\n' + messages); + } else { + if (window.confirm('The last operation encountered some errors:\n' + messages + + '\n\nContinue with the remaining operations?')) { + $.post( + "/command/core/apply-operations?" + $.param({ project: theProject.id }), + { operations: '[]' }, + function(o) {}, + "json" + ); + } else { + self._cancelAll(); + } + } + } + if (this._data.processes.length && !this._timerID) { this._timerID = window.setTimeout(function() { self._timerID = null;