Author: fdesbois Date: 2012-08-09 11:35:36 +0200 (Thu, 09 Aug 2012) New Revision: 374 Url: http://forge.codelutin.com/repositories/revision/sammoa/374 Log: Fix some bugs + add some minor improvements 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/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.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/flight/FlightUIHandler.java 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/util/Importer.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 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-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-09 09:35:36 UTC (rev 374) @@ -745,7 +745,7 @@ logger.trace(String.format( "ObserverPosition : %s, %s, %s", elmt.getTopiaId(), - elmt.getObserver().getInitials(), + (elmt.getObserver() != null ? elmt.getObserver().getInitials() : "N/A"), elmt.getPosition()) ); } 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-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-09 09:35:36 UTC (rev 374) @@ -476,7 +476,7 @@ KEY_ADD("ui." + PROPERTY_ADD, _("sammoa.config.ui.add"), - "pressed F6", + "pressed F7", KeyStroke.class, false, false), @@ -504,7 +504,7 @@ KEY_CIRCLE_BACK("ui." + PROPERTY_CIRCLE_BACK, _("sammoa.config.ui.circleBack"), - "pressed F7", + "pressed F11", KeyStroke.class, false, false); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/DeviceTechnicalException.java 2012-08-09 09:35:36 UTC (rev 374) @@ -43,6 +43,14 @@ this.source = source; } + public String getMessageWithCause() { + String result = getMessage(); + if (getCause() != null) { + result += " : " + getCause().getMessage(); + } + return result; + } + public DeviceManager getSource() { return source; } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/device/gps/BaseGpsHandler.java 2012-08-09 09:35:36 UTC (rev 374) @@ -117,8 +117,10 @@ @Override public void stop() { - timer.cancel(); - timer = null; + if (timer != null) { + timer.cancel(); + timer = null; + } } @Override @@ -179,9 +181,7 @@ } catch (DeviceTechnicalException ex) { // We use ERROR, because this task is during start - // Error is generally the same as previous one from first open() call, - // no need to propagate it - setState(DeviceState.ERROR, null); + setState(DeviceState.ERROR, ex); if (logger.isErrorEnabled()) { logger.error("Can't open GPS device. Try again in " Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/GeoPoints.java 2012-08-09 09:35:36 UTC (rev 374) @@ -46,18 +46,21 @@ List<GeoPoint> result = Lists.newArrayList(); - List<Date> geoPointDates = FluentIterable - .from(geoPoints) - .transform(toDate()) - .toSortedImmutableList(Ordering.natural()); + if (!geoPoints.isEmpty()) { - int index = 0; - for (Date date : dates) { + List<Date> geoPointDates = FluentIterable + .from(geoPoints) + .transform(toDate()) + .toSortedImmutableList(Ordering.natural()); - // We continue starting from the previous index to avoid loop on all the date list - index = getClosestDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date); + int index = 0; + for (Date date : dates) { - result.add(geoPoints.get(index)); + // We continue starting from the previous index to avoid loop on all the date list + index = getClosestDateIndex(index > 0 ? index - 1 : 0, geoPointDates, date); + + result.add(geoPoints.get(index)); + } } return result; } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-08-09 09:35:36 UTC (rev 374) @@ -76,6 +76,10 @@ this.ui = ui; } + public MainUI getUI() { + return ui; + } + public SammoaContext getAppContext() { return context.getAppContext(); } @@ -127,6 +131,8 @@ } else { + SammoaUtil.updateBusyState(ui, true); + if (currentBody != null) { SammoaUI<?> body = (SammoaUI<?>) currentBody; body.getHandler().onCloseUI(); @@ -178,6 +184,8 @@ } ui.setScreen(screen); + + SammoaUtil.updateBusyState(ui, false); } } @@ -301,7 +309,7 @@ flightUIHandler.getFlightController().openGpsDevice(gpsConfig); } catch (DeviceTechnicalException ex) { logger.error("Error on new GpsHandler", ex); - SammoaUtil.showError(ui, ex); + SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause()); } } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java 2012-08-09 09:35:36 UTC (rev 374) @@ -164,6 +164,10 @@ mainUIHandler.setScreen(SammoaScreen.EXPORT_MAP); } + public void setStatusMessage(String message) { + mainUIHandler.getUI().getStatus().setStatus(message); + } + public void open() { context.open(); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/action/CircleBackAction.java 2012-08-09 09:35:36 UTC (rev 374) @@ -23,6 +23,7 @@ */ package fr.ulr.sammoa.ui.swing.action; +import com.google.common.collect.Iterables; import fr.ulr.sammoa.persistence.Observation; import fr.ulr.sammoa.persistence.Route; import fr.ulr.sammoa.persistence.RouteType; @@ -60,7 +61,7 @@ if (observation == null) { List<Observation> obsList = getModel().getObservations(); - observation = obsList.get(obsList.size()); + observation = Iterables.getLast(obsList); } getFlightController().circleBack(observation); 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-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/campaign/CampaignUIHandler.java 2012-08-09 09:35:36 UTC (rev 374) @@ -37,6 +37,7 @@ import fr.ulr.sammoa.ui.swing.region.RegionUIModel; import fr.ulr.sammoa.ui.swing.util.CsvImporter; import fr.ulr.sammoa.ui.swing.util.Importer; +import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import fr.ulr.sammoa.ui.swing.util.ShpImporter; import jaxx.runtime.swing.ErrorDialogUI; import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer; @@ -167,7 +168,9 @@ boolean success = true; Campaign campaign = getModel().newBean(); - + + SammoaUtil.updateBusyState(ui, true); + String campaignId = getReferentialService().saveCampaign(campaign); getModel().setId(campaignId); @@ -207,12 +210,14 @@ success &= observerImporter.readFile(ui, observerFile); } + SammoaUtil.updateBusyState(ui, false); + if (success) { context.setCampaignId(campaignId); close(); } - } catch (IllegalArgumentException e) { + } catch (Exception e) { ErrorDialogUI.showError(e); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/FlightUIHandler.java 2012-08-09 09:35:36 UTC (rev 374) @@ -239,14 +239,16 @@ flightController.openGpsDevice(getConfig().getGpsConfig()); } catch (DeviceTechnicalException ex) { logger.error("Error on GPS init", ex); - SammoaUtil.showError(ui, ex); + SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause()); + SammoaUtil.updateBusyState(context.getMainUIHandler().getUI(), true); } try { flightController.openAudioDevice(); } catch (DeviceTechnicalException ex) { logger.error("Error on Audio init", ex); - SammoaUtil.showError(ui, ex); + SammoaUtil.showErrorMessage(ui, ex.getMessageWithCause()); + SammoaUtil.updateBusyState(context.getMainUIHandler().getUI(), true); } flightController.addListener(this); @@ -885,7 +887,7 @@ event.getNewValue() == DeviceState.ERROR && event.getError() != null) { - SammoaUtil.showError(ui, event.getError()); + context.setStatusMessage(event.getError().getMessageWithCause()); } } }; 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-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/region/RegionUIHandler.java 2012-08-09 09:35:36 UTC (rev 374) @@ -120,6 +120,8 @@ // Prepare new instance Region region = getModel().newBean(); + SammoaUtil.updateBusyState(ui, true); + // Save the entity String regionId = getReferentialService().saveRegion(region); getModel().setId(regionId); @@ -134,15 +136,17 @@ ); } - success &= speciesImporter.readFile(ui, speciesFile); + success = speciesImporter.readFile(ui, speciesFile); } + SammoaUtil.updateBusyState(ui, false); + // Close on success if (success) { ui.getCloseButton().doClick(); } - } catch (IllegalArgumentException e) { + } catch (Exception e) { ErrorDialogUI.showError(e); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/Importer.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/Importer.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/Importer.java 2012-08-09 09:35:36 UTC (rev 374) @@ -27,9 +27,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.JOptionPane; -import javax.swing.UIManager; -import java.awt.Component; +import javax.swing.*; +import java.awt.*; import java.io.File; import java.io.IOException; @@ -48,8 +47,12 @@ try { + SammoaUtil.updateBusyState(ui, true); + String successMessage = onActionPerformed(file); + SammoaUtil.updateBusyState(ui, false); + JOptionPane.showMessageDialog(ui, successMessage); result = true; Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/SammoaUtil.java 2012-08-09 09:35:36 UTC (rev 374) @@ -26,7 +26,6 @@ import com.google.common.base.Joiner; import com.google.common.base.Throwables; -import fr.ulr.sammoa.application.device.DeviceTechnicalException; import jaxx.runtime.JAXXUtil; import jaxx.runtime.SwingUtil; import org.apache.commons.beanutils.NestedNullException; @@ -208,7 +207,7 @@ return file == null ? incoming : new File(file); } - public static void updateBusyState(JComponent ui, boolean busy) { + public static void updateBusyState(Component ui, boolean busy) { if (busy) { // ui bloquee if (logger.isDebugEnabled()) { @@ -224,11 +223,7 @@ } } - public static void showError(Component ui, DeviceTechnicalException ex) { - String message = ex.getMessage(); - if (ex.getCause() != null) { - message += " : " + ex.getCause().getMessage(); - } + public static void showErrorMessage(Component ui, String message) { JOptionPane.showMessageDialog( ui, message, Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 2012-08-08 18:26:33 UTC (rev 373) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ShpImporter.java 2012-08-09 09:35:36 UTC (rev 374) @@ -47,76 +47,69 @@ @Override protected String onActionPerformed(File file) throws IOException { - String result; - try { - - File dbfFile; - String fileName = file.getName(); - File sourceDirectory = file.getParentFile(); - - String ext = Files.getFileExtension(fileName); - int extIndex = fileName.lastIndexOf(ext); - final String fileNameWithoutExt = fileName.substring(0, extIndex); + File dbfFile; + String fileName = file.getName(); + File sourceDirectory = file.getParentFile(); + String ext = Files.getFileExtension(fileName); + int extIndex = fileName.lastIndexOf(ext); + final String fileNameWithoutExt = fileName.substring(0, extIndex); + + if (logger.isDebugEnabled()) { + logger.debug("Source directory '" + sourceDirectory.getAbsolutePath() + "' and fileName '" + fileNameWithoutExt + "'"); + } + + if (!ext.equals("dbf")) { + + fileName = fileNameWithoutExt + "dbf"; + if (logger.isDebugEnabled()) { - logger.debug("Source directory '" + sourceDirectory.getAbsolutePath() + "' and fileName '" + fileNameWithoutExt + "'"); + logger.debug(String.format("Use dbfFile %s for import", fileName)); } - if (!ext.equals("dbf")) { + dbfFile = new File(sourceDirectory, fileName); - fileName = fileNameWithoutExt + "dbf"; - - if (logger.isDebugEnabled()) { - logger.debug(String.format("Use dbfFile %s for import", fileName)); - } - - dbfFile = new File(sourceDirectory, fileName); - - if (!dbfFile.exists()) { - throw new FileNotFoundException("Can't found dbf file '" + dbfFile.getAbsolutePath() + "' for import"); - } - - } else { - dbfFile = file; + if (!dbfFile.exists()) { + throw new FileNotFoundException("Can't found dbf file '" + dbfFile.getAbsolutePath() + "' for import"); } - - DbfImport<E> importer = new DbfImport<E>(getModel(), dbfFile.toURI().toURL()); - - result = onActionPerformed(importer); - String[] files = sourceDirectory.list(new FilenameFilter() { + } else { + dbfFile = file; + } - @Override - public boolean accept(File dir, String fullName) { - String extension = Files.getFileExtension(fullName); - int extIndex = fullName.lastIndexOf(extension); - String name = fullName.substring(0, extIndex); - if (logger.isDebugEnabled()) { - logger.debug(String.format("Read file : %s [ext = %s] -> check equals for %s", - fullName, - extension, - name) - ); - } - return fileNameWithoutExt.equals(name); - } - }); + DbfImport<E> importer = new DbfImport<E>(getModel(), dbfFile.toURI().toURL()); - for (String name : files) { - String extension = Files.getFileExtension(name); - File sourceFile = new File(sourceDirectory, name); - File targetFile = new File(getCopyDirectory(), getCopyFileName() + "." + extension); - if (logger.isInfoEnabled()) { - logger.info(String.format("Copy file '%1$s' to '%2$s'", - sourceFile.getAbsolutePath(), - targetFile.getAbsolutePath()) + String result = onActionPerformed(importer); + + String[] files = sourceDirectory.list(new FilenameFilter() { + + @Override + public boolean accept(File dir, String fullName) { + String extension = Files.getFileExtension(fullName); + int extIndex = fullName.lastIndexOf(extension); + String name = fullName.substring(0, extIndex); + if (logger.isDebugEnabled()) { + logger.debug(String.format("Read file : %s [ext = %s] -> check equals for %s", + fullName, + extension, + name) ); } - FileUtils.copyFile(sourceFile, targetFile); + return fileNameWithoutExt.equals(name); } + }); - } catch (IOException e) { - throw e; + for (String name : files) { + String extension = Files.getFileExtension(name); + File sourceFile = new File(sourceDirectory, name); + File targetFile = new File(getCopyDirectory(), getCopyFileName() + "." + extension); + if (logger.isInfoEnabled()) { + logger.info(String.format("Copy file '%1$s' to '%2$s'", + sourceFile.getAbsolutePath(), + targetFile.getAbsolutePath()) + ); + } + FileUtils.copyFile(sourceFile, targetFile); } return result; }