Author: echatellier Date: 2012-04-24 13:48:07 +0200 (Tue, 24 Apr 2012) New Revision: 3682 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3682 Log: closes #1166 : NPE when updating jobs list table Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java 2012-04-24 10:15:56 UTC (rev 3681) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTableModel.java 2012-04-24 11:48:07 UTC (rev 3682) @@ -97,11 +97,11 @@ boolean forDoToJobs) { this.simulationService = simulationService; if (forDoToJobs) { - jobListener = new JobToDoListener(simulationService, this); + jobListener = new JobToDoListener(this); } else { - jobListener = new JobDoneListener(simulationService, this); + jobListener = new JobDoneListener(this); } - controlListener = new ControlListener(simulationService, this); + controlListener = new ControlListener(this); simulationService.addSimulationServiceListener(jobListener); jobListener.setData(); } @@ -122,9 +122,14 @@ synchronized (jobs) { int index = jobs.indexOf(job); if (index >= 0) { + + // fire before, because of multithreaded update, + // get value at will get arrayindexoutofboundexception + // because fire and remove are not atomic + fireTableRowsDeleted(index, index); + jobs.remove(index); jobIds.remove(id); - fireTableRowsDeleted(index, index); } } } @@ -209,12 +214,6 @@ */ public Object getValueAt(int rowIndex, int columnIndex) { - // TODO IndexOutOfBoundException here - // Concurrent problem ? - if (rowIndex >= jobs.size()) { - return null; - } - SimulationJob job = jobs.get(rowIndex); SimulationControl control = job.getItem().getControl(); String id = control.getId(); @@ -286,12 +285,9 @@ class JobDoneListener implements AbstractJobListener, SimulationServiceListener { - protected SimulationService simulationService; protected SimulationServiceTableModel model; - public JobDoneListener(SimulationService simulationService, - SimulationServiceTableModel model) { - this.simulationService = simulationService; + public JobDoneListener(SimulationServiceTableModel model) { this.model = model; setData(); } @@ -321,12 +317,9 @@ class JobToDoListener implements AbstractJobListener, SimulationServiceListener { - protected SimulationService simulationService; protected SimulationServiceTableModel model; - public JobToDoListener(SimulationService simulationService, - SimulationServiceTableModel model) { - this.simulationService = simulationService; + public JobToDoListener(SimulationServiceTableModel model) { this.model = model; setData(); } @@ -362,12 +355,9 @@ protected class ControlListener implements PropertyChangeListener { - protected SimulationService simulationService; protected SimulationServiceTableModel model; - public ControlListener(SimulationService simulationService, - SimulationServiceTableModel model) { - this.simulationService = simulationService; + public ControlListener(SimulationServiceTableModel model) { this.model = model; }