r454 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-application/src/main/java/fr/ulr/sammoa/application/io sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing sammoa-ui-swing/src/main/
Author: tchemit Date: 2012-08-21 18:12:32 +0200 (Tue, 21 Aug 2012) New Revision: 454 Url: http://forge.codelutin.com/repositories/revision/sammoa/454 Log: refs #1269: Import/Export base H2 (begin of import (referential are ok now)) + use last api from topia Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistenceHelper.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightImportEntry.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java trunk/sammoa-ui-swing/src/main/resources/icons/action-information.png Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorages.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationModel.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/java-info.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/java-info.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ButtonActionTableCellEditorRenderer.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-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-08-21 16:12:32 UTC (rev 454) @@ -970,4 +970,17 @@ } } } + + public Flight getFlightByNaturalId(Map<String, Object> naturalId) { + TopiaContext tx = beginTransaction(); + try { + FlightDAO dao = SammoaDAOHelper.getFlightDAO(tx); + Flight result = dao.findByProperties(naturalId); + return result; + } catch (TopiaException e) { + throw new SammoaTechnicalException(e); + } finally { + endTransaction(tx); + } + } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java 2012-08-21 16:12:32 UTC (rev 454) @@ -55,6 +55,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -64,6 +65,10 @@ */ public class ReferentialService extends SammoaServiceSupport { + //------------------------------------------------------------------------// + //-- Region methods ------------------------------------------------------// + //------------------------------------------------------------------------// + public List<Region> getRegions() { TopiaContext transaction = beginTransaction(); @@ -128,6 +133,45 @@ } } + //------------------------------------------------------------------------// + //-- Species methods -----------------------------------------------------// + //------------------------------------------------------------------------// + + public List<Species> getAllSpecies(Campaign campaign) { + Preconditions.checkNotNull(campaign); + + TopiaContext transaction = beginTransaction(); + try { + SpeciesDAO dao = SammoaDAOHelper.getSpeciesDAO(transaction); + List<Species> result = dao.findAllByRegion(campaign.getRegion()); + return result; + + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } finally { + endTransaction(transaction); + } + } + + public Collection<Species> getAllValidSpecies() { + + TopiaContext transaction = beginTransaction(); + try { + + SpeciesDAO dao = SammoaDAOHelper.getSpeciesDAO(transaction); + Collection<Species> result = dao.findAllByLocalCreation(false); + return result; + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } finally { + endTransaction(transaction); + } + } + + //------------------------------------------------------------------------// + //-- Campaign methods ----------------------------------------------------// + //------------------------------------------------------------------------// + public List<Campaign> getCampaigns() { TopiaContext transaction = beginTransaction(); @@ -144,6 +188,34 @@ } } + public Campaign getCampaignByNaturalId(Map<String, Object> naturalId) { + TopiaContext tx = beginTransaction(); + try { + CampaignDAO dao = SammoaDAOHelper.getCampaignDAO(tx); + Campaign result = dao.findByProperties(naturalId); + return result; + } catch (TopiaException e) { + throw new SammoaTechnicalException(e); + } finally { + endTransaction(tx); + } + } + + public Campaign getCampaign(String topiaId) { + Preconditions.checkNotNull(topiaId); + + TopiaContext transaction = beginTransaction(); + try { + CampaignDAO dao = SammoaDAOHelper.getCampaignDAO(transaction); + Campaign result = dao.findByTopiaId(topiaId); + return result; + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } finally { + endTransaction(transaction); + } + } + public String saveCampaign(Campaign campaign) { Preconditions.checkNotNull(campaign); @@ -205,21 +277,73 @@ } } - public Campaign getCampaign(String topiaId) { - Preconditions.checkNotNull(topiaId); + public void deleteCampaign(String campaignId) { + Preconditions.checkNotNull(campaignId); - TopiaContext transaction = beginTransaction(); + TopiaContext tx = beginTransaction(); try { - CampaignDAO dao = SammoaDAOHelper.getCampaignDAO(transaction); - Campaign result = dao.findByTopiaId(topiaId); - return result; + CampaignDAO dao = SammoaDAOHelper.getCampaignDAO(tx); + + Campaign campaign = dao.findByTopiaId(campaignId); + + Preconditions.checkNotNull(campaign); + + FlightService flightService = getService(FlightService.class); + + // delete all flights from db + List<Flight> flights = flightService.getFlights(tx, campaign); + + for (Flight flight : flights) { + flightService.deleteFlightInDb(tx, flight.getTopiaId()); + } + + // delete observers and observerPositions + ObserverDAO observerDAO = SammoaDAOHelper.getObserverDAO(tx); + List<Observer> observers = observerDAO.findAllByCampaign(campaign); + ObserverPositionDAO observerPositionDAO = + SammoaDAOHelper.getObserverPositionDAO(tx); + Set<ObserverPosition> positions = Sets.newHashSet(); + for (Observer observer : observers) { + positions.addAll(observerPositionDAO.findAllByObserver(observer)); + } + observerDAO.deleteAll(observers); + observerPositionDAO.deleteAll(positions); + + // delete transects + List<Transect> transects = getAllTransects(tx, campaign); + TransectDAO transectDAO = SammoaDAOHelper.getTransectDAO(tx); + transectDAO.deleteAll(transects); + + // delete strates + List<Strate> strates = getAllStrates(tx, campaign); + StrateDAO strateDAO = SammoaDAOHelper.getStrateDAO(tx); + strateDAO.deleteAll(strates); + + // delete sectors + SectorDAO sectorDAO = SammoaDAOHelper.getSectorDAO(tx); + List<Sector> sectors = sectorDAO.findAllByCampaign(campaign); + sectorDAO.deleteAll(sectors); + + // delete campaign + dao.delete(campaign); + + // commit + tx.commitTransaction(); + } catch (TopiaException e) { - throw new TopiaRuntimeException(e); + throw new SammoaTechnicalException(e); } finally { - endTransaction(transaction); + endTransaction(tx); } + + // delete campaign storage + deleteCampaignStorage(campaignId); } + //------------------------------------------------------------------------// + //-- Transect methods ----------------------------------------------------// + //------------------------------------------------------------------------// + public List<Transect> getAllTransects(Campaign campaign) { Preconditions.checkNotNull(campaign); @@ -247,63 +371,23 @@ } } - public List<Strate> getAllStrates(Campaign campaign) { - Preconditions.checkNotNull(campaign); + public Transect getTransect(String transectId) { + Preconditions.checkNotNull(transectId); TopiaContext transaction = beginTransaction(); try { - List<Strate> result = getAllStrates(transaction, campaign); - return result; - } finally { - endTransaction(transaction); - } - } - - public List<Strate> getAllStrates(TopiaContext tx, Campaign campaign) { - Preconditions.checkNotNull(tx); - Preconditions.checkNotNull(campaign); - - try { - StrateDAO dao = SammoaDAOHelper.getStrateDAO(tx); - List<Strate> result = dao.findAllByCampaignOrderedByCode(campaign); + TransectDAO dao = SammoaDAOHelper.getTransectDAO(transaction); + Transect result = dao.findByTopiaId(transectId); return result; } catch (TopiaException e) { throw new TopiaRuntimeException(e); - } - } - public List<Species> getAllSpecies(Campaign campaign) { - Preconditions.checkNotNull(campaign); - - TopiaContext transaction = beginTransaction(); - try { - SpeciesDAO dao = SammoaDAOHelper.getSpeciesDAO(transaction); - List<Species> result = dao.findAllByRegion(campaign.getRegion()); - return result; - - } catch (TopiaException e) { - throw new TopiaRuntimeException(e); } finally { endTransaction(transaction); } } - public Collection<Species> getAllValidSpecies() { - - TopiaContext transaction = beginTransaction(); - try { - - SpeciesDAO dao = SammoaDAOHelper.getSpeciesDAO(transaction); - Collection<Species> result = dao.findAllByLocalCreation(false); - return result; - } catch (TopiaException e) { - throw new TopiaRuntimeException(e); - } finally { - endTransaction(transaction); - } - } - public String createTransect(Transect transect) { Preconditions.checkNotNull(transect); @@ -334,23 +418,40 @@ } } - public Transect getTransect(String transectId) { - Preconditions.checkNotNull(transectId); + //------------------------------------------------------------------------// + //-- Strate methods ------------------------------------------------------// + //------------------------------------------------------------------------// + public List<Strate> getAllStrates(Campaign campaign) { + Preconditions.checkNotNull(campaign); + TopiaContext transaction = beginTransaction(); try { - - TransectDAO dao = SammoaDAOHelper.getTransectDAO(transaction); - Transect result = dao.findByTopiaId(transectId); + List<Strate> result = getAllStrates(transaction, campaign); return result; - } catch (TopiaException e) { - throw new TopiaRuntimeException(e); } finally { endTransaction(transaction); } } + public List<Strate> getAllStrates(TopiaContext tx, Campaign campaign) { + Preconditions.checkNotNull(tx); + Preconditions.checkNotNull(campaign); + + try { + StrateDAO dao = SammoaDAOHelper.getStrateDAO(tx); + List<Strate> result = dao.findAllByCampaignOrderedByCode(campaign); + return result; + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } + } + + //------------------------------------------------------------------------// + //-- Observer methods ----------------------------------------------------// + //------------------------------------------------------------------------// + public List<Observer> getAllObservers(Campaign campaign) { Preconditions.checkNotNull(campaign); @@ -372,69 +473,8 @@ } } - public void deleteCampaign(String campaignId) { - Preconditions.checkNotNull(campaignId); - TopiaContext tx = beginTransaction(); - try { - CampaignDAO dao = SammoaDAOHelper.getCampaignDAO(tx); - Campaign campaign = dao.findByTopiaId(campaignId); - - Preconditions.checkNotNull(campaign); - - FlightService flightService = getService(FlightService.class); - - // delete all flights from db - List<Flight> flights = flightService.getFlights(tx, campaign); - - for (Flight flight : flights) { - flightService.deleteFlightInDb(tx, flight.getTopiaId()); - } - - // delete observers and observerPositions - ObserverDAO observerDAO = SammoaDAOHelper.getObserverDAO(tx); - List<Observer> observers = observerDAO.findAllByCampaign(campaign); - ObserverPositionDAO observerPositionDAO = - SammoaDAOHelper.getObserverPositionDAO(tx); - Set<ObserverPosition> positions = Sets.newHashSet(); - for (Observer observer : observers) { - positions.addAll(observerPositionDAO.findAllByObserver(observer)); - } - observerDAO.deleteAll(observers); - observerPositionDAO.deleteAll(positions); - - // delete transects - List<Transect> transects = getAllTransects(tx, campaign); - TransectDAO transectDAO = SammoaDAOHelper.getTransectDAO(tx); - transectDAO.deleteAll(transects); - - // delete strates - List<Strate> strates = getAllStrates(tx, campaign); - StrateDAO strateDAO = SammoaDAOHelper.getStrateDAO(tx); - strateDAO.deleteAll(strates); - - // delete sectors - SectorDAO sectorDAO = SammoaDAOHelper.getSectorDAO(tx); - List<Sector> sectors = sectorDAO.findAllByCampaign(campaign); - sectorDAO.deleteAll(sectors); - - // delete campaign - dao.delete(campaign); - - // commit - tx.commitTransaction(); - - } catch (TopiaException e) { - throw new SammoaTechnicalException(e); - } finally { - endTransaction(tx); - } - - // delete campaign storage - deleteCampaignStorage(campaignId); - } - public void deleteAllData() { Iterable<String> campaignIds; Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java 2012-08-21 16:12:32 UTC (rev 454) @@ -23,13 +23,23 @@ * #L% */ +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import fr.ulr.sammoa.application.DecoratorService; import fr.ulr.sammoa.persistence.Campaign; +import fr.ulr.sammoa.persistence.Region; import org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.nuiton.util.decorator.Decorator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; +import java.util.Iterator; +import java.util.Map; import java.util.Set; /** @@ -38,10 +48,16 @@ * @author tchemit <chemit@codelutin.com> * @since 0.6 */ -public class CampaignStorage extends SammoaStorage<Campaign> { +public class CampaignStorage extends SammoaStorage<Campaign> implements Iterable<FlightStorage> { private static final long serialVersionUID = 1L; + /** Logger. */ + private static final Logger logger = + LoggerFactory.getLogger(CampaignStorage.class); + + protected Map<String, FlightStorage> flightStorages; + CampaignStorage(File dataDirectory, String id) { super(dataDirectory, id, "campaign.properties"); } @@ -64,14 +80,20 @@ public Set<String> getFlightIds() { String[] files = getFlightDirectory().list(DirectoryFileFilter.INSTANCE); - Set<String> result = Sets.newHashSet(files); + Set<String> result = files == null ? + Sets.<String>newHashSet() : Sets.newHashSet(files); return result; } public FlightStorage getFlightStorage(String flightId) { - FlightStorage flightStorage = - new FlightStorage(getFlightDirectory(), flightId); - return flightStorage; + Preconditions.checkNotNull(flightId); + FlightStorage result = getFlightStorages().get(flightId); + if (result == null) { + + // create this new flight storage + addFlightInStore(result = getFlightToStorage().apply(flightId)); + } + return result; } @Override @@ -81,7 +103,63 @@ Decorator<Campaign> decorator = decoratorService.getDecoratorByType(Campaign.class); - String campaignName = decorator.toString(campaign); - getProperties().put("name", campaignName); + putInProperties("name", decorator.toString(campaign)); + putInProperties(Campaign.PROPERTY_CODE, campaign.getCode()); + putInProperties(Campaign.PROPERTY_REGION + "." + + Region.PROPERTY_CODE, campaign.getRegion().getCode()); } + + @Override + public Map<String, Object> getNaturalId() { + Map<String, Object> result = Maps.newHashMap(); + addInMap(Campaign.PROPERTY_CODE, result); + addInMap(Campaign.PROPERTY_REGION + "." + Region.PROPERTY_CODE, result); + return result; + } + + @Override + public Iterator<FlightStorage> iterator() { + return getFlightStorages().values().iterator(); + } + + protected Map<String, FlightStorage> getFlightStorages() { + if (flightStorages == null) { + + flightStorages = Maps.newTreeMap(); + for (FlightStorage s : Iterables.transform(getFlightIds(), getFlightToStorage())) { + addFlightInStore(s); + } + } + return flightStorages; + } + + protected transient Function<String, FlightStorage> flightToStorage; + + protected Function<String, FlightStorage> getFlightToStorage() { + if (flightToStorage == null) { + flightToStorage = new Function<String, FlightStorage>() { + @Override + public FlightStorage apply(String input) { + return new FlightStorage(getFlightDirectory(), input); + } + }; + } + return flightToStorage; + } + + protected void addFlightInStore(FlightStorage flightStorage) { + if (logger.isInfoEnabled()) { + logger.info("Add flightStorage {} to store {}", flightStorage, this); + } + flightStorages.put(flightStorage.getId(), flightStorage); + } + + @Override + public String toString() { + return new ToStringBuilder(this). + append("directory", getDirectory()). + append("id", getId()). + append("nbFlightStoragesLoaded", flightStorages == null ? 0 : flightStorages.size()). + toString(); + } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-08-21 16:12:32 UTC (rev 454) @@ -23,12 +23,16 @@ * #L% */ +import com.google.common.collect.Maps; import fr.ulr.sammoa.application.DecoratorService; +import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; +import fr.ulr.sammoa.persistence.Region; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.nuiton.util.decorator.Decorator; import java.io.File; -import java.util.Properties; +import java.util.Map; /** * Storage for a flight. @@ -53,13 +57,33 @@ } @Override + public Map<String, Object> getNaturalId() { + Map<String, Object> result = Maps.newHashMap(); + addInMap(Flight.PROPERTY_SYSTEM_ID, result); + addIntInMap(Flight.PROPERTY_FLIGHT_NUMBER, result); + addInMap(Flight.PROPERTY_CAMPAIGN + "." + Campaign.PROPERTY_CODE, result); + addInMap(Flight.PROPERTY_CAMPAIGN + "." + Campaign.PROPERTY_REGION + "." + Region.PROPERTY_CODE, result); + return result; + } + + @Override public void fillProperties(Flight flight, DecoratorService decoratorService) { - Properties properties = getProperties(); Decorator<Flight> decorator = decoratorService.getDecoratorByType(Flight.class); - String flightName = decorator.toString(flight); - properties.put("name", flightName); + putInProperties("name", decorator.toString(flight)); + putInProperties(Flight.PROPERTY_SYSTEM_ID, flight.getSystemId()); + putInProperties(Flight.PROPERTY_FLIGHT_NUMBER, flight.getFlightNumber()); + putInProperties(Flight.PROPERTY_CAMPAIGN + "." + Campaign.PROPERTY_CODE, flight.getCampaign().getCode()); + putInProperties(Flight.PROPERTY_CAMPAIGN + "." + Campaign.PROPERTY_REGION + "." + Region.PROPERTY_CODE, flight.getCampaign().getRegion().getCode()); } + + @Override + public String toString() { + return new ToStringBuilder(this). + append("directory", getDirectory()). + append("id", getId()). + toString(); + } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java 2012-08-21 16:12:32 UTC (rev 454) @@ -34,6 +34,7 @@ import java.io.File; import java.io.IOException; import java.io.Serializable; +import java.util.Map; import java.util.Properties; /** @@ -60,8 +61,11 @@ /** Name of the properties file of the storage. */ private final String propertiesFilename; - public abstract void fillProperties(E entity, DecoratorService decoratorService); + public abstract Map<String, Object> getNaturalId(); + public abstract void fillProperties(E entity, + DecoratorService decoratorService); + SammoaStorage(File dataDirectory, String id, String propertiesFilename) { @@ -111,4 +115,22 @@ public void delete() throws IOException { FileUtils.deleteDirectory(getDirectory()); } + + protected void addInMap(String key, Map<String, Object> result) { + String property = getProperties().getProperty(key); + result.put(key, property); + } + + protected void addIntInMap(String key, Map<String, Object> result) { + String property = getProperties().getProperty(key); + result.put(key, Integer.valueOf(property)); + } + + protected void putInProperties(String key, Object value) { + getProperties().put(key, String.valueOf(value)); + } + + public String getName() { + return getProperties().getProperty("name"); + } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorages.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorages.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorages.java 2012-08-21 16:12:32 UTC (rev 454) @@ -109,4 +109,18 @@ FileUtils.forceMkdir(storage.getDirectory()); FileUtils.forceMkdir(storage.getAudioDirectory()); } + + public static void loadProperties(CampaignStorage storage) { + + try { + storage.loadProperties(); + + for (FlightStorage flightStorage : storage) { + flightStorage.loadProperties(); + } + } catch (IOException e) { + throw new SammoaTechnicalException( + "Could not load storage properties file", e); + } + } } Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationModel.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationModel.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationModel.java 2012-08-21 16:12:32 UTC (rev 454) @@ -24,38 +24,36 @@ * #L% */ -import com.google.common.collect.Lists; +import fr.ulr.sammoa.application.io.CampaignStorage; -import java.io.File; -import java.util.List; - /** - * Model of sammoa import. + * Model of application import. * * @author tchemit <chemit@codelutin.com> * @since 0.6 */ public class ImportApplicationModel { - public static ImportApplicationModel newModel(File importFile, - List<String> flightIds) { + public static ImportApplicationModel newModel(CampaignStorage storage, + Iterable<String> flightIds) { ImportApplicationModel result = new ImportApplicationModel(); - result.importFile = importFile; - result.flightIds = Lists.newArrayList(flightIds); + result.storage = storage; + result.flightIds = flightIds; return result; } - /** Import file that contains all the stuff to import. */ - protected File importFile; + /** Loaded campaign storage. */ + protected CampaignStorage storage; + /** All flight ids to import from the import file. */ - protected List<String> flightIds; + protected Iterable<String> flightIds; - public File getImportFile() { - return importFile; + public CampaignStorage getStorage() { + return storage; } - public List<String> getFlightIds() { + public Iterable<String> getFlightIds() { return flightIds; } } \ No newline at end of file Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java 2012-08-21 16:12:32 UTC (rev 454) @@ -23,19 +23,45 @@ * #L% */ +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.io.Files; import fr.ulr.sammoa.application.SammoaServiceSupport; import fr.ulr.sammoa.application.SammoaTechnicalException; import fr.ulr.sammoa.application.io.CampaignStorage; import fr.ulr.sammoa.application.io.SammoaStorages; +import fr.ulr.sammoa.persistence.SammoaDbMetas; +import fr.ulr.sammoa.persistence.SammoaEntityEnum; +import fr.ulr.sammoa.persistence.SammoaPersistenceHelper; +import org.apache.commons.io.Charsets; import org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.TopiaDAO; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.csv.EntityCsvModel; +import org.nuiton.topia.persistence.csv.in.ImportModelFactory; +import org.nuiton.topia.persistence.csv.in.TopiaCsvImports; +import org.nuiton.topia.persistence.metadata.AssociationMeta; +import org.nuiton.topia.persistence.metadata.ColumnMeta; +import org.nuiton.topia.persistence.metadata.DbMeta; +import org.nuiton.topia.persistence.metadata.MetaFilenameAware; +import org.nuiton.topia.persistence.metadata.TableMeta; import org.nuiton.util.TimeLog; import org.nuiton.util.ZipUtil; +import org.nuiton.util.csv.Import; +import org.nuiton.util.csv.ImportModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.io.Reader; +import java.util.Date; +import java.util.List; +import java.util.Map; /** * Service to import sammoa files. @@ -52,24 +78,6 @@ private static final TimeLog timeLog = new TimeLog(ImportApplicationService.class); - public void importApplication(ImportApplicationModel model) { - - if (logger.isInfoEnabled()) { - logger.info("Start Application import to {} :: {}", - model.getImportFile()); - } - - long startTime = TimeLog.getTime(); - - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - //BOUH! - } - - timeLog.log(startTime, "importApplication", "after Callback execution"); - } - public CampaignStorage loadCampaignStorage(File file) { File tmpDirectory = context.getConfig().getTmpDirectory(); File deflateDirectory = new File(tmpDirectory, file.getName() + "_" + System.nanoTime()); @@ -88,6 +96,198 @@ String campaignId = campaignDirectory.getName(); CampaignStorage storage = SammoaStorages.getCampaignStorage( deflateDirectory, campaignId); + + SammoaStorages.loadProperties(storage); + return storage; } + + public void importApplication(ImportApplicationModel model) { + + CampaignStorage storage = model.getStorage(); + + if (logger.isInfoEnabled()) { + logger.info("Start Application import to {} :: {}", + storage); + } + + long startTime = TimeLog.getTime(); + + DbMeta<SammoaEntityEnum> dbMetas = persistence.getDbMetas(); + SammoaPersistenceHelper persistenceHelper = persistence.getPersistenceHelper(); + MetaFilenameAware<SammoaEntityEnum>[] referencialEntries = SammoaDbMetas.getReferencialEntries(dbMetas); + + List<String> missingEntries = Lists.newArrayList(); + Map<MetaFilenameAware<SammoaEntityEnum>, File> fileMap = TopiaCsvImports.discoverEntries( + referencialEntries, + storage.getCsvDirectory(), + missingEntries); + + Preconditions.checkState( + missingEntries.isEmpty(), + "It miss some csv files for referential import :" + + missingEntries); + + Map<SammoaEntityEnum, Map<String, TopiaEntity>> universe = Maps.newTreeMap(); + SammoaImportModelFactory modelFactory = new SammoaImportModelFactory(universe); + + TopiaContext tx = beginTransaction(); + + try { + + for (MetaFilenameAware<SammoaEntityEnum> entry : referencialEntries) { + + File entryFile = fileMap.get(entry); + TopiaDAO<? extends TopiaEntity> dao = persistenceHelper.getDAO(tx, entry.getSource().getContract()); + importReferential(dao, + modelFactory, + entryFile, + (TableMeta<SammoaEntityEnum>) entry); + } + + tx.commitTransaction(); + + startTime = timeLog.log(startTime, "importApplication", "after referential import"); + } catch (TopiaException e) { + throw new SammoaTechnicalException("Could not import", e); + } catch (IOException e) { + throw new SammoaTechnicalException("Could not import", e); + } finally { + endTransaction(tx); + } + + try { + storage.delete(); + } catch (IOException e) { + throw new SammoaTechnicalException( + "Could not delete storage", e); + } + + timeLog.log(startTime, "importApplication", "after Callback execution"); + } + + protected <E extends TopiaEntity> void importReferential(TopiaDAO<E> dao, + SammoaImportModelFactory modelFactory, + File entryFile, + TableMeta<SammoaEntityEnum> meta) throws IOException, TopiaException { + + SammoaEntityEnum entityEnum = meta.getSource(); + + // create new universe + Map<String, TopiaEntity> universe = Maps.newTreeMap(); + modelFactory.getUniverse().put(entityEnum, universe); + + Reader reader = Files.newReader(entryFile, Charsets.UTF_8); + try { + long s0 = TimeLog.getTime(); + + if (logger.isInfoEnabled()) { + logger.info("Will import " + meta); + } + ImportModel<TopiaEntity> model = modelFactory.buildForImport(meta); + Import<TopiaEntity> importer = Import.newImport(model, reader); + try { + + for (TopiaEntity entity : importer) { + + String topiaId = entity.getTopiaId(); + + Map<String, Object> properties = meta.prepareCreate(entity, null); + E existingEntity = dao.findByProperties(properties); + if (existingEntity == null) { + + // new entity to create + E entityToSave = dao.create(properties); + String newTopiaId = entityToSave.getTopiaId(); + Date topiaCreateDate = entityToSave.getTopiaCreateDate(); + meta.copy(entity, entityToSave); + entityToSave.setTopiaId(newTopiaId); + entityToSave.setTopiaCreateDate(topiaCreateDate); + + if (logger.isInfoEnabled()) { + logger.info("Create entity [{} becomes {}] with naturalId {}", new Object[]{topiaId, newTopiaId, properties}); + } + universe.put(topiaId, entityToSave); + } else { + // existing entity, nothing to create + // just add a ref into universe to make translation possible by foreign keys + + if (logger.isDebugEnabled()) { + logger.debug("Existing entity [{}] with naturalId {}, do not create anything", topiaId, properties); + } + + universe.put(topiaId, existingEntity); + } + + } + + } finally { + importer.close(); + } + + timeLog.log(s0, "importFile::done"); + + s0 = TimeLog.getTime(); + + persistence.flushTransaction(dao.getContext()); + + timeLog.log(s0, "importFile::flushTransaction"); + } finally { + reader.close(); + } + } + + protected class SammoaImportModelFactory implements ImportModelFactory<SammoaEntityEnum> { + + final Map<SammoaEntityEnum, Map<String, TopiaEntity>> universe; + + private SammoaImportModelFactory(Map<SammoaEntityEnum, Map<String, TopiaEntity>> universe) { + this.universe = universe; + } + + public Map<SammoaEntityEnum, Map<String, TopiaEntity>> getUniverse() { + return universe; + } + + public <E extends TopiaEntity> Import<E> newModel(TableMeta<SammoaEntityEnum> meta, Reader reader) { + ImportModel<E> model = buildForImport(meta); + Import<E> importer = Import.newImport(model, reader); + return importer; + } + + @Override + public <E extends TopiaEntity> ImportModel<E> buildForImport(TableMeta<SammoaEntityEnum> meta) { + + EntityCsvModel<SammoaEntityEnum, E> model = EntityCsvModel.newModel( + config.getCsvSeparator(), + meta, + TopiaEntity.TOPIA_ID + ); + + for (ColumnMeta columnMeta : meta) { + String propertyName = columnMeta.getName(); + Class<?> type = columnMeta.getType(); + if (!columnMeta.isFK()) { + model.addDefaultColumn(propertyName, type); + } else { + + Class<TopiaEntity> entityType = (Class<TopiaEntity>) type; + SammoaEntityEnum entityEnum = SammoaEntityEnum.valueOf(entityType); + Map<String, TopiaEntity> entitiesbyId = universe.get(entityEnum); + model.addForeignKeyForImport(propertyName, entityType, entitiesbyId); + } + } + return model; + } + + @Override + public ImportModel<Map<String, Object>> buildForImport(AssociationMeta<SammoaEntityEnum> meta) { + return null; + } + + @Override + public boolean isNMAssociationMeta(AssociationMeta<SammoaEntityEnum> meta) { + return false; + } + } } \ No newline at end of file Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java 2012-08-21 16:12:32 UTC (rev 454) @@ -221,7 +221,7 @@ csvDirectory); ExportEntityVisitor<SammoaEntityEnum> exportVisitor = - ExportEntityVisitor.newVisitor(dbMetas.getEntityEnumProvider(), + ExportEntityVisitor.newVisitor(dbMetas.getPersistenceHelper(), exportContexts); FlightService flightService = getService(FlightService.class); Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaDbMetas.java 2012-08-21 16:12:32 UTC (rev 454) @@ -28,12 +28,12 @@ import org.nuiton.topia.persistence.metadata.DbMeta; import org.nuiton.topia.persistence.metadata.MetaFilenameAware; import org.nuiton.topia.persistence.metadata.Metadatas; -import org.nuiton.topia.persistence.metadata.TopiaEntityEnumProvider; import java.util.List; +import java.util.Map; /** - * TODO + * Useful methods aroun meta datas of sammoa entities. * * @author tchemit <chemit@codelutin.com> * @since 0.6 @@ -43,8 +43,8 @@ private static final SammoaEntityEnum[] EMPTY_ENTITY_TYPE_ARRAY = new SammoaEntityEnum[0]; - public static DbMeta<SammoaEntityEnum> newDbMetas() { - return DbMeta.newDbMeta(new SammoaTopiaEntityEnumProvider(), + public static DbMeta<SammoaEntityEnum> newDbMetas(SammoaPersistenceHelper persistenceHelper) { + return DbMeta.newDbMeta(persistenceHelper, SammoaEntityEnum.values(), EMPTY_ENTITY_TYPE_ARRAY ); @@ -77,12 +77,12 @@ // with no dep result.add(SammoaEntityEnum.Region); + result.add(SammoaEntityEnum.Species); result.add(SammoaEntityEnum.Campaign); - result.add(SammoaEntityEnum.Strate); + result.add(SammoaEntityEnum.Observer); result.add(SammoaEntityEnum.Sector); + result.add(SammoaEntityEnum.Strate); result.add(SammoaEntityEnum.Transect); - result.add(SammoaEntityEnum.Observer); - result.add(SammoaEntityEnum.Species); return result.toArray(new SammoaEntityEnum[result.size()]); } @@ -108,6 +108,15 @@ return entities.toArray(new MetaFilenameAware[entities.size()]); } + public static Map<SammoaEntityEnum, MetaFilenameAware<SammoaEntityEnum>> getReferencialEntriesByType(DbMeta<SammoaEntityEnum> dbMeta) { + List<MetaFilenameAware<SammoaEntityEnum>> entities = Lists.newArrayList(); + List<MetaFilenameAware<SammoaEntityEnum>> associations = Lists.newArrayList(); + entities.addAll(associations); + Metadatas.addEntries(dbMeta, entities, associations, getReferenceTypes()); + return Metadatas.uniqueIndex(entities); + } + + public static MetaFilenameAware<SammoaEntityEnum>[] getDataEntries(DbMeta<SammoaEntityEnum> dbMeta) { List<MetaFilenameAware<SammoaEntityEnum>> entities = Lists.newArrayList(); @@ -124,17 +133,4 @@ return Metadatas.split(associations); } - /** - * Implementation of {@link TopiaEntityEnumProvider} for Sammoa. - * - * @author tchemit <chemit@codelutin.com> - * @since 0.6 - */ - public static class SammoaTopiaEntityEnumProvider implements TopiaEntityEnumProvider<SammoaEntityEnum> { - - @Override - public <E> SammoaEntityEnum getEntityEnum(Class<E> type) { - return SammoaEntityEnum.valueOf(type); - } - } } Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java 2012-08-21 16:12:32 UTC (rev 454) @@ -30,6 +30,7 @@ import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaNotFoundException; import org.nuiton.topia.TopiaRuntimeException; +import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.metadata.DbMeta; @@ -59,6 +60,8 @@ protected AutoSaveListener autoSaveListener; + protected SammoaPersistenceHelper persistenceHelper; + protected DbMeta<SammoaEntityEnum> dbMetas; /** @@ -191,9 +194,16 @@ } } + public SammoaPersistenceHelper getPersistenceHelper() { + if (persistenceHelper == null) { + persistenceHelper = new SammoaPersistenceHelper(); + } + return persistenceHelper; + } + public DbMeta<SammoaEntityEnum> getDbMetas() { if (dbMetas == null) { - dbMetas = SammoaDbMetas.newDbMetas(); + dbMetas = SammoaDbMetas.newDbMetas(getPersistenceHelper()); } return dbMetas; } @@ -228,4 +238,7 @@ } } + public void flushTransaction(TopiaContext tx) throws TopiaException { + ((TopiaContextImplementor) tx).getHibernate().flush(); + } } Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistenceHelper.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistenceHelper.java (rev 0) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistenceHelper.java 2012-08-21 16:12:32 UTC (rev 454) @@ -0,0 +1,31 @@ +package fr.ulr.sammoa.persistence; + +import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.TopiaRuntimeException; +import org.nuiton.topia.persistence.TopiaDAO; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaPersistenceHelper; + +/** + * Implementation of {@link TopiaPersistenceHelper} for Sammoa. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.6 + */ +public class SammoaPersistenceHelper implements TopiaPersistenceHelper<SammoaEntityEnum> { + + @Override + public <E extends TopiaEntity> SammoaEntityEnum getEntityEnum(Class<E> type) { + return SammoaEntityEnum.valueOf(type); + } + + @Override + public <E extends TopiaEntity> TopiaDAO<E> getDAO(TopiaContext tx, Class<E> type) { + try { + return SammoaDAOHelper.<E, TopiaDAO<E>>getDAO(tx, type); + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } + } +} Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistenceHelper.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java =================================================================== --- trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDbMetasTest.java 2012-08-21 16:12:32 UTC (rev 454) @@ -43,7 +43,7 @@ @Before public void setUp() throws Exception { - dbMetas = SammoaDbMetas.newDbMetas(); + dbMetas = SammoaDbMetas.newDbMetas(new SammoaPersistenceHelper()); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-08-21 16:12:32 UTC (rev 454) @@ -35,6 +35,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.swing.UIManager; +import java.awt.Color; import java.io.File; import java.io.IOException; import java.util.Locale; @@ -89,6 +91,8 @@ } } + UIManager.put("BlockingLayerUI.blockingColor", new Color(50,50,50)); + MainUI mainUI = new MainUI(context); mainUI.setVisible(true); } Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightImportEntry.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightImportEntry.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightImportEntry.java 2012-08-21 16:12:32 UTC (rev 454) @@ -0,0 +1,71 @@ +package fr.ulr.sammoa.ui.swing.io.input.application; +/* + * #%L + * SAMMOA :: UI Swing + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ulr.sammoa.application.io.FlightStorage; +import fr.ulr.sammoa.persistence.Flight; +import org.jdesktop.beans.AbstractSerializableBean; + +/** + * Define a flight storage entry found in storage to import with his optional + * existing flight from db. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.6 + */ +public class FlightImportEntry extends AbstractSerializableBean { + + private static final long serialVersionUID = 1L; + + /** The storage of the flight loaded from the sammoa file. */ + protected final FlightStorage flightStorage; + + /** The optional existing flight loaded from db. */ + protected final Flight existingFlight; + + /** Flag to treat or not the incoming flight. */ + protected boolean treat; + + public FlightImportEntry(FlightStorage flightStorage, + Flight existingFlight) { + this.flightStorage = flightStorage; + this.existingFlight = existingFlight; + } + + public FlightStorage getFlightStorage() { + return flightStorage; + } + + public Flight getExistingFlight() { + return existingFlight; + } + + public boolean isTreat() { + return treat; + } + + public void setTreat(boolean treat) { + this.treat = treat; + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightImportEntry.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java 2012-08-21 16:12:32 UTC (rev 454) @@ -0,0 +1,99 @@ +package fr.ulr.sammoa.ui.swing.io.input.application; +/* + * #%L + * SAMMOA :: UI Swing + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import jaxx.runtime.SwingUtil; + +import javax.swing.table.AbstractTableModel; +import java.util.List; + +/** + * Table model with flight entries to import. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.6 + */ +public class FlightTableModel extends AbstractTableModel { + + private static final long serialVersionUID = 1L; + + protected final List<FlightImportEntry> data; + + protected final boolean canSelect; + + protected Class<?>[] COLUMN_TYPES = {String.class, Boolean.class}; + + public FlightTableModel(List<FlightImportEntry> data, boolean canSelect) { + Preconditions.checkNotNull(data); + this.data = data; + this.canSelect = canSelect; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return canSelect && columnIndex == 1; + } + + @Override + public Class<?> getColumnClass(int columnIndex) { + return COLUMN_TYPES[columnIndex]; + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public int getColumnCount() { + return canSelect ? 2 : 1; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + SwingUtil.ensureRowIndex(this, rowIndex); + SwingUtil.ensureColumnIndex(this, columnIndex); + FlightImportEntry flightImportEntry = data.get(rowIndex); + + Object result = null; + switch (columnIndex) { + case 0: + result = flightImportEntry.getFlightStorage().getName(); + break; + case 1: + result = flightImportEntry.isTreat(); + break; + } + return result; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + SwingUtil.ensureRowIndex(this, rowIndex); + SwingUtil.ensureColumnIndex(this, columnIndex); + FlightImportEntry flightImportEntry = data.get(rowIndex); + flightImportEntry.setTreat(Boolean.valueOf(aValue.toString())); + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/FlightTableModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css 2012-08-21 16:12:32 UTC (rev 454) @@ -39,4 +39,19 @@ #importButton { text: "sammoa.action.importApplication"; +} + +#loadImportFileButton { + text: "sammoa.action.loadImportApplicationFile"; + enabled:{model.isImportFileExist()} +} + +#loadImportFileResultInfo { + actionIcon:"information"; +} + +#busyBlockLayerUI { + useIcon:false; + blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; + block:{!model.isImportFileLoaded()}; } \ No newline at end of file Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx 2012-08-21 16:12:32 UTC (rev 454) @@ -30,8 +30,10 @@ fr.ulr.sammoa.ui.swing.SammoaUIContext jaxx.runtime.swing.editor.FileEditor + jaxx.runtime.swing.BlockingLayerUI java.awt.BorderLayout + javax.swing.UIManager static org.nuiton.i18n.I18n._ </import> @@ -56,6 +58,8 @@ <ImportApplicationUIHandler id='handler' initializer='getContextValue(ImportApplicationUIHandler.class)'/> + <BlockingLayerUI id='busyBlockLayerUI'/> + <Table fill='both' constraints='BorderLayout.CENTER'> <!-- import file --> <row> @@ -67,9 +71,37 @@ onActionPerformed='getModel().setImportFile(importFileEditor.getSelectedFile())'/> </cell> </row> + <!-- load import file --> + <row> + <cell fill='horizontal' weightx='1.0' columns='3'> + <JButton id='loadImportFileButton' + onActionPerformed='getHandler().loadStorage(model.getImportFile())'/> + </cell> + </row> + <!-- import file separator --> + <row> + <cell fill='horizontal' weightx='1.0' columns='3'> + <JSeparator id='importFileSeparator'/> + </cell> + </row> + <!-- load import file result --> + <row> + <cell fill='both' weightx='1.0' columns='3'> + <JPanel id='loadImportFileResultPanel' layout='{new BorderLayout()}' + decorator='boxed'> + <JLabel id='loadImportFileResultInfo' + constraints='BorderLayout.NORTH'/> + <JScrollPane id='loadImportFileResultFlightsPane' + constraints='BorderLayout.CENTER'> + <JTable id='loadImportFileResultFlightsTable'/> + </JScrollPane> + </JPanel> + </cell> + </row> + <!--import actions--> <row> - <cell columns='5' fill="both"> + <cell columns='3' fill="both"> <JPanel layout='{new GridLayout(1,2,0,0)}'> <JButton id='quitButton' onActionPerformed='getHandler().close()'/> <JButton id='importButton' Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-08-21 16:12:32 UTC (rev 454) @@ -23,25 +23,41 @@ * #L% */ +import com.google.common.collect.Lists; import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.ReferentialService; import fr.ulr.sammoa.application.io.CampaignStorage; +import fr.ulr.sammoa.application.io.FlightStorage; import fr.ulr.sammoa.application.io.input.application.ImportApplicationModel; import fr.ulr.sammoa.application.io.input.application.ImportApplicationService; import fr.ulr.sammoa.persistence.Campaign; +import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.ui.swing.SammoaScreen; 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 jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.editor.FileEditor; +import org.nuiton.util.FileUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; +import java.util.List; +import java.util.Map; +import static org.nuiton.i18n.I18n._; +import static org.nuiton.i18n.I18n.n_; + /** * UI Handler fo {@link ImportApplicationUI}. * @@ -90,9 +106,13 @@ @Override public void propertyChange(PropertyChangeEvent evt) { - if (ImportApplicationUIModel.PROPERTY_STORAGE.equals(evt.getPropertyName())) { + String propertyName = evt.getPropertyName(); + if (ImportApplicationUIModel.PROPERTY_STORAGE.equals(propertyName)) { CampaignStorage newValue = (CampaignStorage) evt.getNewValue(); onCampaignStorageChanged(newValue); + } else if (ImportApplicationUIModel.PROPERTY_IMPORT_FILE_LOADED.equals(propertyName)) { + boolean newValue = (Boolean) evt.getNewValue(); + onImportFileLoaded(newValue); } // else if (ImportApplicationUIModel.PROPERTY_FLIGHTS.equals(evt.getPropertyName())) { // Collection<Flight> newValue = (Collection<Flight>) evt.getNewValue(); @@ -107,6 +127,26 @@ @Override public void afterInitUI() { + + // Boolean editor/renderer on table + { + JTable table = ui.getLoadImportFileResultFlightsTable(); + TableCellEditor editor = table.getDefaultEditor(Boolean.class); + table.setDefaultEditor(boolean.class, editor); + TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class); + table.setDefaultRenderer(boolean.class, renderer); + } + + SwingUtil.setLayerUI(ui.getLoadImportFileResultPanel(), + ui.getBusyBlockLayerUI()); + + FileEditor importFileEditor = ui.getImportFileEditor(); + String absolutePath = FileUtil.getCurrentDirectory().getAbsolutePath(); + if (absolutePath.endsWith(File.separator + ".")) { + absolutePath = absolutePath.substring(0, absolutePath.length() - 2); + } + importFileEditor.setStartPath(absolutePath); + onImportFileLoaded(false); } @Override @@ -128,11 +168,12 @@ public void importApplication() { + // get service model + ImportApplicationModel dataModel = getModel().toModel(); + JFrame frame = ui.getParentContainer(JFrame.class); SammoaUtil.updateBusyState(frame, true); - try { - ImportApplicationModel dataModel = getModel().toModel(); importService.importApplication(dataModel); } finally { @@ -149,24 +190,111 @@ } protected void onCampaignStorageChanged(CampaignStorage storage) { - String campaignId = storage.getId(); - if (logger.isInfoEnabled()) { - logger.info("Will load campaing {}", campaignId); - } - Campaign campaign = referentialService.getCampaign(campaignId); ImportApplicationUIModel model = getModel(); + List<FlightImportEntry> flightImportEntryList; + Campaign campaign; + if (storage == null) { - if (campaign == null) { + // willReset model + flightImportEntryList = null; + campaign = null; - // new campaign - model.setNewCampaign(campaign); } else { - // existing campaign - model.setExistingCampaign(campaign); + Map<String, Object> naturalId = storage.getNaturalId(); + + if (logger.isInfoEnabled()) { + logger.info("Discover campaing {}", naturalId); + } + + campaign = referentialService.getCampaignByNaturalId(naturalId); + + boolean existingCampaign = campaign != null; + + if (logger.isInfoEnabled()) { + logger.info("Is campaign exist ? {}", existingCampaign); + } + + flightImportEntryList = Lists.newArrayList(); + + for (FlightStorage flightStorage : storage) { + + Map<String, Object> flightNaturalId = flightStorage.getNaturalId(); + + if (logger.isInfoEnabled()) { + logger.info("Discover flight {}", flightNaturalId); + } + Flight flight = null; + + if (existingCampaign) { + + // try to find existing fligth from his natural id + flight = flightService.getFlightByNaturalId(flightNaturalId); + + if (logger.isInfoEnabled()) { + logger.info("Is flight exist ? {}", flight != null); + } + } + + flightImportEntryList.add( + new FlightImportEntry(flightStorage, flight)); + } } + + model.setCampaignExist(campaign != null); + model.setFlightEntries(flightImportEntryList); } + protected void onImportFileLoaded(boolean newValue) { + + JTable table = ui.getLoadImportFileResultFlightsTable(); + JLabel label = ui.getLoadImportFileResultInfo(); + + String infoLabel; + if (newValue) { + + // import file was loaded, let's add + + ImportApplicationUIModel model = getModel(); + + String name = model.getStorage().getName(); + + boolean existingCampaign = model.isCampaignExist(); + + if (existingCampaign) { + + table.setModel(new FlightTableModel(model.getFlightEntries(), true)); + + infoLabel = + _("sammoa.info.importApplication.importfile.loaded.on.existingCampaign", name); + + SwingUtil.setI18nTableHeaderRenderer( + table, + n_("sammoa.importApplication.flightTable.column.flightName"), + n_("sammoa.importApplication.flightTable.column.flightName.tip"), + n_("sammoa.importApplication.flightTable.column.toTreat"), + n_("sammoa.importApplication.flightTable.column.toTreat.tip")); + } else { + + table.setModel(new FlightTableModel(model.getFlightEntries(), false)); + infoLabel = _("sammoa.info.importApplication.importfile.loaded.on.newCampaign", name); + SwingUtil.setI18nTableHeaderRenderer( + table, + n_("sammoa.importApplication.flightTable.column.flightName"), + n_("sammoa.importApplication.flightTable.column.flightName.tip")); + } + + } else { + + // nothing is loaded, just remove table model and change label + + table.setModel(new DefaultTableModel()); + infoLabel = _("sammoa.info.importApplication.no.importfile.loaded"); + } + + label.setText(infoLabel); + } + } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java 2012-08-21 16:12:32 UTC (rev 454) @@ -26,8 +26,6 @@ import com.google.common.collect.Lists; import fr.ulr.sammoa.application.io.CampaignStorage; import fr.ulr.sammoa.application.io.input.application.ImportApplicationModel; -import fr.ulr.sammoa.persistence.Campaign; -import fr.ulr.sammoa.persistence.Flight; import org.jdesktop.beans.AbstractSerializableBean; import java.io.File; @@ -43,18 +41,14 @@ private static final long serialVersionUID = 1L; - public static final String PROPERTY_EXISTING_CAMPAIGN = "existingCampaign"; + public static final String PROPERTY_IMPORT_FILE = "importFile"; - public static final String PROPERTY_EXISTING_FLIGHTS = "existingFlights"; + public static final String PROPERTY_CAMPAIGN_EXIST = "campaignExist"; - public static final String PROPERTY_NEW_CAMPAIGN = "newCampaign"; + public static final String PROPERTY_IMPORT_FILE_EXIST = "importFileExist"; - public static final String PROPERTY_NEW_FLIGHTS = "newFlights"; + public static final String PROPERTY_IMPORT_FILE_LOADED = "importFileLoaded"; - public static final String PROPERTY_SELECTED_FLIGHT_IDS = "selectedFlightIds"; - - public static final String PROPERTY_IMPORT_FILE = "importFile"; - public static final String PROPERTY_STORAGE = "storage"; /** File to import. */ @@ -63,21 +57,11 @@ /** Loaded campaign storage. */ protected CampaignStorage storage; - /** Existing campaign. */ - protected Campaign existingCampaign; + /** Is campaign exists ? */ + protected boolean campaignExist; - /** existing existingFlights on db. */ - protected List<Flight> existingFlights; + protected List<FlightImportEntry> flightEntries; - /** New campaign to import (read from the import file). */ - protected Campaign newCampaign; - - /** New existingFlights to import (read from the import file). */ - protected List<Flight> newFlights; - - /** Selected flight ids to imports. */ - protected List<String> selectedFlightIds; - public File getImportFile() { return importFile; } @@ -86,8 +70,18 @@ File oldValue = this.importFile; this.importFile = importFile; firePropertyChange(PROPERTY_IMPORT_FILE, oldValue, importFile); + firePropertyChange(PROPERTY_IMPORT_FILE_EXIST, false, isImportFileExist()); + firePropertyChange(PROPERTY_IMPORT_FILE_LOADED, false, isImportFileLoaded()); } + public boolean isImportFileExist() { + return importFile != null && importFile.isFile() && importFile.exists(); + } + + public boolean isImportFileLoaded() { + return isImportFileExist() && flightEntries != null; + } + public CampaignStorage getStorage() { return storage; } @@ -96,66 +90,46 @@ CampaignStorage oldValue = this.storage; this.storage = storage; firePropertyChange(PROPERTY_STORAGE, oldValue, storage); + firePropertyChange(PROPERTY_IMPORT_FILE_LOADED, false, isImportFileLoaded()); } - public Campaign getExistingCampaign() { - return existingCampaign; + public boolean isCampaignExist() { + return campaignExist; } - public void setExistingCampaign(Campaign existingCampaign) { - Campaign oldValue = this.existingCampaign; - this.existingCampaign = existingCampaign; - firePropertyChange(PROPERTY_EXISTING_CAMPAIGN, oldValue, existingCampaign); + public void setCampaignExist(boolean campaignExist) { + boolean oldValue = this.campaignExist; + this.campaignExist = campaignExist; + firePropertyChange(PROPERTY_CAMPAIGN_EXIST, oldValue, campaignExist); } - public List<Flight> getExistingFlights() { - if (existingFlights == null) { - existingFlights = Lists.newArrayList(); - } - return existingFlights; + public List<FlightImportEntry> getFlightEntries() { + return flightEntries; } - public void setExistingFlights(List<Flight> existingFlights) { - List<Flight> oldValue = this.existingFlights; - this.existingFlights = existingFlights; - firePropertyChange(PROPERTY_EXISTING_FLIGHTS, oldValue, existingFlights); + public void setFlightEntries(List<FlightImportEntry> flightEntries) { + this.flightEntries = flightEntries; + firePropertyChange(PROPERTY_IMPORT_FILE_EXIST, false, isImportFileLoaded()); } - public List<Flight> getNewFlights() { - return newFlights; - } + public ImportApplicationModel toModel() { - public void setNewFlights(List<Flight> newFlights) { - List<Flight> oldValue = this.newFlights; - this.newFlights = newFlights; - firePropertyChange(PROPERTY_NEW_FLIGHTS, oldValue, newFlights); - } + List<String> flightIds = Lists.newArrayList(); - public Campaign getNewCampaign() { - return newCampaign; - } + for (FlightImportEntry entry : getFlightEntries()) { + if (!campaignExist || entry.isTreat()) { - public void setNewCampaign(Campaign newCampaign) { - Campaign oldValue = this.newCampaign; - this.newCampaign = newCampaign; - firePropertyChange(PROPERTY_NEW_CAMPAIGN, oldValue, newCampaign); - } + //flight to import + flightIds.add(entry.getFlightStorage().getId()); + } + } - public List<String> getSelectedFlightIds() { - return selectedFlightIds; - } - - public void setSelectedFlightIds(List<String> selectedFlightIds) { - List<String> oldValue = this.selectedFlightIds; - this.selectedFlightIds = selectedFlightIds; - firePropertyChange(PROPERTY_SELECTED_FLIGHT_IDS, oldValue, selectedFlightIds); - } - - public ImportApplicationModel toModel() { ImportApplicationModel result = ImportApplicationModel.newModel( - getImportFile(), - getSelectedFlightIds() + getStorage(), + flightIds ); return result; } + + } \ No newline at end of file Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/java-info.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/java-info.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/java-info.java 2012-08-21 16:12:32 UTC (rev 454) @@ -4,3 +4,26 @@ * @since 0.6 */ package fr.ulr.sammoa.ui.swing.io.input.application; +/* + * #%L + * SAMMOA :: UI Swing + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/java-info.java ___________________________________________________________________ Modified: svn:keywords - Author Date Id Revision + Author Date Id Revision HeadURL Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/java-info.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/java-info.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/java-info.java 2012-08-21 16:12:32 UTC (rev 454) @@ -4,3 +4,26 @@ * @since 0.6 */ package fr.ulr.sammoa.ui.swing.io.output.application; +/* + * #%L + * SAMMOA :: UI Swing + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/java-info.java ___________________________________________________________________ Modified: svn:keywords - Author Date Id Revision + Author Date Id Revision HeadURL Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ButtonActionTableCellEditorRenderer.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ButtonActionTableCellEditorRenderer.java 2012-08-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/util/ButtonActionTableCellEditorRenderer.java 2012-08-21 16:12:32 UTC (rev 454) @@ -1,4 +1,27 @@ package fr.ulr.sammoa.ui.swing.util; +/* + * #%L + * SAMMOA :: UI Swing + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ import com.google.common.base.Predicate; import com.google.common.base.Supplier; 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-21 16:11:32 UTC (rev 453) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-21 16:12:32 UTC (rev 454) @@ -24,6 +24,7 @@ sammoa.action.home.tip=Home sammoa.action.importApplication=Import sammoa.action.left.tip=LEFT \: create a new Observation for the observer on the left side +sammoa.action.loadImportApplicationFile=Load selected import file sammoa.action.new=New sammoa.action.next.tip=NEXT \: end previous effort and create a new LEG route for the next selected Transect sammoa.action.nextTransect.tip=NEXT TRANSECT \: choose this transect to be the next one @@ -75,6 +76,13 @@ sammoa.flightPanel.table.column.position.left=Left sammoa.flightPanel.table.column.position.navigator=Nav sammoa.flightPanel.table.column.position.right=Right +sammoa.importApplication.flightTable.column.flightName= +sammoa.importApplication.flightTable.column.flightName.tip= +sammoa.importApplication.flightTable.column.toTreat= +sammoa.importApplication.flightTable.column.toTreat.tip= +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.label.campaign=Campaign\: sammoa.label.campaign.beginDate=Begin\: sammoa.label.campaign.code=Code\: Added: trunk/sammoa-ui-swing/src/main/resources/icons/action-information.png =================================================================== (Binary files differ) Property changes on: trunk/sammoa-ui-swing/src/main/resources/icons/action-information.png ___________________________________________________________________ Added: svn:mime-type + image/png Added: svn:keywords + Author Date Id Revision HeadURL
participants (1)
-
tchemit@users.forge.codelutin.com