Author: fdesbois Date: 2012-08-30 17:58:32 +0200 (Thu, 30 Aug 2012) New Revision: 500 Url: http://forge.codelutin.com/repositories/revision/sammoa/500 Log: fixes #1434 : resolve issue with flightNumber Added: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-30 15:58:32 UTC (rev 500) @@ -232,26 +232,26 @@ } /** - * Create a new flight using the last flight number. The flight number is - * calculated from the last existing flight or from - * configuration {@link SammoaConfig#getFlightNumber()}. + * Create a new flight using the {@code flightNumber}. The flight number + * could be calculated using {@link #getNextFlightNumber()}. * + * @param flightNumber the number of the new flight * @param campaign The campaign of the flight * @return a new flight - * @see FlightDAO#findLastFlightNumber(int) + * @see #getNextFlightNumber() * @since 0.4 */ - public Flight createFlight(Campaign campaign) { + public Flight createFlight(Campaign campaign, int flightNumber) { - TopiaContext transaction = beginTransaction(); + TopiaContext tx = beginTransaction(); try { - FlightDAO dao = SammoaDAOHelper.getFlightDAO(transaction); + FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx); + int nextFlightNumber = getNextFlightNumber(tx); + Preconditions.checkArgument(flightNumber >= nextFlightNumber); + String systemId = config.getSystemId(); - int startNumber = config.getFlightNumber(); - int flightNumber = dao.findLastFlightNumber(startNumber); - Flight result = dao.createByNaturalId(systemId, flightNumber, campaign); @@ -264,8 +264,12 @@ ); } - transaction.commitTransaction(); + tx.commitTransaction(); + // Update flightNumber in config + config.setFlightNumber(flightNumber); + config.save(); + // create flight storage CampaignStorage campaignStorage = getCampaignStorage(campaign.getTopiaId()); @@ -277,11 +281,31 @@ } catch (TopiaException e) { throw new TopiaRuntimeException(e); } finally { - endTransaction(transaction); + endTransaction(tx); } } /** + * Retrieve the next flight number to use. It is the maximum value available + * between the database maximum flightNumber and the configuration one. + * + * @return the next available flight number + */ + public int getNextFlightNumber() { + + TopiaContext tx = persistence.beginTransaction(); + try { + int result = getNextFlightNumber(tx); + return result; + + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } finally { + endTransaction(tx); + } + } + + /** * Remove the given flight from db and storage. * * @param flightId the flight id to remove @@ -994,6 +1018,19 @@ } } + protected int getNextFlightNumber(TopiaContext tx) throws TopiaException { + + FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx); + + int confNumber = config.getFlightNumber(); + Integer dbNumber = dao.findLastFlightNumber(); + + int result = dbNumber == null + ? confNumber : Math.max(confNumber, dbNumber); + result++; + return result; + } + public Flight getFlightByNaturalId(Map<String, Object> naturalId) { TopiaContext tx = beginTransaction(); try { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-30 15:58:32 UTC (rev 500) @@ -223,6 +223,10 @@ return result; } + public void setFlightNumber(int flightNumber) { + applicationConfig.setOption(SammoaConfigOption.FLIGHT_NUMBER.key, String.valueOf(flightNumber)); + } + /** @return {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value */ public File getBackgroundShapeFile() { File result = applicationConfig.getOptionAsFile(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key); @@ -359,7 +363,7 @@ /** The starting value to increment flight number */ FLIGHT_NUMBER("flight.number", n_("sammoa.config.flight.number"), - "1", + "0", Integer.class ), /** The backgroud shape file to display the world */ Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java =================================================================== --- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-08-30 15:58:32 UTC (rev 500) @@ -39,6 +39,7 @@ import fr.ulr.sammoa.persistence.Transect; import fr.ulr.sammoa.persistence.TransectDAO; import fr.ulr.sammoa.persistence.TransectFlight; +import org.junit.After; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; @@ -47,21 +48,24 @@ /** * Created: 08/06/12 - * <p/> - * FIXME-fdesbois-2012-07-03 : This test is ignored, waiting for a more stable AutoCommitSaver * * @author fdesbois <desbois@codelutin.com> */ public class FlightServiceTest { public SammoaConfig config = - new SammoaConfig("sammoa-test.properties"); + new SammoaConfigMock("sammoa-test.properties"); @Rule public SammoaDatabase database = new SammoaDatabase( "/" + config.getApplicationConfig().getConfigFileName(), config.getAutoCommitDelay()); + @After + public void tearDown() { + config.setFlightNumber(0); + } + @Test public void testCreateFlight() throws Exception { @@ -71,15 +75,57 @@ Campaign campaign = database.createCampaign("PACOMM", "FRANCE"); - context.getConfig().applicationConfig.setOption( - SammoaConfig.SammoaConfigOption.FLIGHT_NUMBER.getKey(), "18"); + context.getConfig().setFlightNumber(17); - Flight flight1 = service.createFlight(campaign); + Flight flight = service.createFlight(campaign, 18); - Assert.assertEquals(18, flight1.getFlightNumber()); + Assert.assertEquals(18, flight.getFlightNumber()); + Assert.assertEquals(18, (int) config.getFlightNumber()); } + @Test(expected = IllegalArgumentException.class) + public void testCreateFlightError() throws Exception { + + SammoaContext context = new SammoaContext(config, database.getPersistence()); + + FlightService service = context.getService(FlightService.class); + + Campaign campaign = database.createCampaign("PACOMM", "FRANCE"); + + context.getConfig().setFlightNumber(18); + + service.createFlight(campaign, 1); + } + @Test + public void testGetNextFlightNumber() throws Exception { + + SammoaContext context = new SammoaContext(config, database.getPersistence()); + + FlightService service = context.getService(FlightService.class); + + Campaign campaign = database.createCampaign("PACOMM", "FRANCE"); + + { + service.createFlight(campaign, 124); + int result = service.getNextFlightNumber(); + Assert.assertEquals(125, result); + } + + { + config.setFlightNumber(18); + int result = service.getNextFlightNumber(); + Assert.assertEquals(125, result); + } + + { + config.setFlightNumber(149); + int result = service.getNextFlightNumber(); + Assert.assertEquals(150, result); + } + } + + @Test public void testAddTransects() throws Exception { SammoaContext context = new SammoaContext(config, database.getPersistence()); @@ -91,7 +137,7 @@ // Create the strate Strate strate = createStrate(campaign, 1, StrateType.COAST); - Flight flight = service.createFlight(campaign); + Flight flight = service.createFlight(campaign, service.getNextFlightNumber()); // add 4 observers in flight for (int i = 0; i < 4; i++) { Added: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java =================================================================== --- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java (rev 0) +++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java 2012-08-30 15:58:32 UTC (rev 500) @@ -0,0 +1,29 @@ +package fr.ulr.sammoa.application; + +/** + * Created: 30/08/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class SammoaConfigMock extends SammoaConfig { + + protected int flightNumber; + + public SammoaConfigMock(String file, String... args) { + super(file, args); + } + + @Override + public Integer getFlightNumber() { + return flightNumber; + } + + @Override + public void setFlightNumber(int flightNumber) { + this.flightNumber = flightNumber; + } + + @Override + public void save() { + } +} Property changes on: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/SammoaConfigMock.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java =================================================================== --- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/io/input/csv/ImportCsvServiceTest.java 2012-08-30 15:58:32 UTC (rev 500) @@ -24,6 +24,7 @@ */ import fr.ulr.sammoa.application.SammoaConfig; +import fr.ulr.sammoa.application.SammoaConfigMock; import fr.ulr.sammoa.application.SammoaContext; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Observer; @@ -49,7 +50,7 @@ public class ImportCsvServiceTest { public SammoaConfig config = - new SammoaConfig("sammoa-test.properties"); + new SammoaConfigMock("sammoa-test.properties"); @Rule public SammoaDatabase database = new SammoaDatabase( Modified: trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java =================================================================== --- trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/output/map/ExportMapServiceTest.java 2012-08-30 15:58:32 UTC (rev 500) @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.SammoaConfig; +import fr.ulr.sammoa.application.SammoaConfigMock; import fr.ulr.sammoa.application.SammoaContext; import fr.ulr.sammoa.application.io.input.map.DbfImport; import fr.ulr.sammoa.application.io.input.map.DoubleToIntegerValueParser; @@ -71,7 +72,7 @@ public class ExportMapServiceTest { public SammoaConfig config = - new SammoaConfig("sammoa-test.properties"); + new SammoaConfigMock("sammoa-test.properties"); @Rule public SammoaDatabase database = new SammoaDatabase("/" + @@ -100,7 +101,7 @@ campaign.setEndDate(DateUtil.createDate(31, 12, 2012)); FlightService flightService = context.getService(FlightService.class); - Flight flight = flightService.createFlight(campaign); + Flight flight = flightService.createFlight(campaign, flightService.getNextFlightNumber()); flight.setBeginDate(DateUtil.createDate(18, 0, 12, 18, 7, 2012)); Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/FlightDAOImpl.java 2012-08-30 15:58:32 UTC (rev 500) @@ -43,18 +43,18 @@ */ public class FlightDAOImpl<E extends Flight> extends FlightDAOAbstract<E> { - public int findLastFlightNumber(int defaultValue) { + public Integer findLastFlightNumber() { String ql = "SELECT max(flightNumber) FROM FlightImpl"; try { - Integer queryResult = findByQuery(Integer.class, ql); + Integer result = findByQuery(Integer.class, ql); - int result = queryResult == null ? defaultValue : queryResult + 1; - - if (result < defaultValue) { - result = defaultValue; - } +// int result = queryResult == null ? defaultValue : queryResult + 1; +// +// if (result < defaultValue) { +// result = defaultValue; +// } return result; } catch (TopiaException e) { throw new TopiaRuntimeException(e); Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-30 15:58:32 UTC (rev 500) @@ -217,7 +217,7 @@ observerFile.getAbsolutePath()); } - success &= uiImporter.importCvs(observerImporter, observerFile); + success &= uiImporter.importCsv(observerImporter, observerFile); } SammoaUtil.updateBusyState(ui, false); Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/home/HomeUIHandler.java 2012-08-30 15:58:32 UTC (rev 500) @@ -39,13 +39,17 @@ import fr.ulr.sammoa.ui.swing.SammoaUIContext; import fr.ulr.sammoa.ui.swing.SammoaUIHandler; import fr.ulr.sammoa.ui.swing.UIDecoratorService; +import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.swing.JOptionPane; import java.util.Collection; import java.util.List; import java.util.Set; +import static org.nuiton.i18n.I18n._; + /** * Created: 19/07/12 * @@ -281,10 +285,36 @@ if (flight == null) { - // Create a new Flight for the selected Campaign - flight = flightService.createFlight(campaign); + int nextFlightNumber = flightService.getNextFlightNumber(); + + String response = JOptionPane.showInputDialog( + ui, _("sammoa.inputDialog.flightNumber.message"), nextFlightNumber); + + if (response == null) { + // nothing to do + + } else { + try { + int flightNumber = Integer.parseInt(response); + + if (flightNumber < nextFlightNumber) { + SammoaUtil.showErrorMessage( + ui, _("sammoa.inputDialog.flightNumber.error.greaterThanNextFlightNumber", nextFlightNumber)); + + } else { + + // Create the flight + flight = flightService.createFlight(campaign, flightNumber); + + context.changeScreen(SammoaScreen.FLIGHT, campaign, flight); + } + + } catch (NumberFormatException ex) { + SammoaUtil.showErrorMessage( + ui, _("sammoa.inputDialog.flightNumber.error.notANumber")); + } + } } - context.changeScreen(SammoaScreen.FLIGHT, campaign, flight); } public void showValidation() { Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/UIImporter.java 2012-08-30 15:58:32 UTC (rev 500) @@ -30,8 +30,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.JOptionPane; -import javax.swing.UIManager; import java.awt.Component; import java.io.File; import java.io.IOException; @@ -67,7 +65,7 @@ SammoaUtil.updateBusyState(ui, false); - JOptionPane.showMessageDialog(ui, successMessage); + SammoaUtil.showSuccessMessage(ui, successMessage); result = true; @@ -80,7 +78,7 @@ return result; } - public boolean importCvs(CsvImporter importer, File file) { + public boolean importCsv(CsvImporter importer, File file) { boolean result = false; try { @@ -91,7 +89,7 @@ SammoaUtil.updateBusyState(ui, false); - JOptionPane.showMessageDialog(ui, successMessage); + SammoaUtil.showSuccessMessage(ui, successMessage); result = true; @@ -109,9 +107,7 @@ if (logger.isInfoEnabled()) { logger.info("Import error from file '" + file.getAbsolutePath() + "'", e); } - JOptionPane.showMessageDialog( - ui, e.getMessage(), "Error", - JOptionPane.ERROR_MESSAGE, UIManager.getIcon("error")); + SammoaUtil.showErrorMessage(ui, e.getMessage()); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-30 15:58:32 UTC (rev 500) @@ -131,7 +131,7 @@ speciesFile.getAbsolutePath()); } - success = uiImporter.importCvs(speciesImporter, speciesFile); + success = uiImporter.importCsv(speciesImporter, speciesFile); } SammoaUtil.updateBusyState(ui, false); Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 14:42:03 UTC (rev 499) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-30 15:58:32 UTC (rev 500) @@ -94,6 +94,9 @@ sammoa.info.importApplication.importfile.loaded.on.existingCampaign=Import an existing campaign %s, please choose which flights of the following list to import sammoa.info.importApplication.importfile.loaded.on.newCampaign=Import a new campaign %s, all the flights of the following list will be imported sammoa.info.importApplication.no.importfile.loaded=No import file loaded, choose an file to import then press the 'load import file' button +sammoa.inputDialog.flightNumber.error.greaterThanNextFlightNumber=The flight number can't be greater than %d +sammoa.inputDialog.flightNumber.error.notANumber=The flight number must be a valid integer +sammoa.inputDialog.flightNumber.message=Choose the flight number sammoa.label.campaign=Campaign\: sammoa.label.campaign.beginDate=Begin\: sammoa.label.campaign.code=Code\: