Coser-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
October 2010
- 1 participants
- 54 discussions
r109 - in trunk/coser-business/src: main/java/fr/ifremer/coser/command test/java/fr/ifremer/coser/services test/resources/csv/correct
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
27 Oct '10
Author: chatellier
Date: 2010-10-27 15:38:56 +0000 (Wed, 27 Oct 2010)
New Revision: 109
Log:
Fin du merge d'especes
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
trunk/coser-business/src/test/resources/csv/correct/testlength.csv
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-27 14:23:04 UTC (rev 108)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-27 15:38:56 UTC (rev 109)
@@ -27,15 +27,18 @@
import java.util.Iterator;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.CoserConstants;
import fr.ifremer.coser.bean.AbstractDataContainer;
-import fr.ifremer.coser.bean.Control;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.data.Catch;
+import fr.ifremer.coser.data.Length;
/**
* Merge species command.
@@ -101,12 +104,142 @@
*/
protected Project mergeLength(Project project, AbstractDataContainer container,
String newSpecyName, String... speciesNames) {
+
+ // Campagne;Annee;Trait;Espece;Sexe;Maturite;Longueur;Nombre;Poids;Age
+
+ // regroupement par Campagne;Annee;Trait;Espece;Sexe;Maturite;Longueur;Age
+ String[] commonTuple = null;
+ String[] mergeTuple = null;
+ int mergeTupleIndex = -1;
+
+ // parcours des elements
+ Iterator<String[]> itTuple = container.getLength().iterator();
+ itTuple.next(); // skip header
+ int index = 1; // skip header
+
+ while (itTuple.hasNext()) {
+ String[] tuple = itTuple.next();
+
+ // search for diff in commonTuple and current tuple
+ // 1 = skip line index (0)
+ boolean diffFound = false;
+ if (commonTuple != null) {
+ for (int tupleIndex = 0 ; tupleIndex < commonTuple.length && !diffFound; ++tupleIndex) {
+ if (tupleIndex != Length.INDEX_LINE && tupleIndex != Length.INDEX_NUMBER
+ && tupleIndex != Length.INDEX_WEIGHT && tupleIndex != Length.INDEX_SPECIES) {
+ if (!commonTuple[tupleIndex].equals(tuple[tupleIndex])) {
+ diffFound = true;
+ }
+ }
+ }
+ }
+ else {
+ diffFound = true;
+ }
+
+ if (diffFound) {
+ mergeTuple = null;
+ // clone parce que si c'est un tuple de merge...
+ commonTuple = (String[])ArrayUtils.clone(tuple);
+ }
+
+ // test si l'espece en cours fait partie de celle a merger
+ String species = tuple[Length.INDEX_SPECIES];
+ boolean specyFound = false;
+ for (String specy : speciesNames) {
+ if (specy.equals(species)) {
+ specyFound = true;
+ }
+ }
+
+ // si l'espece est a merger, on se souvient du tuple
+ // principale a merge, ou on merge avec le tuple
+ // principal si on a deja un tuple principal
+ if (specyFound) {
+ if (mergeTuple == null) {
+ mergeTuple = tuple;
+ mergeTuple[Length.INDEX_SPECIES] = newSpecyName;
+ mergeTupleIndex = index;
+ }
+ else {
+ mergeTuple = mergeLengths(mergeTuple, tuple);
+ // et on supprime le tuple
+ // qui a ete merge
+ itTuple.remove();
+ // bidouille le remove decalle les index suivants
+ index--;
+ }
+
+ container.getLength().set(mergeTupleIndex, mergeTuple);
+ }
+
+ index++;
+ }
return project;
}
/**
+ * Merge deux lines des catch.
+ *
+ * Le resultat est mergé dans {@code tuple1} et retourné.
+ *
+ * Somme les "Nombre" et "Poids"
+ *
+ * @param mergeTuple
+ * @param tuple
+ * @return
+ */
+ protected String[] mergeLengths(String[] tuple1, String[] tuple2) {
+
+ try {
+ // number
+ if (isNotAvailableData(tuple1[Length.INDEX_NUMBER]) || isNotAvailableData(tuple2[Length.INDEX_NUMBER])) {
+ tuple1[Length.INDEX_NUMBER] = CoserConstants.VALIDATION_NA;
+ }
+ else {
+ double nombre1 = Double.parseDouble(tuple1[Length.INDEX_NUMBER]);
+ double nombre2 = Double.parseDouble(tuple2[Length.INDEX_NUMBER]);
+ tuple1[Length.INDEX_NUMBER] = String.valueOf(nombre1 + nombre2);
+ }
+
+ // weight
+ if (isNotAvailableData(tuple1[Length.INDEX_WEIGHT]) || isNotAvailableData(tuple2[Length.INDEX_WEIGHT])) {
+ tuple1[Length.INDEX_WEIGHT] = CoserConstants.VALIDATION_NA;
+ }
+ else {
+ double poids1 = Double.parseDouble(tuple1[Length.INDEX_WEIGHT]);
+ double poids2 = Double.parseDouble(tuple2[Length.INDEX_WEIGHT]);
+ tuple1[Length.INDEX_WEIGHT] = String.valueOf(poids1 + poids2);
+ }
+ }
+ catch (NumberFormatException ex) {
+ if (log.isWarnEnabled()) {
+ log.warn("Can't convert data as double for merge", ex);
+ }
+ }
+ return tuple1;
+ }
+
+ /**
+ * Return true if a value
+ *
+ * @param data
+ * @return
+ */
+ protected boolean isNotAvailableData(String data) {
+ boolean result = false;
+ if (StringUtils.isEmpty(data) || data.equals(CoserConstants.VALIDATION_NA)) {
+ result = true;
+ }
+ return result;
+ }
+
+ /**
* Fusion d'especes dans les données de taille.
*
+ * Peut etre a revoir, car ca fonctionne, mais le traitement
+ * est dépendant de l'ordre.
+ *
* @param project project
* @param container data container
* @param newSpecyName new specy name (after merge)
@@ -119,11 +252,9 @@
// "Campagne","Annee","Trait","Espece","Nombre","Poids"
// regroupement par campagne/annee/trait
- String lastCampagne = null;
- String lastAnnee = null;
- String lastTraits = null;
- String[] tupleFound = null;
- int tupleIndex = -1;
+ String[] commonTuple = null;
+ String[] mergeTuple = null;
+ int mergeTupleIndex = -1;
// parcours des elements
Iterator<String[]> itTuple = container.getCatch().iterator();
@@ -134,19 +265,27 @@
// si les valeurs servant au bornes de regroupement
// on changer, on reset les données du merge
- String currentCampagne = tuple[Catch.INDEX_SURVEY];
- String currentAnnee = tuple[Catch.INDEX_YEAR];
- String currentTraits = tuple[Catch.INDEX_HAUL];
- if (!currentCampagne.equals(lastCampagne) ||
- !currentAnnee.equals(lastAnnee) ||
- !currentTraits.equals(lastTraits)) {
-
- tupleFound = null;
- lastCampagne = currentCampagne;
- lastAnnee = currentAnnee;
- lastTraits = currentTraits;
+ boolean diffFound = false;
+ if (commonTuple != null) {
+ for (int tupleIndex = 0 ; tupleIndex < commonTuple.length && !diffFound; ++tupleIndex) {
+ if (tupleIndex != Catch.INDEX_LINE && tupleIndex != Catch.INDEX_NUMBER
+ && tupleIndex != Catch.INDEX_WEIGHT && tupleIndex != Catch.INDEX_SPECIES) {
+ if (!commonTuple[tupleIndex].equals(tuple[tupleIndex])) {
+ diffFound = true;
+ }
+ }
+ }
}
+ else {
+ diffFound = true;
+ }
+ if (diffFound) {
+ mergeTuple = null;
+ // clone parce que si c'est un tuple de merge...
+ commonTuple = (String[])ArrayUtils.clone(tuple);
+ }
+
// test si l'espece en cours fait partie de celle a merger
String species = tuple[Catch.INDEX_SPECIES];
boolean specyFound = false;
@@ -160,13 +299,13 @@
// principale a merge, ou on merge avec le tuple
// principal si on a deja un tuple principal
if (specyFound) {
- if (tupleFound == null) {
- tupleFound = tuple;
- tupleFound[3] = newSpecyName;
- tupleIndex = index;
+ if (mergeTuple == null) {
+ mergeTuple = tuple;
+ mergeTuple[Catch.INDEX_SPECIES] = newSpecyName;
+ mergeTupleIndex = index;
}
else {
- tupleFound = mergeCatches(tupleFound, tuple);
+ mergeTuple = mergeCatches(mergeTuple, tuple);
// et on supprime le tuple
// qui a ete merge
itTuple.remove();
@@ -174,7 +313,7 @@
index--;
}
- container.getCatch().set(tupleIndex, tupleFound);
+ container.getCatch().set(mergeTupleIndex, mergeTuple);
}
index++;
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java 2010-10-27 14:23:04 UTC (rev 108)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java 2010-10-27 15:38:56 UTC (rev 109)
@@ -64,14 +64,14 @@
@Test
public void testDeleteLine() throws CoserBusinessException {
Project project = createTestProject(projectService);
- Assert.assertEquals(29, project.getControl().getLength().size());
+ Assert.assertEquals(30, project.getControl().getLength().size());
DeleteLineCommand command = new DeleteLineCommand();
command.setLineIndex("2");
command.setCategory(Category.LENGTH);
commandService.doAction(command, project, project.getControl());
- Assert.assertEquals(28, project.getControl().getLength().size());
+ Assert.assertEquals(29, project.getControl().getLength().size());
}
/**
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 14:23:04 UTC (rev 108)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 15:38:56 UTC (rev 109)
@@ -236,12 +236,18 @@
public void testMergeSpecies() throws CoserBusinessException {
Project project = createTestProject(service);
Selection selection = service.initProjectSelection(project);
+ selection.setName("test");
Assert.assertTrue(service.isSpecyNameExist(project, "COSER_SPECIES_MERGE"));
Assert.assertEquals(25, selection.getCatch().size());
+ Assert.assertEquals(30, selection.getLength().size());
project = service.mergeSpecies(project, selection, "COSER_SPECIES_MERGE", "COSER_SPECIES1", "COSER_SPECIES2");
Assert.assertEquals(19, selection.getCatch().size());
+ Assert.assertEquals(29, selection.getLength().size());
+
+ service.createProjectSelection(project, selection);
+ System.out.println(selection.getName());
}
}
Modified: trunk/coser-business/src/test/resources/csv/correct/testlength.csv
===================================================================
--- trunk/coser-business/src/test/resources/csv/correct/testlength.csv 2010-10-27 14:23:04 UTC (rev 108)
+++ trunk/coser-business/src/test/resources/csv/correct/testlength.csv 2010-10-27 15:38:56 UTC (rev 109)
@@ -1,29 +1,30 @@
Survey;Year;Haul;Species;Sex;Maturity;Length;Number;Weight;Age
-COSER_TEST;2010;TRAIT1;COSER_SPECIES1;i;NA;29.19;1.00;NA
-COSER_TEST;2010;TRAIT1;COSER_SPECIES2;i;NA;19.60;2.00;NA
-COSER_TEST;2010;TRAIT1;COSER_SPECIES3;i;NA;32.93;5.00;NA
-COSER_TEST;2010;TRAIT1;COSER_SPECIES3;i;NA;26.27;3.00;NA
-COSER_TEST;2010;TRAIT1;COSER_SPECIES3;i;NA;35.25;4.00;NA
-COSER_TEST;2010;TRAIT1;COSER_SPECIES4;i;NA;37.82;4.00;NA
-COSER_TEST;2010;TRAIT2;COSER_SPECIES1;i;NA;20.07;2.00;NA
-COSER_TEST;2010;TRAIT2;COSER_SPECIES1;i;NA;27.18;2.00;NA
-COSER_TEST;2010;TRAIT2;COSER_SPECIES2;i;NA;21.14;1.00;NA
-COSER_TEST;2010;TRAIT2;COSER_SPECIES3;i;NA;1.82;4.00;NA
-COSER_TEST;2010;TRAIT2;COSER_SPECIES4;i;NA;36.55;4.00;NA
-COSER_TEST;2010;TRAIT3;COSER_SPECIES1;i;NA;20.39;3.00;NA
-COSER_TEST;2010;TRAIT3;COSER_SPECIES2;i;NA;19.88;3.00;NA
-COSER_TEST;2010;TRAIT3;COSER_SPECIES3;i;NA;18.16;1.00;NA
-COSER_TEST;2010;TRAIT3;COSER_SPECIES4;i;NA;10.22;2.00;NA
-COSER_TEST;2010;TRAIT3;COSER_SPECIES4;i;NA;33.03;5.00;NA
-COSER_TEST;2011;TRAIT1;COSER_SPECIES1;i;NA;1.00;4.00;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES1;i;NA;29.19;1.00;0.45;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES2;i;NA;19.60;2.00;0.34;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES2;i;NA;19.60;3.00;0.78;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES3;i;NA;32.93;5.00;0.87;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES3;f;NA;26.27;3.00;0.03;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES3;m;NA;35.25;4.00;;NA
+COSER_TEST;2010;TRAIT1;COSER_SPECIES4;i;NA;37.82;4.00;0.61;NA
+COSER_TEST;2010;TRAIT2;COSER_SPECIES1;i;NA;20.07;2.00;0.12;NA
+COSER_TEST;2010;TRAIT2;COSER_SPECIES1;i;NA;27.18;2.00;0.92;NA
+COSER_TEST;2010;TRAIT2;COSER_SPECIES2;i;NA;21.14;1.00;0.34;NA
+COSER_TEST;2010;TRAIT2;COSER_SPECIES3;i;NA;1.82;4.00;0.1;NA
+COSER_TEST;2010;TRAIT2;COSER_SPECIES4;i;NA;36.55;4.00;0.39;NA
+COSER_TEST;2010;TRAIT3;COSER_SPECIES1;i;NA;20.39;3.00;0.28;NA
+COSER_TEST;2010;TRAIT3;COSER_SPECIES2;i;NA;19.88;3.00;0.31;NA
+COSER_TEST;2010;TRAIT3;COSER_SPECIES3;i;NA;18.16;1.00;0.34;NA
+COSER_TEST;2010;TRAIT3;COSER_SPECIES4;i;NA;10.22;2.00;0.31;NA
+COSER_TEST;2010;TRAIT3;COSER_SPECIES4;f;NA;33.03;5.00;0.26;NA
+COSER_TEST;2011;TRAIT1;COSER_SPECIES1;i;NA;1.00;4.00;0.81;NA
COSER_TEST;2011;TRAIT1;COSER_SPECIES2;i;NA;27.61;3.00;NA
-COSER_TEST;2011;TRAIT1;COSER_SPECIES3;i;NA;20.44;3.00;NA
-COSER_TEST;2011;TRAIT1;COSER_SPECIES4;i;NA;6.86;1.00;NA
-COSER_TEST;2011;TRAIT2;COSER_SPECIES1;i;NA;15.04;4.00;NA
-COSER_TEST;2011;TRAIT2;COSER_SPECIES2;i;NA;35.03;1.00;NA
-COSER_TEST;2011;TRAIT2;COSER_SPECIES3;i;NA;19.41;1.00;NA
+COSER_TEST;2011;TRAIT1;COSER_SPECIES3;i;NA;20.44;3.00;0.43;NA
+COSER_TEST;2011;TRAIT1;COSER_SPECIES4;i;NA;6.86;1.00;0.23;NA
+COSER_TEST;2011;TRAIT2;COSER_SPECIES1;i;NA;15.04;4.00;0.95;NA
+COSER_TEST;2011;TRAIT2;COSER_SPECIES2;i;NA;35.03;1.00;0.26;NA
+COSER_TEST;2011;TRAIT2;COSER_SPECIES3;i;NA;19.41;1.00;0.51;NA
COSER_TEST;2011;TRAIT2;COSER_SPECIES4;i;NA;24.58;2.00;NA
-COSER_TEST;2011;TRAIT3;COSER_SPECIES1;i;NA;2.46;4.00;NA
-COSER_TEST;2011;TRAIT3;COSER_SPECIES2;i;NA;18.93;5.00;NA
-COSER_TEST;2011;TRAIT3;COSER_SPECIES3;i;NA;23.77;5.00;NA
-COSER_TEST;2011;TRAIT3;COSER_SPECIES4;i;NA;0.94;3.00;NA
+COSER_TEST;2011;TRAIT3;COSER_SPECIES1;i;NA;2.46;3.00;0.32;NA
+COSER_TEST;2011;TRAIT3;COSER_SPECIES2;i;NA;18.93;5.00;0.22;NA
+COSER_TEST;2011;TRAIT3;COSER_SPECIES3;i;NA;23.77;5.00;0.12;NA
+COSER_TEST;2011;TRAIT3;COSER_SPECIES4;i;NA;0.94;3.00;0.77;NA
1
0
r108 - trunk/coser-business/src/test/java/fr/ifremer/coser/services
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
27 Oct '10
Author: chatellier
Date: 2010-10-27 14:23:04 +0000 (Wed, 27 Oct 2010)
New Revision: 108
Log:
Ajout d'un test sur le reloading de selection
Modified:
trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 14:12:12 UTC (rev 107)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 14:23:04 UTC (rev 108)
@@ -91,8 +91,74 @@
Assert.assertTrue(new File(config.getProjectsDirectory(),
project.getName() + File.separator + "reftaxSpecies.csv").exists());
}
+
+ /**
+ * Test que le project est correctement créer (à partir des données
+ * dans /src/test/resources.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test
+ public void testSaveProject() throws CoserBusinessException {
+ Project project = createTestProject(service);
+ service.saveProjectControl(project);
+ Assert.assertTrue(new File(config.getProjectsDirectory(),
+ project.getName() + File.separator + "control" + File.separator + "catch_co.csv").exists());
+ }
+
/**
+ * Test que les selections sont bien creer.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test
+ public void testCreateSelection() throws CoserBusinessException {
+ Project project = createTestProject(service);
+ Selection selection = service.initProjectSelection(project);
+ selection.setName("titi");
+ service.createProjectSelection(project, selection);
+
+ Assert.assertTrue(new File(config.getProjectsDirectory(),
+ project.getName() + File.separator + "selections" + File.separator +
+ "titi" + File.separator + "catch_se.csv").exists());
+ }
+
+ /**
+ * Test que les selections sont bien rechargées.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test
+ public void testSelectionReloading() throws CoserBusinessException {
+ Project project = createTestProject(service);
+ Assert.assertEquals(25, project.getControl().getCatch().size());
+
+ Selection selection = service.initProjectSelection(project);
+ selection.setName("titi");
+ service.createProjectSelection(project, selection);
+
+ project.clearData();
+ service.loadSelectionData(project, selection);
+ Assert.assertEquals(25, project.getSelections().get("titi").getCatch().size());
+ }
+
+ /**
+ * Test que deux selections de même nom ne peuvent
+ * pas être crées.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test(expected=CoserBusinessException.class)
+ public void testCreateSelectionError() throws CoserBusinessException {
+ Project project = createTestProject(service);
+ Selection selection = service.initProjectSelection(project);
+ selection.setName("titi");
+ service.createProjectSelection(project, selection);
+ service.createProjectSelection(project, selection);
+ }
+
+ /**
* Test qu'une espece exite bien dans le projet de test.
*
* @throws CoserBusinessException
1
0
r107 - in trunk: coser-business/src/main/java/fr/ifremer/coser/bean coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/main/resources coser-business/src/main/resources/i18n coser-business/src/test/java/fr/ifremer/coser/services coser-ui coser-ui/src/main/java/fr/ifremer/coser/ui coser-ui/src/main/java/fr/ifremer/coser/ui/selection coser-ui/src/main/resources/i18n coser-web/src/license coser-web/src/main/webapp/WEB-INF
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
27 Oct '10
Author: chatellier
Date: 2010-10-27 14:12:12 +0000 (Wed, 27 Oct 2010)
New Revision: 107
Log:
Add selection loading/reloading
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties
trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties
trunk/coser-business/src/main/resources/validators.xml
trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
trunk/coser-ui/LICENSE.txt
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/SelectionsListMenuItem.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx
trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties
trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties
trunk/coser-web/src/license/THIRD-PARTY.properties
trunk/coser-web/src/main/webapp/WEB-INF/web.xml
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-10-27 14:12:12 UTC (rev 107)
@@ -52,6 +52,8 @@
"C_Perm","NumSys","NivSys","C_VALIDE","L_VALIDE","AA_VALIDE","C_TxP\u00E8re","Taxa"
};
+ public static final String PROPERTY_SELECTIONS="selections";
+
protected String name;
protected Control control;
@@ -87,8 +89,13 @@
public void setSelections(Map<String, Selection> selections) {
this.selections = selections;
- getPropertyChangeSupport().firePropertyChange("selections", null, selections);
+ getPropertyChangeSupport().firePropertyChange(PROPERTY_SELECTIONS, null, selections);
}
+
+ public void addSelections(Selection selection) {
+ this.selections.put(selection.getName(), selection);
+ getPropertyChangeSupport().firePropertyChange(PROPERTY_SELECTIONS, null, selections);
+ }
public DataStorage getRefTaxSpecies() {
return refTaxSpecies;
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-27 14:12:12 UTC (rev 107)
@@ -30,6 +30,7 @@
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -118,13 +119,11 @@
projectsDirectory.mkdirs();
}
+ // check project existence
String projectName = project.getName();
- // check project existence
- File[] projects = projectsDirectory.listFiles();
- for (File existingProject : projects) {
- if (existingProject.getName().equalsIgnoreCase(projectName)) {
- throw new CoserBusinessException(_("Project %s already exist", project.getName()));
- }
+ File projectDirectory = new File(projectsDirectory, projectName);
+ if (projectDirectory.exists()) {
+ throw new CoserBusinessException(_("Project %s already exist", project.getName()));
}
// first free memory, clear all data
@@ -149,8 +148,7 @@
}
}
- // create new project directory
- File projectDirectory = new File(projectsDirectory, projectName);
+ // create new project directory (after data checking, if ok)
projectDirectory.mkdirs();
// sauvegarde des fichiers (tracabilité)
@@ -186,6 +184,7 @@
}
}
+ project.setSelections(new HashMap<String, Selection>());
control.setHistoryCommand(new ArrayList<Command>());
project.setControl(control);
@@ -227,6 +226,21 @@
throw new CoserBusinessException(_("Missing file %s", inputFile));
}
+ // reload selection without data
+ Map<String, Selection> selections = new HashMap<String, Selection>();
+ File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY);
+ if (selectionsDirectory.isDirectory()) {
+ File[] selectionDirectories = selectionsDirectory.listFiles();
+ for (File selectionDirectory : selectionDirectories) {
+ if (selectionDirectory.isDirectory()) {
+ Selection selection = new Selection();
+ selection.setName(selectionDirectory.getName());
+ selections.put(selectionDirectory.getName(), selection);
+ }
+ }
+ }
+ project.setSelections(selections);
+
return project;
}
@@ -319,7 +333,51 @@
return project;
}
+
+ /**
+ * Load selection data in an initialized project.
+ *
+ * @param project project
+ * @param selection selection to fill
+ * @return project with data
+ * @throws CoserBusinessException
+ */
+ public Project loadSelectionData(Project project, Selection selection) throws CoserBusinessException {
+
+ File projectsDirectory = config.getProjectsDirectory();
+ File projectDirectory = new File(projectsDirectory, project.getName());
+ // first free memory, clear all data
+ project.clearData();
+
+ // try to load validated data first
+ File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY);
+ File selectionDirectory = new File(selectionsDirectory, selection.getName());
+ int fileLoaded = 0;
+ for (Category category : Category.values()) {
+
+ // seulement les category de données ici
+ if (category.isDataCategory()) {
+ File inputFile = new File(selectionDirectory, category.getStorageFileName() +
+ CoserConstants.STORAGE_SELECTION_SUFFIX + CoserConstants.STORAGE_CSV_EXTENSION);
+
+ if (inputFile.isFile()) {
+ DataStorage dataStorage = importService.loadCSVFile(project, category, inputFile, false);
+ addProjectContent(project, selection, category, dataStorage, false);
+ fileLoaded++;
+ }
+ else {
+ throw new CoserBusinessException(_("Missing file %s", inputFile));
+ }
+ }
+ }
+
+ // TODO echatellier 20101027 need history file reloading
+ selection.setHistoryCommand(new ArrayList<Command>());
+
+ return project;
+ }
+
/**
* Enregistre les fichiers de données apres validation.
*
@@ -372,7 +430,7 @@
* @return selection
* @throws CoserBusinessException
*/
- public Selection createProjectSelection(Project project) throws CoserBusinessException {
+ public Selection initProjectSelection(Project project) throws CoserBusinessException {
// TODO echatellier 20101027 voir si on force que les
// fichier de validation existe ici ou pas
@@ -402,6 +460,36 @@
}
/**
+ * Create and save project selection.
+ *
+ * @param project project to create selection
+ * @param selection selection to create
+ * @throws CoserBusinessException
+ */
+ public void createProjectSelection(Project project, Selection selection) throws CoserBusinessException {
+
+ // tout ce qui suit doit exister à ce stade
+ File projectsDirectory = config.getProjectsDirectory();
+ String projectName = project.getName();
+ File projectDirectory = new File(projectsDirectory, projectName);
+
+ // creation du dossier de selections (peut deja exister)
+ File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY);
+
+ // creation du dossier de la selection courante
+ File selectionDirectory = new File(selectionsDirectory, selection.getName());
+
+ if (selectionDirectory.isDirectory()) {
+ throw new CoserBusinessException(_("Selection %s already exists", selection.getName()));
+ }
+ else {
+ selectionDirectory.mkdirs();
+ saveProjectSelection(project, selection);
+ project.addSelections(selection);
+ }
+ }
+
+ /**
* Save project selection.
*
* @param project project to save selection
@@ -420,7 +508,6 @@
// creation du dossier de la selection courante
File selectionDirectory = new File(selectionsDirectory, selection.getName());
- selectionDirectory.mkdirs();
for (Category category : Category.values()) {
if (category.isDataCategory()) {
Modified: trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties
===================================================================
--- trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties 2010-10-27 14:12:12 UTC (rev 107)
@@ -6,6 +6,7 @@
Original\ line\ already\ exists\!=
Project\ %s\ already\ exist=
Project\ %s\ doesn't\ exists\ \!=
+Selection\ %s\ already\ exists=
Specy\ %s\ doesn't\ exist\ in\ referential=
Wrong\ header\ detected\ in\ file.\ Find\ \:\ %s,\ expected\ %s=
Wrong\ header\ detected\ in\ file.\ Find\ \:\ %s,\ expected\ %s\ or\ %s=
Modified: trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties
===================================================================
--- trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties 2010-10-27 14:12:12 UTC (rev 107)
@@ -6,9 +6,10 @@
Original\ line\ already\ exists\!=
Project\ %s\ already\ exist=Le projet %s existe d\u00E9j\u00E0 \!
Project\ %s\ doesn't\ exists\ \!=Le projet %s n'existe pas \!
-Specy\ %s\ doesn't\ exist\ in\ referential=
-Wrong\ header\ detected\ in\ file.\ Find\ \:\ %s,\ expected\ %s=auvais ent\u00EAte de fichier d\u00E9tect\u00E9.\nTrouv\u00E9\u2009\:\n\t%s\nAttendu\u2009\:\n\t%s.
-Wrong\ header\ detected\ in\ file.\ Find\ \:\ %s,\ expected\ %s\ or\ %s=Mauvais ent\u00EAte de fichier d\u00E9tect\u00E9.\nTrouv\u00E9\u2009\:\n\t%s\nAttendu\u2009\:\n\t%s\nou\u2009\:\n\t%s.
+Selection\ %s\ already\ exists=La s\u00E9lection %s existe d\u00E9j\u00E0 \!
+Specy\ %s\ doesn't\ exist\ in\ referential=L'esp\u00E8ce %s n'existe pas dans le r\u00E9f\u00E9rentiel
+Wrong\ header\ detected\ in\ file.\ Find\ \:\ %s,\ expected\ %s=Mauvais ent\u00EAte de fichier d\u00E9tect\u00E9.\n\nTrouv\u00E9\u2009\:\n\t%s\nAttendu\u2009\:\n\t%s.
+Wrong\ header\ detected\ in\ file.\ Find\ \:\ %s,\ expected\ %s\ or\ %s=Mauvais ent\u00EAte de fichier d\u00E9tect\u00E9.\n\nTrouv\u00E9\u2009\:\n\t%s\nAttendu\u2009\:\n\t%s\nou\u2009\:\n\t%s.
coser.business.category.catch=Captures
coser.business.category.haul=Traits
coser.business.category.length=Tailles
Modified: trunk/coser-business/src/main/resources/validators.xml
===================================================================
--- trunk/coser-business/src/main/resources/validators.xml 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-business/src/main/resources/validators.xml 2010-10-27 14:12:12 UTC (rev 107)
@@ -1,4 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Coser :: Business
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 14:12:12 UTC (rev 107)
@@ -113,7 +113,7 @@
@Test
public void testProjectYear() throws CoserBusinessException {
Project project = createTestProject(service);
- Selection selection = service.createProjectSelection(project);
+ Selection selection = service.initProjectSelection(project);
List<Integer> years = service.getProjectYears(selection);
Assert.assertEquals(2, years.size());
@@ -129,7 +129,7 @@
@Test
public void testProjectZone() throws CoserBusinessException {
Project project = createTestProject(service);
- Selection selection = service.createProjectSelection(project);
+ Selection selection = service.initProjectSelection(project);
List<String> zones = service.getProjectZone(selection, 2010, 2011);
Assert.assertEquals(6, zones.size());
@@ -149,7 +149,7 @@
@Test
public void testProjectSpecies() throws CoserBusinessException {
Project project = createTestProject(service);
- Selection selection = service.createProjectSelection(project);
+ Selection selection = service.initProjectSelection(project);
List<Specy> species = service.getProjectSpecies(selection, 2010, 2011);
Assert.assertEquals(4, species.size());
@@ -169,7 +169,7 @@
@Test
public void testMergeSpecies() throws CoserBusinessException {
Project project = createTestProject(service);
- Selection selection = service.createProjectSelection(project);
+ Selection selection = service.initProjectSelection(project);
Assert.assertTrue(service.isSpecyNameExist(project, "COSER_SPECIES_MERGE"));
Assert.assertEquals(25, selection.getCatch().size());
Modified: trunk/coser-ui/LICENSE.txt
===================================================================
--- trunk/coser-ui/LICENSE.txt 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/LICENSE.txt 2010-10-27 14:12:12 UTC (rev 107)
@@ -1,166 +1,674 @@
- GNU LESSER GENERAL PUBLIC LICENSE
+ GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
+ Preamble
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
- 0. Additional Definitions.
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
- 1. Exception to Section 3 of the GNU GPL.
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
+ The precise terms and conditions for copying, distribution and
+modification follow.
- 2. Conveying Modified Versions.
+ TERMS AND CONDITIONS
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
+ 0. Definitions.
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
+ "This License" refers to version 3 of the GNU General Public License.
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
- 3. Object Code Incorporating Material from Library Header Files.
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
- 4. Combined Works.
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
+ 1. Source Code.
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
- d) Do one of the following:
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
+ The Corresponding Source for a work in source code form is that
+same work.
- 5. Combined Libraries.
+ 2. Basic Permissions.
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
- 6. Revised Versions of the GNU Lesser General Public License.
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
+ 4. Conveying Verbatim Copies.
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx 2010-10-27 14:12:12 UTC (rev 107)
@@ -39,9 +39,10 @@
<JMenuItem text="coser.ui.mainframe.menu.quit" onActionPerformed="getHandler().quit()"/>
</JMenu>
- <JMenu id='menuWindow' text="coser.ui.mainframe.menu.window">
+ <JMenu id='menuWindow' text="coser.ui.mainframe.menu.window" enabled="false">
<JMenuItem text="coser.ui.mainframe.menu.window.validation" onActionPerformed="getHandler().showControlView()"/>
- <SelectionsListMenuItem text="coser.ui.mainframe.menu.window.selection" constructorParams="this" />
+ <SelectionsListMenuItem id="menuWindowSelectionMenuItem"
+ text="coser.ui.mainframe.menu.window.selection" constructorParams="this" />
</JMenu>
<JMenu id='menuOptions' text="coser.ui.mainframe.menu.options">
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-10-27 14:12:12 UTC (rev 107)
@@ -261,7 +261,7 @@
try {
Project project = get();
if (project != null) {
- view.setContextValue(project);
+ projectLoaded(project);
showControlView(false);
}
} catch (Exception ex) {
@@ -312,7 +312,7 @@
try {
Project project = get();
if (project != null) {
- view.setContextValue(project);
+ projectLoaded(project);
showControlView();
}
} catch (Exception ex) {
@@ -324,6 +324,15 @@
}
/**
+ * Do some operation when a new project is loaded into application.
+ */
+ protected void projectLoaded(Project project) {
+ view.setContextValue(project);
+ view.getMenuWindow().setEnabled(true);
+ view.getMenuWindowSelectionMenuItem().setProject(project);
+ }
+
+ /**
* Charge les données de control et affiche la vue de control.
*/
public void showControlView() {
@@ -363,11 +372,16 @@
ProjectService projectService = view.getContextValue(ProjectService.class);
Project project = view.getContextValue(Project.class);
try {
- Selection selection = projectService.createProjectSelection(project);
+ Selection selection = projectService.initProjectSelection(project);
view.setContextValue(selection);
SelectionView selectionView = new SelectionView(view);
+ selectionView.setCreationState(true);
selectionView.setSelection(selection);
+ // disable tabs
+ selectionView.setEnabledAt(1, false); // selection lists
+ selectionView.setEnabledAt(2, false); // rsufi
+ // fix, binding not working ?
selectionView.getSelectionDetailsTab().getValidatorSelection().setBean(selection);
selectionView.setHandler(new SelectionHandler());
@@ -391,7 +405,31 @@
* @param selectionName selection name to open
*/
public void showSelectionView(String selectionName) {
-
+ // get selected selection
+ ProjectService projectService = view.getContextValue(ProjectService.class);
+ Project project = view.getContextValue(Project.class);
+ Selection selection = project.getSelections().get(selectionName);
+ try {
+ projectService.loadSelectionData(project, selection);
+
+ view.setContextValue(selection);
+
+ SelectionView selectionView = new SelectionView(view);
+ selectionView.setSelection(selection);
+ // fix, binding not working ?
+ selectionView.getSelectionDetailsTab().getValidatorSelection().setBean(selection);
+ selectionView.setHandler(new SelectionHandler());
+
+ File file = new File("/home/chatellier/tmp/coser/zones.png");
+ ImageIcon icon = new ImageIcon(file.toURI().toURL());
+ selectionView.getSelectionDetailsTab().getZonesMap().setIcon(icon);
+
+ setMainComponent(selectionView);
+ } catch (CoserBusinessException ex) {
+ throw new CoserException("Can't reload selection data", ex);
+ } catch(Exception ex){
+ throw new CoserException("Can't init map", ex);
+ }
}
/**
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/SelectionsListMenuItem.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/SelectionsListMenuItem.java 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/SelectionsListMenuItem.java 2010-10-27 14:12:12 UTC (rev 107)
@@ -25,10 +25,11 @@
import static org.nuiton.i18n.I18n._;
-import java.awt.Component;
+import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.util.HashMap;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.Map;
import javax.swing.JMenu;
@@ -36,7 +37,12 @@
import javax.swing.JSeparator;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Selection;
+
/**
* Selection list menu item. Display dynamic entries for project selection.
*
@@ -46,23 +52,67 @@
* Last update : $Date$
* By : $Author$
*/
-public class SelectionsListMenuItem extends JMenu implements ActionListener {
+public class SelectionsListMenuItem extends JMenu implements ActionListener, PropertyChangeListener {
/** serialVersionUID. */
private static final long serialVersionUID = -3528302058982208907L;
+ private static final Log log = LogFactory.getLog(SelectionsListMenuItem.class);
+
protected CoserFrame view;
- protected Map<Object, Component> components;
+ protected Project project;
public SelectionsListMenuItem(CoserFrame view) {
super();
this.view = view;
- components = new HashMap<Object, Component>();
-
- // seperator
- add(new JSeparator());
-
+ updateMenuContent();
+ }
+
+ public Project getProject() {
+ return project;
+ }
+
+ public void setProject(Project project) {
+ if (this.project != null) {
+ this.project.removePropertyChangeListener(Project.PROPERTY_SELECTIONS, this);
+ }
+ this.project = project;
+ this.project.addPropertyChangeListener(Project.PROPERTY_SELECTIONS, this);
+ updateMenuContent();
+ }
+
+ protected void updateMenuContent() {
+ removeAll();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Refresh selection menu items");
+ }
+
+ if (project != null) {
+
+ Map<String, Selection> selections = project.getSelections();
+
+ if (selections == null || selections.isEmpty()) {
+ JMenuItem menuItem = new JMenuItem(_("coser.ui.mainframe.menu.window.noSelection"));
+ menuItem.setFont(menuItem.getFont().deriveFont(Font.ITALIC));
+ menuItem.setEnabled(false);
+ add(menuItem);
+ }
+ else {
+ for (String selectionName : selections.keySet()) {
+ // new selection
+ JMenuItem menuItem = new JMenuItem(selectionName);
+ menuItem.setActionCommand(selectionName);
+ menuItem.addActionListener(this);
+ add(menuItem);
+ }
+ }
+
+ // seperator
+ add(new JSeparator());
+ }
+
// new selection
JMenuItem menuItem = new JMenuItem(_("coser.ui.mainframe.menu.window.newSelection"));
menuItem.setActionCommand(""); // peut pas etre null, c'est nul !
@@ -85,4 +135,12 @@
view.getHandler().showSelectionView(actionCommand);
}
}
+
+ /*
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ updateMenuContent();
+ }
}
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-10-27 14:12:12 UTC (rev 107)
@@ -25,7 +25,9 @@
<Table>
<SelectionHandler id="handler" javaBean="null" />
-
+
+ <Boolean id="creationState" javaBean="false" />
+
<!-- Validation -->
<fr.ifremer.coser.bean.Selection id="selection" javaBean="null" />
<jaxx.runtime.validator.swing.SwingValidatorMessageTableModel id='errorsTableModel'
@@ -44,7 +46,8 @@
<JLabel text="coser.ui.selection.details.name" />
</cell>
<cell weightx="1" fill="horizontal" columns="3">
- <JTextField id="selectionDetailsSelecionNameField" text="{selection.getName()}" />
+ <JTextField id="selectionDetailsSelecionNameField" text="{getSelection().getName()}"
+ enabled="{isCreationState()}"/>
<javax.swing.text.Document javaBean="selectionDetailsSelecionNameField.getDocument()"
onInsertUpdate='getSelection().setName(selectionDetailsSelecionNameField.getText())'
onRemoveUpdate='getSelection().setName(selectionDetailsSelecionNameField.getText())' />
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-10-27 14:12:12 UTC (rev 107)
@@ -167,21 +167,26 @@
*/
public void saveSelection(SelectionDetailsView view) {
- // TODO test de nom valid ?
-
Project project = view.getContextValue(Project.class);
- Selection seletion = view.getContextValue(Selection.class);
+ Selection selection = view.getContextValue(Selection.class);
ProjectService service = view.getContextValue(ProjectService.class);
-
+ SelectionView selectionView = view.getParentContainer(SelectionView.class);
+
try {
- service.saveProjectSelection(project, seletion);
+ if (view.isCreationState()) {
+ service.createProjectSelection(project, selection);
+ selectionView.setCreationState(false);
+ }
+ else {
+ service.saveProjectSelection(project, selection);
+ }
}
catch (CoserBusinessException ex) {
+ JOptionPane.showMessageDialog(view, ex.getMessage(), _("coser.ui.selection.saveError"), JOptionPane.ERROR_MESSAGE);
throw new CoserException("Can't save selection", ex);
}
// enable tabs
- SelectionView selectionView = view.getParentContainer(SelectionView.class);
selectionView.setEnabledAt(1, true); // selection lists
selectionView.setEnabledAt(2, true); // rsufi
}
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx 2010-10-27 14:12:12 UTC (rev 107)
@@ -25,6 +25,8 @@
<JTabbedPane>
<fr.ifremer.coser.bean.Selection id="selection" javaBean="null" />
+ <Boolean id="creationState" javaBean="false" />
+
<SelectionHandler id="handler" javaBean="null" />
<script><![CDATA[
void $afterCompleteSetup() {
@@ -38,13 +40,13 @@
]]></script>
<tab title="coser.ui.selection.tab.details">
<SelectionDetailsView id="selectionDetailsTab" constructorParams="this"
- handler="{getHandler()}" selection="{getSelection()}"/>
+ handler="{getHandler()}" selection="{getSelection()}" creationState="{isCreationState()}"/>
</tab>
- <tab title="coser.ui.selection.tab.lists" enabled="false">
+ <tab title="coser.ui.selection.tab.lists">
<SelectionListsView id="selectionListsView" constructorParams="this"
handler="{getHandler()}" />
</tab>
- <tab title="coser.ui.selection.tab.result" enabled="false">
+ <tab title="coser.ui.selection.tab.result">
<SelectionResultView id="selectionResultView" constructorParams="this"
handler="{getHandler()}" />
</tab>
Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties
===================================================================
--- trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties 2010-10-27 14:12:12 UTC (rev 107)
@@ -2,13 +2,9 @@
coser.config.category.main=
coser.config.category.main.description=
coser.config.config.file.description=
-coser.config.database.directory.description=
coser.config.locale.description=Application's locale
coser.config.lookandfeel.description=Application's swing theme
-coser.config.reference.species.description=
-coser.config.reference.zones.description=
coser.config.support.email.description=Support email address
-coser.config.validator.directory.description=
coser.ui.common.cancel=Cancel
coser.ui.common.comment=Comment
coser.ui.common.delete=
@@ -44,6 +40,7 @@
coser.ui.mainframe.menu.view.lookandfeel=Theme
coser.ui.mainframe.menu.window=Window
coser.ui.mainframe.menu.window.newSelection=
+coser.ui.mainframe.menu.window.noSelection=
coser.ui.mainframe.menu.window.selection=
coser.ui.mainframe.menu.window.validation=
coser.ui.mainview.title=Contr\u00F4le et S\u00E9lection RSufi
@@ -58,7 +55,6 @@
coser.ui.project.openProjectTitle=
coser.ui.project.project=
coser.ui.project.projectname=Project name \:
-coser.ui.project.sizeFile=Size file \:
coser.ui.project.stratesFile=Strates file \:
coser.ui.project.traitsFile=Traits file \:
coser.ui.project.useCustomReferenceSpeciesFile=
@@ -69,7 +65,6 @@
coser.ui.result.extractDataTitle=
coser.ui.selection.allSpecies=All species
coser.ui.selection.details.beginDate=
-coser.ui.selection.details.createSelection=
coser.ui.selection.details.endDate=
coser.ui.selection.details.family=
coser.ui.selection.details.gender=
@@ -90,16 +85,14 @@
coser.ui.selection.invalidFusionName=
coser.ui.selection.maturitySpecies=Species with maturity
coser.ui.selection.occurenceDensitySpecies=Filtered species
+coser.ui.selection.saveError=
coser.ui.selection.sizeAllYearSpecies=Species with size all year
coser.ui.selection.speciesMenuFusion=
coser.ui.selection.speciesMenuLabel=
coser.ui.selection.tab.details=
coser.ui.selection.tab.lists=
coser.ui.selection.tab.result=
-coser.ui.selectionlist.createSelection=Create selection
-coser.ui.selectionlist.species=
coser.ui.validation.checkData=Check data
-coser.ui.validation.data.index=
coser.ui.validators.cancel=
coser.ui.validators.deleteValidator=
coser.ui.validators.description=
Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties
===================================================================
--- trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties 2010-10-27 14:12:12 UTC (rev 107)
@@ -40,6 +40,7 @@
coser.ui.mainframe.menu.view.lookandfeel=Th\u00E8me
coser.ui.mainframe.menu.window=Fen\u00EAtre
coser.ui.mainframe.menu.window.newSelection=Nouvelle s\u00E9lection
+coser.ui.mainframe.menu.window.noSelection=Aucune s\u00E9lection
coser.ui.mainframe.menu.window.selection=S\u00E9lection
coser.ui.mainframe.menu.window.validation=Validation
coser.ui.mainview.title=Contr\u00F4le et S\u00E9lection RSufi
@@ -84,6 +85,7 @@
coser.ui.selection.invalidFusionName=Le nom de fusion choisit n'est pas pr\u00E9sent de le r\u00E9f\u00E9rentiel \!
coser.ui.selection.maturitySpecies=Esp\u00E8ces avec maturit\u00E9
coser.ui.selection.occurenceDensitySpecies=Esp\u00E8ces filtr\u00E9es
+coser.ui.selection.saveError=Erreur de sauvegarde
coser.ui.selection.sizeAllYearSpecies=Esp\u00E8ces avec taille pour toutes les ann\u00E9es
coser.ui.selection.speciesMenuFusion=Fusion
coser.ui.selection.speciesMenuLabel=Menu esp\u00E8ces
@@ -91,7 +93,6 @@
coser.ui.selection.tab.lists=Listes des esp\u00E8ces
coser.ui.selection.tab.result=Resultats RSufi
coser.ui.validation.checkData=V\u00E9rifier les donn\u00E9es
-coser.ui.validation.data.index=Index
coser.ui.validators.cancel=Annuler
coser.ui.validators.deleteValidator=Supprimer
coser.ui.validators.description=L'application doit \u00EAtre red\u00E9marr\u00E9e apr\u00E8s la modification des validateurs.
Modified: trunk/coser-web/src/license/THIRD-PARTY.properties
===================================================================
--- trunk/coser-web/src/license/THIRD-PARTY.properties 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-web/src/license/THIRD-PARTY.properties 2010-10-27 14:12:12 UTC (rev 107)
@@ -1,3 +1,26 @@
+###
+# #%L
+# Coser :: Web
+#
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2010 Ifremer, Codelutin
+# %%
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# #L%
+###
# Generated by org.nuiton.license.plugin.AddThirdPartyMojo
#-------------------------------------------------------------------------------
# Already used licenses in project :
Modified: trunk/coser-web/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/coser-web/src/main/webapp/WEB-INF/web.xml 2010-10-27 11:47:34 UTC (rev 106)
+++ trunk/coser-web/src/main/webapp/WEB-INF/web.xml 2010-10-27 14:12:12 UTC (rev 107)
@@ -1,4 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Coser :: Web
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero 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 Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #L%
+ -->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.5//EN"
1
0
r106 - in trunk: . coser-business/src/main/java/fr/ifremer/coser/bean coser-business/src/main/java/fr/ifremer/coser/command coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/main/resources/fr/ifremer/coser/bean coser-business/src/main/resources/i18n coser-business/src/test/java/fr/ifremer/coser/services coser-ui/src/main/java/fr/ifremer/coser coser-ui/src/main/java/fr/ifremer/coser/ui coser-ui/src/main/java/fr/ifremer/coser/ui/control coser-ui/src/main/java/fr/ifremer
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
by chatellier@users.labs.libre-entreprise.org 27 Oct '10
27 Oct '10
Author: chatellier
Date: 2010-10-27 11:47:34 +0000 (Wed, 27 Oct 2010)
New Revision: 106
Log:
Modify data loading time (control / selection)
Added:
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataContainer.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Control.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Selection.java
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Selection-error-validation.xml
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Project-error-validation.xml
trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties
trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties
trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/ProjectCreationView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/YearComboBoxModel.java
trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties
trunk/pom.xml
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataContainer.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataContainer.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataContainer.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -0,0 +1,172 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.bean;
+
+import java.util.List;
+
+import fr.ifremer.coser.command.Command;
+import fr.ifremer.coser.storage.DataStorage;
+
+/**
+ * TODO add comment here.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class AbstractDataContainer extends AbstractEntity {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 3963187480579783560L;
+
+ protected DataStorage dataCatch;
+
+ /** Deleted catch (can be null). */
+ protected DataStorage deletedDataCatch;
+
+ protected DataStorage dataStrata;
+
+ /** Deleted strata (can be null). */
+ protected DataStorage deletedDataStrata;
+
+ protected DataStorage dataHaul;
+
+ /** Deleted haul (can be null). */
+ protected DataStorage deletedDataHaul;
+
+ protected DataStorage dataLength;
+
+ /** Deleted length (can be null). */
+ protected DataStorage deletedDataLength;
+
+ /** L'historique des commandes do/undo .*/
+ protected List<Command> historyCommand;
+
+ /**
+ * Clear all data to force free memory.
+ */
+ public void clearData() {
+ dataCatch = null;
+ deletedDataCatch = null;
+ dataStrata = null;
+ deletedDataStrata = null;
+ dataHaul = null;
+ deletedDataHaul = null;
+ dataLength = null;
+ deletedDataLength = null;
+ historyCommand = null;
+ }
+
+ public DataStorage getCatch() {
+ return dataCatch;
+ }
+
+ public void setCatch(DataStorage dataCatch) {
+ this.dataCatch = dataCatch;
+ }
+
+ public DataStorage getStrata() {
+ return dataStrata;
+ }
+
+ public void setStrata(DataStorage dataStrata) {
+ this.dataStrata = dataStrata;
+ }
+
+ public DataStorage getHaul() {
+ return dataHaul;
+ }
+
+ public void setHaul(DataStorage dataHaul) {
+ this.dataHaul = dataHaul;
+ }
+
+ public DataStorage getLength() {
+ return dataLength;
+ }
+
+ public void setLength(DataStorage dataLength) {
+ this.dataLength = dataLength;
+ }
+
+ public DataStorage getDeletedCatch() {
+ return deletedDataCatch;
+ }
+
+ public void setDeletedCatch(DataStorage deletedDataCatch) {
+ this.deletedDataCatch = deletedDataCatch;
+ }
+
+ public DataStorage getDeletedStrata() {
+ return deletedDataStrata;
+ }
+
+ public void setDeletedStrata(DataStorage deletedDataStrata) {
+ this.deletedDataStrata = deletedDataStrata;
+ }
+
+ public DataStorage getDeletedHaul() {
+ return deletedDataHaul;
+ }
+
+ public void setDeletedHaul(DataStorage deletedDataHaul) {
+ this.deletedDataHaul = deletedDataHaul;
+ }
+
+ public DataStorage getDeletedLength() {
+ return deletedDataLength;
+ }
+
+ public void setDeletedLength(DataStorage deletedDataLength) {
+ this.deletedDataLength = deletedDataLength;
+ }
+
+ public List<Command> getHistoryCommand() {
+ return historyCommand;
+ }
+
+ public void setHistoryCommand(List<Command> historyCommand) {
+ this.historyCommand = historyCommand;
+ }
+
+ /**
+ * Return {@code true} if data are loaded.
+ *
+ * If lists are non {@code null}.
+ *
+ * @return {@code true} if at least one list is not {@code null}
+ */
+ public boolean isDataLoaded() {
+ boolean result = false;
+ result |= dataCatch != null;
+ result |= dataStrata != null;
+ result |= dataHaul != null;
+ result |= dataLength != null;
+ return result;
+ }
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataContainer.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Control.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Control.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Control.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -0,0 +1,42 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.bean;
+
+/**
+ * Control entity.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class Control extends AbstractDataContainer {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 3693938021315541627L;
+
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Control.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -25,9 +25,8 @@
package fr.ifremer.coser.bean;
-import java.util.List;
+import java.util.Map;
-import fr.ifremer.coser.command.Command;
import fr.ifremer.coser.storage.DataStorage;
/**
@@ -54,33 +53,14 @@
};
protected String name;
-
- protected DataStorage dataCatch;
-
- protected DataStorage deletedDataCatch;
-
- protected DataStorage dataStrata;
-
- protected DataStorage deletedDataStrata;
-
- protected DataStorage dataHaul;
-
- protected DataStorage deletedDataHaul;
-
- protected DataStorage dataLength;
-
- protected DataStorage deletedDataLength;
+ protected Control control;
+
+ protected Map<String, Selection> selections;
+
/** Reftax SIH. */
protected DataStorage refTaxSpecies;
- /** L'historique des commandes do/undo .*/
- protected List<Command> historyCommand;
-
- public DataStorage getCatch() {
- return dataCatch;
- }
-
public String getName() {
return name;
}
@@ -91,66 +71,25 @@
getPropertyChangeSupport().firePropertyChange("name", oldValue, name);
}
- public void setCatch(DataStorage dataCatch) {
- this.dataCatch = dataCatch;
+ public Control getControl() {
+ return control;
}
- public DataStorage getStrata() {
- return dataStrata;
+ public void setControl(Control control) {
+ Control oldValue = this.control;
+ this.control = control;
+ getPropertyChangeSupport().firePropertyChange("control", oldValue, control);
}
- public void setStrata(DataStorage dataStrata) {
- this.dataStrata = dataStrata;
+ public Map<String, Selection> getSelections() {
+ return selections;
}
- public DataStorage getHaul() {
- return dataHaul;
+ public void setSelections(Map<String, Selection> selections) {
+ this.selections = selections;
+ getPropertyChangeSupport().firePropertyChange("selections", null, selections);
}
- public void setHaul(DataStorage dataHaul) {
- this.dataHaul = dataHaul;
- }
-
- public DataStorage getLength() {
- return dataLength;
- }
-
- public void setLength(DataStorage dataLength) {
- this.dataLength = dataLength;
- }
-
- public DataStorage getDeletedCatch() {
- return deletedDataCatch;
- }
-
- public void setDeletedCatch(DataStorage deletedDataCatch) {
- this.deletedDataCatch = deletedDataCatch;
- }
-
- public DataStorage getDeletedStrata() {
- return deletedDataStrata;
- }
-
- public void setDeletedStrata(DataStorage deletedDataStrata) {
- this.deletedDataStrata = deletedDataStrata;
- }
-
- public DataStorage getDeletedHaul() {
- return deletedDataHaul;
- }
-
- public void setDeletedHaul(DataStorage deletedDataHaul) {
- this.deletedDataHaul = deletedDataHaul;
- }
-
- public DataStorage getDeletedLength() {
- return deletedDataLength;
- }
-
- public void setDeletedLength(DataStorage deletedDataLength) {
- this.deletedDataLength = deletedDataLength;
- }
-
public DataStorage getRefTaxSpecies() {
return refTaxSpecies;
}
@@ -158,12 +97,18 @@
public void setRefTaxSpecies(DataStorage refTaxSpecies) {
this.refTaxSpecies = refTaxSpecies;
}
-
- public List<Command> getHistoryCommand() {
- return historyCommand;
+
+ /**
+ * Force all container data clear to force free memory.
+ */
+ public void clearData() {
+ if (control != null) {
+ control.clearData();
+ }
+ if (selections != null) {
+ for (Selection selection : selections.values()) {
+ selection.clearData();
+ }
+ }
}
-
- public void setHistoryCommand(List<Command> historyCommand) {
- this.historyCommand = historyCommand;
- }
}
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Selection.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Selection.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Selection.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -0,0 +1,53 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.bean;
+
+/**
+ * Project selection.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class Selection extends AbstractDataContainer {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = -1484104459960459854L;
+
+ protected String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ String oldValue = this.name;
+ this.name = name;
+ getPropertyChangeSupport().firePropertyChange("name", oldValue, name);
+ }
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Selection.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -28,6 +28,7 @@
import java.util.UUID;
import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.bean.AbstractDataContainer;
import fr.ifremer.coser.bean.Project;
/**
@@ -73,15 +74,17 @@
* Do command on project.
*
* @param project project
+ * @param container container
* @throws CoserBusinessException
*/
- public abstract void doCommand(Project project) throws CoserBusinessException;
+ public abstract void doCommand(Project project, AbstractDataContainer container) throws CoserBusinessException;
/**
* Undo command on project.
*
* @param project project
+ * @param container container
* @throws CoserBusinessException
*/
- public abstract void undoCommand(Project project) throws CoserBusinessException;
+ public abstract void undoCommand(Project project, AbstractDataContainer container) throws CoserBusinessException;
}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -34,6 +34,7 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants.Category;
+import fr.ifremer.coser.bean.AbstractDataContainer;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.data.AbstractDataEntity;
import fr.ifremer.coser.storage.DataStorage;
@@ -74,28 +75,28 @@
}
@Override
- public void doCommand(Project project) throws CoserBusinessException {
-
+ public void doCommand(Project project, AbstractDataContainer container) throws CoserBusinessException {
+
DataStorage dataStorage = null;
DataStorage deletedDataStorage = null;
// get data storage depending on category
switch(category) {
case CATCH:
- dataStorage = project.getCatch();
- deletedDataStorage = project.getDeletedCatch();
+ dataStorage = container.getCatch();
+ deletedDataStorage = container.getDeletedCatch();
break;
case HAUL:
- dataStorage = project.getHaul();
- deletedDataStorage = project.getDeletedHaul();
+ dataStorage = container.getHaul();
+ deletedDataStorage = container.getDeletedHaul();
break;
case LENGTH:
- dataStorage = project.getLength();
- deletedDataStorage = project.getDeletedLength();
+ dataStorage = container.getLength();
+ deletedDataStorage = container.getDeletedLength();
break;
case STRATA:
- dataStorage = project.getStrata();
- deletedDataStorage = project.getDeletedStrata();
+ dataStorage = container.getStrata();
+ deletedDataStorage = container.getDeletedStrata();
break;
}
@@ -123,27 +124,28 @@
}
@Override
- public void undoCommand(Project project) throws CoserBusinessException {
+ public void undoCommand(Project project, AbstractDataContainer container) throws CoserBusinessException {
+
DataStorage dataStorage = null;
DataStorage deletedDataStorage = null;
// get data storage depending on category
switch(category) {
case CATCH:
- dataStorage = project.getCatch();
- deletedDataStorage = project.getDeletedCatch();
+ dataStorage = container.getCatch();
+ deletedDataStorage = container.getDeletedCatch();
break;
case HAUL:
- dataStorage = project.getHaul();
- deletedDataStorage = project.getDeletedHaul();
+ dataStorage = container.getHaul();
+ deletedDataStorage = container.getDeletedHaul();
break;
case LENGTH:
- dataStorage = project.getLength();
- deletedDataStorage = project.getDeletedLength();
+ dataStorage = container.getLength();
+ deletedDataStorage = container.getDeletedLength();
break;
case STRATA:
- dataStorage = project.getStrata();
- deletedDataStorage = project.getDeletedStrata();
+ dataStorage = container.getStrata();
+ deletedDataStorage = container.getDeletedStrata();
break;
}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -32,6 +32,8 @@
import org.apache.commons.logging.LogFactory;
import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.bean.AbstractDataContainer;
+import fr.ifremer.coser.bean.Control;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.data.Catch;
@@ -72,10 +74,10 @@
* @see fr.ifremer.coser.command.Command#doCommand(fr.ifremer.coser.bean.Project)
*/
@Override
- public void doCommand(Project project) throws CoserBusinessException {
+ public void doCommand(Project project, AbstractDataContainer container) throws CoserBusinessException {
- project = mergeCatch(project, newSpecyName, speciesNames);
- project = mergeLength(project, newSpecyName, speciesNames);
+ project = mergeCatch(project, container, newSpecyName, speciesNames);
+ project = mergeLength(project, container, newSpecyName, speciesNames);
}
@@ -83,7 +85,7 @@
* @see fr.ifremer.coser.command.Command#undoCommand(fr.ifremer.coser.bean.Project)
*/
@Override
- public void undoCommand(Project project) throws CoserBusinessException {
+ public void undoCommand(Project project, AbstractDataContainer container) throws CoserBusinessException {
throw new NotImplementedException("Merge operation can't be undone");
}
@@ -92,12 +94,13 @@
* Fusion d'espece dans les données de captures.
*
* @param project project
+ * @param container data container
* @param newSpecyName new specy name (after merge)
* @param speciesNames species name to merge
* @return project
*/
- protected Project mergeLength(Project project, String newSpecyName,
- String... speciesNames) {
+ protected Project mergeLength(Project project, AbstractDataContainer container,
+ String newSpecyName, String... speciesNames) {
return project;
}
@@ -105,12 +108,13 @@
* Fusion d'especes dans les données de taille.
*
* @param project project
+ * @param container data container
* @param newSpecyName new specy name (after merge)
* @param speciesNames species name to merge
* @return project
*/
- protected Project mergeCatch(Project project, String newSpecyName,
- String... speciesNames) {
+ protected Project mergeCatch(Project project, AbstractDataContainer container,
+ String newSpecyName, String... speciesNames) {
// "Campagne","Annee","Trait","Espece","Nombre","Poids"
@@ -122,7 +126,7 @@
int tupleIndex = -1;
// parcours des elements
- Iterator<String[]> itTuple = project.getCatch().iterator();
+ Iterator<String[]> itTuple = container.getCatch().iterator();
itTuple.next(); // skip header
int index = 1; // skip header
while (itTuple.hasNext()) {
@@ -170,7 +174,7 @@
index--;
}
- project.getCatch().set(tupleIndex, tupleFound);
+ container.getCatch().set(tupleIndex, tupleFound);
}
index++;
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -27,6 +27,7 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants.Category;
+import fr.ifremer.coser.bean.AbstractDataContainer;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.data.Catch;
import fr.ifremer.coser.data.Haul;
@@ -100,12 +101,12 @@
}
@Override
- public void doCommand(Project project) throws CoserBusinessException {
+ public void doCommand(Project project, AbstractDataContainer container) throws CoserBusinessException {
}
@Override
- public void undoCommand(Project project) throws CoserBusinessException {
+ public void undoCommand(Project project, AbstractDataContainer container) throws CoserBusinessException {
}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -33,6 +33,7 @@
import fr.ifremer.coser.CoserBusinessConfig;
import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.bean.AbstractDataContainer;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.command.Command;
@@ -69,9 +70,10 @@
*
* @param command command to perform
* @param project project
+ * @param container container
* @throws CoserBusinessException
*/
- public void doAction(Command command, Project project) throws CoserBusinessException {
+ public void doAction(Command command, Project project, AbstractDataContainer container) throws CoserBusinessException {
if (log.isDebugEnabled()) {
log.debug("Do action " + command);
}
@@ -81,20 +83,21 @@
command.setCommandUUID(getUniqueCommandUUID());
}
- command.doCommand(project);
- project.getHistoryCommand().add(command);
+ command.doCommand(project, container);
+ container.getHistoryCommand().add(command);
}
/**
* Undo last command on project.
*
* @param project project
+ * @param container container
* @throws CoserBusinessException
*/
- public void undoAction(Project project) throws CoserBusinessException {
+ public void undoAction(Project project, AbstractDataContainer container) throws CoserBusinessException {
+
+ ListIterator<Command> itCommand = container.getHistoryCommand().listIterator(container.getHistoryCommand().size());
- ListIterator<Command> itCommand = project.getHistoryCommand().listIterator(project.getHistoryCommand().size());
-
String lastUUID = null;
while (itCommand.hasPrevious()) {
Command command = itCommand.previous();
@@ -103,7 +106,7 @@
break;
}
else {
- command.undoCommand(project);
+ command.undoCommand(project, container);
lastUUID = command.getCommandUUID();
itCommand.remove();
}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -46,7 +46,10 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants;
import fr.ifremer.coser.CoserConstants.Category;
+import fr.ifremer.coser.bean.AbstractDataContainer;
+import fr.ifremer.coser.bean.Control;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Selection;
import fr.ifremer.coser.bean.Specy;
import fr.ifremer.coser.command.Command;
import fr.ifremer.coser.command.DeleteLineCommand;
@@ -97,13 +100,108 @@
}
/**
- * Load project.
+ * Create new project.
*
- * @param projectName project name to load
+ * Do (ordered):
+ * - project existence test
+ * - data loading
+ * - data copying (after loading check)
+ *
+ * @param project project to create
+ * @param categoriesAndFiles additional files to load
+ * @return project with filled data
+ * @throws CoserBusinessException if project can't be created
+ */
+ public Project createProject(Project project, Map<Category, File> categoriesAndFiles) throws CoserBusinessException {
+ File projectsDirectory = config.getProjectsDirectory();
+ if (!projectsDirectory.isDirectory()) {
+ projectsDirectory.mkdirs();
+ }
+
+ String projectName = project.getName();
+ // check project existence
+ File[] projects = projectsDirectory.listFiles();
+ for (File existingProject : projects) {
+ if (existingProject.getName().equalsIgnoreCase(projectName)) {
+ throw new CoserBusinessException(_("Project %s already exist", project.getName()));
+ }
+ }
+
+ // first free memory, clear all data
+ project.clearData();
+
+ Control control = new Control();
+
+ // load each files
+ // loaded before any creation, to check data format
+ // useless loading, just to check data
+ for (Map.Entry<Category, File> categoryAndFile : categoriesAndFiles.entrySet()) {
+ Category category = categoryAndFile.getKey();
+ File dataFile = categoryAndFile.getValue();
+ DataStorage dataStorage = importService.loadCSVFile(project, category, dataFile, true);
+ addProjectContent(project, control, category, dataStorage, false);
+
+ // init empty deleted collection
+ if (category.isDataCategory()) {
+ // deleted data
+ DataStorage dataStorage2 = importService.getEmptyStorage(project, category);
+ addProjectContent(project, control, category, dataStorage2, true);
+ }
+ }
+
+ // create new project directory
+ File projectDirectory = new File(projectsDirectory, projectName);
+ projectDirectory.mkdirs();
+
+ // sauvegarde des fichiers (tracabilité)
+ File originalDirectory = new File(projectDirectory, CoserConstants.STORAGE_ORIGINAL_DIRECTORY);
+ originalDirectory.mkdirs();
+ for (Map.Entry<Category, File> categoryAndFile : categoriesAndFiles.entrySet()) {
+ Category category = categoryAndFile.getKey();
+ File dataFile = categoryAndFile.getValue();
+ try {
+
+ // les fichiers de donnees sont stockes dans un repertoire
+ // "original"
+ if (category.isDataCategory()) {
+ File storageDataFile = new File(originalDirectory,
+ category.getStorageFileName() + CoserConstants.STORAGE_CSV_EXTENSION);
+ FileUtils.copyFile(dataFile, storageDataFile);
+ }
+
+ // les fichiers autres (reftax) sont stockes a la base
+ else {
+ File storageDataFile = new File(projectDirectory,
+ category.getStorageFileName() + CoserConstants.STORAGE_CSV_EXTENSION);
+ FileUtils.copyFile(dataFile, storageDataFile);
+ }
+ } catch (IOException ex) {
+ // clean creates directories
+ try {
+ FileUtils.deleteDirectory(projectDirectory);
+ } catch (IOException e) {
+ throw new CoserBusinessException(_("Can't create project"), ex);
+ }
+ throw new CoserBusinessException(_("Can't create project"), ex);
+ }
+ }
+
+ control.setHistoryCommand(new ArrayList<Command>());
+ project.setControl(control);
+
+ return project;
+ }
+
+ /**
+ * Open project without loading data.
+ *
+ * Just load non category data (reftax).
+ *
+ * @param projectName project name to open
* @return loaded project with data
* @throws CoserBusinessException
*/
- public Project loadProject(String projectName) throws CoserBusinessException {
+ public Project openProject(String projectName) throws CoserBusinessException {
// check project existence
File projectsDirectory = config.getProjectsDirectory();
@@ -114,6 +212,41 @@
Project project = new Project();
project.setName(projectName);
+ // load additional files
+ File inputFile = new File(projectDirectory,
+ Category.REFTAX_SPECIES.getStorageFileName() +
+ CoserConstants.STORAGE_CSV_EXTENSION);
+
+ if (inputFile.isFile()) {
+ DataStorage dataStorage = importService.loadCSVFile(project, Category.REFTAX_SPECIES, inputFile, true);
+ addProjectContent(project, null, Category.REFTAX_SPECIES, dataStorage, false);
+ }
+ else {
+ // si on arrive ici et qu'un fichier original
+ // n'existe pas, c'est grave
+ throw new CoserBusinessException(_("Missing file %s", inputFile));
+ }
+
+ return project;
+ }
+
+ /**
+ * Load control data in an initialized project.
+ *
+ * @param project project
+ * @return project with data
+ * @throws CoserBusinessException
+ */
+ public Project loadControlData(Project project) throws CoserBusinessException {
+
+ File projectsDirectory = config.getProjectsDirectory();
+ File projectDirectory = new File(projectsDirectory, project.getName());
+
+ // first free memory, clear all data
+ project.clearData();
+
+ Control control = new Control();
+
// try to load validated data first
File controlDirectory = new File(projectDirectory, CoserConstants.STORAGE_CONTROL_DIRECTORY);
int fileLoaded = 0;
@@ -126,7 +259,7 @@
if (inputFile.isFile()) {
DataStorage dataStorage = importService.loadCSVFile(project, category, inputFile, false);
- addProjectContent(project, category, dataStorage, false);
+ addProjectContent(project, control, category, dataStorage, false);
fileLoaded++;
}
else {
@@ -148,7 +281,7 @@
log.debug("Can't find file " + inputFile);
}
}
- addProjectContent(project, category, dataStorage, true);
+ addProjectContent(project, control, category, dataStorage, true);
}
}
@@ -164,7 +297,7 @@
// main data
if (storageDataFile.isFile()) {
DataStorage dataStorage = importService.loadCSVFile(project, category, storageDataFile, true);
- addProjectContent(project, category, dataStorage, false);
+ addProjectContent(project, control, category, dataStorage, false);
}
else {
// si on arrive ici et qu'un fichier original
@@ -174,169 +307,20 @@
// deleted data
DataStorage dataStorage = importService.getEmptyStorage(project, category);
- addProjectContent(project, category, dataStorage, true);
+ addProjectContent(project, control, category, dataStorage, true);
}
}
}
- // load additional files
- File inputFile = new File(projectDirectory,
- Category.REFTAX_SPECIES.getStorageFileName() +
- CoserConstants.STORAGE_CSV_EXTENSION);
+ // TODO echatellier 20101027 need history file reloading
+ control.setHistoryCommand(new ArrayList<Command>());
- if (inputFile.isFile()) {
- DataStorage dataStorage = importService.loadCSVFile(project, Category.REFTAX_SPECIES, inputFile, true);
- addProjectContent(project, Category.REFTAX_SPECIES, dataStorage, false);
- }
- else {
- // si on arrive ici et qu'un fichier original
- // n'existe pas, c'est grave
- throw new CoserBusinessException(_("Missing file %s", inputFile));
- }
+ project.setControl(control);
- // init des autres resources du projet
- project.setHistoryCommand(new ArrayList<Command>());
-
return project;
}
/**
- * Set content into project depending on category type.
- *
- * @param project project
- * @param category category
- * @param content content to set
- * @param deletedContent if content means deleted objects for {@code category}
- */
- protected void addProjectContent(Project project, Category category,
- DataStorage content, boolean deletedContent) {
-
- switch (category) {
- case CATCH:
- if (!deletedContent) {
- project.setCatch(content);
- }
- else {
- project.setDeletedCatch(content);
- }
- break;
- case HAUL:
- if (!deletedContent) {
- project.setHaul(content);
- }
- else {
- project.setDeletedHaul(content);
- }
- break;
- case LENGTH:
- if (!deletedContent) {
- project.setLength(content);
- }
- else {
- project.setDeletedLength(content);
- }
- break;
- case STRATA:
- if (!deletedContent) {
- project.setStrata(content);
- }
- else {
- project.setDeletedStrata(content);
- }
- break;
- case REFTAX_SPECIES:
- project.setRefTaxSpecies(content);
- break;
- }
- }
-
- /**
- * Create new project.
- *
- * Do (ordered):
- * - project existence test
- * - data loading
- * - data copying (after loading check)
- *
- * @param project project to create
- * @param categoriesAndFiles additionals files to load
- * @return project with filled data
- * @throws CoserBusinessException if project can't be created
- */
- public Project createProject(Project project, Map<Category, File> categoriesAndFiles) throws CoserBusinessException {
- File projectsDirectory = config.getProjectsDirectory();
- if (!projectsDirectory.isDirectory()) {
- projectsDirectory.mkdirs();
- }
-
- String projectName = project.getName();
- // check project existence
- File[] projects = projectsDirectory.listFiles();
- for (File existingProject : projects) {
- if (existingProject.getName().equalsIgnoreCase(projectName)) {
- throw new CoserBusinessException(_("Project %s already exist", project.getName()));
- }
- }
-
- // load each files
- // loaded before any creation, to check data format
- for (Map.Entry<Category, File> categoryAndFile : categoriesAndFiles.entrySet()) {
- Category category = categoryAndFile.getKey();
- File dataFile = categoryAndFile.getValue();
- DataStorage dataStorage = importService.loadCSVFile(project, category, dataFile, true);
- addProjectContent(project, category, dataStorage, false);
-
- if (category.isDataCategory()) {
- // deleted data
- DataStorage dataStorage2 = importService.getEmptyStorage(project, category);
- addProjectContent(project, category, dataStorage2, true);
- }
- }
-
- // create new project directory
- File projectDirectory = new File(projectsDirectory, projectName);
- projectDirectory.mkdirs();
-
- // sauvegarde des fichier (tracabilité)
- File originalDirectory = new File(projectDirectory, CoserConstants.STORAGE_ORIGINAL_DIRECTORY);
- originalDirectory.mkdirs();
- for (Map.Entry<Category, File> categoryAndFile : categoriesAndFiles.entrySet()) {
- Category category = categoryAndFile.getKey();
- File dataFile = categoryAndFile.getValue();
- try {
-
- // les fichiers de donnees sont stockes dans un repertoire
- // "original"
- if (category.isDataCategory()) {
- File storageDataFile = new File(originalDirectory,
- category.getStorageFileName() + CoserConstants.STORAGE_CSV_EXTENSION);
- FileUtils.copyFile(dataFile, storageDataFile);
- }
-
- // les fichiers autres (refatx) sont stockes a la base
- else {
- File storageDataFile = new File(projectDirectory,
- category.getStorageFileName() + CoserConstants.STORAGE_CSV_EXTENSION);
- FileUtils.copyFile(dataFile, storageDataFile);
- }
- } catch (IOException ex) {
- // clean creates directories
- try {
- FileUtils.deleteDirectory(projectDirectory);
- } catch (IOException e) {
- throw new CoserBusinessException(_("Can't create project"), ex);
- }
- throw new CoserBusinessException(_("Can't create project"), ex);
- }
- }
-
- // init des autres resources du projet
- project.setHistoryCommand(new ArrayList<Command>());
-
- return project;
- }
-
- /**
* Enregistre les fichiers de données apres validation.
*
* @param project project to save
@@ -363,11 +347,11 @@
if (log.isDebugEnabled()) {
log.debug("Saving control file : " + controlFile);
}
- DataStorage content = getProjectContent(project, category, false);
+ DataStorage content = getProjectContent(project, project.getControl(), category, false);
importService.storeData(project, content, controlFile);
// save deleted content (if needed)
- DataStorage contentDeleted = getProjectContent(project, category, true);
+ DataStorage contentDeleted = getProjectContent(project, project.getControl(), category, true);
// if more content than header
if (contentDeleted.size() > 1) {
File deletedDataFile = new File(controlDirectory,
@@ -381,6 +365,84 @@
}
/**
+ * Creer une instance de selection "non sauvegardee" avec les données
+ * de control (validée) du projet.
+ *
+ * @param project project to create selection
+ * @return selection
+ * @throws CoserBusinessException
+ */
+ public Selection createProjectSelection(Project project) throws CoserBusinessException {
+
+ // TODO echatellier 20101027 voir si on force que les
+ // fichier de validation existe ici ou pas
+
+ Project localProject = project;
+ if (!localProject.getControl().isDataLoaded()) {
+ localProject = loadControlData(localProject);
+ }
+
+ // create new selection
+ Control control = localProject.getControl();
+ DataStorage dataCatch = control.getCatch();
+ DataStorage dataHaul = control.getHaul();
+ DataStorage dataLength = control.getLength();
+ DataStorage dataStrata = control.getStrata();
+
+ project.clearData();
+
+ Selection selection = new Selection();
+ selection.setCatch(dataCatch);
+ selection.setHaul(dataHaul);
+ selection.setLength(dataLength);
+ selection.setStrata(dataStrata);
+ selection.setHistoryCommand(new ArrayList<Command>());
+
+ return selection;
+ }
+
+ /**
+ * Save project selection.
+ *
+ * @param project project to save selection
+ * @param selection selection to save
+ * @throws CoserBusinessException
+ */
+ public void saveProjectSelection(Project project, Selection selection) throws CoserBusinessException {
+
+ // tout ce qui suit doit exister à ce stade
+ File projectsDirectory = config.getProjectsDirectory();
+ String projectName = project.getName();
+ File projectDirectory = new File(projectsDirectory, projectName);
+
+ // creation du dossier de selections (peut deja exister)
+ File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY);
+
+ // creation du dossier de la selection courante
+ File selectionDirectory = new File(selectionsDirectory, selection.getName());
+ selectionDirectory.mkdirs();
+
+ for (Category category : Category.values()) {
+ if (category.isDataCategory()) {
+ File controlFile = new File(selectionDirectory,
+ category.getStorageFileName() +
+ CoserConstants.STORAGE_SELECTION_SUFFIX +
+ CoserConstants.STORAGE_CSV_EXTENSION);
+ if (log.isDebugEnabled()) {
+ log.debug("Saving selection file : " + controlFile);
+ }
+
+ DataStorage content = getProjectContent(project, selection, category, false);
+ importService.storeData(project, content, controlFile);
+
+ // delete data are not saved here
+ // can't delete data in selection
+ }
+ }
+
+ }
+
+ /**
* Set content into project depending on category type.
*
* @param project project
@@ -388,101 +450,134 @@
* @param content content to set
* @param deletedContent if content means deleted objects for {@code category}
*/
- protected DataStorage getProjectContent(Project project, Category category, boolean deletedContent) {
+ protected void addProjectContent(Project project, AbstractDataContainer container,
+ Category category, DataStorage content, boolean deletedContent) {
- DataStorage content = null;
-
switch (category) {
case CATCH:
if (!deletedContent) {
- content = project.getCatch();
+ container.setCatch(content);
}
else {
- content = project.getDeletedCatch();
+ container.setDeletedCatch(content);
}
break;
case HAUL:
if (!deletedContent) {
- content = project.getHaul();
+ container.setHaul(content);
}
else {
- content = project.getDeletedHaul();
+ container.setDeletedHaul(content);
}
break;
case LENGTH:
if (!deletedContent) {
- content = project.getLength();
+ container.setLength(content);
}
else {
- content = project.getDeletedLength();
+ container.setDeletedLength(content);
}
break;
case STRATA:
if (!deletedContent) {
- content = project.getStrata();
+ container.setStrata(content);
}
else {
- content = project.getDeletedStrata();
+ container.setDeletedStrata(content);
}
break;
case REFTAX_SPECIES:
project.setRefTaxSpecies(content);
break;
}
-
- return content;
}
/**
- * Save project selection.
+ * Set content into project depending on category type.
*
- * @param project project to save selection
- * @throws CoserBusinessException
+ * @param project project
+ * @param category category
+ * @param content content to set
+ * @param deletedContent if content means deleted objects for {@code category}
*/
- public void saveProjectSelection(Project project, String selectionName) throws CoserBusinessException {
+ protected DataStorage getProjectContent(Project project, AbstractDataContainer container,
+ Category category, boolean deletedContent) {
- // tout ce qui suit doit exister à ce stade
- File projectsDirectory = config.getProjectsDirectory();
- String projectName = project.getName();
- File projectDirectory = new File(projectsDirectory, projectName);
+ DataStorage content = null;
- // creation du dossier de selections (peut deja exister)
- File selectionsDirectory = new File(projectDirectory, CoserConstants.STORAGE_SELECTION_DIRECTORY);
-
- // creation du dossier de la selection courante
- File selectionDirectory = new File(selectionsDirectory, selectionName);
- selectionDirectory.mkdirs();
-
- for (Category category : Category.values()) {
- if (category.isDataCategory()) {
- File controlFile = new File(selectionDirectory,
- category.getStorageFileName() +
- CoserConstants.STORAGE_SELECTION_SUFFIX +
- CoserConstants.STORAGE_CSV_EXTENSION);
- if (log.isDebugEnabled()) {
- log.debug("Saving selection file : " + controlFile);
- }
-
- DataStorage content = getProjectContent(project, category, false);
- importService.storeData(project, content, controlFile);
+ switch (category) {
+ case CATCH:
+ if (!deletedContent) {
+ content = container.getCatch();
}
+ else {
+ content = container.getDeletedCatch();
+ }
+ break;
+ case HAUL:
+ if (!deletedContent) {
+ content = container.getHaul();
+ }
+ else {
+ content = container.getDeletedHaul();
+ }
+ break;
+ case LENGTH:
+ if (!deletedContent) {
+ content = container.getLength();
+ }
+ else {
+ content = container.getDeletedLength();
+ }
+ break;
+ case STRATA:
+ if (!deletedContent) {
+ content = container.getStrata();
+ }
+ else {
+ content = container.getDeletedStrata();
+ }
+ break;
}
+ return content;
}
/**
+ * Supprime une données via son index.
+ *
+ * Used in control ui.
+ *
+ * @param project project
+ * @param control control
+ * @param category category
+ * @param index index to delete
+ * @throws CoserBusinessException
+ */
+ public void deleteData(Project project, Control control, Category category, String index) throws CoserBusinessException {
+
+ // create new delete action
+ DeleteLineCommand command = new DeleteLineCommand();
+ command.setCategory(category);
+ command.setLineIndex(index);
+ commandService.doAction(command, project, control);
+ }
+
+ /**
* Get zones name in project with data in [{@code beginYear}-{@code endYear}].
*
- * @param project project
+ * Used in selection ui.
+ *
+ * @param selection selection
* @param beginYear begin year
* @param endYear end year
* @return zones
*/
- public List<String> getProjectZone(Project project, Integer beginYear, Integer endYear) {
+ public List<String> getProjectZone(Selection selection, Integer beginYear, Integer endYear) {
List<String> result = new ArrayList<String>();
- Iterator<String[]> itTuple = project.getHaul().iterator();
+ Iterator<String[]> itTuple = selection.getHaul().iterator();
itTuple.next(); // skip header
while (itTuple.hasNext()) {
String[] tuple = itTuple.next();
@@ -507,14 +602,16 @@
* Le parcours est fait sur le fichier "haul", c'est potentiellement
* le plus petit.
*
- * @param project project to search into
+ * Used in selection ui.
+ *
+ * @param selection selection to search into
* @return year list
*/
- public List<Integer> getProjectYears(Project project) {
+ public List<Integer> getProjectYears(Selection selection) {
SortedSet<Integer> years = new TreeSet<Integer>();
- Iterator<String[]> itTuple = project.getHaul().iterator();
+ Iterator<String[]> itTuple = selection.getHaul().iterator();
itTuple.next(); // header
while (itTuple.hasNext()) {
String[] tuple = itTuple.next();
@@ -539,16 +636,18 @@
/**
* Get species name in project with data in [{@code beginYear}-{@code endYear}].
*
- * @param project project
+ * Used in selection ui.
+ *
+ * @param selection selection
* @param beginYear begin year
* @param endYear end year
* @return zones
*/
- public List<Specy> getProjectSpecies(Project project, Integer beginYear, Integer endYear) {
+ public List<Specy> getProjectSpecies(Selection selection, Integer beginYear, Integer endYear) {
SortedMap<String, Specy> result = new TreeMap<String, Specy>();
- Iterator<String[]> itTuple = project.getCatch().iterator();
+ Iterator<String[]> itTuple = selection.getCatch().iterator();
itTuple.next(); // skip header
while (itTuple.hasNext()) {
String[] tuple = itTuple.next();
@@ -581,6 +680,8 @@
* Test que le nom de la nouvelle espece existe dans le Reftax actuellement
* utilisé par le projet.
*
+ * Used in selection ui.
+ *
* @param project project (avec reftax)
* @param newSpecyName specy code to test
* @return {@code true} if specy name exist
@@ -605,13 +706,16 @@
/**
* Fusion d'especes.
*
+ * Used un selection ui.
+ *
* @param project project
+ * @param selection selection
* @param newSpecyName new specy name (after merge)
* @param speciesNames species name to merge
* @return project
* @throws CoserBusinessException
*/
- public Project mergeSpecies(Project project, String newSpecyName, String... speciesNames) throws CoserBusinessException {
+ public Project mergeSpecies(Project project, Selection selection, String newSpecyName, String... speciesNames) throws CoserBusinessException {
if (!isSpecyNameExist(project, newSpecyName)) {
throw new CoserBusinessException(_("Specy %s doesn't exist in referential", newSpecyName));
@@ -620,25 +724,8 @@
MergeSpeciesCommand command = new MergeSpeciesCommand();
command.setNewSpecyName(newSpecyName);
command.setSpeciesNames(speciesNames);
- commandService.doAction(command, project);
+ commandService.doAction(command, project, selection);
return project;
}
-
- /**
- * Supprime une données via son index.
- *
- * @param project project
- * @param category category
- * @param index index to delete
- * @throws CoserBusinessException
- */
- public void deleteData(Project project, Category category, String index) throws CoserBusinessException {
-
- // create new delete action
- DeleteLineCommand command = new DeleteLineCommand();
- command.setCategory(category);
- command.setLineIndex(index);
- commandService.doAction(command, project);
- }
}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -49,7 +49,7 @@
import fr.ifremer.coser.CoserBusinessConfig;
import fr.ifremer.coser.CoserConstants.Category;
import fr.ifremer.coser.CoserConstants.ValidationLevel;
-import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Control;
import fr.ifremer.coser.control.ProgressMonitor;
import fr.ifremer.coser.control.ValidationError;
import fr.ifremer.coser.data.Catch;
@@ -81,6 +81,11 @@
protected ActionContext context;
+ /**
+ * Initialise le context xworks.
+ *
+ * @param config configuration
+ */
public ValidationService(CoserBusinessConfig config) {
this.config = config;
validationSupport = new ValidationAwareSupport();
@@ -103,11 +108,18 @@
validator = container2.getInstance(ActionValidatorManager.class, "no-annotations");
}
+ /**
+ * Valide un seul bean, retourne la liste des erreurs trouvées.
+ *
+ * @param bean
+ * @return
+ */
protected List<ValidationError> validate(Object bean) {
List<ValidationError> result = null;
try {
- // obligatoire pour les thread local
+ // obligatoire pour les appel dans les thread et swing EDT
ActionContext.setContext(context);
+
for(ValidationLevel validationLevel : ValidationLevel.values()) {
try {
@@ -151,12 +163,12 @@
/**
* Valide une category entière d'un project.
*
- * @param project project a valider
+ * @param control control a valider
* @param category category a valider
* @param progress progress monitor
* @return les erreurs de validation
*/
- public List<ValidationError> validateCategory(Project project, Category category, ProgressMonitor progress) {
+ public List<ValidationError> validateCategory(Control control, Category category, ProgressMonitor progress) {
Catch beanCatch = new Catch();
Haul beanHaul = new Haul();
@@ -166,16 +178,16 @@
DataStorage dataToCheck = null;
switch (category) {
case CATCH:
- dataToCheck = project.getCatch();
+ dataToCheck = control.getCatch();
break;
case HAUL:
- dataToCheck = project.getHaul();
+ dataToCheck = control.getHaul();
break;
case LENGTH:
- dataToCheck = project.getLength();
+ dataToCheck = control.getLength();
break;
case STRATA:
- dataToCheck = project.getStrata();
+ dataToCheck = control.getStrata();
break;
}
Modified: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Project-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Project-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Project-error-validation.xml 2010-10-27 11:47:34 UTC (rev 106)
@@ -29,7 +29,7 @@
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
- <message>Project name is mandatory</message>
+ <message>Project name is required</message>
</field-validator>
</field>
</validators>
\ No newline at end of file
Added: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Selection-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Selection-error-validation.xml (rev 0)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Selection-error-validation.xml 2010-10-27 11:47:34 UTC (rev 106)
@@ -0,0 +1,35 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+<validators>
+ <field name="name">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>Selection name is required</message>
+ </field-validator>
+ </field>
+</validators>
\ No newline at end of file
Modified: trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties
===================================================================
--- trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/resources/i18n/coser-business-en_GB.properties 2010-10-27 11:47:34 UTC (rev 106)
@@ -1,6 +1,9 @@
Can't\ create\ project=
+Can't\ find\ line\ %s\ for\ deletion=
+Can't\ find\ line\ %s\ for\ undeletion=
Can't\ read\ file\ '%s'.\ Check\ CSV\ file\ separator\ (%c)=
Missing\ file\ %s=
+Original\ line\ already\ exists\!=
Project\ %s\ already\ exist=
Project\ %s\ doesn't\ exists\ \!=
Specy\ %s\ doesn't\ exist\ in\ referential=
Modified: trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties
===================================================================
--- trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/main/resources/i18n/coser-business-fr_FR.properties 2010-10-27 11:47:34 UTC (rev 106)
@@ -1,6 +1,9 @@
Can't\ create\ project=Impossible de cr\u00E9er le projet
+Can't\ find\ line\ %s\ for\ deletion=
+Can't\ find\ line\ %s\ for\ undeletion=
Can't\ read\ file\ '%s'.\ Check\ CSV\ file\ separator\ (%c)=Impossible de lire le fichier '%s'.\nMerci de v\u00E9rifier le s\u00E9parateur utilis\u00E9 (%c).
Missing\ file\ %s=Fichier manquant \: %s
+Original\ line\ already\ exists\!=
Project\ %s\ already\ exist=Le projet %s existe d\u00E9j\u00E0 \!
Project\ %s\ doesn't\ exists\ \!=Le projet %s n'existe pas \!
Specy\ %s\ doesn't\ exist\ in\ referential=
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -34,6 +34,7 @@
import fr.ifremer.coser.CoserConstants.Category;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.command.DeleteLineCommand;
+import fr.ifremer.coser.data.Length;
/**
* CommandService tests
@@ -63,14 +64,14 @@
@Test
public void testDeleteLine() throws CoserBusinessException {
Project project = createTestProject(projectService);
- Assert.assertEquals(29, project.getLength().size());
+ Assert.assertEquals(29, project.getControl().getLength().size());
DeleteLineCommand command = new DeleteLineCommand();
command.setLineIndex("2");
command.setCategory(Category.LENGTH);
- commandService.doAction(command, project);
- Assert.assertEquals(28, project.getLength().size());
+ commandService.doAction(command, project, project.getControl());
+ Assert.assertEquals(28, project.getControl().getLength().size());
}
/**
@@ -84,8 +85,8 @@
DeleteLineCommand command = new DeleteLineCommand();
command.setLineIndex("2");
command.setCategory(Category.LENGTH);
- commandService.doAction(command, project);
- commandService.doAction(command, project);
+ commandService.doAction(command, project, project.getControl());
+ commandService.doAction(command, project, project.getControl());
}
/**
@@ -97,18 +98,16 @@
@Test
public void testDeleteLineUndo() throws CoserBusinessException {
Project project = createTestProject(projectService);
- Assert.assertEquals("3", project.getLength().get(4)[0]);
+ Assert.assertEquals("3", project.getControl().getLength().get(4)[Length.INDEX_LINE]);
DeleteLineCommand command = new DeleteLineCommand();
command.setLineIndex("3");
command.setCategory(Category.LENGTH);
- commandService.doAction(command, project);
- System.out.println(project.getLength());
- Assert.assertEquals("4", project.getLength().get(4)[0]);
- commandService.undoAction(project);
- System.out.println("\n" + project.getLength());
- Assert.assertEquals("3", project.getLength().get(4)[0]);
+ commandService.doAction(command, project, project.getControl());
+ Assert.assertEquals("4", project.getControl().getLength().get(4)[Length.INDEX_LINE]);
+ commandService.undoAction(project, project.getControl());
+ Assert.assertEquals("3", project.getControl().getLength().get(4)[Length.INDEX_LINE]);
}
}
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -71,10 +71,10 @@
@AfterClass
public static void cleanDirectory() throws IOException {
- //FileUtils.deleteDirectory(testDirectory);
+ FileUtils.deleteDirectory(testDirectory);
}
- protected Project createTestProject(ProjectService service) throws CoserBusinessException {
+ protected Project createTestProject(ProjectService projectService) throws CoserBusinessException {
Project project = new Project();
project.setName("Project-" + System.nanoTime());
@@ -92,8 +92,13 @@
categoriesAndFile.put(Category.STRATA, testStrata);
categoriesAndFile.put(Category.REFTAX_SPECIES, testReftax);
- project = service.createProject(project, categoriesAndFile);
+ project = projectService.createProject(project, categoriesAndFile);
+ project = projectService.loadControlData(project);
+ // sans la sauvegarde des données de control, on ne pas creer de
+ // selection
+ projectService.saveProjectControl(project);
+
if (log.isDebugEnabled()) {
log.debug("Created project : " + project.getName());
}
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ProjectServiceTest.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -36,6 +36,7 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Selection;
import fr.ifremer.coser.bean.Specy;
/**
@@ -112,8 +113,9 @@
@Test
public void testProjectYear() throws CoserBusinessException {
Project project = createTestProject(service);
-
- List<Integer> years = service.getProjectYears(project);
+ Selection selection = service.createProjectSelection(project);
+
+ List<Integer> years = service.getProjectYears(selection);
Assert.assertEquals(2, years.size());
Assert.assertEquals(Integer.valueOf(2010), years.get(0));
Assert.assertEquals(Integer.valueOf(2011), years.get(1));
@@ -127,14 +129,15 @@
@Test
public void testProjectZone() throws CoserBusinessException {
Project project = createTestProject(service);
-
- List<String> zones = service.getProjectZone(project, 2010, 2011);
+ Selection selection = service.createProjectSelection(project);
+
+ List<String> zones = service.getProjectZone(selection, 2010, 2011);
Assert.assertEquals(6, zones.size());
- zones = service.getProjectZone(project, 2011, 2011);
+ zones = service.getProjectZone(selection, 2011, 2011);
Assert.assertEquals(3, zones.size());
- zones = service.getProjectZone(project, 2009, 2009);
+ zones = service.getProjectZone(selection, 2009, 2009);
Assert.assertEquals(0, zones.size());
}
@@ -146,14 +149,15 @@
@Test
public void testProjectSpecies() throws CoserBusinessException {
Project project = createTestProject(service);
+ Selection selection = service.createProjectSelection(project);
- List<Specy> species = service.getProjectSpecies(project, 2010, 2011);
+ List<Specy> species = service.getProjectSpecies(selection, 2010, 2011);
Assert.assertEquals(4, species.size());
- species = service.getProjectSpecies(project, 2011, 2011);
+ species = service.getProjectSpecies(selection, 2011, 2011);
Assert.assertEquals(4, species.size());
- species = service.getProjectSpecies(project, 2009, 2009);
+ species = service.getProjectSpecies(selection, 2009, 2009);
Assert.assertEquals(0, species.size());
}
@@ -165,12 +169,13 @@
@Test
public void testMergeSpecies() throws CoserBusinessException {
Project project = createTestProject(service);
+ Selection selection = service.createProjectSelection(project);
Assert.assertTrue(service.isSpecyNameExist(project, "COSER_SPECIES_MERGE"));
- Assert.assertEquals(25, project.getCatch().size());
+ Assert.assertEquals(25, selection.getCatch().size());
- project = service.mergeSpecies(project, "COSER_SPECIES_MERGE", "COSER_SPECIES1", "COSER_SPECIES2");
+ project = service.mergeSpecies(project, selection, "COSER_SPECIES_MERGE", "COSER_SPECIES1", "COSER_SPECIES2");
- Assert.assertEquals(19, project.getCatch().size());
+ Assert.assertEquals(19, selection.getCatch().size());
}
}
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/Coser.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -120,9 +120,8 @@
}
}
- DefaultApplicationContext context = new DefaultApplicationContext();
-
// define unique context globale values
+ DefaultApplicationContext context = new DefaultApplicationContext();
context.setContextValue(coserConfig);
context.setContextValue(new ProjectService(coserConfig));
context.setContextValue(new ImportService(coserConfig));
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrame.jaxx 2010-10-27 11:47:34 UTC (rev 106)
@@ -40,7 +40,7 @@
</JMenu>
<JMenu id='menuWindow' text="coser.ui.mainframe.menu.window">
- <JMenuItem text="coser.ui.mainframe.menu.window.validation" onActionPerformed="getHandler().showValidationView()"/>
+ <JMenuItem text="coser.ui.mainframe.menu.window.validation" onActionPerformed="getHandler().showControlView()"/>
<SelectionsListMenuItem text="coser.ui.mainframe.menu.window.selection" constructorParams="this" />
</JMenu>
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -57,6 +57,7 @@
import fr.ifremer.coser.CoserConstants.Category;
import fr.ifremer.coser.CoserException;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Selection;
import fr.ifremer.coser.data.Catch;
import fr.ifremer.coser.services.ProjectService;
import fr.ifremer.coser.ui.control.ControlHandler;
@@ -261,7 +262,7 @@
Project project = get();
if (project != null) {
view.setContextValue(project);
- showValidationView();
+ showControlView(false);
}
} catch (Exception ex) {
throw new CoserException("Can't create project", ex);
@@ -289,7 +290,7 @@
ProjectService projectService = projectView.getContextValue(ProjectService.class);
Project project = null;
try {
- Project p = projectService.loadProject(projectName);
+ Project p = projectService.openProject(projectName);
project = p;
} catch (CoserBusinessException ex) {
if (log.isErrorEnabled()) {
@@ -312,7 +313,7 @@
Project project = get();
if (project != null) {
view.setContextValue(project);
- showValidationView();
+ showControlView();
}
} catch (Exception ex) {
throw new CoserException("Can't create project", ex);
@@ -322,29 +323,66 @@
task.execute();
}
- public void showValidationView() {
- ControlView controlView = new ControlView(view);
- controlView.setHandler(new ControlHandler());
- setMainComponent(controlView);
+ /**
+ * Charge les données de control et affiche la vue de control.
+ */
+ public void showControlView() {
+ showControlView(true);
}
/**
+ * Charge les données de control et affiche la vue de control.
+ *
+ * @param reloadData reload data (a {@code false} dans le cas d'une creation,
+ * les données sont deja chargées)
+ */
+ public void showControlView(boolean reloadData) {
+ // load control
+ ProjectService projectService = view.getContextValue(ProjectService.class);
+ Project project = view.getContextValue(Project.class);
+ try {
+
+ if (reloadData) {
+ project = projectService.loadControlData(project);
+ }
+
+ ControlView controlView = new ControlView(view);
+ controlView.setHandler(new ControlHandler());
+ setMainComponent(controlView);
+ } catch (CoserBusinessException ex) {
+ throw new CoserException("Can't load control data", ex);
+ }
+ }
+
+ /**
* Show selection view to create new selection.
*/
public void showSelectionView() {
- SelectionView selectionView = new SelectionView(view);
- SelectionHandler selectionHandler = new SelectionHandler();
- selectionView.setHandler(selectionHandler);
-
+
+ // create new selection
+ ProjectService projectService = view.getContextValue(ProjectService.class);
+ Project project = view.getContextValue(Project.class);
try {
- File file = new File("/home/chatellier/tmp/coser/zones.png");
- ImageIcon icon = new ImageIcon(file.toURI().toURL());
- selectionView.getSelectionDetailsTab().getZonesMap().setIcon(icon);
+ Selection selection = projectService.createProjectSelection(project);
+ view.setContextValue(selection);
- } catch(Exception e){
- e.printStackTrace();
- };
- setMainComponent(selectionView);
+ SelectionView selectionView = new SelectionView(view);
+ selectionView.setSelection(selection);
+ selectionView.getSelectionDetailsTab().getValidatorSelection().setBean(selection);
+ selectionView.setHandler(new SelectionHandler());
+
+ try {
+ File file = new File("/home/chatellier/tmp/coser/zones.png");
+ ImageIcon icon = new ImageIcon(file.toURI().toURL());
+ selectionView.getSelectionDetailsTab().getZonesMap().setIcon(icon);
+
+ } catch(Exception e){
+ e.printStackTrace();
+ };
+ setMainComponent(selectionView);
+ } catch (CoserBusinessException ex) {
+ throw new CoserException("Can't create new selection", ex);
+ }
}
/**
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/ProjectCreationView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/ProjectCreationView.jaxx 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/ProjectCreationView.jaxx 2010-10-27 11:47:34 UTC (rev 106)
@@ -25,6 +25,7 @@
<Table>
<CoserFrameHandler id="handler" javaBean="null" />
+ <!-- Validation -->
<fr.ifremer.coser.bean.Project id="project" />
<jaxx.runtime.validator.swing.SwingValidatorMessageTableModel id='errorsTableModel'
onTableChanged='createProjectButton.setEnabled(errorsTableModel.getRowCount()==0)'/>
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -58,13 +58,13 @@
switch (category) {
case CATCH:
- data = project.getCatch(); break;
+ data = project.getControl().getCatch(); break;
case HAUL:
- data = project.getHaul(); break;
+ data = project.getControl().getHaul(); break;
case LENGTH:
- data = project.getLength(); break;
+ data = project.getControl().getLength(); break;
case STRATA:
- data = project.getStrata(); break;
+ data = project.getControl().getStrata(); break;
}
header = data.get(0);
fireTableStructureChanged();
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -149,7 +149,7 @@
final ValidationService validationService = view.getContextValue(ValidationService.class);
final Project project = view.getContextValue(Project.class);
final Category category = (Category)view.getCategoryComboBox().getSelectedItem();
- final ControlProgressBar bar = view.getCheckProgressBar();
+ final ControlProgressBar progressBar = view.getCheckProgressBar();
SwingWorker<List<ValidationError>, Void> task = new SwingWorker<List<ValidationError>, Void>() {
@@ -158,7 +158,7 @@
@Override
public List<ValidationError> doInBackground() {
- List<ValidationError> validationErrors = validationService.validateCategory(project, category, bar);
+ List<ValidationError> validationErrors = validationService.validateCategory(project.getControl(), category, progressBar);
return validationErrors;
}
@@ -191,9 +191,10 @@
}
/**
- * Called when selection change.
+ * Called when selection change to display selected bean
+ * in edition panel.
*
- * @param view
+ * @param view view
*/
public void controlDataTableSelectionChanged(ControlView view) {
@@ -209,20 +210,20 @@
switch(category) {
case CATCH:
// warning, skip header
- header = project.getCatch().get(0);
- line = project.getCatch().get(selectedRow + 1);
+ header = project.getControl().getCatch().get(0);
+ line = project.getControl().getCatch().get(selectedRow + 1);
break;
case HAUL:
- header = project.getHaul().get(0);
- line = project.getHaul().get(selectedRow + 1);
+ header = project.getControl().getHaul().get(0);
+ line = project.getControl().getHaul().get(selectedRow + 1);
break;
case LENGTH:
- header = project.getLength().get(0);
- line = project.getLength().get(selectedRow + 1);
+ header = project.getControl().getLength().get(0);
+ line = project.getControl().getLength().get(selectedRow + 1);
break;
case STRATA:
- header = project.getStrata().get(0);
- line = project.getStrata().get(selectedRow + 1);
+ header = project.getControl().getStrata().get(0);
+ line = project.getControl().getStrata().get(selectedRow + 1);
break;
}
@@ -440,25 +441,25 @@
case CATCH:
Catch beanCatch = view.getValidatorCatch().getBean();
data = beanCatch.getData();
- project.getCatch().set(selectedLine + 1, data); // csv header
+ project.getControl().getCatch().set(selectedLine + 1, data); // csv header
model.fireTableRowsUpdated(selectedLine, selectedLine);
break;
case HAUL:
Haul beanHaul = view.getValidatorHaul().getBean();
data = beanHaul.getData();
- project.getHaul().set(selectedLine + 1, data); // csv header
+ project.getControl().getHaul().set(selectedLine + 1, data); // csv header
model.fireTableRowsUpdated(selectedLine, selectedLine);
break;
case LENGTH:
Length beanLength = view.getValidatorLength().getBean();
data = beanLength.getData();
- project.getLength().set(selectedLine + 1, data); // csv header
+ project.getControl().getLength().set(selectedLine + 1, data); // csv header
model.fireTableRowsUpdated(selectedLine, selectedLine);
break;
case STRATA:
Strata beanStrata = view.getValidatorStrata().getBean();
data = beanStrata.getData();
- project.getStrata().set(selectedLine + 1, data); // csv header
+ project.getControl().getStrata().set(selectedLine + 1, data); // csv header
model.fireTableRowsUpdated(selectedLine, selectedLine);
break;
}
@@ -495,7 +496,7 @@
String[] data = model.getDataAt(selectedLine);
try {
- projectService.deleteData(project, category, data[AbstractDataEntity.INDEX_LINE]);
+ projectService.deleteData(project, project.getControl(), category, data[AbstractDataEntity.INDEX_LINE]);
model.fireTableRowsDeleted(selectedLine, selectedLine);
}
catch (CoserBusinessException ex) {
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2010-10-27 11:47:34 UTC (rev 106)
@@ -88,10 +88,10 @@
<cell fill="both" weightx="1" weighty="2" columns="2">
<jaxx.runtime.validator.swing.SwingValidatorMessageTableModel id='errorsTableModel'
onTableChanged='saveButton.setEnabled(errorsTableModel.getRowCount()==0)'/>
- <fr.ifremer.coser.bean.Catch id="beanCatch" javaBean="null" />
- <fr.ifremer.coser.bean.Haul id="beanHaul" javaBean="null" />
- <fr.ifremer.coser.bean.Strata id="beanStrata" javaBean="null" />
- <fr.ifremer.coser.bean.Length id="beanLength" javaBean="null" />
+ <fr.ifremer.coser.data.Catch id="beanCatch" javaBean="null" />
+ <fr.ifremer.coser.data.Haul id="beanHaul" javaBean="null" />
+ <fr.ifremer.coser.data.Strata id="beanStrata" javaBean="null" />
+ <fr.ifremer.coser.data.Length id="beanLength" javaBean="null" />
<BeanValidator id='validatorCatch' bean='beanCatch'
uiClass="jaxx.runtime.validator.swing.ui.TranslucentValidationUI"
errorTableModel="errorsTableModel" />
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionDetailsView.jaxx 2010-10-27 11:47:34 UTC (rev 106)
@@ -23,7 +23,19 @@
#L%
-->
<Table>
+
<SelectionHandler id="handler" javaBean="null" />
+
+ <!-- Validation -->
+ <fr.ifremer.coser.bean.Selection id="selection" javaBean="null" />
+ <jaxx.runtime.validator.swing.SwingValidatorMessageTableModel id='errorsTableModel'
+ onTableChanged='saveSelectionButton.setEnabled(errorsTableModel.getRowCount()==0)'/>
+ <BeanValidator id='validatorSelection' bean='selection'
+ uiClass="jaxx.runtime.validator.swing.ui.ImageValidationUI"
+ errorTableModel="errorsTableModel">
+ <field name="name" component="selectionDetailsSelecionNameField" />
+ </BeanValidator>
+
<row>
<cell weightx="1" weighty="1" fill="both">
<Table>
@@ -32,7 +44,10 @@
<JLabel text="coser.ui.selection.details.name" />
</cell>
<cell weightx="1" fill="horizontal" columns="3">
- <JTextField id="selectionDetailsSelecionNameField" />
+ <JTextField id="selectionDetailsSelecionNameField" text="{selection.getName()}" />
+ <javax.swing.text.Document javaBean="selectionDetailsSelecionNameField.getDocument()"
+ onInsertUpdate='getSelection().setName(selectionDetailsSelecionNameField.getText())'
+ onRemoveUpdate='getSelection().setName(selectionDetailsSelecionNameField.getText())' />
</cell>
</row>
<row>
@@ -125,7 +140,8 @@
</row>
<row>
<cell fill="horizontal" columns="4">
- <JButton text="coser.ui.selection.details.saveSelection" onActionPerformed="getHandler().saveSelection(this)" />
+ <JButton id="saveSelectionButton" text="coser.ui.selection.details.saveSelection"
+ onActionPerformed="getHandler().saveSelection(this)" />
</cell>
</row>
</Table>
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionHandler.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -44,6 +44,7 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserException;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Selection;
import fr.ifremer.coser.bean.Specy;
import fr.ifremer.coser.services.ProjectService;
@@ -77,7 +78,8 @@
* @param view view
*/
public void updateSelectionZone(SelectionDetailsView view) {
- Project project = view.getContextValue(Project.class);
+ //Project project = view.getContextValue(Project.class);
+ Selection seletion = view.getContextValue(Selection.class);
ProjectService projectService = view.getContextValue(ProjectService.class);
Integer beginYear = (Integer)view.getSelectionDetailsBeginYearField().getSelectedItem();
@@ -85,7 +87,7 @@
// il est possible que l'evenement fasse suite a une seule des selections
if (beginYear != null && endYear != null) {
- List<String> zone = projectService.getProjectZone(project, beginYear, endYear);
+ List<String> zone = projectService.getProjectZone(seletion, beginYear, endYear);
view.getSelectionZoneModel().setZones(zone);
}
}
@@ -96,7 +98,8 @@
* @param view view
*/
public void updateSelectionSpecies(SelectionDetailsView view) {
- Project project = view.getContextValue(Project.class);
+ //Project project = view.getContextValue(Project.class);
+ Selection seletion = view.getContextValue(Selection.class);
ProjectService projectService = view.getContextValue(ProjectService.class);
Integer beginYear = (Integer)view.getSelectionDetailsBeginYearField().getSelectedItem();
@@ -104,7 +107,7 @@
// il est possible que l'evenement fasse suite a une seule des selections
if (beginYear != null && endYear != null) {
- List<Specy> species = projectService.getProjectSpecies(project, beginYear, endYear);
+ List<Specy> species = projectService.getProjectSpecies(seletion, beginYear, endYear);
view.getSpecyListModel().setSpecy(species);
}
}
@@ -163,15 +166,15 @@
* @param view parent view
*/
public void saveSelection(SelectionDetailsView view) {
- String selectionName = view.getSelectionDetailsSelecionNameField().getText().trim();
// TODO test de nom valid ?
Project project = view.getContextValue(Project.class);
+ Selection seletion = view.getContextValue(Selection.class);
ProjectService service = view.getContextValue(ProjectService.class);
try {
- service.saveProjectSelection(project, selectionName);
+ service.saveProjectSelection(project, seletion);
}
catch (CoserBusinessException ex) {
throw new CoserException("Can't save selection", ex);
@@ -206,6 +209,7 @@
String newSpecyName = view.getNewSpeciesNameField().getText();
Project project = view.getContextValue(Project.class);
+ Selection seletion = view.getContextValue(Selection.class);
ProjectService projectService = view.getContextValue(ProjectService.class);
boolean newSpecyExist = projectService.isSpecyNameExist(project, newSpecyName);
@@ -224,7 +228,7 @@
}
try {
- projectService.mergeSpecies(project, newSpecyName, specyNames);
+ projectService.mergeSpecies(project, seletion, newSpecyName, specyNames);
}
catch (CoserBusinessException ex) {
throw new CoserException("Can't merge species", ex);
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionView.jaxx 2010-10-27 11:47:34 UTC (rev 106)
@@ -23,6 +23,8 @@
#L%
-->
<JTabbedPane>
+ <fr.ifremer.coser.bean.Selection id="selection" javaBean="null" />
+
<SelectionHandler id="handler" javaBean="null" />
<script><![CDATA[
void $afterCompleteSetup() {
@@ -35,12 +37,15 @@
}
]]></script>
<tab title="coser.ui.selection.tab.details">
- <SelectionDetailsView id="selectionDetailsTab" constructorParams="this" handler="{getHandler()}" />
+ <SelectionDetailsView id="selectionDetailsTab" constructorParams="this"
+ handler="{getHandler()}" selection="{getSelection()}"/>
</tab>
<tab title="coser.ui.selection.tab.lists" enabled="false">
- <SelectionListsView id="selectionListsView" constructorParams="this" handler="{getHandler()}" />
+ <SelectionListsView id="selectionListsView" constructorParams="this"
+ handler="{getHandler()}" />
</tab>
<tab title="coser.ui.selection.tab.result" enabled="false">
- <SelectionResultView id="selectionResultView" constructorParams="this" handler="{getHandler()}" />
+ <SelectionResultView id="selectionResultView" constructorParams="this"
+ handler="{getHandler()}" />
</tab>
</JTabbedPane>
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/YearComboBoxModel.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/YearComboBoxModel.java 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/YearComboBoxModel.java 2010-10-27 11:47:34 UTC (rev 106)
@@ -30,7 +30,7 @@
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
-import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Selection;
import fr.ifremer.coser.services.ProjectService;
/**
@@ -60,9 +60,9 @@
protected List<Integer> getYear() {
if (years == null) {
- Project project = view.getContextValue(Project.class);
+ Selection selection = view.getContextValue(Selection.class);
ProjectService service = view.getContextValue(ProjectService.class);
- years = service.getProjectYears(project);
+ years = service.getProjectYears(selection);
}
return years;
}
Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties
===================================================================
--- trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties 2010-10-27 11:47:34 UTC (rev 106)
@@ -63,6 +63,7 @@
coser.ui.project.traitsFile=Traits file \:
coser.ui.project.useCustomReferenceSpeciesFile=
coser.ui.project.usedReferenceSpeciesFile=
+coser.ui.result.availableDataTitle=
coser.ui.result.extractDataButton=
coser.ui.result.extractDataLabel=
coser.ui.result.extractDataTitle=
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2010-10-26 14:16:24 UTC (rev 105)
+++ trunk/pom.xml 2010-10-27 11:47:34 UTC (rev 106)
@@ -196,7 +196,7 @@
<license.organizationName>Ifremer, Codelutin</license.organizationName>
<!-- Versions -->
- <jaxx.version>2.2.3</jaxx.version>
+ <jaxx.version>2.2.4-SNAPSHOT</jaxx.version>
<i18n.version>1.2.2</i18n.version>
</properties>
@@ -236,7 +236,7 @@
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<links>
- <link>http://java.sun.com/javase/6/docs/api/</link>
+ <link>http://download.oracle.com/javase/6/docs/api/</link>
</links>
</configuration>
</plugin>
1
0
r105 - in trunk/coser-business/src/main/resources/fr/ifremer/coser: . bean data
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
26 Oct '10
Author: chatellier
Date: 2010-10-26 14:16:24 +0000 (Tue, 26 Oct 2010)
New Revision: 105
Log:
Move data beans to their own data package
Added:
trunk/coser-business/src/main/resources/fr/ifremer/coser/data/
trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-warning-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Haul-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Length-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Strata-error-validation.xml
Removed:
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-warning-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Haul-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Strata-error-validation.xml
Deleted: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml 2010-10-26 14:08:45 UTC (rev 104)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -1,65 +0,0 @@
-<!--
- #%L
- Coser :: UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 Ifremer, Codelutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser 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 Lesser Public License for more details.
-
- You should have received a copy of the GNU General Lesser Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/lgpl-3.0.html>.
- #L%
- -->
-<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
- <field name="survey">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a campagne name.</message>
- </field-validator>
- </field>
- <field name="year">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a espece name.</message>
- </field-validator>
- </field>
- <field name="haul">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a trait name.</message>
- </field-validator>
- </field>
- <field name="species">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a espece name.</message>
- </field-validator>
- </field>
- <field name="number">
- <field-validator type="checkDouble" short-circuit="true">
- <param name="notAvailable">NA</param>
- <message>Number attribute is not a valid double</message>
- </field-validator>
- </field>
- <field name="weight">
- <field-validator type="checkDouble" short-circuit="true">
- <param name="notAvailable">NA</param>
- <message>Weight attribute is not a valid double</message>
- </field-validator>
- </field>
-</validators>
\ No newline at end of file
Deleted: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-warning-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-warning-validation.xml 2010-10-26 14:08:45 UTC (rev 104)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-warning-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -1,36 +0,0 @@
-<!--
- #%L
- Coser :: UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 Ifremer, Codelutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser 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 Lesser Public License for more details.
-
- You should have received a copy of the GNU General Lesser Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/lgpl-3.0.html>.
- #L%
- -->
-<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
- <field name="weight">
- <field-validator type="coserDouble">
- <param name="min">0</param>
- <param name="max">999</param>
- <message>Weight n'est pas compris entre ${min} en ${max}</message>
- </field-validator>
- </field>
-</validators>
\ No newline at end of file
Deleted: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Haul-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Haul-error-validation.xml 2010-10-26 14:08:45 UTC (rev 104)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Haul-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -1,74 +0,0 @@
-<!--
- #%L
- Coser :: UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 Ifremer, Codelutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser 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 Lesser Public License for more details.
-
- You should have received a copy of the GNU General Lesser Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/lgpl-3.0.html>.
- #L%
- -->
-<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
- <field name="survey">
- <field-validator type="requiredstring">
- <message>You must enter a survey name.</message>
- </field-validator>
- </field>
- <field name="year">
- <field-validator type="requiredstring">
- <message>You must enter a year name.</message>
- </field-validator>
- </field>
- <field name="haul">
- <field-validator type="requiredstring">
- <message>You must enter a haul name.</message>
- </field-validator>
- </field>
- <field name="month">
- <field-validator type="requiredstring">
- <message>You must enter a month name.</message>
- </field-validator>
- </field>
- <field name="stratum">
- <field-validator type="requiredstring">
- <message>You must enter a stratum name.</message>
- </field-validator>
- </field>
- <field name="sweptSurface">
- <field-validator type="requiredstring">
- <message>You must enter a sweptSurface name.</message>
- </field-validator>
- </field>
- <field name="lat">
- <field-validator type="checkDouble" short-circuit="true">
- <message>lat attribute is not a valid double</message>
- </field-validator>
- </field>
- <field name="long">
- <field-validator type="checkDouble" short-circuit="true">
- <message>long attribute is not a valid double</message>
- </field-validator>
- </field>
- <field name="depth">
- <field-validator type="checkDouble" short-circuit="true">
- <message>Depth attribute is not a valid double</message>
- </field-validator>
- </field>
-</validators>
\ No newline at end of file
Deleted: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml 2010-10-26 14:08:45 UTC (rev 104)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -1,85 +0,0 @@
-<!--
- #%L
- Coser :: UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 Ifremer, Codelutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser 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 Lesser Public License for more details.
-
- You should have received a copy of the GNU General Lesser Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/lgpl-3.0.html>.
- #L%
- -->
-<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
- <field name="survey">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a campagne name.</message>
- </field-validator>
- </field>
- <field name="year">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a espece name.</message>
- </field-validator>
- </field>
- <field name="haul">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a trait name.</message>
- </field-validator>
- </field>
- <field name="species">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a espece name.</message>
- </field-validator>
- </field>
- <field name="sex">
- <field-validator type="requiredstring" short-circuit="true">
- <message>Sex is mandatory</message>
- </field-validator>
- </field>
- <field name="maturity">
- <field-validator type="requiredstring" short-circuit="true">
- <message>Maturity attribute is required</message>
- </field-validator>
- </field>
- <field name="length">
- <field-validator type="checkDouble" short-circuit="true">
- <message>length attribute is not a valid double</message>
- </field-validator>
- </field>
- <field name="number">
- <field-validator type="checkDouble" short-circuit="true">
- <param name="notAvailable">NA</param>
- <message>number attribute is not a valid double</message>
- </field-validator>
- </field>
- <field name="weight">
- <field-validator type="checkDouble" short-circuit="true">
- <param name="notAvailable">NA</param>
- <message>Weight attribute is not a valid double</message>
- </field-validator>
- </field>
- <field name="age">
- <field-validator type="requiredstring" short-circuit="true">
- <message>Age attribute is required</message>
- </field-validator>
- </field>
-</validators>
\ No newline at end of file
Deleted: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Strata-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Strata-error-validation.xml 2010-10-26 14:08:45 UTC (rev 104)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Strata-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -1,47 +0,0 @@
-<!--
- #%L
- Coser :: UI
-
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2010 Ifremer, Codelutin
- %%
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser 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 Lesser Public License for more details.
-
- You should have received a copy of the GNU General Lesser Public
- License along with this program. If not, see
- <http://www.gnu.org/licenses/lgpl-3.0.html>.
- #L%
- -->
-<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-<validators>
- <field name="survey">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a campagne name.</message>
- </field-validator>
- </field>
- <field name="stratum">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a strata name.</message>
- </field-validator>
- </field>
- <field name="surface">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message>You must enter a trait name.</message>
- </field-validator>
- </field>
-</validators>
\ No newline at end of file
Copied: trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-error-validation.xml (from rev 101, trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml)
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-error-validation.xml (rev 0)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -0,0 +1,65 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+<validators>
+ <field name="survey">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a campagne name.</message>
+ </field-validator>
+ </field>
+ <field name="year">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a espece name.</message>
+ </field-validator>
+ </field>
+ <field name="haul">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a trait name.</message>
+ </field-validator>
+ </field>
+ <field name="species">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a espece name.</message>
+ </field-validator>
+ </field>
+ <field name="number">
+ <field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
+ <message>Number attribute is not a valid double</message>
+ </field-validator>
+ </field>
+ <field name="weight">
+ <field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
+ <message>Weight attribute is not a valid double</message>
+ </field-validator>
+ </field>
+</validators>
\ No newline at end of file
Copied: trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-warning-validation.xml (from rev 82, trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-warning-validation.xml)
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-warning-validation.xml (rev 0)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Catch-warning-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -0,0 +1,36 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+<validators>
+ <field name="weight">
+ <field-validator type="coserDouble">
+ <param name="min">0</param>
+ <param name="max">999</param>
+ <message>Weight n'est pas compris entre ${min} en ${max}</message>
+ </field-validator>
+ </field>
+</validators>
\ No newline at end of file
Copied: trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Haul-error-validation.xml (from rev 82, trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Haul-error-validation.xml)
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Haul-error-validation.xml (rev 0)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Haul-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -0,0 +1,74 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+<validators>
+ <field name="survey">
+ <field-validator type="requiredstring">
+ <message>You must enter a survey name.</message>
+ </field-validator>
+ </field>
+ <field name="year">
+ <field-validator type="requiredstring">
+ <message>You must enter a year name.</message>
+ </field-validator>
+ </field>
+ <field name="haul">
+ <field-validator type="requiredstring">
+ <message>You must enter a haul name.</message>
+ </field-validator>
+ </field>
+ <field name="month">
+ <field-validator type="requiredstring">
+ <message>You must enter a month name.</message>
+ </field-validator>
+ </field>
+ <field name="stratum">
+ <field-validator type="requiredstring">
+ <message>You must enter a stratum name.</message>
+ </field-validator>
+ </field>
+ <field name="sweptSurface">
+ <field-validator type="requiredstring">
+ <message>You must enter a sweptSurface name.</message>
+ </field-validator>
+ </field>
+ <field name="lat">
+ <field-validator type="checkDouble" short-circuit="true">
+ <message>lat attribute is not a valid double</message>
+ </field-validator>
+ </field>
+ <field name="long">
+ <field-validator type="checkDouble" short-circuit="true">
+ <message>long attribute is not a valid double</message>
+ </field-validator>
+ </field>
+ <field name="depth">
+ <field-validator type="checkDouble" short-circuit="true">
+ <message>Depth attribute is not a valid double</message>
+ </field-validator>
+ </field>
+</validators>
\ No newline at end of file
Copied: trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Length-error-validation.xml (from rev 101, trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml)
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Length-error-validation.xml (rev 0)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Length-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -0,0 +1,85 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+<validators>
+ <field name="survey">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a campagne name.</message>
+ </field-validator>
+ </field>
+ <field name="year">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a espece name.</message>
+ </field-validator>
+ </field>
+ <field name="haul">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a trait name.</message>
+ </field-validator>
+ </field>
+ <field name="species">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a espece name.</message>
+ </field-validator>
+ </field>
+ <field name="sex">
+ <field-validator type="requiredstring" short-circuit="true">
+ <message>Sex is mandatory</message>
+ </field-validator>
+ </field>
+ <field name="maturity">
+ <field-validator type="requiredstring" short-circuit="true">
+ <message>Maturity attribute is required</message>
+ </field-validator>
+ </field>
+ <field name="length">
+ <field-validator type="checkDouble" short-circuit="true">
+ <message>length attribute is not a valid double</message>
+ </field-validator>
+ </field>
+ <field name="number">
+ <field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
+ <message>number attribute is not a valid double</message>
+ </field-validator>
+ </field>
+ <field name="weight">
+ <field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
+ <message>Weight attribute is not a valid double</message>
+ </field-validator>
+ </field>
+ <field name="age">
+ <field-validator type="requiredstring" short-circuit="true">
+ <message>Age attribute is required</message>
+ </field-validator>
+ </field>
+</validators>
\ No newline at end of file
Copied: trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Strata-error-validation.xml (from rev 82, trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Strata-error-validation.xml)
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Strata-error-validation.xml (rev 0)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/data/Strata-error-validation.xml 2010-10-26 14:16:24 UTC (rev 105)
@@ -0,0 +1,47 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin
+ %%
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+
+ You should have received a copy of the GNU General Lesser Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ #L%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+ "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+<validators>
+ <field name="survey">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a campagne name.</message>
+ </field-validator>
+ </field>
+ <field name="stratum">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a strata name.</message>
+ </field-validator>
+ </field>
+ <field name="surface">
+ <field-validator type="requiredstring">
+ <param name="trim">true</param>
+ <message>You must enter a trait name.</message>
+ </field-validator>
+ </field>
+</validators>
\ No newline at end of file
1
0
r104 - in trunk: coser-business/src/main/java/fr/ifremer/coser coser-business/src/main/java/fr/ifremer/coser/bean coser-business/src/main/java/fr/ifremer/coser/command coser-business/src/main/java/fr/ifremer/coser/data coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/test/java/fr/ifremer/coser/services coser-ui/src/main/java/fr/ifremer/coser/ui coser-ui/src/main/java/fr/ifremer/coser/ui/control
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
26 Oct '10
Author: chatellier
Date: 2010-10-26 14:08:45 +0000 (Tue, 26 Oct 2010)
New Revision: 104
Log:
Move data beans to their own data package
Added:
trunk/coser-business/src/main/java/fr/ifremer/coser/data/
trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java
trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java
trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java
trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java
trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java
trunk/coser-business/src/main/java/fr/ifremer/coser/data/package-info.java
Removed:
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataEntity.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Catch.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Haul.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Length.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Strata.java
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java
Deleted: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataEntity.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataEntity.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataEntity.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -1,66 +0,0 @@
-/*
- * #%L
- *
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package fr.ifremer.coser.bean;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Abstract entity to add all common data array code.
- *
- * @author chatellier
- * @version $Revision$
- *
- * Last update : $Date$
- * By : $Author$
- */
-public abstract class AbstractDataEntity extends AbstractEntity {
-
- /** serialVersionUID. */
- private static final long serialVersionUID = 4188448448464323807L;
-
- public static final int INDEX_LINE = 0;
- public static final String PROPERTY_LINE = n_("coser.business.line");
-
- protected String[] data;
-
- public String[] getData() {
- return data;
- }
-
- public void setData(String[] data) {
- this.data = data;
- }
-
- public void setLine(String value) {
- String oldValue = data[INDEX_LINE];
- data[INDEX_LINE] = value;
- getPropertyChangeSupport().firePropertyChange(PROPERTY_LINE, oldValue, value);
- }
-
- public String getLine() {
- return data[INDEX_LINE];
- }
-}
Deleted: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Catch.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Catch.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Catch.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -1,120 +0,0 @@
-/*
- * #%L
- *
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 Codelutin, Chatellier Eric
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package fr.ifremer.coser.bean;
-
-
-/**
- * Catch entity delegating to ordered array.
- *
- * "Campagne","Annee","Trait","Espece","Nombre","Poids"
- * "Survey","Year","Haul","Species","Number","Weight"
- *
- * @author chatellier
- * @version $Revision$
- *
- * Last update : $Date$
- * By : $Author$
- */
-public class Catch extends AbstractDataEntity {
-
- /** serialVersionUID. */
- private static final long serialVersionUID = -3868116128268974801L;
-
- public static final String[] FR_HEADERS = {
- "Campagne","Annee","Trait","Espece","Nombre","Poids"
- };
-
- public static final String[] EN_HEADERS = {
- "Survey","Year","Haul","Species","Number","Weight"
- };
-
- public static final int INDEX_SURVEY = 1;
- public static final int INDEX_YEAR = 2;
- public static final int INDEX_HAUL = 3;
- public static final int INDEX_SPECIES = 4;
- public static final int INDEX_NUMBER = 5;
- public static final int INDEX_WEIGHT = 6;
-
- public void setSurvey(String value) {
- String oldValue = data[INDEX_SURVEY];
- data[INDEX_SURVEY] = value;
- getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
- }
-
- public String getSurvey() {
- return data[INDEX_SURVEY];
- }
-
- public void setYear(String value) {
- String oldValue = data[INDEX_YEAR];
- data[INDEX_YEAR] = value;
- getPropertyChangeSupport().firePropertyChange("year", oldValue, value);
- }
-
- public String getYear() {
- return data[INDEX_YEAR];
- }
-
- public void setHaul(String value) {
- String oldValue = data[INDEX_HAUL];
- data[INDEX_HAUL] = value;
- getPropertyChangeSupport().firePropertyChange("haul", oldValue, value);
- }
-
- public String getHaul() {
- return data[INDEX_HAUL];
- }
-
- public void setSpecies(String value) {
- String oldValue = data[INDEX_SPECIES];
- data[INDEX_SPECIES] = value;
- getPropertyChangeSupport().firePropertyChange("species", oldValue, value);
- }
-
- public String getSpecies() {
- return data[INDEX_SPECIES];
- }
-
- public void setNumber(String value) {
- String oldValue = data[INDEX_NUMBER];
- data[INDEX_NUMBER] = String.valueOf(value);
- getPropertyChangeSupport().firePropertyChange("number", oldValue, value);
- }
-
- public String getNumber() {
- return data[INDEX_NUMBER];
- }
-
- public void setWeight(String value) {
- String oldValue = data[INDEX_WEIGHT];
- data[INDEX_WEIGHT] = value;
- getPropertyChangeSupport().firePropertyChange("weight", oldValue, value);
- }
-
- public String getWeight() {
- return data[INDEX_WEIGHT];
- }
-}
Deleted: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Haul.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Haul.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Haul.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -1,153 +0,0 @@
-/*
- * #%L
- *
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 Codelutin, Chatellier Eric
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package fr.ifremer.coser.bean;
-
-
-/**
- * Haul entity delegating to ordered array.
- *
- * "Campagne","Annee","Trait","Mois","Strate","SurfaceBalayee","Lat","Long","ProfMoy"
- * "Survey","Year","Haul","Month","Stratum","SweptSurface","Lat","Long","Depth"
- *
- * @author chatellier
- * @version $Revision$
- *
- * Last update : $Date$
- * By : $Author$
- */
-public class Haul extends AbstractDataEntity {
-
- /** serialVersionUID. */
- private static final long serialVersionUID = 3931599935237369209L;
-
- public static final String[] FR_HEADERS = {
- "Campagne","Annee","Trait","Mois","Strate","SurfaceBalayee","Lat","Long","ProfMoy"
- };
-
- public static final String[] EN_HEADERS = {
- "Survey","Year","Haul","Month","Stratum","SweptSurface","Lat","Long","Depth"
- };
-
- public static final int INDEX_SURVEY = 1;
- public static final int INDEX_YEAR = 2;
- public static final int INDEX_HAUL = 3;
- public static final int INDEX_MONTH = 4;
- public static final int INDEX_STRATUM = 5;
- public static final int INDEX_SWEPT_SURFACE = 6;
- public static final int INDEX_LAT = 7;
- public static final int INDEX_LONG = 8;
- public static final int INDEX_DEPTH = 9;
-
- public void setSurvey(String value) {
- String oldValue = data[INDEX_SURVEY];
- data[INDEX_SURVEY] = value;
- getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
- }
-
- public String getSurvey() {
- return data[INDEX_SURVEY];
- }
-
- public void setYear(String value) {
- String oldValue = data[INDEX_YEAR];
- data[INDEX_YEAR] = value;
- getPropertyChangeSupport().firePropertyChange("year", oldValue, value);
- }
-
- public String getYear() {
- return data[INDEX_YEAR];
- }
-
- public void setHaul(String value) {
- String oldValue = data[INDEX_HAUL];
- data[INDEX_HAUL] = value;
- getPropertyChangeSupport().firePropertyChange("haul", oldValue, value);
- }
-
- public String getHaul() {
- return data[INDEX_HAUL];
- }
-
- public void setMonth(String value) {
- String oldValue = data[INDEX_MONTH];
- data[INDEX_MONTH] = value;
- getPropertyChangeSupport().firePropertyChange("month", oldValue, value);
- }
-
- public String getMonth() {
- return data[INDEX_MONTH];
- }
-
- public void setStratum(String value) {
- String oldValue = data[INDEX_STRATUM];
- data[INDEX_STRATUM] = value;
- getPropertyChangeSupport().firePropertyChange("stratum", oldValue, value);
- }
-
- public String getStratum() {
- return data[INDEX_STRATUM];
- }
-
- public void setSweptSurface(String value) {
- String oldValue = data[INDEX_SWEPT_SURFACE];
- data[INDEX_SWEPT_SURFACE] = value;
- getPropertyChangeSupport().firePropertyChange("sweptSurface", oldValue, value);
- }
-
- public String getSweptSurface() {
- return data[INDEX_SWEPT_SURFACE];
- }
-
- public void setLat(String value) {
- String oldValue = data[INDEX_LAT];
- data[INDEX_LAT] = value;
- getPropertyChangeSupport().firePropertyChange("lat", oldValue, value);
- }
-
- public String getLat() {
- return data[INDEX_LAT];
- }
-
- public void setLong(String value) {
- String oldValue = data[INDEX_LONG];
- data[INDEX_LONG] = value;
- getPropertyChangeSupport().firePropertyChange("long", oldValue, value);
- }
-
- public String getLong() {
- return data[INDEX_LONG];
- }
-
- public void setDepth(String value) {
- String oldValue = data[INDEX_DEPTH];
- data[INDEX_DEPTH] = value;
- getPropertyChangeSupport().firePropertyChange("depth", oldValue, value);
- }
-
- public String getDepth() {
- return data[INDEX_DEPTH];
- }
-}
Deleted: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Length.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Length.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Length.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -1,173 +0,0 @@
-/*
- * #%L
- *
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 Codelutin, Chatellier Eric
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package fr.ifremer.coser.bean;
-
-/**
- * Length entity delegating to ordered array.
- *
- * "Campagne","Annee","Trait","Espece","Sexe","Maturite","Longueur","Nombre","Poids","Age"
- * "Survey","Year","Haul","Species","Sex","Maturity","Length","Number","Weight","Age"
- *
- * @author chatellier
- * @version $Revision$
- *
- * Last update : $Date$
- * By : $Author$
- */
-public class Length extends AbstractDataEntity {
-
- /** serialVersionUID. */
- private static final long serialVersionUID = 1283486477462355761L;
-
- public static final String[] FR_HEADERS = {
- "Campagne","Annee","Trait","Espece","Sexe","Maturite","Longueur","Nombre","Poids","Age"
- };
-
- public static final String[] EN_HEADERS = {
- "Survey","Year","Haul","Species","Sex","Maturity","Length","Number","Weight","Age"
- };
-
- public static final int INDEX_SURVEY = 1;
- public static final int INDEX_YEAR = 2;
- public static final int INDEX_HAUL = 3;
- public static final int INDEX_SPECIES = 4;
- public static final int INDEX_SEX = 5;
- public static final int INDEX_MATURITY = 6;
- public static final int INDEX_LENGTH = 7;
- public static final int INDEX_NUMBER = 8;
- public static final int INDEX_WEIGHT = 9;
- public static final int INDEX_AGE = 10;
-
- public void setSurvey(String value) {
- String oldValue = data[INDEX_SURVEY];
- data[INDEX_SURVEY] = value;
- getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
- }
-
- public String getSurvey() {
- return data[INDEX_SURVEY];
- }
-
- public void setYear(String value) {
- String oldValue = data[INDEX_YEAR];
- data[INDEX_YEAR] = value;
- getPropertyChangeSupport().firePropertyChange("year", oldValue, value);
- }
-
- public String getYear() {
- return data[INDEX_YEAR];
- }
-
- public void setHaul(String value) {
- String oldValue = data[INDEX_HAUL];
- data[INDEX_HAUL] = value;
- getPropertyChangeSupport().firePropertyChange("haul", oldValue, value);
- }
-
- public String getHaul() {
- return data[INDEX_HAUL];
- }
-
- public void setSpecies(String value) {
- String oldValue = data[INDEX_SPECIES];
- data[INDEX_SPECIES] = value;
- getPropertyChangeSupport().firePropertyChange("species", oldValue, value);
- }
-
- public String getSpecies() {
- return data[INDEX_SPECIES];
- }
-
- public void setSex(String value) {
- String oldValue = data[INDEX_SEX];
- data[INDEX_SEX] = value;
- getPropertyChangeSupport().firePropertyChange("sex", oldValue, value);
- }
-
- public String getSex() {
- return data[INDEX_SEX];
- }
-
- public void setMaturity(String value) {
- String oldValue = data[INDEX_MATURITY];
- data[INDEX_MATURITY] = value;
- getPropertyChangeSupport().firePropertyChange("maturity", oldValue, value);
- }
-
- public String getMaturity() {
- return data[INDEX_MATURITY];
- }
-
- public void setLength(String value) {
- String oldValue = data[INDEX_LENGTH];
- data[INDEX_LENGTH] = value;
- getPropertyChangeSupport().firePropertyChange("length", oldValue, value);
- }
-
- public String getLength() {
- return data[INDEX_LENGTH];
- }
-
- public void setNumber(String value) {
- String oldValue = data[INDEX_NUMBER];
- data[INDEX_NUMBER] = value;
- getPropertyChangeSupport().firePropertyChange("number", oldValue, value);
- }
-
- public String getNumber() {
- return data[INDEX_NUMBER];
- }
-
- public void setWeight(String value) {
- String oldValue = data[INDEX_WEIGHT];
- data[INDEX_WEIGHT] = value;
- getPropertyChangeSupport().firePropertyChange("weight", oldValue, value);
- }
-
- public String getWeight() {
- return data[INDEX_WEIGHT];
- }
-
- /**
- * Age field.
- *
- * @param value new value to set
- */
- public void setAge(String value) {
- String oldValue = data[INDEX_AGE];
- data[INDEX_AGE] = value;
- getPropertyChangeSupport().firePropertyChange("age", oldValue, value);
- }
-
- /**
- * Age field.
- *
- * @return age
- */
- public String getAge() {
- return data[INDEX_AGE];
- }
-}
Deleted: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Strata.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Strata.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Strata.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -1,88 +0,0 @@
-/*
- * #%L
- *
- *
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2010 Codelutin, Chatellier Eric
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Lesser Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/lgpl-3.0.html>.
- * #L%
- */
-
-package fr.ifremer.coser.bean;
-
-
-/**
- * Strata entity delegating to ordered array.
- *
- * "Campagne","Strate","Surface"
- * "Survey","Stratum","Surface"
- *
- * @author chatellier
- * @version $Revision$
- *
- * Last update : $Date$
- * By : $Author$
- */
-public class Strata extends AbstractDataEntity {
-
- /** serialVersionUID. */
- private static final long serialVersionUID = 3176546952537796549L;
-
- public static final String[] FR_HEADERS = {
- "Campagne","Strate","Surface"
- };
-
- public static final String[] EN_HEADERS = {
- "Survey","Stratum","Surface"
- };
-
- public static final int INDEX_SURVEY = 1;
- public static final int INDEX_STRATUM = 2;
- public static final int INDEX_SURFACE = 3;
-
- public void setSurvey(String value) {
- String oldValue = data[INDEX_SURVEY];
- data[INDEX_SURVEY] = value;
- getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
- }
-
- public String getSurvey() {
- return data[INDEX_SURVEY];
- }
-
- public void setStratum(String value) {
- String oldValue = data[INDEX_STRATUM];
- data[INDEX_STRATUM] = value;
- getPropertyChangeSupport().firePropertyChange("stratum", oldValue, value);
- }
-
- public String getStratum() {
- return data[INDEX_STRATUM];
- }
-
- public void setSurface(String value) {
- String oldValue = data[INDEX_SURFACE];
- data[INDEX_SURFACE] = value;
- getPropertyChangeSupport().firePropertyChange("surface", oldValue, value);
- }
-
- public String getSurface() {
- return data[INDEX_SURFACE];
- }
-
-}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -34,8 +34,8 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants.Category;
-import fr.ifremer.coser.bean.AbstractDataEntity;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.data.AbstractDataEntity;
import fr.ifremer.coser.storage.DataStorage;
/**
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -32,8 +32,8 @@
import org.apache.commons.logging.LogFactory;
import fr.ifremer.coser.CoserBusinessException;
-import fr.ifremer.coser.bean.Catch;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.data.Catch;
/**
* Merge species command.
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -27,11 +27,11 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants.Category;
-import fr.ifremer.coser.bean.Catch;
-import fr.ifremer.coser.bean.Haul;
-import fr.ifremer.coser.bean.Length;
import fr.ifremer.coser.bean.Project;
-import fr.ifremer.coser.bean.Strata;
+import fr.ifremer.coser.data.Catch;
+import fr.ifremer.coser.data.Haul;
+import fr.ifremer.coser.data.Length;
+import fr.ifremer.coser.data.Strata;
/**
* Command pattern object.
Copied: trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java (from rev 97, trunk/coser-business/src/main/java/fr/ifremer/coser/bean/AbstractDataEntity.java)
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -0,0 +1,67 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.data;
+
+import static org.nuiton.i18n.I18n.n_;
+import fr.ifremer.coser.bean.AbstractEntity;
+
+/**
+ * Abstract entity to add all common data array code.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public abstract class AbstractDataEntity extends AbstractEntity {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 4188448448464323807L;
+
+ public static final int INDEX_LINE = 0;
+ public static final String PROPERTY_LINE = n_("coser.business.line");
+
+ protected String[] data;
+
+ public String[] getData() {
+ return data;
+ }
+
+ public void setData(String[] data) {
+ this.data = data;
+ }
+
+ public void setLine(String value) {
+ String oldValue = data[INDEX_LINE];
+ data[INDEX_LINE] = value;
+ getPropertyChangeSupport().firePropertyChange(PROPERTY_LINE, oldValue, value);
+ }
+
+ public String getLine() {
+ return data[INDEX_LINE];
+ }
+}
Copied: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java (from rev 97, trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Catch.java)
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -0,0 +1,119 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.data;
+
+/**
+ * Catch entity delegating to ordered array.
+ *
+ * "Campagne","Annee","Trait","Espece","Nombre","Poids"
+ * "Survey","Year","Haul","Species","Number","Weight"
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class Catch extends AbstractDataEntity {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = -3868116128268974801L;
+
+ public static final String[] FR_HEADERS = {
+ "Campagne","Annee","Trait","Espece","Nombre","Poids"
+ };
+
+ public static final String[] EN_HEADERS = {
+ "Survey","Year","Haul","Species","Number","Weight"
+ };
+
+ public static final int INDEX_SURVEY = 1;
+ public static final int INDEX_YEAR = 2;
+ public static final int INDEX_HAUL = 3;
+ public static final int INDEX_SPECIES = 4;
+ public static final int INDEX_NUMBER = 5;
+ public static final int INDEX_WEIGHT = 6;
+
+ public void setSurvey(String value) {
+ String oldValue = data[INDEX_SURVEY];
+ data[INDEX_SURVEY] = value;
+ getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
+ }
+
+ public String getSurvey() {
+ return data[INDEX_SURVEY];
+ }
+
+ public void setYear(String value) {
+ String oldValue = data[INDEX_YEAR];
+ data[INDEX_YEAR] = value;
+ getPropertyChangeSupport().firePropertyChange("year", oldValue, value);
+ }
+
+ public String getYear() {
+ return data[INDEX_YEAR];
+ }
+
+ public void setHaul(String value) {
+ String oldValue = data[INDEX_HAUL];
+ data[INDEX_HAUL] = value;
+ getPropertyChangeSupport().firePropertyChange("haul", oldValue, value);
+ }
+
+ public String getHaul() {
+ return data[INDEX_HAUL];
+ }
+
+ public void setSpecies(String value) {
+ String oldValue = data[INDEX_SPECIES];
+ data[INDEX_SPECIES] = value;
+ getPropertyChangeSupport().firePropertyChange("species", oldValue, value);
+ }
+
+ public String getSpecies() {
+ return data[INDEX_SPECIES];
+ }
+
+ public void setNumber(String value) {
+ String oldValue = data[INDEX_NUMBER];
+ data[INDEX_NUMBER] = String.valueOf(value);
+ getPropertyChangeSupport().firePropertyChange("number", oldValue, value);
+ }
+
+ public String getNumber() {
+ return data[INDEX_NUMBER];
+ }
+
+ public void setWeight(String value) {
+ String oldValue = data[INDEX_WEIGHT];
+ data[INDEX_WEIGHT] = value;
+ getPropertyChangeSupport().firePropertyChange("weight", oldValue, value);
+ }
+
+ public String getWeight() {
+ return data[INDEX_WEIGHT];
+ }
+}
Copied: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java (from rev 97, trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Haul.java)
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -0,0 +1,152 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.data;
+
+/**
+ * Haul entity delegating to ordered array.
+ *
+ * "Campagne","Annee","Trait","Mois","Strate","SurfaceBalayee","Lat","Long","ProfMoy"
+ * "Survey","Year","Haul","Month","Stratum","SweptSurface","Lat","Long","Depth"
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class Haul extends AbstractDataEntity {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 3931599935237369209L;
+
+ public static final String[] FR_HEADERS = {
+ "Campagne","Annee","Trait","Mois","Strate","SurfaceBalayee","Lat","Long","ProfMoy"
+ };
+
+ public static final String[] EN_HEADERS = {
+ "Survey","Year","Haul","Month","Stratum","SweptSurface","Lat","Long","Depth"
+ };
+
+ public static final int INDEX_SURVEY = 1;
+ public static final int INDEX_YEAR = 2;
+ public static final int INDEX_HAUL = 3;
+ public static final int INDEX_MONTH = 4;
+ public static final int INDEX_STRATUM = 5;
+ public static final int INDEX_SWEPT_SURFACE = 6;
+ public static final int INDEX_LAT = 7;
+ public static final int INDEX_LONG = 8;
+ public static final int INDEX_DEPTH = 9;
+
+ public void setSurvey(String value) {
+ String oldValue = data[INDEX_SURVEY];
+ data[INDEX_SURVEY] = value;
+ getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
+ }
+
+ public String getSurvey() {
+ return data[INDEX_SURVEY];
+ }
+
+ public void setYear(String value) {
+ String oldValue = data[INDEX_YEAR];
+ data[INDEX_YEAR] = value;
+ getPropertyChangeSupport().firePropertyChange("year", oldValue, value);
+ }
+
+ public String getYear() {
+ return data[INDEX_YEAR];
+ }
+
+ public void setHaul(String value) {
+ String oldValue = data[INDEX_HAUL];
+ data[INDEX_HAUL] = value;
+ getPropertyChangeSupport().firePropertyChange("haul", oldValue, value);
+ }
+
+ public String getHaul() {
+ return data[INDEX_HAUL];
+ }
+
+ public void setMonth(String value) {
+ String oldValue = data[INDEX_MONTH];
+ data[INDEX_MONTH] = value;
+ getPropertyChangeSupport().firePropertyChange("month", oldValue, value);
+ }
+
+ public String getMonth() {
+ return data[INDEX_MONTH];
+ }
+
+ public void setStratum(String value) {
+ String oldValue = data[INDEX_STRATUM];
+ data[INDEX_STRATUM] = value;
+ getPropertyChangeSupport().firePropertyChange("stratum", oldValue, value);
+ }
+
+ public String getStratum() {
+ return data[INDEX_STRATUM];
+ }
+
+ public void setSweptSurface(String value) {
+ String oldValue = data[INDEX_SWEPT_SURFACE];
+ data[INDEX_SWEPT_SURFACE] = value;
+ getPropertyChangeSupport().firePropertyChange("sweptSurface", oldValue, value);
+ }
+
+ public String getSweptSurface() {
+ return data[INDEX_SWEPT_SURFACE];
+ }
+
+ public void setLat(String value) {
+ String oldValue = data[INDEX_LAT];
+ data[INDEX_LAT] = value;
+ getPropertyChangeSupport().firePropertyChange("lat", oldValue, value);
+ }
+
+ public String getLat() {
+ return data[INDEX_LAT];
+ }
+
+ public void setLong(String value) {
+ String oldValue = data[INDEX_LONG];
+ data[INDEX_LONG] = value;
+ getPropertyChangeSupport().firePropertyChange("long", oldValue, value);
+ }
+
+ public String getLong() {
+ return data[INDEX_LONG];
+ }
+
+ public void setDepth(String value) {
+ String oldValue = data[INDEX_DEPTH];
+ data[INDEX_DEPTH] = value;
+ getPropertyChangeSupport().firePropertyChange("depth", oldValue, value);
+ }
+
+ public String getDepth() {
+ return data[INDEX_DEPTH];
+ }
+}
Copied: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java (from rev 97, trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Length.java)
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -0,0 +1,173 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.data;
+
+/**
+ * Length entity delegating to ordered array.
+ *
+ * "Campagne","Annee","Trait","Espece","Sexe","Maturite","Longueur","Nombre","Poids","Age"
+ * "Survey","Year","Haul","Species","Sex","Maturity","Length","Number","Weight","Age"
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class Length extends AbstractDataEntity {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 1283486477462355761L;
+
+ public static final String[] FR_HEADERS = {
+ "Campagne","Annee","Trait","Espece","Sexe","Maturite","Longueur","Nombre","Poids","Age"
+ };
+
+ public static final String[] EN_HEADERS = {
+ "Survey","Year","Haul","Species","Sex","Maturity","Length","Number","Weight","Age"
+ };
+
+ public static final int INDEX_SURVEY = 1;
+ public static final int INDEX_YEAR = 2;
+ public static final int INDEX_HAUL = 3;
+ public static final int INDEX_SPECIES = 4;
+ public static final int INDEX_SEX = 5;
+ public static final int INDEX_MATURITY = 6;
+ public static final int INDEX_LENGTH = 7;
+ public static final int INDEX_NUMBER = 8;
+ public static final int INDEX_WEIGHT = 9;
+ public static final int INDEX_AGE = 10;
+
+ public void setSurvey(String value) {
+ String oldValue = data[INDEX_SURVEY];
+ data[INDEX_SURVEY] = value;
+ getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
+ }
+
+ public String getSurvey() {
+ return data[INDEX_SURVEY];
+ }
+
+ public void setYear(String value) {
+ String oldValue = data[INDEX_YEAR];
+ data[INDEX_YEAR] = value;
+ getPropertyChangeSupport().firePropertyChange("year", oldValue, value);
+ }
+
+ public String getYear() {
+ return data[INDEX_YEAR];
+ }
+
+ public void setHaul(String value) {
+ String oldValue = data[INDEX_HAUL];
+ data[INDEX_HAUL] = value;
+ getPropertyChangeSupport().firePropertyChange("haul", oldValue, value);
+ }
+
+ public String getHaul() {
+ return data[INDEX_HAUL];
+ }
+
+ public void setSpecies(String value) {
+ String oldValue = data[INDEX_SPECIES];
+ data[INDEX_SPECIES] = value;
+ getPropertyChangeSupport().firePropertyChange("species", oldValue, value);
+ }
+
+ public String getSpecies() {
+ return data[INDEX_SPECIES];
+ }
+
+ public void setSex(String value) {
+ String oldValue = data[INDEX_SEX];
+ data[INDEX_SEX] = value;
+ getPropertyChangeSupport().firePropertyChange("sex", oldValue, value);
+ }
+
+ public String getSex() {
+ return data[INDEX_SEX];
+ }
+
+ public void setMaturity(String value) {
+ String oldValue = data[INDEX_MATURITY];
+ data[INDEX_MATURITY] = value;
+ getPropertyChangeSupport().firePropertyChange("maturity", oldValue, value);
+ }
+
+ public String getMaturity() {
+ return data[INDEX_MATURITY];
+ }
+
+ public void setLength(String value) {
+ String oldValue = data[INDEX_LENGTH];
+ data[INDEX_LENGTH] = value;
+ getPropertyChangeSupport().firePropertyChange("length", oldValue, value);
+ }
+
+ public String getLength() {
+ return data[INDEX_LENGTH];
+ }
+
+ public void setNumber(String value) {
+ String oldValue = data[INDEX_NUMBER];
+ data[INDEX_NUMBER] = value;
+ getPropertyChangeSupport().firePropertyChange("number", oldValue, value);
+ }
+
+ public String getNumber() {
+ return data[INDEX_NUMBER];
+ }
+
+ public void setWeight(String value) {
+ String oldValue = data[INDEX_WEIGHT];
+ data[INDEX_WEIGHT] = value;
+ getPropertyChangeSupport().firePropertyChange("weight", oldValue, value);
+ }
+
+ public String getWeight() {
+ return data[INDEX_WEIGHT];
+ }
+
+ /**
+ * Age field.
+ *
+ * @param value new value to set
+ */
+ public void setAge(String value) {
+ String oldValue = data[INDEX_AGE];
+ data[INDEX_AGE] = value;
+ getPropertyChangeSupport().firePropertyChange("age", oldValue, value);
+ }
+
+ /**
+ * Age field.
+ *
+ * @return age
+ */
+ public String getAge() {
+ return data[INDEX_AGE];
+ }
+}
Copied: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java (from rev 97, trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Strata.java)
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -0,0 +1,87 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.data;
+
+/**
+ * Strata entity delegating to ordered array.
+ *
+ * "Campagne","Strate","Surface"
+ * "Survey","Stratum","Surface"
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class Strata extends AbstractDataEntity {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = 3176546952537796549L;
+
+ public static final String[] FR_HEADERS = {
+ "Campagne","Strate","Surface"
+ };
+
+ public static final String[] EN_HEADERS = {
+ "Survey","Stratum","Surface"
+ };
+
+ public static final int INDEX_SURVEY = 1;
+ public static final int INDEX_STRATUM = 2;
+ public static final int INDEX_SURFACE = 3;
+
+ public void setSurvey(String value) {
+ String oldValue = data[INDEX_SURVEY];
+ data[INDEX_SURVEY] = value;
+ getPropertyChangeSupport().firePropertyChange("survey", oldValue, value);
+ }
+
+ public String getSurvey() {
+ return data[INDEX_SURVEY];
+ }
+
+ public void setStratum(String value) {
+ String oldValue = data[INDEX_STRATUM];
+ data[INDEX_STRATUM] = value;
+ getPropertyChangeSupport().firePropertyChange("stratum", oldValue, value);
+ }
+
+ public String getStratum() {
+ return data[INDEX_STRATUM];
+ }
+
+ public void setSurface(String value) {
+ String oldValue = data[INDEX_SURFACE];
+ data[INDEX_SURFACE] = value;
+ getPropertyChangeSupport().firePropertyChange("surface", oldValue, value);
+ }
+
+ public String getSurface() {
+ return data[INDEX_SURFACE];
+ }
+
+}
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/data/package-info.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/data/package-info.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/package-info.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -0,0 +1,28 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+/**
+ * Data entities classes.
+ */
+package fr.ifremer.coser.data;
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/data/package-info.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -51,12 +51,12 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants;
import fr.ifremer.coser.CoserConstants.Category;
-import fr.ifremer.coser.bean.AbstractDataEntity;
-import fr.ifremer.coser.bean.Catch;
-import fr.ifremer.coser.bean.Haul;
-import fr.ifremer.coser.bean.Length;
import fr.ifremer.coser.bean.Project;
-import fr.ifremer.coser.bean.Strata;
+import fr.ifremer.coser.data.AbstractDataEntity;
+import fr.ifremer.coser.data.Catch;
+import fr.ifremer.coser.data.Haul;
+import fr.ifremer.coser.data.Length;
+import fr.ifremer.coser.data.Strata;
import fr.ifremer.coser.storage.DataStorage;
import fr.ifremer.coser.storage.MemoryListStorage;
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -46,13 +46,13 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants;
import fr.ifremer.coser.CoserConstants.Category;
-import fr.ifremer.coser.bean.Catch;
-import fr.ifremer.coser.bean.Haul;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.bean.Specy;
import fr.ifremer.coser.command.Command;
import fr.ifremer.coser.command.DeleteLineCommand;
import fr.ifremer.coser.command.MergeSpeciesCommand;
+import fr.ifremer.coser.data.Catch;
+import fr.ifremer.coser.data.Haul;
import fr.ifremer.coser.storage.DataStorage;
/**
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ValidationService.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -49,13 +49,13 @@
import fr.ifremer.coser.CoserBusinessConfig;
import fr.ifremer.coser.CoserConstants.Category;
import fr.ifremer.coser.CoserConstants.ValidationLevel;
-import fr.ifremer.coser.bean.Catch;
-import fr.ifremer.coser.bean.Haul;
-import fr.ifremer.coser.bean.Length;
import fr.ifremer.coser.bean.Project;
-import fr.ifremer.coser.bean.Strata;
import fr.ifremer.coser.control.ProgressMonitor;
import fr.ifremer.coser.control.ValidationError;
+import fr.ifremer.coser.data.Catch;
+import fr.ifremer.coser.data.Haul;
+import fr.ifremer.coser.data.Length;
+import fr.ifremer.coser.data.Strata;
import fr.ifremer.coser.storage.DataStorage;
/**
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -32,8 +32,8 @@
import org.junit.Assert;
import org.junit.Test;
-import fr.ifremer.coser.bean.Catch;
import fr.ifremer.coser.control.ValidationError;
+import fr.ifremer.coser.data.Catch;
/**
* Test abour validation.
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/CoserFrameHandler.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -56,8 +56,8 @@
import fr.ifremer.coser.CoserConfig;
import fr.ifremer.coser.CoserConstants.Category;
import fr.ifremer.coser.CoserException;
-import fr.ifremer.coser.bean.Catch;
import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.data.Catch;
import fr.ifremer.coser.services.ProjectService;
import fr.ifremer.coser.ui.control.ControlHandler;
import fr.ifremer.coser.ui.control.ControlView;
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-10-26 13:59:58 UTC (rev 103)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-10-26 14:08:45 UTC (rev 104)
@@ -61,13 +61,13 @@
import fr.ifremer.coser.CoserBusinessException;
import fr.ifremer.coser.CoserConstants.Category;
import fr.ifremer.coser.CoserException;
-import fr.ifremer.coser.bean.AbstractDataEntity;
-import fr.ifremer.coser.bean.Catch;
-import fr.ifremer.coser.bean.Haul;
-import fr.ifremer.coser.bean.Length;
import fr.ifremer.coser.bean.Project;
-import fr.ifremer.coser.bean.Strata;
import fr.ifremer.coser.control.ValidationError;
+import fr.ifremer.coser.data.AbstractDataEntity;
+import fr.ifremer.coser.data.Catch;
+import fr.ifremer.coser.data.Haul;
+import fr.ifremer.coser.data.Length;
+import fr.ifremer.coser.data.Strata;
import fr.ifremer.coser.services.ProjectService;
import fr.ifremer.coser.services.ValidationService;
1
0
r103 - in trunk: coser-business/src/main/java/fr/ifremer/coser coser-business/src/main/java/fr/ifremer/coser/bean coser-business/src/main/java/fr/ifremer/coser/command coser-business/src/main/java/fr/ifremer/coser/services coser-business/src/main/java/fr/ifremer/coser/storage coser-business/src/test/java/fr/ifremer/coser/services coser-ui/src/main/java/fr/ifremer/coser/ui/control coser-ui/src/main/java/fr/ifremer/coser/ui/selection coser-ui/src/main/resources/i18n
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
26 Oct '10
Author: chatellier
Date: 2010-10-26 13:59:58 +0000 (Tue, 26 Oct 2010)
New Revision: 103
Log:
Implementation du pattern command pour les operations sur les donn?\195?\169es.
Added:
trunk/coser-business/src/main/java/fr/ifremer/coser/command/
trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java
trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
trunk/coser-business/src/main/java/fr/ifremer/coser/storage/DataStorage.java
trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryListStorage.java
trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionListsView.jaxx
trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionResultView.jaxx
trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties
trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/CoserConstants.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -58,12 +58,18 @@
/** Suffix des nom de fichiers data apres control. */
public static final String STORAGE_CONTROL_SUFFIX = "_co";
+
+ /** Suffix des nom de fichiers data contenant les données supprimées. */
+ public static final String STORAGE_DELECTED_SUFFIX = "_del";
/** Suffix des nom de fichiers data apres selection. */
public static final String STORAGE_SELECTION_SUFFIX = "_se";
/** Extension des fichiers CSV. */
public static final String STORAGE_CSV_EXTENSION = ".csv";
+
+ /** Nom du fichier des historiques de modification */
+ public static final String HISTORY_FILENAME = "history.csv";
/** Categories des données manipulées. */
public static enum Category {
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/bean/Project.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -25,6 +25,9 @@
package fr.ifremer.coser.bean;
+import java.util.List;
+
+import fr.ifremer.coser.command.Command;
import fr.ifremer.coser.storage.DataStorage;
/**
@@ -54,15 +57,26 @@
protected DataStorage dataCatch;
+ protected DataStorage deletedDataCatch;
+
protected DataStorage dataStrata;
+ protected DataStorage deletedDataStrata;
+
protected DataStorage dataHaul;
+ protected DataStorage deletedDataHaul;
+
protected DataStorage dataLength;
+
+ protected DataStorage deletedDataLength;
/** Reftax SIH. */
protected DataStorage refTaxSpecies;
+ /** L'historique des commandes do/undo .*/
+ protected List<Command> historyCommand;
+
public DataStorage getCatch() {
return dataCatch;
}
@@ -105,6 +119,38 @@
this.dataLength = dataLength;
}
+ public DataStorage getDeletedCatch() {
+ return deletedDataCatch;
+ }
+
+ public void setDeletedCatch(DataStorage deletedDataCatch) {
+ this.deletedDataCatch = deletedDataCatch;
+ }
+
+ public DataStorage getDeletedStrata() {
+ return deletedDataStrata;
+ }
+
+ public void setDeletedStrata(DataStorage deletedDataStrata) {
+ this.deletedDataStrata = deletedDataStrata;
+ }
+
+ public DataStorage getDeletedHaul() {
+ return deletedDataHaul;
+ }
+
+ public void setDeletedHaul(DataStorage deletedDataHaul) {
+ this.deletedDataHaul = deletedDataHaul;
+ }
+
+ public DataStorage getDeletedLength() {
+ return deletedDataLength;
+ }
+
+ public void setDeletedLength(DataStorage deletedDataLength) {
+ this.deletedDataLength = deletedDataLength;
+ }
+
public DataStorage getRefTaxSpecies() {
return refTaxSpecies;
}
@@ -112,4 +158,12 @@
public void setRefTaxSpecies(DataStorage refTaxSpecies) {
this.refTaxSpecies = refTaxSpecies;
}
+
+ public List<Command> getHistoryCommand() {
+ return historyCommand;
+ }
+
+ public void setHistoryCommand(List<Command> historyCommand) {
+ this.historyCommand = historyCommand;
+ }
}
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,87 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.command;
+
+import java.util.UUID;
+
+import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.bean.Project;
+
+/**
+ * Command interface.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public abstract class Command {
+
+ /**
+ * UUID de la commande. Les commandes ayant un UUID commun font partie
+ * du même groupe de commandes.
+ */
+ protected String commandUUID;
+
+ /**
+ * UUID de la commande. Les commandes ayant un UUID commun font partie
+ * du même groupe de commandes.
+ *
+ * @return command UUID
+ * @see UUID
+ */
+ public String getCommandUUID() {
+ return commandUUID;
+ }
+
+ /**
+ * UUID de la commande. Les commandes ayant un UUID commun font partie
+ * du même groupe de commandes.
+ *
+ * @param commandUUID new uuid
+ * @see UUID
+ */
+ public void setCommandUUID(String commandUUID) {
+ this.commandUUID = commandUUID;
+ }
+
+ /**
+ * Do command on project.
+ *
+ * @param project project
+ * @throws CoserBusinessException
+ */
+ public abstract void doCommand(Project project) throws CoserBusinessException;
+
+ /**
+ * Undo command on project.
+ *
+ * @param project project
+ * @throws CoserBusinessException
+ */
+ public abstract void undoCommand(Project project) throws CoserBusinessException;
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/command/Command.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,197 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.command;
+
+import static org.nuiton.i18n.I18n._;
+
+import java.util.Iterator;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.CoserConstants.Category;
+import fr.ifremer.coser.bean.AbstractDataEntity;
+import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.storage.DataStorage;
+
+/**
+ * Command pattern object.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class DeleteLineCommand extends Command {
+
+ private static final Log log = LogFactory.getLog(DeleteLineCommand.class);
+
+ /** Category de données sur lequel porte l'action. */
+ protected Category category;
+
+ /** Line index of object to do command to. */
+ protected String lineIndex;
+
+ public Category getCategory() {
+ return category;
+ }
+
+ public void setCategory(Category category) {
+ this.category = category;
+ }
+
+ public String getLineIndex() {
+ return lineIndex;
+ }
+
+ public void setLineIndex(String lineIndex) {
+ this.lineIndex = lineIndex;
+ }
+
+ @Override
+ public void doCommand(Project project) throws CoserBusinessException {
+
+ DataStorage dataStorage = null;
+ DataStorage deletedDataStorage = null;
+
+ // get data storage depending on category
+ switch(category) {
+ case CATCH:
+ dataStorage = project.getCatch();
+ deletedDataStorage = project.getDeletedCatch();
+ break;
+ case HAUL:
+ dataStorage = project.getHaul();
+ deletedDataStorage = project.getDeletedHaul();
+ break;
+ case LENGTH:
+ dataStorage = project.getLength();
+ deletedDataStorage = project.getDeletedLength();
+ break;
+ case STRATA:
+ dataStorage = project.getStrata();
+ deletedDataStorage = project.getDeletedStrata();
+ break;
+ }
+
+ // parcourt des lignes
+ boolean dataLineFound = false;
+ Iterator<String[]> itDataStorage = dataStorage.iterator();
+ itDataStorage.next(); // skip header
+ while (itDataStorage.hasNext()) {
+ String[] dataLine = itDataStorage.next();
+ String dataLineIndex = dataLine[AbstractDataEntity.INDEX_LINE];
+ if (dataLineIndex.equals(lineIndex)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Removing line " + dataLineIndex);
+ }
+ dataLineFound = true;
+ deletedDataStorage.add(dataLine);
+ itDataStorage.remove();
+ }
+ }
+
+ // if not found, throw business exception
+ if (!dataLineFound) {
+ throw new CoserBusinessException(_("Can't find line %s for deletion", lineIndex));
+ }
+ }
+
+ @Override
+ public void undoCommand(Project project) throws CoserBusinessException {
+ DataStorage dataStorage = null;
+ DataStorage deletedDataStorage = null;
+
+ // get data storage depending on category
+ switch(category) {
+ case CATCH:
+ dataStorage = project.getCatch();
+ deletedDataStorage = project.getDeletedCatch();
+ break;
+ case HAUL:
+ dataStorage = project.getHaul();
+ deletedDataStorage = project.getDeletedHaul();
+ break;
+ case LENGTH:
+ dataStorage = project.getLength();
+ deletedDataStorage = project.getDeletedLength();
+ break;
+ case STRATA:
+ dataStorage = project.getStrata();
+ deletedDataStorage = project.getDeletedStrata();
+ break;
+ }
+
+ // parcourt des lignes
+ boolean dataLineFound = false;
+ Iterator<String[]> itDeletedDataStorage = deletedDataStorage.iterator();
+ itDeletedDataStorage.next(); //skip header
+ while (itDeletedDataStorage.hasNext()) {
+ String[] deletedDataLine = itDeletedDataStorage.next();
+ String deletedDataLineIndex = deletedDataLine[AbstractDataEntity.INDEX_LINE];
+ if (deletedDataLineIndex.equals(lineIndex)) {
+ dataLineFound = true;
+ itDeletedDataStorage.remove();
+
+ // search new insert point
+ int originalDataLine = Integer.parseInt(deletedDataLineIndex);
+ Iterator<String[]> itDataStorage = dataStorage.iterator();
+ itDataStorage.next(); //skip header
+ int index = 1; // due to header
+ while (itDataStorage.hasNext()) {
+ String[] dataLine = itDataStorage.next();
+ String dataLineIndex = dataLine[AbstractDataEntity.INDEX_LINE];
+ int dataLineInt = Integer.parseInt(dataLineIndex);
+ if (dataLineInt == originalDataLine) {
+ throw new CoserBusinessException(_("Original line already exists!"));
+ }
+ else if (dataLineInt > originalDataLine) {
+ break;
+ }
+ index++;
+ }
+
+ // insert line at specified index
+ dataStorage.add(index, deletedDataLine);
+ if (log.isDebugEnabled()) {
+ log.debug("Restore line " + index);
+ }
+ }
+ }
+
+ // if not found, throw business exception
+ if (!dataLineFound) {
+ throw new CoserBusinessException(_("Can't find line %s for undeletion", lineIndex));
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Delete line " + lineIndex + " on " + category;
+ }
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/command/DeleteLineCommand.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,213 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.command;
+
+import java.util.Iterator;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.bean.Catch;
+import fr.ifremer.coser.bean.Project;
+
+/**
+ * Merge species command.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class MergeSpeciesCommand extends Command {
+
+ private static final Log log = LogFactory.getLog(MergeSpeciesCommand.class);
+
+ protected String newSpecyName;
+
+ protected String[] speciesNames;
+
+ public String getNewSpecyName() {
+ return newSpecyName;
+ }
+
+ public void setNewSpecyName(String newSpecyName) {
+ this.newSpecyName = newSpecyName;
+ }
+
+ public String[] getSpeciesNames() {
+ return speciesNames;
+ }
+
+ public void setSpeciesNames(String[] speciesNames) {
+ this.speciesNames = speciesNames;
+ }
+
+ /*
+ * @see fr.ifremer.coser.command.Command#doCommand(fr.ifremer.coser.bean.Project)
+ */
+ @Override
+ public void doCommand(Project project) throws CoserBusinessException {
+
+ project = mergeCatch(project, newSpecyName, speciesNames);
+ project = mergeLength(project, newSpecyName, speciesNames);
+
+ }
+
+ /*
+ * @see fr.ifremer.coser.command.Command#undoCommand(fr.ifremer.coser.bean.Project)
+ */
+ @Override
+ public void undoCommand(Project project) throws CoserBusinessException {
+ throw new NotImplementedException("Merge operation can't be undone");
+
+ }
+
+ /**
+ * Fusion d'espece dans les données de captures.
+ *
+ * @param project project
+ * @param newSpecyName new specy name (after merge)
+ * @param speciesNames species name to merge
+ * @return project
+ */
+ protected Project mergeLength(Project project, String newSpecyName,
+ String... speciesNames) {
+ return project;
+ }
+
+ /**
+ * Fusion d'especes dans les données de taille.
+ *
+ * @param project project
+ * @param newSpecyName new specy name (after merge)
+ * @param speciesNames species name to merge
+ * @return project
+ */
+ protected Project mergeCatch(Project project, String newSpecyName,
+ String... speciesNames) {
+
+ // "Campagne","Annee","Trait","Espece","Nombre","Poids"
+
+ // regroupement par campagne/annee/trait
+ String lastCampagne = null;
+ String lastAnnee = null;
+ String lastTraits = null;
+ String[] tupleFound = null;
+ int tupleIndex = -1;
+
+ // parcours des elements
+ Iterator<String[]> itTuple = project.getCatch().iterator();
+ itTuple.next(); // skip header
+ int index = 1; // skip header
+ while (itTuple.hasNext()) {
+ String[] tuple = itTuple.next();
+
+ // si les valeurs servant au bornes de regroupement
+ // on changer, on reset les données du merge
+ String currentCampagne = tuple[Catch.INDEX_SURVEY];
+ String currentAnnee = tuple[Catch.INDEX_YEAR];
+ String currentTraits = tuple[Catch.INDEX_HAUL];
+ if (!currentCampagne.equals(lastCampagne) ||
+ !currentAnnee.equals(lastAnnee) ||
+ !currentTraits.equals(lastTraits)) {
+
+ tupleFound = null;
+ lastCampagne = currentCampagne;
+ lastAnnee = currentAnnee;
+ lastTraits = currentTraits;
+ }
+
+ // test si l'espece en cours fait partie de celle a merger
+ String species = tuple[Catch.INDEX_SPECIES];
+ boolean specyFound = false;
+ for (String specy : speciesNames) {
+ if (specy.equals(species)) {
+ specyFound = true;
+ }
+ }
+
+ // si l'espece est a merger, on se souvient du tuple
+ // principale a merge, ou on merge avec le tuple
+ // principal si on a deja un tuple principal
+ if (specyFound) {
+ if (tupleFound == null) {
+ tupleFound = tuple;
+ tupleFound[3] = newSpecyName;
+ tupleIndex = index;
+ }
+ else {
+ tupleFound = mergeCatches(tupleFound, tuple);
+ // et on supprime le tuple
+ // qui a ete merge
+ itTuple.remove();
+ // bidouille le remove decalle les index suivants
+ index--;
+ }
+
+ project.getCatch().set(tupleIndex, tupleFound);
+ }
+
+ index++;
+ }
+
+ return project;
+ }
+
+ /**
+ * Merge deux lines des catch.
+ *
+ * Le resultat est mergé dans {@code tuple1} et retourné.
+ *
+ * Somme les "Nombre" et "Poids"
+ *
+ * @param tuple1 tuple1
+ * @param tuple2 tuple2
+ * @return tuple1
+ */
+ protected String[] mergeCatches(String[] tuple1, String[] tuple2) {
+
+ // "Campagne","Annee","Trait","Espece","Nombre","Poids"
+
+ try {
+ double nombre1 = Double.parseDouble(tuple1[Catch.INDEX_NUMBER]);
+ double nombre2 = Double.parseDouble(tuple2[Catch.INDEX_NUMBER]);
+ double poids1 = Double.parseDouble(tuple1[Catch.INDEX_WEIGHT]);
+ double poids2 = Double.parseDouble(tuple2[Catch.INDEX_WEIGHT]);
+
+ tuple1[Catch.INDEX_NUMBER] = String.valueOf(nombre1 + nombre2);
+ tuple1[Catch.INDEX_WEIGHT] = String.valueOf(poids1 + poids2);
+ }
+ catch (NumberFormatException ex) {
+ if (log.isWarnEnabled()) {
+ log.warn("Can't convert data as double for merge", ex);
+ }
+ }
+ return tuple1;
+ }
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/command/MergeSpeciesCommand.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,132 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.command;
+
+import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.CoserConstants.Category;
+import fr.ifremer.coser.bean.Catch;
+import fr.ifremer.coser.bean.Haul;
+import fr.ifremer.coser.bean.Length;
+import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.bean.Strata;
+
+/**
+ * Command pattern object.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class ModifyFieldCommand extends Command {
+
+ /** Category de données sur lequel porte l'action. */
+ protected Category category;
+
+ /** Line index of object to do command to. */
+ protected int line;
+
+ /** Field index to to command. */
+ protected int fieldIndex;
+
+ /** Field actual value. */
+ protected Object currentValue;
+
+ /** Field new value. */
+ protected Object newValue;
+
+ public Category getCategory() {
+ return category;
+ }
+
+ public void setCategory(Category category) {
+ this.category = category;
+ }
+
+ public int getLine() {
+ return line;
+ }
+
+ public void setLine(int line) {
+ this.line = line;
+ }
+
+ public int getFieldIndex() {
+ return fieldIndex;
+ }
+
+ public void setFieldIndex(int fieldIndex) {
+ this.fieldIndex = fieldIndex;
+ }
+
+ public Object getCurrentValue() {
+ return currentValue;
+ }
+
+ public void setCurrentValue(Object currentValue) {
+ this.currentValue = currentValue;
+ }
+
+ public Object getNewValue() {
+ return newValue;
+ }
+
+ public void setNewValue(Object newValue) {
+ this.newValue = newValue;
+ }
+
+ @Override
+ public void doCommand(Project project) throws CoserBusinessException {
+
+ }
+
+ @Override
+ public void undoCommand(Project project) throws CoserBusinessException {
+
+ }
+
+ @Override
+ public String toString() {
+ String toString = "Modify field ";
+ switch (category) {
+ case CATCH:
+ toString += Catch.EN_HEADERS[fieldIndex];
+ break;
+ case HAUL:
+ toString += Haul.EN_HEADERS[fieldIndex];
+ break;
+ case LENGTH:
+ toString += Length.EN_HEADERS[fieldIndex];
+ break;
+ case STRATA:
+ toString += Strata.EN_HEADERS[fieldIndex];
+ break;
+ }
+ toString += " on line " + line;
+ return toString;
+ }
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java (rev 0)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,112 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.services;
+
+import java.util.ListIterator;
+import java.util.UUID;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import fr.ifremer.coser.CoserBusinessConfig;
+import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.command.Command;
+
+/**
+ * Command service.
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class CommandService {
+
+ private static final Log log = LogFactory.getLog(CommandService.class);
+
+ protected CoserBusinessConfig config;
+
+ public CommandService(CoserBusinessConfig config) {
+ this.config = config;
+ }
+
+ /**
+ * Generate new unique command UUID.
+ *
+ * @return unique command uuid
+ */
+ public String getUniqueCommandUUID() {
+ return UUID.randomUUID().toString();
+ }
+
+ /**
+ * Perform command on project. Save action on project history file.
+ *
+ * @param command command to perform
+ * @param project project
+ * @throws CoserBusinessException
+ */
+ public void doAction(Command command, Project project) throws CoserBusinessException {
+ if (log.isDebugEnabled()) {
+ log.debug("Do action " + command);
+ }
+
+ // si la commande n'a pas de UUID
+ if (command.getCommandUUID() == null) {
+ command.setCommandUUID(getUniqueCommandUUID());
+ }
+
+ command.doCommand(project);
+ project.getHistoryCommand().add(command);
+ }
+
+ /**
+ * Undo last command on project.
+ *
+ * @param project project
+ * @throws CoserBusinessException
+ */
+ public void undoAction(Project project) throws CoserBusinessException {
+
+ ListIterator<Command> itCommand = project.getHistoryCommand().listIterator(project.getHistoryCommand().size());
+
+ String lastUUID = null;
+ while (itCommand.hasPrevious()) {
+ Command command = itCommand.previous();
+
+ if (lastUUID != null && !lastUUID.equals(command.getCommandUUID())) {
+ break;
+ }
+ else {
+ command.undoCommand(project);
+ lastUUID = command.getCommandUUID();
+ itCommand.remove();
+ }
+ }
+ }
+}
Property changes on: trunk/coser-business/src/main/java/fr/ifremer/coser/services/CommandService.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -88,7 +88,7 @@
* @return project
* @throws CoserBusinessException
*/
- public Project loadCSVFile(Project project, Category category, File file, boolean originalLoading) throws CoserBusinessException {
+ public DataStorage loadCSVFile(Project project, Category category, File file, boolean originalLoading) throws CoserBusinessException {
DataStorage content = new MemoryListStorage();
@@ -127,8 +127,6 @@
content.add(line);
}
}
-
- addProjectContent(project, category, content);
} catch (FileNotFoundException ex) {
throw new CoserBusinessException("Can't read file", ex);
} catch (IOException ex) {
@@ -139,39 +137,10 @@
IOUtils.closeQuietly(reader);
}
- return project;
+ return content;
}
/**
- * Set content into project depending on category type.
- *
- * @param project project
- * @param category category
- * @param content content to set
- */
- protected void addProjectContent(Project project, Category category,
- DataStorage content) {
-
- switch (category) {
- case CATCH:
- project.setCatch(content);
- break;
- case HAUL:
- project.setHaul(content);
- break;
- case LENGTH:
- project.setLength(content);
- break;
- case STRATA:
- project.setStrata(content);
- break;
- case REFTAX_SPECIES:
- project.setRefTaxSpecies(content);
- break;
- }
- }
-
- /**
* Check csv file header names and order depending on file category.
*
* @param category
@@ -223,32 +192,43 @@
}
/**
- * Store project category data in specified file as csv.
+ * Get empty storage for category (filled with just header)
*
- * @param project project containing data
- * @param category category to save
- * @param file file to save to
- * @throws CoserBusinessException
+ * @param project project
+ * @param category category
+ * @return initialized storage
*/
- public void storeData(Project project, Category category, File file) throws CoserBusinessException {
+ public DataStorage getEmptyStorage(Project project, Category category) {
- // get project category content
- DataStorage content = null;
+ DataStorage dataStorage = new MemoryListStorage();
switch (category) {
case CATCH:
- content = project.getCatch();
+ dataStorage.add(Catch.EN_HEADERS);
break;
case HAUL:
- content = project.getHaul();
+ dataStorage.add(Haul.EN_HEADERS);
break;
case LENGTH:
- content = project.getLength();
+ dataStorage.add(Length.EN_HEADERS);
break;
case STRATA:
- content = project.getStrata();
+ dataStorage.add(Strata.EN_HEADERS);
break;
}
+ return dataStorage;
+ }
+
+ /**
+ * Store project category data in specified file as csv.
+ *
+ * @param project project containing data
+ * @param content content to save
+ * @param file file to save to
+ * @throws CoserBusinessException
+ */
+ public void storeData(Project project, DataStorage content, File file) throws CoserBusinessException {
+
// save content
Writer writer = null;
CSVWriter csvWriter = null;
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -50,6 +50,10 @@
import fr.ifremer.coser.bean.Haul;
import fr.ifremer.coser.bean.Project;
import fr.ifremer.coser.bean.Specy;
+import fr.ifremer.coser.command.Command;
+import fr.ifremer.coser.command.DeleteLineCommand;
+import fr.ifremer.coser.command.MergeSpeciesCommand;
+import fr.ifremer.coser.storage.DataStorage;
/**
* Service business method relative to project.
@@ -67,10 +71,13 @@
protected CoserBusinessConfig config;
protected ImportService importService;
+
+ protected CommandService commandService;
public ProjectService(CoserBusinessConfig config) {
this.config = config;
importService = new ImportService(config);
+ commandService = new CommandService(config);
}
/**
@@ -97,7 +104,7 @@
* @throws CoserBusinessException
*/
public Project loadProject(String projectName) throws CoserBusinessException {
-
+
// check project existence
File projectsDirectory = config.getProjectsDirectory();
File projectDirectory = new File(projectsDirectory, projectName);
@@ -112,15 +119,14 @@
int fileLoaded = 0;
for (Category category : Category.values()) {
- // les fichiers de data sont dans le dossier "original"
+ // seulement les category de données ici
if (category.isDataCategory()) {
- File inputFile = new File(controlDirectory,
- category.getStorageFileName() +
- CoserConstants.STORAGE_CONTROL_SUFFIX +
- CoserConstants.STORAGE_CSV_EXTENSION);
+ File inputFile = new File(controlDirectory, category.getStorageFileName() +
+ CoserConstants.STORAGE_CONTROL_SUFFIX + CoserConstants.STORAGE_CSV_EXTENSION);
if (inputFile.isFile()) {
- project = importService.loadCSVFile(project, category, inputFile, false);
+ DataStorage dataStorage = importService.loadCSVFile(project, category, inputFile, false);
+ addProjectContent(project, category, dataStorage, false);
fileLoaded++;
}
else {
@@ -128,6 +134,21 @@
log.debug("Can't find file " + inputFile);
}
}
+
+ // load deleted file if exists
+ inputFile = new File(controlDirectory, category.getStorageFileName() +
+ CoserConstants.STORAGE_DELECTED_SUFFIX + CoserConstants.STORAGE_CSV_EXTENSION);
+ DataStorage dataStorage = null;
+ if (inputFile.isFile()) {
+ dataStorage = importService.loadCSVFile(project, category, inputFile, false);
+ }
+ else {
+ dataStorage = importService.getEmptyStorage(project, category);
+ if (log.isDebugEnabled()) {
+ log.debug("Can't find file " + inputFile);
+ }
+ }
+ addProjectContent(project, category, dataStorage, true);
}
}
@@ -139,15 +160,21 @@
if (category.isDataCategory()) {
File storageDataFile = new File(originalDirectory,
category.getStorageFileName() + CoserConstants.STORAGE_CSV_EXTENSION);
-
+
+ // main data
if (storageDataFile.isFile()) {
- project = importService.loadCSVFile(project, category, storageDataFile, true);
+ DataStorage dataStorage = importService.loadCSVFile(project, category, storageDataFile, true);
+ addProjectContent(project, category, dataStorage, false);
}
else {
// si on arrive ici et qu'un fichier original
// n'existe pas, c'est grave
throw new CoserBusinessException(_("Missing file %s", storageDataFile));
}
+
+ // deleted data
+ DataStorage dataStorage = importService.getEmptyStorage(project, category);
+ addProjectContent(project, category, dataStorage, true);
}
}
}
@@ -158,7 +185,8 @@
CoserConstants.STORAGE_CSV_EXTENSION);
if (inputFile.isFile()) {
- project = importService.loadCSVFile(project, Category.REFTAX_SPECIES, inputFile, true);
+ DataStorage dataStorage = importService.loadCSVFile(project, Category.REFTAX_SPECIES, inputFile, true);
+ addProjectContent(project, Category.REFTAX_SPECIES, dataStorage, false);
}
else {
// si on arrive ici et qu'un fichier original
@@ -166,10 +194,63 @@
throw new CoserBusinessException(_("Missing file %s", inputFile));
}
+ // init des autres resources du projet
+ project.setHistoryCommand(new ArrayList<Command>());
+
return project;
}
/**
+ * Set content into project depending on category type.
+ *
+ * @param project project
+ * @param category category
+ * @param content content to set
+ * @param deletedContent if content means deleted objects for {@code category}
+ */
+ protected void addProjectContent(Project project, Category category,
+ DataStorage content, boolean deletedContent) {
+
+ switch (category) {
+ case CATCH:
+ if (!deletedContent) {
+ project.setCatch(content);
+ }
+ else {
+ project.setDeletedCatch(content);
+ }
+ break;
+ case HAUL:
+ if (!deletedContent) {
+ project.setHaul(content);
+ }
+ else {
+ project.setDeletedHaul(content);
+ }
+ break;
+ case LENGTH:
+ if (!deletedContent) {
+ project.setLength(content);
+ }
+ else {
+ project.setDeletedLength(content);
+ }
+ break;
+ case STRATA:
+ if (!deletedContent) {
+ project.setStrata(content);
+ }
+ else {
+ project.setDeletedStrata(content);
+ }
+ break;
+ case REFTAX_SPECIES:
+ project.setRefTaxSpecies(content);
+ break;
+ }
+ }
+
+ /**
* Create new project.
*
* Do (ordered):
@@ -202,7 +283,14 @@
for (Map.Entry<Category, File> categoryAndFile : categoriesAndFiles.entrySet()) {
Category category = categoryAndFile.getKey();
File dataFile = categoryAndFile.getValue();
- project = importService.loadCSVFile(project, category, dataFile, true);
+ DataStorage dataStorage = importService.loadCSVFile(project, category, dataFile, true);
+ addProjectContent(project, category, dataStorage, false);
+
+ if (category.isDataCategory()) {
+ // deleted data
+ DataStorage dataStorage2 = importService.getEmptyStorage(project, category);
+ addProjectContent(project, category, dataStorage2, true);
+ }
}
// create new project directory
@@ -242,6 +330,9 @@
}
}
+ // init des autres resources du projet
+ project.setHistoryCommand(new ArrayList<Command>());
+
return project;
}
@@ -263,6 +354,8 @@
controlDirectory.mkdirs();
for (Category category : Category.values()) {
if (category.isDataCategory()) {
+
+ // save main content
File controlFile = new File(controlDirectory,
category.getStorageFileName() +
CoserConstants.STORAGE_CONTROL_SUFFIX +
@@ -270,12 +363,77 @@
if (log.isDebugEnabled()) {
log.debug("Saving control file : " + controlFile);
}
- importService.storeData(project, category, controlFile);
+ DataStorage content = getProjectContent(project, category, false);
+ importService.storeData(project, content, controlFile);
+
+ // save deleted content (if needed)
+ DataStorage contentDeleted = getProjectContent(project, category, true);
+ // if more content than header
+ if (contentDeleted.size() > 1) {
+ File deletedDataFile = new File(controlDirectory,
+ category.getStorageFileName() +
+ CoserConstants.STORAGE_DELECTED_SUFFIX +
+ CoserConstants.STORAGE_CSV_EXTENSION);
+ importService.storeData(project, contentDeleted, deletedDataFile);
+ }
}
}
}
/**
+ * Set content into project depending on category type.
+ *
+ * @param project project
+ * @param category category
+ * @param content content to set
+ * @param deletedContent if content means deleted objects for {@code category}
+ */
+ protected DataStorage getProjectContent(Project project, Category category, boolean deletedContent) {
+
+ DataStorage content = null;
+
+ switch (category) {
+ case CATCH:
+ if (!deletedContent) {
+ content = project.getCatch();
+ }
+ else {
+ content = project.getDeletedCatch();
+ }
+ break;
+ case HAUL:
+ if (!deletedContent) {
+ content = project.getHaul();
+ }
+ else {
+ content = project.getDeletedHaul();
+ }
+ break;
+ case LENGTH:
+ if (!deletedContent) {
+ content = project.getLength();
+ }
+ else {
+ content = project.getDeletedLength();
+ }
+ break;
+ case STRATA:
+ if (!deletedContent) {
+ content = project.getStrata();
+ }
+ else {
+ content = project.getDeletedStrata();
+ }
+ break;
+ case REFTAX_SPECIES:
+ project.setRefTaxSpecies(content);
+ break;
+ }
+
+ return content;
+ }
+
+ /**
* Save project selection.
*
* @param project project to save selection
@@ -304,7 +462,9 @@
if (log.isDebugEnabled()) {
log.debug("Saving selection file : " + controlFile);
}
- importService.storeData(project, category, controlFile);
+
+ DataStorage content = getProjectContent(project, category, false);
+ importService.storeData(project, content, controlFile);
}
}
@@ -457,131 +617,28 @@
throw new CoserBusinessException(_("Specy %s doesn't exist in referential", newSpecyName));
}
- project = mergeCatch(project, newSpecyName, speciesNames);
- project = mergeLength(project, newSpecyName, speciesNames);
- return project;
- }
+ MergeSpeciesCommand command = new MergeSpeciesCommand();
+ command.setNewSpecyName(newSpecyName);
+ command.setSpeciesNames(speciesNames);
+ commandService.doAction(command, project);
- /**
- * Fusion d'espece dans les données de captures.
- *
- * @param project project
- * @param newSpecyName new specy name (after merge)
- * @param speciesNames species name to merge
- * @return project
- */
- protected Project mergeLength(Project project, String newSpecyName,
- String... speciesNames) {
return project;
}
/**
- * Fusion d'especes dans les données de taille.
+ * Supprime une données via son index.
*
* @param project project
- * @param newSpecyName new specy name (after merge)
- * @param speciesNames species name to merge
- * @return project
+ * @param category category
+ * @param index index to delete
+ * @throws CoserBusinessException
*/
- protected Project mergeCatch(Project project, String newSpecyName,
- String... speciesNames) {
-
- // "Campagne","Annee","Trait","Espece","Nombre","Poids"
+ public void deleteData(Project project, Category category, String index) throws CoserBusinessException {
- // regroupement par campagne/annee/trait
- String lastCampagne = null;
- String lastAnnee = null;
- String lastTraits = null;
- String[] tupleFound = null;
- int tupleIndex = -1;
-
- // parcours des elements
- Iterator<String[]> itTuple = project.getCatch().iterator();
- itTuple.next(); // skip header
- int index = 1; // skip header
- while (itTuple.hasNext()) {
- String[] tuple = itTuple.next();
-
- // si les valeurs servant au bornes de regroupement
- // on changer, on reset les données du merge
- String currentCampagne = tuple[Catch.INDEX_SURVEY];
- String currentAnnee = tuple[Catch.INDEX_YEAR];
- String currentTraits = tuple[Catch.INDEX_HAUL];
- if (!currentCampagne.equals(lastCampagne) ||
- !currentAnnee.equals(lastAnnee) ||
- !currentTraits.equals(lastTraits)) {
-
- tupleFound = null;
- lastCampagne = currentCampagne;
- lastAnnee = currentAnnee;
- lastTraits = currentTraits;
- }
-
- // test si l'espece en cours fait partie de celle a merger
- String species = tuple[Catch.INDEX_SPECIES];
- boolean specyFound = false;
- for (String specy : speciesNames) {
- if (specy.equals(species)) {
- specyFound = true;
- }
- }
-
- // si l'espece est a merger, on se souvient du tuple
- // principale a merge, ou on merge avec le tuple
- // principal si on a deja un tuple principal
- if (specyFound) {
- if (tupleFound == null) {
- tupleFound = tuple;
- tupleFound[3] = newSpecyName;
- tupleIndex = index;
- }
- else {
- tupleFound = mergeCatches(tupleFound, tuple);
- // et on supprime le tuple
- // qui a ete merge
- itTuple.remove();
- // bidouille le remove decalle les index suivants
- index--;
- }
-
- project.getCatch().set(tupleIndex, tupleFound);
- }
-
- index++;
- }
-
- return project;
+ // create new delete action
+ DeleteLineCommand command = new DeleteLineCommand();
+ command.setCategory(category);
+ command.setLineIndex(index);
+ commandService.doAction(command, project);
}
-
- /**
- * Merge deux lines des catch.
- *
- * Le resultat est mergé dans {@code tuple1} et retourné.
- *
- * Somme les "Nombre" et "Poids"
- *
- * @param tuple1 tuple1
- * @param tuple2 tuple2
- * @return tuple1
- */
- protected String[] mergeCatches(String[] tuple1, String[] tuple2) {
-
- // "Campagne","Annee","Trait","Espece","Nombre","Poids"
-
- try {
- double nombre1 = Double.parseDouble(tuple1[Catch.INDEX_NUMBER]);
- double nombre2 = Double.parseDouble(tuple2[Catch.INDEX_NUMBER]);
- double poids1 = Double.parseDouble(tuple1[Catch.INDEX_WEIGHT]);
- double poids2 = Double.parseDouble(tuple2[Catch.INDEX_WEIGHT]);
-
- tuple1[Catch.INDEX_NUMBER] = String.valueOf(nombre1 + nombre2);
- tuple1[Catch.INDEX_WEIGHT] = String.valueOf(poids1 + poids2);
- }
- catch (NumberFormatException ex) {
- if (log.isWarnEnabled()) {
- log.warn("Can't convert data as double for merge", ex);
- }
- }
- return tuple1;
- }
}
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/storage/DataStorage.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/storage/DataStorage.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/storage/DataStorage.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -47,6 +47,14 @@
* @param data data to add
*/
void add(String[] data);
+
+ /**
+ * Add new data into storage.
+ *
+ * @param index index to insert data
+ * @param data data to add
+ */
+ void add(int index, String[] data);
/**
* Get data at specified index.
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryListStorage.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryListStorage.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryListStorage.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -109,6 +109,16 @@
String stringData = arrayToString(data);
internalStorage.add(stringData);
}
+
+ /*
+ * @see fr.ifremer.coser.storage.DataStorage#addData(java.lang.String[])
+ */
+ @Override
+ public void add(int index, String[] data) {
+
+ String stringData = arrayToString(data);
+ internalStorage.add(index, stringData);
+ }
protected String arrayToString(String[] data) {
StringWriter writer = new StringWriter();
@@ -164,4 +174,9 @@
String[] oldArray = stringToArray(old);
return oldArray;
}
+
+ @Override
+ public String toString() {
+ return internalStorage.toString();
+ }
}
Added: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java (rev 0)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,114 @@
+/*
+ * #%L
+ *
+ *
+ * $Id$
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU General Lesser Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/lgpl-3.0.html>.
+ * #L%
+ */
+
+package fr.ifremer.coser.services;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import fr.ifremer.coser.CoserBusinessException;
+import fr.ifremer.coser.CoserConstants.Category;
+import fr.ifremer.coser.bean.Project;
+import fr.ifremer.coser.command.DeleteLineCommand;
+
+/**
+ * CommandService tests
+ *
+ * @author chatellier
+ * @version $Revision$
+ *
+ * Last update : $Date$
+ * By : $Author$
+ */
+public class CommandServiceTest extends CoserTestAbstract {
+
+ protected CommandService commandService;
+ protected ProjectService projectService;
+
+ @Before
+ public void initService() {
+ projectService = new ProjectService(config);
+ commandService = new CommandService(config);
+ }
+
+ /**
+ * Test la suppression correcte d'une ligne.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test
+ public void testDeleteLine() throws CoserBusinessException {
+ Project project = createTestProject(projectService);
+ Assert.assertEquals(29, project.getLength().size());
+
+ DeleteLineCommand command = new DeleteLineCommand();
+ command.setLineIndex("2");
+ command.setCategory(Category.LENGTH);
+
+ commandService.doAction(command, project);
+ Assert.assertEquals(28, project.getLength().size());
+ }
+
+ /**
+ * Test la suppression incorrecte d'une ligne.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test(expected=CoserBusinessException.class)
+ public void testDeleteLineWrong() throws CoserBusinessException {
+ Project project = createTestProject(projectService);
+ DeleteLineCommand command = new DeleteLineCommand();
+ command.setLineIndex("2");
+ command.setCategory(Category.LENGTH);
+ commandService.doAction(command, project);
+ commandService.doAction(command, project);
+ }
+
+ /**
+ * Test la suppression correcte d'une ligne puis le rétablissement
+ * de la ligne supprimée.
+ *
+ * @throws CoserBusinessException
+ */
+ @Test
+ public void testDeleteLineUndo() throws CoserBusinessException {
+ Project project = createTestProject(projectService);
+ Assert.assertEquals("3", project.getLength().get(4)[0]);
+
+ DeleteLineCommand command = new DeleteLineCommand();
+ command.setLineIndex("3");
+ command.setCategory(Category.LENGTH);
+
+ commandService.doAction(command, project);
+ System.out.println(project.getLength());
+ Assert.assertEquals("4", project.getLength().get(4)[0]);
+ commandService.undoAction(project);
+ System.out.println("\n" + project.getLength());
+ Assert.assertEquals("3", project.getLength().get(4)[0]);
+
+ }
+}
Property changes on: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CommandServiceTest.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/CoserTestAbstract.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -31,6 +31,8 @@
import java.util.Map;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
@@ -50,6 +52,8 @@
*/
public abstract class CoserTestAbstract {
+ private static final Log log = LogFactory.getLog(CoserTestAbstract.class);
+
protected static CoserBusinessConfig config;
protected static File testDirectory;
@@ -67,7 +71,7 @@
@AfterClass
public static void cleanDirectory() throws IOException {
- FileUtils.deleteDirectory(testDirectory);
+ //FileUtils.deleteDirectory(testDirectory);
}
protected Project createTestProject(ProjectService service) throws CoserBusinessException {
@@ -89,6 +93,10 @@
categoriesAndFile.put(Category.REFTAX_SPECIES, testReftax);
project = service.createProject(project, categoriesAndFile);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Created project : " + project.getName());
+ }
return project;
}
}
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -103,15 +103,12 @@
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
- Object result = null;
+ Object result = getDataAt(rowIndex)[columnIndex];
- if (columnIndex == 0) {
- result = rowIndex + 1;
- }
- else {
- result = data.get(rowIndex + 1)[columnIndex];
- }
-
return result;
}
+
+ public String[] getDataAt(int rowIndex) {
+ return data.get(rowIndex + 1);
+ }
}
Added: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx (rev 0)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx 2010-10-26 13:59:58 UTC (rev 103)
@@ -0,0 +1,53 @@
+<!--
+ #%L
+ Coser :: UI
+
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
+ %%
+ 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%
+ -->
+<JDialog title="coser.ui.control.replace.title" modal="true">
+ <ControlHandler id="handler" javaBean="null" />
+ <Table>
+ <row>
+ <cell fill="horizontal">
+ <JLabel text="coser.ui.control.replace.find" />
+ </cell>
+ <cell weightx="1" fill="horizontal">
+ <JTextField id="replaceFindField" />
+ </cell>
+ </row>
+ <row>
+ <cell fill="horizontal">
+ <JLabel text="coser.ui.control.replace.replace" />
+ </cell>
+ <cell weightx="2" weighty="1" fill="both" columns="3">
+ <JTextField id="replaceReplaceField" />
+ </cell>
+ </row>
+ <row>
+ <cell columns="4" anchor="east" insets="0">
+ <JPanel>
+ <JButton text="coser.ui.common.cancel" onActionPerformed="dispose()"/>
+ <JButton text="coser.ui.common.valid" onActionPerformed="getHandler().performFindAndReplace(this)" />
+ </JPanel>
+ </cell>
+ </row>
+ </Table>
+</JDialog>
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-10-26 13:59:58 UTC (rev 103)
@@ -30,13 +30,17 @@
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.swing.JLabel;
+import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JViewport;
@@ -44,6 +48,7 @@
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.TableColumnModel;
import jaxx.runtime.SwingUtil;
import jaxx.runtime.validator.swing.SwingValidator;
@@ -91,6 +96,51 @@
}
/**
+ * Affiche le menu contextuel de la table qui contient les données.
+ *
+ * @param view view
+ * @param event mouse event
+ */
+ public void showDataTableContextMenu(final ControlView view, MouseEvent event) {
+
+ // clic contextuel
+ if (event.getButton() == MouseEvent.BUTTON3) {
+ int[] dataSelectedRows = view.getControlDataTable().getSelectedRows();
+ int columnIndex = view.getControlDataTable().getColumnModel().getColumnIndexAtX(event.getX());
+
+ // plusieurs lignes selectionnées et pas la premiere colonne (Line index)
+ if (dataSelectedRows.length > 0 && columnIndex > 0) {
+ String columnName = view.getControlDataTable().getColumnName(columnIndex);
+ JPopupMenu popupMenu = new JPopupMenu(_("coser.ui.control.dataMenuLabel"));
+ JMenuItem replaceMenu = new JMenuItem(_("coser.ui.control.dataMenuReplace", columnName));
+ replaceMenu.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ ControlFindReplaceDialog viewDialog = new ControlFindReplaceDialog(view);
+ viewDialog.setLocationRelativeTo(view);
+ viewDialog.setVisible(true);
+ }
+ });
+ popupMenu.add(replaceMenu);
+ popupMenu.show(view.getControlDataTable(), event.getX(), event.getY());
+ }
+ }
+ }
+
+ /**
+ * Perform find and replace.
+ *
+ * @param view parent view
+ */
+ public void performFindAndReplace(ControlFindReplaceDialog view) {
+ String find = view.getReplaceFindField().getText();
+ String replace = view.getReplaceReplaceField().getText();
+ if (log.isWarnEnabled()) {
+ log.warn("Perform : " + find + " replace with " + replace);
+ }
+ }
+
+ /**
* Check project.
*
* @param view
@@ -323,7 +373,16 @@
validator.installUIs();
validator.reloadBean();
+
+ view.getControlDataValidButton().setEnabled(true);
+ view.getControlDataCancelButton().setEnabled(true);
+ view.getControlDataDeleteButton().setEnabled(true);
}
+ else {
+ view.getControlDataValidButton().setEnabled(false);
+ view.getControlDataCancelButton().setEnabled(false);
+ view.getControlDataDeleteButton().setEnabled(false);
+ }
view.getEditionScrollPane().repaint();
view.getEditionScrollPane().validate();
}
@@ -423,33 +482,25 @@
public void deleteData(ControlView view) {
int response = JOptionPane.showConfirmDialog(view, _("coser.ui.control.confirmDeletionMessage"),
_("coser.ui.control.confirmDeletionTitle"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
-
+
if (response == JOptionPane.YES_OPTION) {
Project project = view.getContextValue(Project.class);
+ ProjectService projectService = view.getContextValue(ProjectService.class);
+
+ // get selected row, and selected csv line index
JTable controlDataTable = view.getControlDataTable();
ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel();
int selectedLine = controlDataTable.getSelectedRow();
Category category = (Category)view.getCategoryComboBox().getSelectedItem();
-
- // get data
- switch (category) {
- case CATCH:
- project.getCatch().remove(selectedLine + 1); // csv header
+ String[] data = model.getDataAt(selectedLine);
+
+ try {
+ projectService.deleteData(project, category, data[AbstractDataEntity.INDEX_LINE]);
model.fireTableRowsDeleted(selectedLine, selectedLine);
- break;
- case HAUL:
- project.getHaul().remove(selectedLine + 1); // csv header
- model.fireTableRowsDeleted(selectedLine, selectedLine);
- break;
- case LENGTH:
- project.getLength().remove(selectedLine + 1); // csv header
- model.fireTableRowsDeleted(selectedLine, selectedLine);
- break;
- case STRATA:
- project.getCatch().remove(selectedLine + 1); // csv header
- model.fireTableRowsDeleted(selectedLine, selectedLine);
- break;
}
+ catch (CoserBusinessException ex) {
+ throw new CoserException("Can't delete data", ex);
+ }
}
}
}
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2010-10-26 13:59:58 UTC (rev 103)
@@ -46,7 +46,8 @@
<row>
<cell fill="both" weightx="1" weighty="2" columns="2">
<JScrollPane>
- <JTable id='controlDataTable' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this)}" />
+ <JTable id='controlDataTable' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this)}"
+ onMouseClicked="getHandler().showDataTableContextMenu(this, event)"/>
<ListSelectionModel id="controlDataTableSelectionModel" javaBean="controlDataTable.getSelectionModel()"
onValueChanged="getHandler().controlDataTableSelectionChanged(this, event)" />
</JScrollPane>
@@ -63,16 +64,19 @@
</row>
<row>
<cell weightx="1" anchor="east">
- <JButton text="coser.ui.common.valid"
- onActionPerformed="getHandler().validDataModification(this)" />
+ <JButton id="controlDataValidButton" text="coser.ui.common.valid"
+ onActionPerformed="getHandler().validDataModification(this)"
+ enabled="false" />
</cell>
<cell>
- <JButton text="coser.ui.common.cancel"
- onActionPerformed="getHandler().cancelDataModification(this)" />
+ <JButton id="controlDataCancelButton" text="coser.ui.common.cancel"
+ onActionPerformed="getHandler().cancelDataModification(this)"
+ enabled="false" />
</cell>
<cell>
- <JButton text="coser.ui.common.delete"
- onActionPerformed="getHandler().deleteData(this)" />
+ <JButton id="controlDataDeleteButton" text="coser.ui.common.delete"
+ onActionPerformed="getHandler().deleteData(this)"
+ enabled="false" />
</cell>
</row>
</Table>
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionListsView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionListsView.jaxx 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionListsView.jaxx 2010-10-26 13:59:58 UTC (rev 103)
@@ -57,7 +57,7 @@
<row>
<cell />
<cell />
- <cell fill="horizontal" insets="0" columns="2">
+ <cell fill="horizontal" insets="0" columns="2" anchor="west">
<JPanel>
<JLabel text="coser.ui.selection.filter.occurrence" />
<JTextField id="selectionFilterOccurrenceField" columns="3" text="5" />
@@ -66,7 +66,12 @@
<JButton text="coser.ui.selection.filter.filter" />
</JPanel>
</cell>
- <cell columns="4"/>
+ <cell columns="2">
+ <JButton icon="chart_bar.png" />
+ </cell>
+ <cell columns="2">
+ <JButton icon="chart_bar.png" />
+ </cell>
</row>
<row>
<cell weighty="1" weightx="1" fill="both" columns="2">
Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionResultView.jaxx
===================================================================
--- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionResultView.jaxx 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/selection/SelectionResultView.jaxx 2010-10-26 13:59:58 UTC (rev 103)
@@ -24,12 +24,44 @@
-->
<Table>
<SelectionHandler id="handler" javaBean="null" />
-
<row>
- <cell weightx="1" weighty="1" fill="both">
- <JScrollPane>
- <JTable model="{new fr.ifremer.coser.ui.result.ResultTableModel()}"/>
- </JScrollPane>
+ <cell weightx="1" fill="horizontal">
+ <Table border='{BorderFactory.createTitledBorder(_("coser.ui.result.extractDataTitle"))}'>
+ <row>
+ <cell>
+ <JLabel text="coser.ui.result.extractDataLabel" />
+ </cell>
+ <cell weightx="1" fill="horizontal">
+ <JTextField id="resultExtractDataField" />
+ </cell>
+ <cell>
+ <JButton text="coser.ui.common.selectFile" />
+ </cell>
+ </row>
+ <row>
+ <cell columns="3">
+ <JButton text="coser.ui.result.extractDataButton" />
+ </cell>
+ </row>
+ </Table>
</cell>
</row>
+ <row>
+ <cell weightx="1" weighty="2" fill="both">
+ <Table border='{BorderFactory.createTitledBorder(_("coser.ui.result.availableDataTitle"))}'>
+ <row>
+ <cell weightx="1" weighty="1" fill="both">
+ <JScrollPane>
+ <JTable model="{new fr.ifremer.coser.ui.result.ResultTableModel()}"/>
+ </JScrollPane>
+ </cell>
+ </row>
+ <row>
+ <cell>
+
+ </cell>
+ </row>
+ </Table>
+ </cell>
+ </row>
</Table>
Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties
===================================================================
--- trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/resources/i18n/coser-ui-en_GB.properties 2010-10-26 13:59:58 UTC (rev 103)
@@ -1,7 +1,3 @@
-Name=
-Selection\ 1=
-Selection\ 2=
-Selection\ 3=
coser.config.application.version.description=Application's version
coser.config.category.main=
coser.config.category.main.description=
@@ -13,7 +9,7 @@
coser.config.reference.zones.description=
coser.config.support.email.description=Support email address
coser.config.validator.directory.description=
-coser.ui.common.cancel=
+coser.ui.common.cancel=Cancel
coser.ui.common.comment=Comment
coser.ui.common.delete=
coser.ui.common.selectAll=
@@ -23,10 +19,15 @@
coser.ui.config.title=
coser.ui.control.confirmDeletionMessage=
coser.ui.control.confirmDeletionTitle=
+coser.ui.control.dataMenuLabel=
+coser.ui.control.dataMenuReplace=
coser.ui.control.global.field=
coser.ui.control.global.level=
coser.ui.control.global.message=
coser.ui.control.graphtitle=Graph
+coser.ui.control.replace.find=
+coser.ui.control.replace.replace=
+coser.ui.control.replace.title=
coser.ui.control.save=
coser.ui.error.htmlmessage=An error occurs \: %s
coser.ui.error.title=Global application error
@@ -62,6 +63,9 @@
coser.ui.project.traitsFile=Traits file \:
coser.ui.project.useCustomReferenceSpeciesFile=
coser.ui.project.usedReferenceSpeciesFile=
+coser.ui.result.extractDataButton=
+coser.ui.result.extractDataLabel=
+coser.ui.result.extractDataTitle=
coser.ui.selection.allSpecies=All species
coser.ui.selection.details.beginDate=
coser.ui.selection.details.createSelection=
@@ -74,9 +78,9 @@
coser.ui.selection.details.species=
coser.ui.selection.details.technicalComment=
coser.ui.selection.details.zone=
-coser.ui.selection.filter.density=X\:
+coser.ui.selection.filter.density=Density \:
coser.ui.selection.filter.filter=Filter
-coser.ui.selection.filter.occurrence=Y\:
+coser.ui.selection.filter.occurrence=Occurrence \:
coser.ui.selection.fusion.comment=
coser.ui.selection.fusion.description=
coser.ui.selection.fusion.name=
Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties
===================================================================
--- trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties 2010-10-26 08:53:49 UTC (rev 102)
+++ trunk/coser-ui/src/main/resources/i18n/coser-ui-fr_FR.properties 2010-10-26 13:59:58 UTC (rev 103)
@@ -1,7 +1,3 @@
-Name=
-Selection\ 1=
-Selection\ 2=
-Selection\ 3=
coser.config.application.version.description=Version de l'application
coser.config.category.main=Coser
coser.config.category.main.description=Configuration principale
@@ -19,12 +15,17 @@
coser.ui.config.title=Configuration
coser.ui.control.confirmDeletionMessage=\u00CAtes vous s\u00FBr de vouloir supprimer cette donn\u00E9e ?
coser.ui.control.confirmDeletionTitle=Confirmation de suppression
+coser.ui.control.dataMenuLabel=Menu table des donn\u00E9es
+coser.ui.control.dataMenuReplace=Remplacer dans %s
coser.ui.control.global.field=Champ
coser.ui.control.global.level=Type
coser.ui.control.global.message=Message
coser.ui.control.graphtitle=Graphique
+coser.ui.control.replace.find=Chercher \:
+coser.ui.control.replace.replace=Remplacer \:
+coser.ui.control.replace.title=Chercher et remplacer
coser.ui.control.save=Sauvegarder
-coser.ui.error.htmlmessage=Une erreur s'est produite\u2009\:\u2009%s
+coser.ui.error.htmlmessage=Une erreur s'est produite \: %s
coser.ui.error.title=Erreur globale
coser.ui.mainframe.menu.configuration=Configuration
coser.ui.mainframe.menu.file=Fichier
@@ -42,38 +43,42 @@
coser.ui.mainframe.menu.window.selection=S\u00E9lection
coser.ui.mainframe.menu.window.validation=Validation
coser.ui.mainview.title=Contr\u00F4le et S\u00E9lection RSufi
-coser.ui.project.captureFile=Fichier de captures\u2009\:
+coser.ui.project.captureFile=Fichier de captures \:
coser.ui.project.createProject=Cr\u00E9er le projet
coser.ui.project.creationError=Erreur de cr\u00E9ation
-coser.ui.project.customReferenceSpeciesFile=Nouveau fichier de r\u00E9f\u00E9rence\u2009\:
-coser.ui.project.lengthFile=Fichiers des tailles\u2009\:
+coser.ui.project.customReferenceSpeciesFile=Nouveau fichier de r\u00E9f\u00E9rence \:
+coser.ui.project.lengthFile=Fichiers des tailles \:
coser.ui.project.newProject=Nouveau projet
coser.ui.project.openError=Erreur d'ouverture
coser.ui.project.openProject=Ouvrir
coser.ui.project.openProjectTitle=Ouvrir un projet existant
-coser.ui.project.project=Projet\u2009\:
-coser.ui.project.projectname=Nom du projet\u2009\:
-coser.ui.project.stratesFile=Fichiers des strates\u2009\:
-coser.ui.project.traitsFile=Fichiers des traits\u2009\:
+coser.ui.project.project=Projet \:
+coser.ui.project.projectname=Nom du projet \:
+coser.ui.project.stratesFile=Fichiers des strates \:
+coser.ui.project.traitsFile=Fichiers des traits \:
coser.ui.project.useCustomReferenceSpeciesFile=Utiliser un autre fichier de r\u00E9f\u00E9rence
-coser.ui.project.usedReferenceSpeciesFile=Fichier de r\u00E9f\u00E9rence utilis\u00E9\u2009\:
+coser.ui.project.usedReferenceSpeciesFile=Fichier de r\u00E9f\u00E9rence utilis\u00E9 \:
+coser.ui.result.availableDataTitle=R\u00E9sultats disponibles \:
+coser.ui.result.extractDataButton=Extraire
+coser.ui.result.extractDataLabel=Dossier d'extraction \:
+coser.ui.result.extractDataTitle=Extraction des donn\u00E9es d'entr\u00E9e de RSufi
coser.ui.selection.allSpecies=Toutes les esp\u00E8ces
-coser.ui.selection.details.beginDate=Date de d\u00E9but\u2009\:
-coser.ui.selection.details.endDate=Date de fin\u2009\:
-coser.ui.selection.details.family=Filtrer par famille\u2009\:
-coser.ui.selection.details.gender=Filtrer par genre\u2009\:
-coser.ui.selection.details.name=Nom de la s\u00E9lection\u2009\:
+coser.ui.selection.details.beginDate=Date de d\u00E9but \:
+coser.ui.selection.details.endDate=Date de fin \:
+coser.ui.selection.details.family=Filtrer par famille \:
+coser.ui.selection.details.gender=Filtrer par genre \:
+coser.ui.selection.details.name=Nom de la s\u00E9lection \:
coser.ui.selection.details.otherComment=Autre commentaire
coser.ui.selection.details.saveSelection=Sauvegarder la s\u00E9lection
-coser.ui.selection.details.species=Esp\u00E8ces\u2009\:
+coser.ui.selection.details.species=Esp\u00E8ces \:
coser.ui.selection.details.technicalComment=Commentaire technique
-coser.ui.selection.details.zone=Zone\u2009\:
-coser.ui.selection.filter.density=Densit\u00E9\u2009\:
+coser.ui.selection.details.zone=Zone \:
+coser.ui.selection.filter.density=Densit\u00E9 \:
coser.ui.selection.filter.filter=Filtrer
-coser.ui.selection.filter.occurrence=Occurence\u2009\:
+coser.ui.selection.filter.occurrence=Occurence \:
coser.ui.selection.fusion.comment=Commentaire
coser.ui.selection.fusion.description=Fusion de deux esp\u00E8ces. Veuillez renseigner un nouveau nom pr\u00E9sent dans le r\u00E9f\u00E9rentiel.
-coser.ui.selection.fusion.name=Nouveau nom\u2009\:
+coser.ui.selection.fusion.name=Nouveau nom \:
coser.ui.selection.fusion.title=Fusion
coser.ui.selection.fusionError=Erreur de fusion
coser.ui.selection.invalidFusionName=Le nom de fusion choisit n'est pas pr\u00E9sent de le r\u00E9f\u00E9rentiel \!
@@ -94,4 +99,4 @@
coser.ui.validators.newValidator=Nouveau validateur
coser.ui.validators.title=Validateurs
coser.ui.validators.valid=Valider
-coser.ui.validators.validators=Validateurs\u2009\:
+coser.ui.validators.validators=Validateurs \:
1
0
r102 - trunk/coser-business/src/main/java/fr/ifremer/coser/services
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
by chatellier@users.labs.libre-entreprise.org 26 Oct '10
26 Oct '10
Author: chatellier
Date: 2010-10-26 08:53:49 +0000 (Tue, 26 Oct 2010)
New Revision: 102
Log:
Use close (closeable) from commons-io 2.0
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-10-25 16:22:54 UTC (rev 101)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ImportService.java 2010-10-26 08:53:49 UTC (rev 102)
@@ -135,13 +135,7 @@
throw new CoserBusinessException("Can't read file", ex);
}
finally {
- if (csvReader != null) {
- try {
- csvReader.close();
- } catch (IOException ex) {
- throw new CoserBusinessException("Can't close file", ex);
- }
- }
+ IOUtils.closeQuietly(csvReader);
IOUtils.closeQuietly(reader);
}
@@ -270,13 +264,7 @@
throw new CoserBusinessException("Can't save data", ex);
}
finally {
- if (csvWriter != null) {
- try {
- csvWriter.close();
- } catch (IOException ex) {
- throw new CoserBusinessException("Can't close file", ex);
- }
- }
+ IOUtils.closeQuietly(csvWriter);
IOUtils.closeQuietly(writer);
}
}
1
0
r101 - in trunk/coser-business/src: main/java/fr/ifremer/coser/validators main/resources/fr/ifremer/coser/bean test/java/fr/ifremer/coser/services
by chatellier@users.labs.libre-entreprise.org 25 Oct '10
by chatellier@users.labs.libre-entreprise.org 25 Oct '10
25 Oct '10
Author: chatellier
Date: 2010-10-25 16:22:54 +0000 (Mon, 25 Oct 2010)
New Revision: 101
Log:
Manage NA as valid double value
Modified:
trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml
trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml
trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java
Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java
===================================================================
--- trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java 2010-10-25 15:44:33 UTC (rev 100)
+++ trunk/coser-business/src/main/java/fr/ifremer/coser/validators/CoserCheckDoubleValidator.java 2010-10-25 16:22:54 UTC (rev 101)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2010 Codelutin, Chatellier Eric
+ * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
@@ -29,7 +29,7 @@
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
/**
- * TODO add comment here.
+ * Validateur de double de coser.
*
* @author chatellier
* @version $Revision$
@@ -39,25 +39,16 @@
*/
public class CoserCheckDoubleValidator extends FieldValidatorSupport {
- protected Double max = null;
- protected Double min = null;
+ protected String notAvailable;
- public void setMax(Double max) {
- this.max = max;
+ public String getNotAvailable() {
+ return notAvailable;
}
- public Double getMax() {
- return max;
+ public void setNotAvailable(String notAvailable) {
+ this.notAvailable = notAvailable;
}
- public void setMin(Double min) {
- this.min = min;
- }
-
- public Double getMin() {
- return min;
- }
-
public void validate(Object object) throws ValidationException {
Object obj = getFieldValue(getFieldName(), object);
String value = (String) obj;
@@ -68,22 +59,16 @@
return;
}
- double doubleValue = 0;
+ // If NA value = object it's ok too
+ if (notAvailable != null && notAvailable.equals(value)) {
+ return;
+ }
+
try {
- doubleValue = Double.parseDouble(value);
+ Double.parseDouble(value);
}
catch (NumberFormatException ex) {
addFieldError(getFieldName(), object);
}
-
- // only check for a minimum value if the min parameter is set
- if (min != null && doubleValue < min) {
- addFieldError(getFieldName(), object);
- }
-
- // only check for a maximum value if the max parameter is set
- if (max != null && doubleValue > max) {
- addFieldError(getFieldName(), object);
- }
}
}
Modified: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml 2010-10-25 15:44:33 UTC (rev 100)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Catch-error-validation.xml 2010-10-25 16:22:54 UTC (rev 101)
@@ -52,11 +52,13 @@
</field>
<field name="number">
<field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
<message>Number attribute is not a valid double</message>
</field-validator>
</field>
<field name="weight">
<field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
<message>Weight attribute is not a valid double</message>
</field-validator>
</field>
Modified: trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml
===================================================================
--- trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml 2010-10-25 15:44:33 UTC (rev 100)
+++ trunk/coser-business/src/main/resources/fr/ifremer/coser/bean/Length-error-validation.xml 2010-10-25 16:22:54 UTC (rev 101)
@@ -67,11 +67,13 @@
</field>
<field name="number">
<field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
<message>number attribute is not a valid double</message>
</field-validator>
</field>
<field name="weight">
<field-validator type="checkDouble" short-circuit="true">
+ <param name="notAvailable">NA</param>
<message>Weight attribute is not a valid double</message>
</field-validator>
</field>
Modified: trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java
===================================================================
--- trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java 2010-10-25 15:44:33 UTC (rev 100)
+++ trunk/coser-business/src/test/java/fr/ifremer/coser/services/ValidationServiceTest.java 2010-10-25 16:22:54 UTC (rev 101)
@@ -36,7 +36,7 @@
import fr.ifremer.coser.control.ValidationError;
/**
- * TODO add comment here.
+ * Test abour validation.
*
* @author chatellier
* @version $Revision$
@@ -50,25 +50,42 @@
protected ValidationService validationService = new ValidationService(config);
+ /**
+ * Test les validations sur les champs vide.
+ */
@Test
public void testCatchValidation() {
Catch myCatch = new Catch();
- myCatch.setData(new String[]{"","","","","",""});
+ myCatch.setData(new String[]{"1", "","","","","",""});
List<ValidationError> errors = validationService.validate(myCatch);
+ if (log.isDebugEnabled()) {
+ log.debug("Validation errors = " + errors);
+ }
Assert.assertNotNull(errors);
Assert.assertFalse(errors.isEmpty());
+
+ myCatch.setData(new String[]{"1", "Toto","","","","999",""});
+ errors = validationService.validate(myCatch);
if (log.isDebugEnabled()) {
log.debug("Validation errors = " + errors);
}
-
- myCatch.setData(new String[]{"Toto","","","","999",""});
- errors = validationService.validate(myCatch);
Assert.assertNotNull(errors);
Assert.assertFalse(errors.isEmpty());
+ }
+
+ /**
+ * Test la validation des valeurs NA pour les doubles.
+ */
+ @Test
+ public void testDoubleValidation() {
+ Catch myCatch = new Catch();
+ myCatch.setData(new String[]{"1", "Test survey","1999","Test trait","Test sp","NA","12"});
+ List<ValidationError> errors = validationService.validate(myCatch);
if (log.isDebugEnabled()) {
log.debug("Validation errors = " + errors);
}
+ Assert.assertNull(errors);
}
}
1
0
Author: chatellier
Date: 2010-10-25 15:44:33 +0000 (Mon, 25 Oct 2010)
New Revision: 100
Log:
Update project layout doc
Modified:
trunk/src/site/site_en.xml
trunk/src/site/site_fr.xml
Modified: trunk/src/site/site_en.xml
===================================================================
--- trunk/src/site/site_en.xml 2010-10-25 15:43:40 UTC (rev 99)
+++ trunk/src/site/site_en.xml 2010-10-25 15:44:33 UTC (rev 100)
@@ -59,7 +59,7 @@
</item>
<item name="Developer" href="developer.html">
-
+ <item name="Coser Project layout" href="directory.html" />
</item>
</menu>
Modified: trunk/src/site/site_fr.xml
===================================================================
--- trunk/src/site/site_fr.xml 2010-10-25 15:43:40 UTC (rev 99)
+++ trunk/src/site/site_fr.xml 2010-10-25 15:44:33 UTC (rev 100)
@@ -61,7 +61,7 @@
</item>
<item name="Développeur" href="developer.html">
-
+ <item name="Coser Project layout" href="directory.html" />
</item>
</menu>
1
0