Author: fdesbois Date: 2012-09-21 15:00:10 +0200 (Fri, 21 Sep 2012) New Revision: 586 Url: http://forge.codelutin.com/repositories/revision/sammoa/586 Log: fixes #1511 : improve crossingNumber behavior, do not use nbTimes any longer except for init case (from import) Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java trunk/src/site/rst/model.rst 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-09-20 12:45:28 UTC (rev 585) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/FlightService.java 2012-09-21 13:00:10 UTC (rev 586) @@ -309,13 +309,13 @@ } } - public void deleteTansectFlight(Flight flight, - TransectFlight transectFlight) { + public void deleteTransectFlight(Flight flight, + TransectFlight transectFlight) { TopiaContext tx = beginTransaction(); try { - deleteTansectFlight(tx, flight, transectFlight); + deleteTransectFlight(tx, flight, transectFlight); tx.commitTransaction(); @@ -326,9 +326,9 @@ } } - protected void deleteTansectFlight(TopiaContext tx, - Flight flight, - TransectFlight transectFlight) + protected void deleteTransectFlight(TopiaContext tx, + Flight flight, + TransectFlight transectFlight) throws TopiaException { SammoaDAOHelper.getObserverPositionDAO(tx).deleteAll( @@ -868,13 +868,12 @@ TransectFlightDAO transectFlightDAO = SammoaDAOHelper.getTransectFlightDAO(transaction); - TransectFlight result = - transectFlightDAO.create(TransectFlight.PROPERTY_TRANSECT, - transect); + int crossingNumber = + transectFlightDAO.getMaxCrossingNumberByTransect(transect) + 1; - int crossingNumber = transect.getNbTimes() + 1; + TransectFlight result = transectFlightDAO.create(); + result.setTransect(transect); result.setCrossingNumber(crossingNumber); - transect.setNbTimes(crossingNumber); // Update transect for nbTimes TransectDAO transectDAO = SammoaDAOHelper.getTransectDAO(transaction); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-20 12:45:28 UTC (rev 585) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ValidationService.java 2012-09-21 13:00:10 UTC (rev 586) @@ -58,7 +58,7 @@ if (transectFlight.isDeleted()) { // Use FlightService for delete - context.getService(FlightService.class).deleteTansectFlight(tx, flight, transectFlight); + context.getService(FlightService.class).deleteTransectFlight(tx, flight, transectFlight); result = null; 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-09-20 12:45:28 UTC (rev 585) +++ trunk/sammoa-application/src/test/java/fr/ulr/sammoa/application/FlightServiceTest.java 2012-09-21 13:00:10 UTC (rev 586) @@ -24,6 +24,7 @@ */ package fr.ulr.sammoa.application; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; @@ -46,6 +47,9 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; +import java.util.List; +import java.util.Map; + /** * Created: 08/06/12 * @@ -133,9 +137,10 @@ FlightService service = context.getService(FlightService.class); Campaign campaign = database.createCampaign("PACOMM", "FRANCE"); - - // Create the strate Strate strate = createStrate(campaign, 1, StrateType.COAST); + Transect transect1 = createTransect("C1", strate); + Transect transect2 = createTransect("C2", strate); + Transect transect3 = createTransect("C3", strate); Flight flight = service.createFlight(campaign, service.getNextFlightNumber()); @@ -144,10 +149,6 @@ flight.addObserver(createObserver(String.valueOf(i), campaign)); } - Transect transect1 = createTransect("C1", strate); - Transect transect2 = createTransect("C2", strate); - Transect transect3 = createTransect("C3", strate); - // Add transect1 and transect2 Iterable<Transect> transects = Lists.newArrayList(transect1, transect2); @@ -156,8 +157,10 @@ Assert.assertEquals(2, flight.getTransectFlight().size()); TransectFlight transectFlight1 = flight.getTransectFlight().get(0); Assert.assertEquals(transect1, transectFlight1.getTransect()); + Assert.assertEquals(1, transectFlight1.getCrossingNumber()); TransectFlight transectFlight2 = flight.getTransectFlight().get(1); Assert.assertEquals(transect2, transectFlight2.getTransect()); + Assert.assertEquals(1, transectFlight2.getCrossingNumber()); // Add an other transectFlight for transect2 and transect3 transects = Lists.newArrayList(transect2, transect3); @@ -167,10 +170,154 @@ Assert.assertEquals(4, flight.getTransectFlight().size()); TransectFlight transectFlight3 = flight.getTransectFlight().get(2); Assert.assertEquals(transect3, transectFlight3.getTransect()); + Assert.assertEquals(1, transectFlight3.getCrossingNumber()); TransectFlight transectFlightAtIndex2 = flight.getTransectFlight().get(1); Assert.assertNotSame(transectFlight2, transectFlightAtIndex2); + Assert.assertEquals(transect2, transectFlightAtIndex2.getTransect()); + Assert.assertEquals(2, transectFlightAtIndex2.getCrossingNumber()); } + @Test + public void testDeleteTransectFlight() throws Exception { + + SammoaContext context = new SammoaContext(config, database.getPersistence()); + + FlightService service = context.getService(FlightService.class); + + Campaign campaign = database.createCampaign("PACOMM", "FRANCE"); + Strate strate = createStrate(campaign, 1, StrateType.COAST); + Transect transect = createTransect("C1", strate); + + Flight flight = service.createFlight(campaign, service.getNextFlightNumber()); + + List<TransectFlight> transectFlights = + service.addTransects(flight, 0, ImmutableList.of(transect)); + + TransectFlight transectFlight = transectFlights.get(0); + Assert.assertEquals(1, transectFlight.getCrossingNumber()); + + service.deleteTransectFlight(flight, transectFlight); + + transectFlights = + service.addTransects(flight, 0, ImmutableList.of(transect)); + transectFlight = transectFlights.get(0); + Assert.assertEquals(1, transectFlight.getCrossingNumber()); + } + + @Test + public void testCrossingNumber() throws Exception { + + SammoaContext context = new SammoaContext(config, database.getPersistence()); + + FlightService service = context.getService(FlightService.class); + + Campaign campaign = database.createCampaign("PACOMM", "FRANCE"); + + Strate strate = createStrate(campaign, 1, StrateType.COAST); + Transect transect = createTransect("C1/01", strate); + + Flight flight1 = service.createFlight(campaign, service.getNextFlightNumber()); + Flight flight2 = service.createFlight(campaign, service.getNextFlightNumber()); + Flight flight3 = service.createFlight(campaign, service.getNextFlightNumber()); + + int index = 0; + // 1st crossing on flight 1 + { + service.addTransects(flight1, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight1.getTransectFlight().get(index); + Assert.assertEquals(1, transectFlight.getCrossingNumber()); + } + // 2nd crossing on flight 1 + { + service.addTransects(flight1, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight1.getTransectFlight().get(index); + Assert.assertEquals(2, transectFlight.getCrossingNumber()); + } + // 3rd crossing on flight 2 + { + service.addTransects(flight2, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight2.getTransectFlight().get(index); + Assert.assertEquals(3, transectFlight.getCrossingNumber()); + } + // 6th crossing on flight 3 + // manual set because an other system does the 4th and 5th crossings + { + service.addTransects(flight3, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight3.getTransectFlight().get(index); + Assert.assertEquals(4, transectFlight.getCrossingNumber()); + transectFlight.setCrossingNumber(6); + } + // 7th crossing on flight 3 + { + service.addTransects(flight3, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight3.getTransectFlight().get(index); + Assert.assertEquals(7, transectFlight.getCrossingNumber()); + } + // We delete the flight3, the next crossing become the 4th + { + service.deleteFlight(campaign.getTopiaId(), flight3.getTopiaId()); + } + // 4th crossing on flight 2 + { + service.addTransects(flight2, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight2.getTransectFlight().get(index); + Assert.assertEquals(4, transectFlight.getCrossingNumber()); + } + // We update the transect nbTimes (usually done by import) + { + transect.setNbTimes(5); + } + // 6th crossing on flight 2 + { + service.addTransects(flight2, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight2.getTransectFlight().get(index); + Assert.assertEquals(6, transectFlight.getCrossingNumber()); + } + // Mark 2nd crossing as deleted + { + TransectFlight transectFlight = flight1.getTransectFlight().get(index); + Assert.assertEquals(2, transectFlight.getCrossingNumber()); + transectFlight.setDeleted(true); + } + // 5th crossing on flight 1 (manual change) + { + service.addTransects(flight1, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight1.getTransectFlight().get(index); + Assert.assertEquals(7, transectFlight.getCrossingNumber()); + transectFlight.setCrossingNumber(5); + } + // Change the 6th crossingNumber to 2nd (2nd is marked deleted) + { + TransectFlight transectFlight = flight2.getTransectFlight().get(index); + Assert.assertEquals(6, transectFlight.getCrossingNumber()); + transectFlight.setCrossingNumber(2); + } + // Check that 6 transectFlight are attached to the transect + // but one is deleted + { + TopiaContext tx = database.beginTransaction(); + Map<Transect, Long> map = SammoaDAOHelper.getTransectFlightDAO(tx). + countAllByTransect(); + Assert.assertEquals(new Long(6), map.get(transect)); + } + // 6th crossing on flight 1 marked as 1st one (strange but not forbidden) + { + service.addTransects(flight1, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight1.getTransectFlight().get(index); + Assert.assertEquals(6, transectFlight.getCrossingNumber()); + transectFlight.setCrossingNumber(1); + } + // 7th crossing on flight 2 + // There is 6 transectFlight not deleted, 2 as 1st crossing and no 6th crossing + // No check is done, but here we assume that there is 6 valid crossing + // So the next one is the 7th + { + service.addTransects(flight2, index, ImmutableList.of(transect)); + TransectFlight transectFlight = flight2.getTransectFlight().get(index); + Assert.assertEquals(7, transectFlight.getCrossingNumber()); + } + } + protected Observer createObserver(String initials, Campaign campaign) throws TopiaException { TopiaContext transaction = database.beginTransaction(); Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-09-20 12:45:28 UTC (rev 585) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/TransectFlightDAOImpl.java 2012-09-21 13:00:10 UTC (rev 586) @@ -76,6 +76,34 @@ } } + public int getMaxCrossingNumberByTransect(Transect transect) { + + String ql = "SELECT max(crossingNumber), count(*), transect.nbTimes " + + "FROM TransectFlightImpl " + + "WHERE transect = :transect " + + "AND deleted = :deleted " + + "GROUP BY transect"; + try { + Object[] queryResults = (Object[]) getContext().findUnique( + ql, "transect", transect, "deleted", false); + + int result; + if (queryResults == null) { + // By default we use the transect nbTimes set by import + result = transect.getNbTimes(); + + } else { + int maxCrossingNumber = (Integer) queryResults[0]; + int nbTransectFlights = ((Long) queryResults[1]).intValue(); + int transectNbTimes = (Integer) queryResults[2]; + result = Math.max(Math.max(maxCrossingNumber, nbTransectFlights), transectNbTimes); + } + return result; + } catch (TopiaException e) { + throw new TopiaRuntimeException(e); + } + } + public void reAttachIndexInFlight(Iterable<TransectFlight> transectFlights) throws TopiaException { StringBuilder builder = new StringBuilder(); Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-20 12:45:28 UTC (rev 585) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/TransectFlightModel.java 2012-09-21 13:00:10 UTC (rev 586) @@ -140,14 +140,6 @@ public void setCrossingNumber(int crossingNumber) { int oldValue = getCrossingNumber(); getSource().setCrossingNumber(crossingNumber); - - // We need to update the manual nbTimes from transect to ensure next crossingNumber value - // only if the nbTimes is inferior to the new value manually set - int nbTimes = getTransect().getSource().getNbTimes(); - if (crossingNumber > nbTimes) { - getTransect().getSource().setNbTimes(crossingNumber); - } - firePropertyChange(PROPERTY_CROSSING_NUMBER, oldValue, crossingNumber); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java 2012-09-20 12:45:28 UTC (rev 585) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/flight/action/DeleteTransectAction.java 2012-09-21 13:00:10 UTC (rev 586) @@ -80,7 +80,7 @@ FlightService service = getSammoaUIContext().getService(FlightService.class); - service.deleteTansectFlight(getModel().getFlight(), transectFlight.getSource()); + service.deleteTransectFlight(getModel().getFlight(), transectFlight.getSource()); if (logger.isDebugEnabled()) { logger.debug("Delete transect {} ", Modified: trunk/src/site/rst/model.rst =================================================================== --- trunk/src/site/rst/model.rst 2012-09-20 12:45:28 UTC (rev 585) +++ trunk/src/site/rst/model.rst 2012-09-21 13:00:10 UTC (rev 586) @@ -737,18 +737,14 @@ +----------------------+----------------------------------+--------------------+----------------+ | nbTimes | Nombre de fois sur lequel a été | int | | | | effectué le transect. Ce nombre | | | -| | est incrémenté en fonction du | | | -| | numéro de passage | | | -| | (*crossingNumber*) d'un nouveau | | | -| | TransectFlight_. Le numéro de | | | -| | passage est modifié manuellement | | | -| | par l'utilisateur. Le nombre de | | | -| | TransectFlight_ rattaché à ce | | | -| | transect depuis la base peut | | | -| | être différent, car d'anciens | | | -| | vols ayant un lien avec ce | | | -| | transect ont pu être supprimés | | | -| | de la base. | | | +| | est importé et n'est utilisé | | | +| | comme base pour le prochain | | | +| | *crossingNumber* des | | | +| | TransectFlight_ que si il est | | | +| | supérieur à la plus grande | | | +| | valeur existante de | | | +| | *crossingNumber* pour ce | | | +| | transect. | | | +----------------------+----------------------------------+--------------------+----------------+ | graphicIndex | Index de l'objet graphique | Integer | | | | depuis le fichier SHP importé. | | |