Tutti-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
February 2013
- 6 participants
- 236 discussions
r365 - in trunk/tutti-persistence/src/main: java/fr/ifremer/tutti/persistence/service resources
by blavenier@users.forge.codelutin.com 08 Feb '13
by blavenier@users.forge.codelutin.com 08 Feb '13
08 Feb '13
Author: blavenier
Date: 2013-02-08 17:15:42 +0100 (Fri, 08 Feb 2013)
New Revision: 365
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/365
Log:
Fix :
- change call of adagio-core->TaxonNameDao (new API for synonyms management)
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/resources/applicationContext-service-tutti.xml
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-02-08 10:29:38 UTC (rev 364)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-02-08 16:15:42 UTC (rev 365)
@@ -28,6 +28,9 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import fr.ifremer.adagio.core.dao.referential.StatusDao;
+import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxon;
+import fr.ifremer.adagio.core.dao.referential.taxon.ReferenceTaxonDao;
+import fr.ifremer.adagio.core.dao.referential.taxon.TaxonName;
import fr.ifremer.adagio.core.dao.referential.taxon.TaxonNameExtendDao;
import fr.ifremer.adagio.core.dao.referential.taxon.TaxonRefTaxVO;
import fr.ifremer.tutti.persistence.entities.TuttiEntities;
@@ -50,6 +53,7 @@
import org.hibernate.type.DateType;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;
+import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@@ -78,6 +82,9 @@
@Resource(name = "statusDao")
protected StatusDao statusDao;
+
+ @Resource(name = "referenceTaxonDao")
+ protected ReferenceTaxonDao referenceTaxonDao;
//------------------------------------------------------------------------//
//-- ReferentialPersistenceService implentation --//
@@ -213,7 +220,7 @@
}
@Override
- @Cacheable(value = "tuttiAllFishingVessel")
+ @Cacheable(value = "fishingVessels")
public List<Vessel> getAllFishingVessel() {
Iterator<Object[]> list = queryListWithStatus(
"allVessels",
@@ -363,9 +370,10 @@
}
@Override
+ @Cacheable(value = "species")
public List<Species> getAllSpecies() {
- TaxonRefTaxVO[] sources = taxonNameDao.getAllTaxonRefTax();
+ TaxonRefTaxVO[] sources = taxonNameDao.getAllTaxonNames(true);
List<Species> result = Lists.newArrayList();
for (TaxonRefTaxVO source : sources) {
@@ -376,8 +384,9 @@
}
@Override
+ //TODO manage Cacheable(value = "species")
public Species getSpecies(String speciesId) {
- TaxonRefTaxVO source = taxonNameDao.getTaxonRefTax(
+ TaxonRefTaxVO source = taxonNameDao.getTaxonNameReferent(
Integer.valueOf(speciesId));
Species target = loadSpecies(source);
@@ -385,6 +394,7 @@
}
@Override
+ @Cacheable(value = "pmfms")
public List<Caracteristic> getAllCaracteristic() {
Iterator<Object[]> sources = queryListWithStatus(
"allPmfm",
@@ -454,6 +464,7 @@
}
@Override
+ //TODO manage Cacheable(value = "pmfms")
public Caracteristic getCaracteristic(Integer pmfmId) {
Object[] source = queryUniqueWithStatus("pmfmById",
"pmfmId", IntegerType.INSTANCE, pmfmId,
@@ -463,24 +474,34 @@
}
@Override
+ @CacheEvict (value = "species")
public List<Species> importTemporarySpecies(List<Species> species) {
- //TODO
- return null;
+ List<Species> result = Lists.newArrayList();
+ for (Iterator iterator = species.iterator(); iterator.hasNext();) {
+ Species source = (Species) iterator.next();
+
+ source = importTemporarySpecies(source);
+ result.add(source);
+ }
+ return result;
}
@Override
+ @CacheEvict (value = "fishingVessels")
public List<Vessel> importTemporaryVessel(List<Vessel> vessels) {
//TODO
return null;
}
@Override
+ @CacheEvict (value = "persons")
public List<Person> importTemporaryPerson(List<Person> persons) {
//TODO
return null;
}
@Override
+ @CacheEvict (value = "gears")
public List<Gear> importTemporaryGear(List<Gear> gears) {
//TODO
return null;
@@ -489,6 +510,31 @@
//------------------------------------------------------------------------//
//-- Internal methods --//
//------------------------------------------------------------------------//
+
+ protected Species importTemporarySpecies(Species source) {
+ Preconditions.checkNotNull(source);
+ Preconditions.checkNotNull(source.getName());
+
+ // Generate a new id for referenceTaxon
+ Integer referenceTaxonId = queryUniqueTyped(
+ "newReferenceTaxonTemporaryId");
+
+ ReferenceTaxon referenceTaxon = ReferenceTaxon.Factory.newInstance();
+ referenceTaxon.setId(referenceTaxonId);
+ referenceTaxon.setName(source.getName());
+
+ referenceTaxon = referenceTaxonDao.create(referenceTaxon);
+// source.setReferenceTaxonId()
+
+ TaxonName taxonName = TaxonName.Factory.newInstance();
+ taxonName.setIsTemporary(true);
+ taxonName.setIsReferent(true);
+ taxonName.setReferenceTaxon(referenceTaxon);
+ taxonName.setName(source.getName());
+
+
+ return source;
+ }
protected List<FishingOperationLocation> getFishingOperationLocations(Integer locationLevelId) {
Iterator<Object[]> sources = queryListWithStatus(
Modified: trunk/tutti-persistence/src/main/resources/applicationContext-service-tutti.xml
===================================================================
--- trunk/tutti-persistence/src/main/resources/applicationContext-service-tutti.xml 2013-02-08 10:29:38 UTC (rev 364)
+++ trunk/tutti-persistence/src/main/resources/applicationContext-service-tutti.xml 2013-02-08 16:15:42 UTC (rev 365)
@@ -37,7 +37,11 @@
<bean id="tuttiEnumerationFile" init-method="init"
class="fr.ifremer.tutti.persistence.service.TuttiEnumerationFile"/>
- <!-- Specific caches for tutti (not defined in ehcache.xml) -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- Caches management for tutti (not defined in adagio-core/ehcache.xml) -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+ <!-- Session caches : -->
<bean id="tuttiAbstractCache" abstract="true" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager" ref="ehcache"/>
<property name="maxElementsInMemory" value="5000"/>
@@ -47,10 +51,14 @@
<property name="overflowToDisk" value="false"/>
<property name="diskPersistent" value="false"/>
<property name="diskExpiryThreadIntervalSeconds" value="300"/>
- </bean>
+ </bean>
+
+ <bean id="tuttiPmfmsCache" parent="tuttiAbstractEternalCache">
+ <property name="cacheName" value="pmfms" />
+ </bean>
- <bean id="tuttiAllFishingVesselCache" parent="tuttiAbstractCache">
- <property name="cacheName" value="tuttiAllFishingVessel" />
+ <!-- Eternal caches : -->
+ <bean id="tuttiAbstractEternalCache" abstract="true" parent="tuttiAbstractCache">
<property name="eternal" value="true"/>
<property name="overflowToDisk" value="true"/>
<property name="diskPersistent" value="true"/>
@@ -59,6 +67,22 @@
<property name="timeToIdle" value="0"/>
</bean>
+ <bean id="tuttiFishingVesselsCache" parent="tuttiAbstractEternalCache">
+ <property name="cacheName" value="fishingVessels" />
+ </bean>
+
+ <bean id="tuttiSpeciesCache" parent="tuttiAbstractEternalCache">
+ <property name="cacheName" value="species" />
+ </bean>
+
+ <bean id="tuttiGearsCache" parent="tuttiAbstractEternalCache">
+ <property name="cacheName" value="gears" />
+ </bean>
+
+ <bean id="tuttiPersonsCache" parent="tuttiAbstractEternalCache">
+ <property name="cacheName" value="persons" />
+ </bean>
+
<!-- Example to use to create a new cache area :
<bean id="tuttiOtherCache" parent="tuttiPersistenceDefaultCache">
</bean> -->
1
0
08 Feb '13
Author: tchemit
Date: 2013-02-08 11:29:38 +0100 (Fri, 08 Feb 2013)
New Revision: 364
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/364
Log:
ajout dans les esp?\195?\168ce de l'id de r?\195?\169f?\195?\169rence + du boolean referenceTaxon dans Species
Modified:
trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo
Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo
===================================================================
(Binary files differ)
1
0
08 Feb '13
Author: tchemit
Date: 2013-02-08 10:16:44 +0100 (Fri, 08 Feb 2013)
New Revision: 363
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/363
Log:
add referenceTaxonId field to Species
Modified:
trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo
Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo
===================================================================
(Binary files differ)
1
0
07 Feb '13
Author: kmorin
Date: 2013-02-07 23:31:52 +0100 (Thu, 07 Feb 2013)
New Revision: 362
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/362
Log:
- move validator widget and component resizer and mover into jaxx
- start weight computing in the catches
Removed:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml
trunk/tutti-ui-swing/src/main/resources/icons/action-alert-error.png
trunk/tutti-ui-swing/src/main/resources/icons/action-alert-info.png
trunk/tutti-ui-swing/src/main/resources/icons/action-alert-none.png
trunk/tutti-ui-swing/src/main/resources/icons/action-alert-warning.png
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -297,7 +297,7 @@
if (italicStyle != null && italicStyle) {
text = "<em>" + text + "</em>";
}
- jLabel.setText("<html>" + text + "</strong>");
+ jLabel.setText("<html>" + text + "</html>");
}
} else if (component instanceof AbstractButton) {
AbstractButton abstractButton = (AbstractButton) component;
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 2013-02-07 22:31:52 UTC (rev 362)
@@ -30,7 +30,7 @@
javax.swing.JFrame
org.jdesktop.swingx.JXTitledPanel
jaxx.runtime.validator.swing.SwingValidator
- fr.ifremer.tutti.ui.swing.util.SwingValidatorMessageWidget
+ jaxx.runtime.validator.swing.SwingValidatorMessageWidget
fr.ifremer.tutti.ui.swing.TuttiUIContext
</import>
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -97,12 +97,47 @@
//check if the user changed the date and not only the time)
Date oldDate = (Date) evt.getOldValue();
Date newDate = (Date) evt.getNewValue();
- if (!DateUtils.isSameDay(oldDate, newDate)) {
+ if (oldDate == null || !DateUtils.isSameDay(oldDate, newDate)) {
getModel().setGearShootingEndDate(newDate);
}
}
+ };
+
+ private final PropertyChangeListener coordinatePropertiesListener = new PropertyChangeListener() {
+ private List<String> properties = Lists.newArrayList(
+ EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND
+ );
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (properties.contains(evt.getPropertyName())) {
+ EditFishingOperationUIModel source = (EditFishingOperationUIModel) evt.getSource();
+ if (source.isFishingOperationRectiligne()) {
+ source.computeDictance();
+ }
+ }
+ }
};
/**
@@ -182,43 +217,6 @@
}
});
- model.addPropertyChangeListener(new PropertyChangeListener() {
-
- List<String> properties = Lists.newArrayList(
- EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE,
- EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND
- );
-
- @Override
- public void propertyChange(PropertyChangeEvent evt) {
- if (properties.contains(evt.getPropertyName())) {
- EditFishingOperationUIModel source = (EditFishingOperationUIModel) evt.getSource();
- if (source.isFishingOperationRectiligne()) {
- source.computeDictance();
- }
- }
- }
- });
-
model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID, new PropertyChangeListener() {
@Override
@@ -456,6 +454,7 @@
EditFishingOperationUIModel model = getModel();
model.removePropertyChangeListener(EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE, startDateListener);
+ model.removePropertyChangeListener(coordinatePropertiesListener);
if (empty || !bean.equals(model.getFishingOperation()) || isAModelModified()) {
if (empty) {
@@ -524,6 +523,7 @@
fishingOperationMonitor.clearModified();
model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE, startDateListener);
+ model.addPropertyChangeListener(coordinatePropertiesListener);
}
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -58,6 +58,13 @@
* @since 0.3
*/
protected Float categoryWeight;
+
+ /**
+ * Sample computed weight.
+ *
+ * @since 1.0
+ */
+ protected Float computedWeight;
public static <C extends Serializable> SampleCategory<C> newSample(SampleCategoryType categoryType) {
SampleCategory<C> result = new SampleCategory<C>();
@@ -92,12 +99,22 @@
this.categoryWeight = categoryWeight;
}
+ public Float getComputedWeight() {
+ return computedWeight;
+ }
+
+ public void setComputedWeight(Float computedWeight) {
+ this.computedWeight = computedWeight;
+ }
+
public boolean isValid() {
return categoryValue != null;
}
public boolean isEmpty() {
- return categoryValue == null && categoryWeight == null;
+ return categoryValue == null
+ && categoryWeight == null
+ && computedWeight == null;
}
public boolean isEmptyOrValid() {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -217,14 +217,19 @@
text = "";
} else {
Float number = sampleCategory.getCategoryWeight();
+ Float computedNumber = sampleCategory.getComputedWeight();
+
+ text = "<html>" + categoryDecorator.toString(categoryValue) + " / ";
- text = categoryDecorator.toString(categoryValue) + " / ";
-
- if (number == null) {
+ if (number != null) {
+ text += number;
+ } else if (computedNumber != null) {
+ text += "<em style='color: blue'>" + computedNumber + "</em>";
+ } else {
text += "-";
- } else {
- text += number;
}
+
+ text += "</html>";
}
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -59,6 +59,8 @@
public static final String PROPERTY_SORTED_UNSORTED_CATEGORY_VALUE = "sortedUnsortedCategoryValue";
public static final String PROPERTY_SORTED_UNSORTED_CATEGORY_WEIGHT = "sortedUnsortedCategoryWeight";
+
+ public static final String PROPERTY_SORTED_UNSORTED_COMPUTED_WEIGHT = "sortedUnsortedComputedWeight";
public static final String PROPERTY_SIZE_CATEGORY = "sizeCategory";
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -134,11 +134,6 @@
n_("tutti.table.species.batch.header.computedNumber"),
n_("tutti.table.species.batch.header.computedNumber"));
- public static final ColumnIdentifier<SpeciesBatchRowModel> NUMBER = ColumnIdentifier.newId(
- SpeciesBatchRowModel.PROPERTY_NUMBER,
- n_("tutti.table.species.batch.header.number"),
- n_("tutti.table.species.batch.header.number"));
-
public static final ColumnIdentifier<SpeciesBatchRowModel> COMMENT = ColumnIdentifier.newId(
SpeciesBatchRowModel.PROPERTY_COMMENT,
n_("tutti.table.species.batch.header.comment"),
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.css 2013-02-07 22:31:52 UTC (rev 362)
@@ -57,9 +57,9 @@
}
#speciesTotalSampleSortedWeightField {
- property: speciesTotalSampleSortedWeight;
- model: {model.getSpeciesTotalSampleSortedWeight()};
- numberPattern: {INT_6_DIGITS_PATTERN};
+ text: {getStringValue(model.getSpeciesTotalUnsortedWeight())};
+ editable: false;
+ enabled: false;
}
#speciesTotalUnsortedWeightLabel {
@@ -138,6 +138,12 @@
enabled: {model.isCreateSpeciesBatchEnabled()};
}
+#computeSpeciesBatchButton {
+ actionIcon: generate;
+ mnemonic: E;
+ text: "tutti.action.computeSpeciesBatch";
+}
+
#filterTablePane {
border: {new TitledBorder(null, "")};
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUI.jaxx 2013-02-07 22:31:52 UTC (rev 362)
@@ -113,8 +113,7 @@
<JLabel id='speciesTotalSampleSortedWeightLabel'/>
</cell>
<cell>
- <NumberEditor id='speciesTotalSampleSortedWeightField'
- constructorParams='this'/>
+ <JTextField id='speciesTotalSampleSortedWeightField'/>
</cell>
<cell>
<JLabel id='speciesTotalUnsortedWeightLabel'/>
@@ -157,6 +156,8 @@
<JRadioButton id='filterSpeciesBatchRootButton'
onActionPerformed='model.setTableViewMode(TableViewMode.ROOT)'/>
</JPanel>
+ <JButton id='computeSpeciesBatchButton' constraints='BorderLayout.EAST'
+ onActionPerformed='handler.computeSpeciesBatch()'/>
</JPanel>
</cell>
</row>
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -838,15 +838,112 @@
totalWeight += w;
}
}
+ } else {
+ totalNumber = row.getNumber();
}
row.setComputedNumber(totalNumber);
+
+ SampleCategory finestCategory;
+ if (row.getAgeCategory().isValid()) {
+ finestCategory = row.getAgeCategory();
+
+ } else if (row.getMaturityCategory().isValid()) {
+ finestCategory = row.getMaturityCategory();
+
+ } else if (row.getSexCategory().isValid()) {
+ finestCategory = row.getSexCategory();
+
+ } else if (row.getSizeCategory().isValid()) {
+ finestCategory = row.getSizeCategory();
+
+ } else {
+ finestCategory = row.getSortedUnsortedCategory();
+ }
+ if (finestCategory.getCategoryWeight() == null) {
+ finestCategory.setComputedWeight(totalWeight);
+ }
+
}
+
+ public void computeSpeciesBatch() {
+ Float totalSortedWeight = 0f;
+ Float totalUnsortedWeight = 0f;
+ List<SpeciesBatchRowModel> roots = getModel().getRows();
+ for (SpeciesBatchRowModel row : roots) {
+ if (row.isBatchRoot()) {
+ Float weight = computeSpeciesBatch(row);
+ if (weight == null) {
+ JOptionPane.showMessageDialog(
+ ui,
+ _("tutti.dialog.catches.species.computeWeight.error.message"),
+ _("tutti.dialog.catches.species.computeWeight.error.title"),
+ JOptionPane.ERROR_MESSAGE);
+ totalSortedWeight = null;
+ totalUnsortedWeight = null;
+ break;
+ }
+ if (persistenceService.isSortedQualitativeValue(row.getSortedUnsortedCategory().getCategoryValue())) {
+ totalSortedWeight += weight;
+ } else {
+ totalUnsortedWeight += weight;
+ }
+ }
+ }
+ ui.getSpeciesTotalSampleSortedWeightField()
+ .setText(totalSortedWeight != null ? totalSortedWeight.toString() : "");
+ ui.getSpeciesTotalUnsortedWeightField()
+ .setText(totalUnsortedWeight != null ? totalUnsortedWeight.toString() : "");
+ }
//------------------------------------------------------------------------//
//-- Internal methods --//
//------------------------------------------------------------------------//
+ protected Float computeSpeciesBatch(SpeciesBatchRowModel row) {
+ Float sum = null;
+ List<SpeciesBatchRowModel> children = row.getBatchChild();
+ if (!row.isBatchLeaf()) {
+ for (SpeciesBatchRowModel child : children) {
+ Float weight = computeSpeciesBatch(child);
+ if (weight == null) {
+ return null;
+ }
+ sum += weight;
+ }
+ }
+
+ SampleCategory finestCategory;
+ if (row.getAgeCategory().isValid()) {
+ finestCategory = row.getAgeCategory();
+
+ } else if (row.getMaturityCategory().isValid()) {
+ finestCategory = row.getMaturityCategory();
+
+ } else if (row.getSexCategory().isValid()) {
+ finestCategory = row.getSexCategory();
+
+ } else if (row.getSizeCategory().isValid()) {
+ finestCategory = row.getSizeCategory();
+
+ } else {
+ finestCategory = row.getSortedUnsortedCategory();
+ }
+ Float weight = finestCategory.getCategoryWeight();
+ if (weight == null) {
+ weight = finestCategory.getComputedWeight();
+ }
+ Float result;
+ if (sum != null && weight == null) {
+ finestCategory.setComputedWeight(sum);
+ result = sum;
+
+ } else {
+ result = weight;
+ }
+ return result;
+ }
+
protected void saveRows(Iterable<SpeciesBatchRowModel> rows) {
for (SpeciesBatchRowModel row : rows) {
saveRow(row);
@@ -984,7 +1081,8 @@
if (enableSplit) {
// can split if selected batch is a leaf
- enableSplit = row.isBatchLeaf();
+ enableSplit = row.isBatchLeaf()
+ && row.getComputedNumber() == null;
}
if (enableRename) {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/FrequencyCellComponent.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -150,15 +150,13 @@
// at close, synch back frequencies
- // transfer rows to editor
- List<SpeciesFrequencyRowModel> frequency = Lists.newArrayList();
-
if (frequencyModel.isSimpleCountingMode()) {
- SpeciesFrequencyRowModel row = new SpeciesFrequencyRowModel();
- row.setNumber(frequencyModel.getSimpleCount());
- frequency.add(row);
+ editRow.setNumber(frequencyModel.getSimpleCount());
} else {
+ // transfer rows to editor
+ List<SpeciesFrequencyRowModel> frequency = Lists.newArrayList();
+
for (SpeciesFrequencyRowModel row : frequencyModel.getRows()) {
if (row.isValid()) {
@@ -166,18 +164,20 @@
frequency.add(row);
}
}
- }
+ if (log.isInfoEnabled()) {
+ log.info("Push back " + frequency.size() +
+ " frequency to batch " + frequencyModel.getBatch());
+ }
- if (log.isInfoEnabled()) {
- log.info("Push back " + frequency.size() +
- " frequency to batch " + frequencyModel.getBatch());
+ // push back to batch
+ editRow.setFrequency(frequency);
+ editRow.setNumber(null);
+
}
-
- // push back to batch
- editRow.setFrequency(frequency);
-
+
// update frequencies total
ui.getHandler().updateTotalFromFrequencies(editRow);
+
}
int r = rowIndex;
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -54,7 +54,7 @@
* @since 0.3
*/
protected final SampleCategory<Serializable> category = SampleCategory.newSample(null);
-
+
protected static final Binder<SplitSpeciesBatchRowModel, SplitSpeciesBatchRowModel> fromBeanBinder =
BinderFactory.newBinder(SplitSpeciesBatchRowModel.class,
SplitSpeciesBatchRowModel.class);
@@ -106,5 +106,5 @@
category.setCategoryWeight(weight);
firePropertyChange(PROPERTY_WEIGHT, oldValue, weight);
}
-
+
}
\ No newline at end of file
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 22:31:52 UTC (rev 362)
@@ -48,12 +48,6 @@
selectedItem: {model.getSelectedCategory()};
}
-#sampleCheckBox {
- text: "tutti.label.sampleCategoryConfiguration.sample";
- selected: {model.isSample()};
- enabled: {model.getBatchWeight() != null};
-}
-
#speciesLabel {
text: "tutti.label.sampleCategoryConfiguration.species";
labelFor: {speciesField};
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.jaxx 2013-02-07 22:31:52 UTC (rev 362)
@@ -69,7 +69,6 @@
<BeanValidator id='validator' bean='model' errorTableModel='errorTableModel'
uiClass='jaxx.runtime.validator.swing.ui.ImageValidationUI'>
<field name='selectedCategory' component='categoryComboBox'/>
- <field name='sample' component='sampleCheckBox'/>
<field name='sampleWeight' component='sampleWeightField'/>
</BeanValidator>
@@ -86,15 +85,7 @@
</cell>
</row>
- <!-- Split as a sample or not ? -->
<row>
- <cell columns='2'>
- <JCheckBox id='sampleCheckBox'
- onItemStateChanged='handler.setBoolean(event, "sample")'/>
- </cell>
- </row>
-
- <row>
<cell columns="2">
<JSeparator/>
</cell>
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -46,8 +46,6 @@
public static final String PROPERTY_SPECIES = "species";
- public static final String PROPERTY_SAMPLE = "sample";
-
public static final String PROPERTY_SELECTED_CATEGORY = "selectedCategory";
public static final String PROPERTY_BATCH_WEIGHT = "batchWeight";
@@ -76,13 +74,6 @@
protected SampleCategoryType selectedCategory;
/**
- * Flag when the batch to split is a sample.
- *
- * @since 0.3
- */
- protected boolean sample;
-
- /**
* Sample weight of split batches.
*
* @since 0.3
@@ -130,16 +121,6 @@
firePropertyChange(PROPERTY_SELECTED_CATEGORY, oldValue, selectedCategory);
}
- public boolean isSample() {
- return sample;
- }
-
- public void setSample(boolean sample) {
- Object oldValue = isSample();
- this.sample = sample;
- firePropertyChange(PROPERTY_SAMPLE, oldValue, sample);
- }
-
public Float getBatchWeight() {
return batch == null ? null : batch.getSampleCategory().getCategoryWeight();
}
Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentMover.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -1,380 +0,0 @@
-package fr.ifremer.tutti.ui.swing.util;
-
-/*
- * #%L
- * Tutti :: UI
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 Ifremer
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-
-import javax.swing.JComponent;
-import javax.swing.SwingUtilities;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.GraphicsEnvironment;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Window;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-/**
- * This class allows you to move a Component by using a mouse. The Component
- * moved can be a high level Window (ie. Window, Frame, Dialog) in which case
- * the Window is moved within the desktop. Or the Component can belong to a
- * Container in which case the Component is moved within the Container.
- * <p/>
- * When moving a Window, the listener can be added to a child Component of
- * the Window. In this case attempting to move the child will result in the
- * Window moving. For example, you might create a custom "Title Bar" for an
- * undecorated Window and moving of the Window is accomplished by moving the
- * title bar only. Multiple components can be registered as "window movers".
- * <p/>
- * Components can be registered when the class is created. Additional
- * components can be added at any time using the registerComponent() method.
- */
-public class ComponentMover extends MouseAdapter {
- private Insets dragInsets = new Insets(0, 0, 0, 0);
-
- private Dimension snapSize = new Dimension(1, 1);
-
- private Insets edgeInsets = new Insets(0, 0, 0, 0);
-
- private boolean changeCursor = true;
-
- private boolean autoLayout = false;
-
- private Class destinationClass;
-
- private Component destinationComponent;
-
- private Component destination;
-
- private Component source;
-
- private Point pressed;
-
- private Point location;
-
- private Cursor originalCursor;
-
- private boolean autoscrolls;
-
- private boolean potentialDrag;
-
-
- /**
- * Constructor for moving individual components. The components must be
- * regisetered using the registerComponent() method.
- */
- public ComponentMover() {
- }
-
- /**
- * Constructor to specify a Class of Component that will be moved when
- * drag events are generated on a registered child component. The events
- * will be passed to the first ancestor of this specified class.
- *
- * @param destinationClass the Class of the ancestor component
- * @param components the Components to be registered for forwarding
- * drag events to the ancestor Component.
- */
- public ComponentMover(Class destinationClass, Component... components) {
- this.destinationClass = destinationClass;
- registerComponent(components);
- }
-
- /**
- * Constructor to specify a parent component that will be moved when drag
- * events are generated on a registered child component.
- *
- * @param destinationComponent the component drage events should be forwareded to
- * @param components the Components to be registered for forwarding drag
- * events to the parent component to be moved
- */
- public ComponentMover(Component destinationComponent, Component... components) {
- this.destinationComponent = destinationComponent;
- registerComponent(components);
- }
-
- /**
- * Get the auto layout property
- *
- * @return the auto layout property
- */
- public boolean isAutoLayout() {
- return autoLayout;
- }
-
- /**
- * Set the auto layout property
- *
- * @param autoLayout when true layout will be invoked on the parent container
- */
- public void setAutoLayout(boolean autoLayout) {
- this.autoLayout = autoLayout;
- }
-
- /**
- * Get the change cursor property
- *
- * @return the change cursor property
- */
- public boolean isChangeCursor() {
- return changeCursor;
- }
-
- /**
- * Set the change cursor property
- *
- * @param changeCursor when true the cursor will be changed to the
- * Cursor.MOVE_CURSOR while the mouse is pressed
- */
- public void setChangeCursor(boolean changeCursor) {
- this.changeCursor = changeCursor;
- }
-
- /**
- * Get the drag insets
- *
- * @return the drag insets
- */
- public Insets getDragInsets() {
- return dragInsets;
- }
-
- /**
- * Set the drag insets. The insets specify an area where mouseDragged
- * events should be ignored and therefore the component will not be moved.
- * This will prevent these events from being confused with a
- * MouseMotionListener that supports component resizing.
- *
- * @param dragInsets
- */
- public void setDragInsets(Insets dragInsets) {
- this.dragInsets = dragInsets;
- }
-
- /**
- * Get the bounds insets
- *
- * @return the bounds insets
- */
- public Insets getEdgeInsets() {
- return edgeInsets;
- }
-
- /**
- * Set the edge insets. The insets specify how close to each edge of the parent
- * component that the child component can be moved. Positive values means the
- * component must be contained within the parent. Negative values means the
- * component can be moved outside the parent.
- *
- * @param edgeInsets
- */
- public void setEdgeInsets(Insets edgeInsets) {
- this.edgeInsets = edgeInsets;
- }
-
- /**
- * Remove listeners from the specified component
- *
- * @param components the component the listeners are removed from
- */
- public void deregisterComponent(Component... components) {
- for (Component component : components)
- component.removeMouseListener(this);
- }
-
- /**
- * Add the required listeners to the specified component
- *
- * @param components the component the listeners are added to
- */
- public void registerComponent(Component... components) {
- for (Component component : components)
- component.addMouseListener(this);
- }
-
- /**
- * Get the snap size
- *
- * @return the snap size
- */
- public Dimension getSnapSize() {
- return snapSize;
- }
-
- /**
- * Set the snap size. Forces the component to be snapped to
- * the closest grid position. Snapping will occur when the mouse is
- * dragged half way.
- */
- public void setSnapSize(Dimension snapSize) {
- if (snapSize.width < 1
- || snapSize.height < 1)
- throw new IllegalArgumentException("Snap sizes must be greater than 0");
-
- this.snapSize = snapSize;
- }
-
- /**
- * Setup the variables used to control the moving of the component:
- * <p/>
- * source - the source component of the mouse event
- * destination - the component that will ultimately be moved
- * pressed - the Point where the mouse was pressed in the destination
- * component coordinates.
- */
- @Override
- public void mousePressed(MouseEvent e) {
- source = e.getComponent();
- int width = source.getSize().width - dragInsets.left - dragInsets.right;
- int height = source.getSize().height - dragInsets.top - dragInsets.bottom;
- Rectangle r = new Rectangle(dragInsets.left, dragInsets.top, width, height);
-
- if (r.contains(e.getPoint()))
- setupForDragging(e);
- }
-
- private void setupForDragging(MouseEvent e) {
- source.addMouseMotionListener(this);
- potentialDrag = true;
-
- // Determine the component that will ultimately be moved
-
- if (destinationComponent != null) {
- destination = destinationComponent;
- } else if (destinationClass == null) {
- destination = source;
- } else // forward events to destination component
- {
- destination = SwingUtilities.getAncestorOfClass(destinationClass, source);
- }
-
- pressed = e.getLocationOnScreen();
- location = destination.getLocation();
-
- if (changeCursor) {
- originalCursor = source.getCursor();
- source.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
- }
-
- // Making sure autoscrolls is false will allow for smoother dragging of
- // individual components
-
- if (destination instanceof JComponent) {
- JComponent jc = (JComponent) destination;
- autoscrolls = jc.getAutoscrolls();
- jc.setAutoscrolls(false);
- }
- }
-
- /**
- * Move the component to its new location. The dragged Point must be in
- * the destination coordinates.
- */
- @Override
- public void mouseDragged(MouseEvent e) {
- Point dragged = e.getLocationOnScreen();
- int dragX = getDragDistance(dragged.x, pressed.x, snapSize.width);
- int dragY = getDragDistance(dragged.y, pressed.y, snapSize.height);
-
- int locationX = location.x + dragX;
- int locationY = location.y + dragY;
-
- // Mouse dragged events are not generated for every pixel the mouse
- // is moved. Adjust the location to make sure we are still on a
- // snap value.
-
- while (locationX < edgeInsets.left)
- locationX += snapSize.width;
-
- while (locationY < edgeInsets.top)
- locationY += snapSize.height;
-
- Dimension d = getBoundingSize(destination);
-
- while (locationX + destination.getSize().width + edgeInsets.right > d.width)
- locationX -= snapSize.width;
-
- while (locationY + destination.getSize().height + edgeInsets.bottom > d.height)
- locationY -= snapSize.height;
-
- // Adjustments are finished, move the component
-
- destination.setLocation(locationX, locationY);
- }
-
- /*
- * Determine how far the mouse has moved from where dragging started
- * (Assume drag direction is down and right for positive drag distance)
- */
- private int getDragDistance(int larger, int smaller, int snapSize) {
- int halfway = snapSize / 2;
- int drag = larger - smaller;
- drag += (drag < 0) ? -halfway : halfway;
- drag = (drag / snapSize) * snapSize;
-
- return drag;
- }
-
- /*
- * Get the bounds of the parent of the dragged component.
- */
- private Dimension getBoundingSize(Component source) {
- if (source instanceof Window) {
- GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
- Rectangle bounds = env.getMaximumWindowBounds();
- return new Dimension(bounds.width, bounds.height);
- } else {
- return source.getParent().getSize();
- }
- }
-
- /** Restore the original state of the Component */
- @Override
- public void mouseReleased(MouseEvent e) {
- if (!potentialDrag) return;
-
- source.removeMouseMotionListener(this);
- potentialDrag = false;
-
- if (changeCursor)
- source.setCursor(originalCursor);
-
- if (destination instanceof JComponent) {
- ((JComponent) destination).setAutoscrolls(autoscrolls);
- }
-
- // Layout the components on the parent container
-
- if (autoLayout) {
- if (destination instanceof JComponent) {
- ((JComponent) destination).revalidate();
- } else {
- destination.validate();
- }
- }
- }
-}
\ No newline at end of file
Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/ComponentResizer.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -1,460 +0,0 @@
-package fr.ifremer.tutti.ui.swing.util;
-
-/*
- * #%L
- * Tutti :: UI
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 Ifremer
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-
-import javax.swing.JComponent;
-import javax.swing.SwingUtilities;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.GraphicsEnvironment;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Window;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * The ComponentResizer allows you to resize a component by dragging a border
- * of the component.
- */
-public class ComponentResizer extends MouseAdapter {
- private final static Dimension MINIMUM_SIZE = new Dimension(10, 10);
-
- private final static Dimension MAXIMUM_SIZE =
- new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
-
- private static Map<Integer, Integer> cursors = new HashMap<Integer, Integer>();
-
- {
- cursors.put(1, Cursor.N_RESIZE_CURSOR);
- cursors.put(2, Cursor.W_RESIZE_CURSOR);
- cursors.put(4, Cursor.S_RESIZE_CURSOR);
- cursors.put(8, Cursor.E_RESIZE_CURSOR);
- cursors.put(3, Cursor.NW_RESIZE_CURSOR);
- cursors.put(9, Cursor.NE_RESIZE_CURSOR);
- cursors.put(6, Cursor.SW_RESIZE_CURSOR);
- cursors.put(12, Cursor.SE_RESIZE_CURSOR);
- }
-
- private Insets dragInsets;
-
- private Dimension snapSize;
-
- private int direction;
-
- protected static final int NORTH = 1;
-
- protected static final int WEST = 2;
-
- protected static final int SOUTH = 4;
-
- protected static final int EAST = 8;
-
- private Cursor sourceCursor;
-
- private boolean resizing;
-
- private Rectangle bounds;
-
- private Point pressed;
-
- private boolean autoscrolls;
-
- private Dimension minimumSize = MINIMUM_SIZE;
-
- private Dimension maximumSize = MAXIMUM_SIZE;
-
- /**
- * Convenience contructor. All borders are resizable in increments of
- * a single pixel. Components must be registered separately.
- */
- public ComponentResizer() {
- this(new Insets(5, 5, 5, 5), new Dimension(1, 1));
- }
-
- /**
- * Convenience contructor. All borders are resizable in increments of
- * a single pixel. Components can be registered when the class is created
- * or they can be registered separately afterwards.
- *
- * @param components components to be automatically registered
- */
- public ComponentResizer(Component... components) {
- this(new Insets(5, 5, 5, 5), new Dimension(1, 1), components);
- }
-
- /**
- * Convenience contructor. Eligible borders are resisable in increments of
- * a single pixel. Components can be registered when the class is created
- * or they can be registered separately afterwards.
- *
- * @param dragInsets Insets specifying which borders are eligible to be
- * resized.
- * @param components components to be automatically registered
- */
- public ComponentResizer(Insets dragInsets, Component... components) {
- this(dragInsets, new Dimension(1, 1), components);
- }
-
- /**
- * Create a ComponentResizer.
- *
- * @param dragInsets Insets specifying which borders are eligible to be
- * resized.
- * @param snapSize Specify the dimension to which the border will snap to
- * when being dragged. Snapping occurs at the halfway mark.
- * @param components components to be automatically registered
- */
- public ComponentResizer(Insets dragInsets, Dimension snapSize, Component... components) {
- setDragInsets(dragInsets);
- setSnapSize(snapSize);
- registerComponent(components);
- }
-
- /**
- * Get the drag insets
- *
- * @return the drag insets
- */
- public Insets getDragInsets() {
- return dragInsets;
- }
-
- /**
- * Set the drag dragInsets. The insets specify an area where mouseDragged
- * events are recognized from the edge of the border inwards. A value of
- * 0 for any size will imply that the border is not resizable. Otherwise
- * the appropriate drag cursor will appear when the mouse is inside the
- * resizable border area.
- *
- * @param dragInsets Insets to control which borders are resizeable.
- */
- public void setDragInsets(Insets dragInsets) {
- validateMinimumAndInsets(minimumSize, dragInsets);
-
- this.dragInsets = dragInsets;
- }
-
- /**
- * Get the components maximum size.
- *
- * @return the maximum size
- */
- public Dimension getMaximumSize() {
- return maximumSize;
- }
-
- /**
- * Specify the maximum size for the component. The component will still
- * be constrained by the size of its parent.
- *
- * @param maximumSize the maximum size for a component.
- */
- public void setMaximumSize(Dimension maximumSize) {
- this.maximumSize = maximumSize;
- }
-
- /**
- * Get the components minimum size.
- *
- * @return the minimum size
- */
- public Dimension getMinimumSize() {
- return minimumSize;
- }
-
- /**
- * Specify the minimum size for the component. The minimum size is
- * constrained by the drag insets.
- *
- * @param minimumSize the minimum size for a component.
- */
- public void setMinimumSize(Dimension minimumSize) {
- validateMinimumAndInsets(minimumSize, dragInsets);
-
- this.minimumSize = minimumSize;
- }
-
- /**
- * Remove listeners from the specified component
- *
- * @param components the component the listeners are removed from
- */
- public void deregisterComponent(Component... components) {
- for (Component component : components) {
- component.removeMouseListener(this);
- component.removeMouseMotionListener(this);
- }
- }
-
- /**
- * Add the required listeners to the specified component
- *
- * @param components the component the listeners are added to
- */
- public void registerComponent(Component... components) {
- for (Component component : components) {
- component.addMouseListener(this);
- component.addMouseMotionListener(this);
- }
- }
-
- /**
- * Get the snap size.
- *
- * @return the snap size.
- */
- public Dimension getSnapSize() {
- return snapSize;
- }
-
- /**
- * Control how many pixels a border must be dragged before the size of
- * the component is changed. The border will snap to the size once
- * dragging has passed the halfway mark.
- *
- * @param snapSize Dimension object allows you to separately spcify a
- * horizontal and vertical snap size.
- */
- public void setSnapSize(Dimension snapSize) {
- this.snapSize = snapSize;
- }
-
- /**
- * When the components minimum size is less than the drag insets then
- * we can't determine which border should be resized so we need to
- * prevent this from happening.
- */
- private void validateMinimumAndInsets(Dimension minimum, Insets drag) {
- int minimumWidth = drag.left + drag.right;
- int minimumHeight = drag.top + drag.bottom;
-
- if (minimum.width < minimumWidth
- || minimum.height < minimumHeight) {
- String message = "Minimum size cannot be less than drag insets";
- throw new IllegalArgumentException(message);
- }
- }
-
- /**
- */
- @Override
- public void mouseMoved(MouseEvent e) {
- Component source = e.getComponent();
- Point location = e.getPoint();
- direction = 0;
-
- if (location.x < dragInsets.left)
- direction += WEST;
-
- if (location.x > source.getWidth() - dragInsets.right - 1)
- direction += EAST;
-
- if (location.y < dragInsets.top)
- direction += NORTH;
-
- if (location.y > source.getHeight() - dragInsets.bottom - 1)
- direction += SOUTH;
-
- // Mouse is no longer over a resizable border
-
- if (direction == 0) {
- source.setCursor(sourceCursor);
- } else // use the appropriate resizable cursor
- {
- int cursorType = cursors.get(direction);
- Cursor cursor = Cursor.getPredefinedCursor(cursorType);
- source.setCursor(cursor);
- }
- }
-
- @Override
- public void mouseEntered(MouseEvent e) {
- if (!resizing) {
- Component source = e.getComponent();
- sourceCursor = source.getCursor();
- }
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- if (!resizing) {
- Component source = e.getComponent();
- source.setCursor(sourceCursor);
- }
- }
-
- @Override
- public void mousePressed(MouseEvent e) {
- // The mouseMoved event continually updates this variable
-
- if (direction == 0) return;
-
- // Setup for resizing. All future dragging calculations are done based
- // on the original bounds of the component and mouse pressed location.
-
- resizing = true;
-
- Component source = e.getComponent();
- pressed = e.getPoint();
- SwingUtilities.convertPointToScreen(pressed, source);
- bounds = source.getBounds();
-
- // Making sure autoscrolls is false will allow for smoother resizing
- // of components
-
- if (source instanceof JComponent) {
- JComponent jc = (JComponent) source;
- autoscrolls = jc.getAutoscrolls();
- jc.setAutoscrolls(false);
- }
- }
-
- /** Restore the original state of the Component */
- @Override
- public void mouseReleased(MouseEvent e) {
- resizing = false;
-
- Component source = e.getComponent();
- source.setCursor(sourceCursor);
-
- if (source instanceof JComponent) {
- ((JComponent) source).setAutoscrolls(autoscrolls);
- }
- }
-
- /**
- * Resize the component ensuring location and size is within the bounds
- * of the parent container and that the size is within the minimum and
- * maximum constraints.
- * <p/>
- * All calculations are done using the bounds of the component when the
- * resizing started.
- */
- @Override
- public void mouseDragged(MouseEvent e) {
- if (resizing == false) return;
-
- Component source = e.getComponent();
- Point dragged = e.getPoint();
- SwingUtilities.convertPointToScreen(dragged, source);
-
- changeBounds(source, direction, bounds, pressed, dragged);
- }
-
- protected void changeBounds(Component source, int direction, Rectangle bounds, Point pressed, Point current) {
- // Start with original locaton and size
-
- int x = bounds.x;
- int y = bounds.y;
- int width = bounds.width;
- int height = bounds.height;
-
- // Resizing the West or North border affects the size and location
-
- if (WEST == (direction & WEST)) {
- int drag = getDragDistance(pressed.x, current.x, snapSize.width);
- int maximum = Math.min(width + x, maximumSize.width);
- drag = getDragBounded(drag, snapSize.width, width, minimumSize.width, maximum);
-
- x -= drag;
- width += drag;
- }
-
- if (NORTH == (direction & NORTH)) {
- int drag = getDragDistance(pressed.y, current.y, snapSize.height);
- int maximum = Math.min(height + y, maximumSize.height);
- drag = getDragBounded(drag, snapSize.height, height, minimumSize.height, maximum);
-
- y -= drag;
- height += drag;
- }
-
- // Resizing the East or South border only affects the size
-
- if (EAST == (direction & EAST)) {
- int drag = getDragDistance(current.x, pressed.x, snapSize.width);
- Dimension boundingSize = getBoundingSize(source);
- int maximum = Math.min(boundingSize.width - x, maximumSize.width);
- drag = getDragBounded(drag, snapSize.width, width, minimumSize.width, maximum);
- width += drag;
- }
-
- if (SOUTH == (direction & SOUTH)) {
- int drag = getDragDistance(current.y, pressed.y, snapSize.height);
- Dimension boundingSize = getBoundingSize(source);
- int maximum = Math.min(boundingSize.height - y, maximumSize.height);
- drag = getDragBounded(drag, snapSize.height, height, minimumSize.height, maximum);
- height += drag;
- }
-
- source.setBounds(x, y, width, height);
- source.validate();
- }
-
- /*
- * Determine how far the mouse has moved from where dragging started
- */
- private int getDragDistance(int larger, int smaller, int snapSize) {
- int halfway = snapSize / 2;
- int drag = larger - smaller;
- drag += (drag < 0) ? -halfway : halfway;
- drag = (drag / snapSize) * snapSize;
-
- return drag;
- }
-
- /*
- * Adjust the drag value to be within the minimum and maximum range.
- */
- private int getDragBounded(int drag, int snapSize, int dimension, int minimum, int maximum) {
- while (dimension + drag < minimum)
- drag += snapSize;
-
- while (dimension + drag > maximum)
- drag -= snapSize;
-
-
- return drag;
- }
-
- /*
- * Keep the size of the component within the bounds of its parent.
- */
- private Dimension getBoundingSize(Component source) {
- if (source instanceof Window) {
- GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
- Rectangle bounds = env.getMaximumWindowBounds();
- return new Dimension(bounds.width, bounds.height);
- } else {
- return source.getParent().getSize();
- }
- }
-}
\ No newline at end of file
Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -1,245 +0,0 @@
-
-package fr.ifremer.tutti.ui.swing.util;
-
-/*
- * #%L
- * Tutti :: UI
- * $Id$
- * $HeadURL$
- * %%
- * Copyright (C) 2012 - 2013 Ifremer
- * %%
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * #L%
- */
-
-import jaxx.runtime.SwingUtil;
-import jaxx.runtime.validator.swing.SwingValidator;
-import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel;
-import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer;
-import jaxx.runtime.validator.swing.SwingValidatorUtil;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jdesktop.swingx.JXTitledPanel;
-import org.nuiton.validator.NuitonValidatorScope;
-
-import javax.swing.AbstractAction;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JRootPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.JToggleButton;
-import javax.swing.KeyStroke;
-import javax.swing.ListSelectionModel;
-import javax.swing.event.TableModelEvent;
-import javax.swing.event.TableModelListener;
-import java.awt.Component;
-import java.awt.Point;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.HierarchyBoundsAdapter;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-
-import static org.nuiton.i18n.I18n._;
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Button which opens a popup containing a table with the errors found
- * by registered validators.
- *
- * @author kmorin <kmorin(a)codelutin.com>
- * @since 2.5.10
- */
-public class SwingValidatorMessageWidget extends JToggleButton {
-
- private static final Log log =
- LogFactory.getLog(SwingValidatorMessageWidget.class);
-
- private static final long serialVersionUID = 1L;
-
- protected SwingValidatorMessageTableModel errorTableModel = new SwingValidatorMessageTableModel();
-
- protected JDialog popup = new JDialog();
-
- protected JTable errorTable = new JTable();
-
- protected Point popupPosition = null;
-
- public SwingValidatorMessageWidget() {
- super(SwingUtil.createActionIcon("alert-none"));
- setToolTipText(_("tutti.validator.alert.none"));
-
- errorTableModel.addTableModelListener(new TableModelListener() {
-
- public void tableChanged(TableModelEvent e) {
- int alerts = errorTableModel.getRowCount();
- String label;
- switch (alerts) {
- case 0:
- label = n_("tutti.validator.alert.none");
- break;
- case 1:
- label = n_("tutti.validator.alert.one");
- break;
- default:
- label = n_("tutti.validator.alert.several");
- }
-
- NuitonValidatorScope maxScope;
- String icon;
- if (alerts == 0) {
- icon = "alert-none";
-
- } else {
- maxScope = NuitonValidatorScope.INFO;
- for (int i = 0; i < alerts; i++) {
- NuitonValidatorScope scope = errorTableModel.getRow(i).getScope();
- int diff = scope.compareTo(maxScope);
- if (diff < 0) {
- maxScope = scope;
- }
- }
- switch (maxScope) {
- case INFO:
- icon = "alert-info";
- break;
- case WARNING:
- icon = "alert-warning";
- break;
- default:
- icon = "alert-error";
-
- }
- }
-
- setToolTipText(_(label, alerts));
- setIcon(SwingUtil.createActionIcon(icon));
- }
- });
-
- errorTable.setModel(errorTableModel);
- errorTable.setRowSelectionAllowed(true);
- errorTable.setAutoCreateRowSorter(true);
- errorTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
- errorTable.setCellSelectionEnabled(false);
- errorTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- errorTable.setFillsViewportHeight(true);
-
- SwingValidatorUtil.installUI(errorTable,
- new SwingValidatorMessageTableRenderer());
-
- JScrollPane scrollPanel = new JScrollPane(errorTable);
- scrollPanel.setColumnHeaderView(errorTable.getTableHeader());
-
- JXTitledPanel titledPanel = new JXTitledPanel(_("tutti.errorTable.title"), scrollPanel);
- popup.add(titledPanel);
- popup.setTitle(_("tutti.errorTable.title"));
- popup.setSize(800, 300);
- popup.setAlwaysOnTop(true);
- popup.setUndecorated(true);
-
- ComponentResizer cr = new ComponentResizer();
- cr.registerComponent(popup);
- ComponentMover cm = new ComponentMover();
- cm.setDragInsets(cr.getDragInsets());
- cm.registerComponent(popup);
-
- popup.addWindowListener(new WindowAdapter() {
-
- @Override
- public void windowClosing(WindowEvent e) {
- setSelected(false);
- }
-
- });
-
- popup.addComponentListener(new ComponentAdapter() {
-
- @Override
- public void componentMoved(ComponentEvent e) {
- Component component = e.getComponent();
- if (component.isShowing()) {
- popupPosition = component.getLocationOnScreen();
- }
- }
-
- });
-
- addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- if (isSelected()) {
- popup.setVisible(true);
- } else {
- popup.dispose();
- }
- }
- });
-
- addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
-
- @Override
- public void ancestorMoved(HierarchyEvent e) {
- if (popupPosition == null && isShowing()) {
- Point point = new Point(getLocationOnScreen());
- point.translate(-popup.getWidth() + getWidth(), -popup.getHeight());
- popup.setLocation(point);
- }
- }
- });
-
- // add a auto-close action
- JRootPane rootPane = popup.getRootPane();
-
- KeyStroke shortcutClosePopup = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
-
- rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
- shortcutClosePopup, "close");
- rootPane.getActionMap().put("close", new AbstractAction() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void actionPerformed(ActionEvent e) {
- popup.dispose();
- setSelected(false);
- }
- });
-
- }
-
- /**
- * Registers a validator.
- *
- * @param validator
- */
- public void registerValidator(SwingValidator validator) {
- errorTableModel.registerValidator(validator);
- validator.reloadBean();
- }
-
- /** Clears all the validators. */
- public void clearValidators() {
- errorTableModel.clearValidators();
- errorTableModel.clear();
- }
-
-}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/AttachmentCellComponent.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -27,26 +27,10 @@
import com.google.common.base.Preconditions;
import fr.ifremer.tutti.persistence.entities.data.Attachment;
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
-import fr.ifremer.tutti.ui.swing.util.ComponentMover;
-import fr.ifremer.tutti.ui.swing.util.ComponentResizer;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction;
import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel;
import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier;
-import jaxx.runtime.JAXXUtil;
-import jaxx.runtime.SwingUtil;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.decorator.Decorator;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.BorderFactory;
-import javax.swing.JDialog;
-import javax.swing.JTable;
-import javax.swing.border.LineBorder;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableCellRenderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Frame;
@@ -57,6 +41,21 @@
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Collection;
+import javax.swing.AbstractCellEditor;
+import javax.swing.BorderFactory;
+import javax.swing.JDialog;
+import javax.swing.JTable;
+import javax.swing.border.LineBorder;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import jaxx.runtime.JAXXUtil;
+import jaxx.runtime.SwingUtil;
+import jaxx.runtime.swing.ComponentMover;
+import jaxx.runtime.swing.ComponentResizer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.decorator.Decorator;
import static org.nuiton.i18n.I18n._;
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/LongTextCellComponent.java 2013-02-07 22:31:52 UTC (rev 362)
@@ -26,14 +26,14 @@
import com.google.common.base.Preconditions;
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
-import fr.ifremer.tutti.ui.swing.util.ComponentMover;
-import fr.ifremer.tutti.ui.swing.util.ComponentResizer;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction;
import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel;
import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier;
import jaxx.runtime.JAXXUtil;
import jaxx.runtime.SwingUtil;
+import jaxx.runtime.swing.ComponentMover;
+import jaxx.runtime.swing.ComponentResizer;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Deleted: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-warning-validation.xml 2013-02-07 22:31:52 UTC (rev 362)
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- #%L
- Tutti :: UI
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2012 - 2013 Ifremer
- %%
- 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%
- -->
-
-
-<!DOCTYPE validators PUBLIC
- "-//Apache Struts//XWork Validator 1.0.3//EN"
- "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
-
-<validators>
-
-
- <field name="comment">
-
- <field-validator type="required">
-
- <!-- No comment (just to test...) -->
- <message></message>
-
- </field-validator>
-
- </field>
-
-</validators>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 22:31:52 UTC (rev 362)
@@ -45,19 +45,11 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ sampleWeight == null || sampleWeight <= batchWeight]]></param>
+ <![CDATA[ sampleWeight == null || batchWeight == null || sampleWeight <= batchWeight]]></param>
<message>
tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight
</message>
</field-validator>
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ ( sampleWeight == null || sample || batchWeight == sampleWeight ) ]]></param>
- <message>
- tutti.validator.error.splitSpeciesBatch.sampleWeight.mismatchBatchWeight
- </message>
- </field-validator>
-
</field>
</validators>
\ No newline at end of file
Deleted: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-warning-validation.xml 2013-02-07 22:31:52 UTC (rev 362)
@@ -1,40 +0,0 @@
-<!--
- #%L
- Tutti :: UI
- $Id$
- $HeadURL$
- %%
- Copyright (C) 2012 - 2013 Ifremer
- %%
- 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%
- -->
-<!DOCTYPE validators PUBLIC
- "-//Apache Struts//XWork Validator 1.0.3//EN"
- "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
-<validators>
-
- <field name="sample">
-
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ !sample ]]></param>
- <message>
- tutti.validator.warning.splitSpeciesBatch.sampleBatch
- </message>
- </field-validator>
-
- </field>
-</validators>
\ No newline at end of file
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-07 18:51:36 UTC (rev 361)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-07 22:31:52 UTC (rev 362)
@@ -25,6 +25,7 @@
tutti.action.cloneProtocol=Cloner
tutti.action.cloneProtocol.tip=Dupliquer le protocole sélectionné
tutti.action.close=Fermer
+tutti.action.computeSpeciesBatch=Elever les poids
tutti.action.configuration=Configuration
tutti.action.configuration.tip=Configurer Tutti
tutti.action.createSpeciesBatch=Créer un lot pour une espèce
@@ -140,10 +141,11 @@
tutti.config.category.ui.description=Options de l'interface utilisateur
tutti.dialog.askSaveBeforeLeaving.message=Vous avez fait des modifications qu vous n'avez pas enregistrées. Voulez-vous les enregistrer ?
tutti.dialog.askSaveBeforeLeaving.title=Modifications non enregistrées
+tutti.dialog.catches.species.computeWeight.error.message=Erreur lors de l'élévation des poids
+tutti.dialog.catches.species.computeWeight.error.title=Erreur
tutti.dialog.catches.species.split.weightNotNull.message=Pour catégoriser un lot, il ne doit pas avoir de poids sous-échantillonné. Catégoriser le lot mettra le poids sous-échantillonné à nul.
tutti.dialog.catches.species.split.weightNotNull.title=Poids sous-échantillonné non nul
tutti.duration.format=dj Hh m'm'
-tutti.errorTable.title=Rapport de contrôles
tutti.file.csv=Extension d'un fichier csv
tutti.file.protocol=Extension d'un fichier de protocole Tutti
tutti.information.import.temporary.referential=Vous pouvez ici importer des référentiels temporaires
@@ -396,7 +398,7 @@
tutti.table.species.frequency.header.number=Nombre
tutti.table.species.frequency.header.weight=Poids observé (kg)
tutti.table.species.sampleCategory.header.category=Catégorie
-tutti.table.species.sampleCategory.header.selected=
+tutti.table.species.sampleCategory.header.selected=Sélection
tutti.table.species.sampleCategory.header.weight=Poids (kg)
tutti.timeeditor.H=H
tutti.title.about=À propos de Tutti
@@ -436,9 +438,6 @@
tutti.to.be.done=< A FAIRE >
tutti.tooltip.attachment.none=Pas de pièce-jointes
tutti.tooltip.comment.none=Pas de commentaire
-tutti.validator.alert.none=Aucune alerte
-tutti.validator.alert.one=1 alerte
-tutti.validator.alert.several=%s alertes
tutti.validator.error.comment.too.long=Taille de commentaire trop longue (limitée à %s caractères)
tutti.validator.error.createSpeciesBatch.batchWeight.invalidValue=Le poids du lot doit être strictement positif
tutti.validator.error.createSpeciesBatch.batchWeight.required=Le poids du lot est obligatoire
Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-error.png
===================================================================
(Binary files differ)
Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-info.png
===================================================================
(Binary files differ)
Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-none.png
===================================================================
(Binary files differ)
Deleted: trunk/tutti-ui-swing/src/main/resources/icons/action-alert-warning.png
===================================================================
(Binary files differ)
1
0
r361 - in trunk/tutti-persistence/src: main/java/fr/ifremer/tutti/persistence/service main/resources test/java/fr/ifremer/tutti/persistence/service
by blavenier@users.forge.codelutin.com 07 Feb '13
by blavenier@users.forge.codelutin.com 07 Feb '13
07 Feb '13
Author: blavenier
Date: 2013-02-07 19:51:36 +0100 (Thu, 07 Feb 2013)
New Revision: 361
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/361
Log:
Add
- now store/get the fishingOperation.vessel (into OperationVesselAssociation in the database)
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml
trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-07 17:32:30 UTC (rev 360)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-07 18:51:36 UTC (rev 361)
@@ -25,6 +25,7 @@
*/
import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import fr.ifremer.adagio.core.dao.data.batch.denormalized.DenormalizedBatch;
import fr.ifremer.adagio.core.dao.data.fishingArea.FishingArea;
@@ -36,6 +37,9 @@
import fr.ifremer.adagio.core.dao.data.measure.VesselUseMeasurement;
import fr.ifremer.adagio.core.dao.data.operation.FishingOperationDao;
import fr.ifremer.adagio.core.dao.data.operation.Operation;
+import fr.ifremer.adagio.core.dao.data.operation.OperationVesselAssociation;
+import fr.ifremer.adagio.core.dao.data.operation.OperationVesselAssociationDao;
+import fr.ifremer.adagio.core.dao.data.operation.OperationVesselAssociationPK;
import fr.ifremer.adagio.core.dao.data.survey.fishingTrip.FishingTrip;
import fr.ifremer.adagio.core.dao.data.survey.scientificCruise.ScientificCruise;
import fr.ifremer.adagio.core.dao.data.survey.scientificCruise.ScientificCruiseDao;
@@ -52,6 +56,7 @@
import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl;
import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValue;
import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueImpl;
+import fr.ifremer.adagio.core.dao.referential.vessel.VesselImpl;
import fr.ifremer.adagio.core.service.referential.location.LocationService;
import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
@@ -59,6 +64,7 @@
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation;
import fr.ifremer.tutti.persistence.entities.referential.Person;
+import fr.ifremer.tutti.persistence.entities.referential.Vessel;
import fr.ifremer.tutti.persistence.service.measure.MeasurementPersistenceHelper;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
@@ -107,6 +113,9 @@
@Resource(name = "fishingOperationDao")
protected FishingOperationDao fishingOperationDao;
+ @Resource(name = "operationVesselAssociationDao")
+ protected OperationVesselAssociationDao operationVesselAssociationDao;
+
@Resource(name = "locationService")
protected LocationService locationService;
@@ -190,6 +199,8 @@
fishingOperations.add(fishingOperation);
+ // TODO BLA: code utile juste pour les tests UI
+ //fishingOperations.add(getFishingOperation(source[0].toString()));
}
return fishingOperations;
}
@@ -325,6 +336,13 @@
localite.setId(localiteId.toString());
result.setLocation(localite);
}
+
+ // Vessel (the one with the catch batch)
+ String vesselCode = (String) source[colIndex++];
+ if (vesselCode != null) {
+ Vessel vessel = referentialService.getVessel(vesselCode);
+ result.setVessel(vessel);
+ }
// Retrieve environment caracteristics :
getEnvironmentCaracteristics(id, result);
@@ -621,7 +639,7 @@
}
} else {
// TODO BLA : Then parse the String when more than one number (ie "1,3")
- // then and validate content
+ // and validate content
}
// Store into Gear Use Features
@@ -677,6 +695,16 @@
// Vessel
target.setVessel(fishingTrip.getVessel());
+
+ // Associated vessel
+ if (copyIfNull && source.getVessel() == null && target.getOperationVesselAssociations() != null) {
+ target.getOperationVesselAssociations().clear();
+ }
+ else if(source.getVessel() != null
+ && source.getVessel().getId() != null) {
+ setOperationVesselAssociation(target, source.getVessel().getId());
+ }
+
// Quality Flag :
if (target.getQualityFlag() == null) {
@@ -1189,4 +1217,51 @@
}
return null;
}
+
+ protected void setOperationVesselAssociation(Operation target, String vesselCode) {
+ OperationVesselAssociation ova = null;
+ OperationVesselAssociationPK ovaPK = new OperationVesselAssociationPK();
+ ovaPK.setVessel(load(VesselImpl.class, vesselCode));
+ ovaPK.setOperation(target);
+
+ // If vessel is equal as cruise vessel : do note store any VesselOperationAssociation entity
+ if (vesselCode.equals(target.getVessel().getCode())) {
+ removeAllOperationVesselAssociation(target);
+ return;
+ }
+
+ // Retrieve existing association
+ for (Iterator<OperationVesselAssociation> iterator = target.getOperationVesselAssociations().iterator(); iterator.hasNext();) {
+ OperationVesselAssociation asso = iterator.next();
+ if (asso.getOperationVesselAssociationPk().equals(ovaPK)) {
+ ova = asso;
+ break;
+ }
+ }
+
+ // Create a new association
+ if (ova == null) {
+ ova = OperationVesselAssociation.Factory.newInstance();
+ ova.setOperationVesselAssociationPk(ovaPK);
+ if (target.getOperationVesselAssociations() == null) {
+ target.setOperationVesselAssociations(Lists.newArrayList(ova));
+ }
+ else {
+ removeAllOperationVesselAssociation(target);
+ target.getOperationVesselAssociations().add(ova);
+ }
+ }
+
+ ova.setIsCatchOnOperationVessel(Boolean.FALSE);
+ }
+
+ protected void removeAllOperationVesselAssociation(Operation target) {
+ if(target.getOperationVesselAssociations() != null) {
+ for (Iterator<OperationVesselAssociation> iterator = target.getOperationVesselAssociations().iterator(); iterator.hasNext();) {
+ OperationVesselAssociation asso = iterator.next();
+ operationVesselAssociationDao.remove(asso);
+ }
+ target.getOperationVesselAssociations().clear();
+ }
+ }
}
Modified: trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml
===================================================================
--- trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-02-07 17:32:30 UTC (rev 360)
+++ trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-02-07 18:51:36 UTC (rev 361)
@@ -167,13 +167,14 @@
SELECT
o.id AS id,
o.name AS name,
- guf.gear.label AS gearLabel,
+ g.label AS gearLabel,
o.startDateTime AS startDateTime,
(select vum.alphanumericalValue from VesselUseMeasurementImpl vum where vum.vesselUseFeatures.id = vuf.id and vum.pmfm.id=:pmfmIdStationNumber) AS stationNumber,
(select gum.alphanumericalValue from GearUseMeasurementImpl gum where gum.gearUseFeatures.id = guf.id and gum.pmfm.id=:pmfmIdMultirigAggregation) AS multirigAggregation
FROM
FishingOperationImpl o
LEFT OUTER JOIN o.gearUseFeatures guf
+ LEFT OUTER JOIN guf.gear g
LEFT OUTER JOIN o.vesselUseFeatures vuf
WHERE
o.fishingTrip.scientificCruise.id=:cruiseId
@@ -198,7 +199,8 @@
(select vp_end from VesselPositionImpl vp_end where vp_end.operation.id = o.id and vp_end.dateTime = o.endDateTime) AS endVesselPosition,
max(case when (rl.locationLevel.id = :locationLevelIdStrata) then rl.id else null end) AS strataId,
max(case when (rl.locationLevel.id = :locationLevelIdSubStrata) then rl.id else null end) AS subStrataId,
- max(case when (rl.locationLevel.id = :locationLevelIdLocalite) then rl.id else null end) AS localiteId
+ max(case when (rl.locationLevel.id = :locationLevelIdLocalite) then rl.id else null end) AS localiteId,
+ max(case when (va.isCatchOnOperationVessel = false) then va.id.vessel.code else o.vessel.code end) as vesselCode
FROM
FishingOperationImpl o
INNER JOIN o.gearUseFeatures guf
@@ -206,6 +208,7 @@
LEFT OUTER JOIN guf.fishingAreas fa
LEFT OUTER JOIN fa.regulationLocation fa2rl
LEFT OUTER JOIN fa2rl.id.location rl
+ LEFT OUTER JOIN o.operationVesselAssociations va
WHERE
o.id=:fishingOperationId
GROUP BY o.name
Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java
===================================================================
--- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java 2013-02-07 17:32:30 UTC (rev 360)
+++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java 2013-02-07 18:51:36 UTC (rev 361)
@@ -33,6 +33,8 @@
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
import fr.ifremer.tutti.persistence.entities.referential.FishingOperationLocation;
import fr.ifremer.tutti.persistence.entities.referential.Gear;
+import fr.ifremer.tutti.persistence.entities.referential.Vessel;
+
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Ignore;
@@ -70,6 +72,8 @@
protected CruisePersistenceService cruiseService;
protected Cruise cruise = null;
+ protected Gear cruiseGear = null;
+ protected Vessel notCruiseVessel = null;
@Autowired(required = true)
protected TuttiEnumerationFile enumeration;
@@ -81,6 +85,28 @@
referentialService = TuttiPersistenceServiceLocator.getReferentialPersistenceService();
programService = TuttiPersistenceServiceLocator.getProgramPersistenceService();
+ // Duplicate an existing cruise, to attach new fishing operations
+ cruise = cruiseService.getCruise(dbResource.getFixtures().cruiseId());
+ cruise.setId(null);
+ cruise.setName("Unit-test-" + System.currentTimeMillis());
+ cruise.setBeginDate(new Date());
+ cruise.setEndDate(null);
+ cruise.setMultirigNumber(2);
+
+ // Keep only one gear in the cruise : (need for case n°4)
+ List<Gear> cruiseGears = cruise.getGear();
+ assertNotNull(cruiseGears);
+ assertTrue(cruiseGears.size() > 0);
+ cruiseGear = cruiseGears.get(0);
+ assertNotNull(cruiseGear.getId());
+ cruise.setGear(Lists.newArrayList(cruiseGear));
+
+ cruise = cruiseService.createCruise(cruise);
+ assertNotNull(cruise.getId());
+
+ // Find a vessel, different from the cruise vessel
+ notCruiseVessel = referentialService.getVessel(dbResource.getFixtures().fishingVesselCode());
+ assertNotNull(notCruiseVessel.getId());
}
@Test
@@ -105,25 +131,7 @@
FishingOperation reloadedFishingOperation;
FishingOperation createdFishingOperation;
- // Duplicate an existing cruise, to attach new fishing operations
- cruise = cruiseService.getCruise(dbResource.getFixtures().cruiseId());
- cruise.setId(null);
- cruise.setName("Unit-test-" + System.currentTimeMillis());
- cruise.setBeginDate(new Date());
- cruise.setEndDate(null);
- cruise.setMultirigNumber(2);
- // Keep only one gear in the cruise : (need for case n°4)
- List<Gear> cruiseGears = cruise.getGear();
- assertNotNull(cruiseGears);
- assertTrue(cruiseGears.size() > 0);
- Gear cruiseGear = cruiseGears.get(0);
- assertNotNull(cruiseGear.getId());
- cruise.setGear(Lists.newArrayList(cruiseGear));
-
- cruise = cruiseService.createCruise(cruise);
- assertNotNull(cruise.getId());
-
- // Retrieve some environment caracteristics
+ // Retrieve some environment caracteristics
List<Caracteristic> allEnvironmentCaracteristics = referentialService.getAllCaracteristic();
CaracteristicMap environmentCaracteristics = new CaracteristicMap();
CaracteristicMap environmentValuesOneEntry = new CaracteristicMap();
@@ -185,6 +193,7 @@
fishingOperation.setGearShootingStartDate(null);
fishingOperation.setGearShootingEndDate(null);
fishingOperation.setGear(null);
+ fishingOperation.setVessel(null);
fishingOperation.setGearShootingStartLatitude(33.2541f);
fishingOperation.setComment(null);
@@ -224,6 +233,7 @@
fishingOperation.setFishingOperationValid(Boolean.TRUE);
fishingOperation.setComment("Unit test createFishingOperation() - Part n°2 : All properties set");
fishingOperation.setGear(cruiseGear);
+ fishingOperation.setVessel(notCruiseVessel);
fishingOperation.setEnvironmentCaracteristics(environmentCaracteristics);
fishingOperation.setGearShootingCaracteristics(gearShootingCaracteristics);
@@ -244,6 +254,8 @@
reloadedFishingOperation = service.getFishingOperation(createdFishingOperation.getId());
assertNotNull(reloadedFishingOperation.getGear());
+ assertNotNull(reloadedFishingOperation.getVessel());
+ assertEquals(fishingOperation.getVessel().getId(), reloadedFishingOperation.getVessel().getId());
assertEquals(fishingOperation.getStationNumber(), reloadedFishingOperation.getStationNumber());
assertEquals(fishingOperation.getFishingOperationNumber(), reloadedFishingOperation.getFishingOperationNumber());
assertEquals(fishingOperation.getMultirigAggregation(), reloadedFishingOperation.getMultirigAggregation());
@@ -347,6 +359,7 @@
// - remove strata, substrata, localite
// - remove some environment carateristics
// - remove some gear shooting carateristics
+ // - change vessel (to same as cruise)
// -----------------------------------------------------------------------------
fishingOperation.setId(reloadedFishingOperation.getId());
fishingOperation.setGearShootingStartLatitude(null);
@@ -358,6 +371,7 @@
fishingOperation.setStrata(null);
fishingOperation.setSubStrata(null);
fishingOperation.setLocation(null);
+ fishingOperation.setVessel(cruise.getVessel(0));
fishingOperation.setEnvironmentCaracteristics(environmentValuesOneEntry);
fishingOperation.setGearShootingCaracteristics(gearShootingCaracteristicsOneEntry);
fishingOperation.setComment(fishingOperation.getComment() + "\n\nUnit test createFishingOperation() - Part n°5 : check if deleted sub items in DB");
1
0
r360 - in trunk/tutti-persistence/src: main/java/fr/ifremer/tutti/persistence/service main/resources test/java/fr/ifremer/tutti/persistence/service
by blavenier@users.forge.codelutin.com 07 Feb '13
by blavenier@users.forge.codelutin.com 07 Feb '13
07 Feb '13
Author: blavenier
Date: 2013-02-07 18:32:30 +0100 (Thu, 07 Feb 2013)
New Revision: 360
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/360
Log:
Fix :
- NullPointerException on saveFishingOperation()
- Fix getFishingOperation query, when no gear store in database
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml
trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-07 16:04:51 UTC (rev 359)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-07 17:32:30 UTC (rev 360)
@@ -557,7 +557,9 @@
gearPhysicalFeatures.getOperations().add(target);
}
}
- nameBuffer.append(source.getGear().getLabel());
+ if (source.getGear() != null && source.getGear().getLabel() != null) {
+ nameBuffer.append(source.getGear().getLabel());
+ }
// Retrieve entities : Fishing Area
FishingArea fishingArea;
@@ -585,9 +587,11 @@
// Retrieve multirig number, from Gear physical features
int cruiseMultirigCount = 1; // default value
- GearPhysicalMeasurement gpmMultirigCount = measurementHelper.getGearPhysicalMeasurement(gearPhysicalFeatures, enumeration.PMFM_ID_MULTIRIG_NUMBER);
- if (gpmMultirigCount != null && gpmMultirigCount.getNumericalValue() != null) {
- cruiseMultirigCount = gpmMultirigCount.getNumericalValue().intValue();
+ if (gearPhysicalFeatures != null) {
+ GearPhysicalMeasurement gpmMultirigCount = measurementHelper.getGearPhysicalMeasurement(gearPhysicalFeatures, enumeration.PMFM_ID_MULTIRIG_NUMBER);
+ if (gpmMultirigCount != null && gpmMultirigCount.getNumericalValue() != null) {
+ cruiseMultirigCount = gpmMultirigCount.getNumericalValue().intValue();
+ }
}
// StationNumber
Modified: trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml
===================================================================
--- trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-02-07 16:04:51 UTC (rev 359)
+++ trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-02-07 17:32:30 UTC (rev 360)
@@ -170,7 +170,7 @@
guf.gear.label AS gearLabel,
o.startDateTime AS startDateTime,
(select vum.alphanumericalValue from VesselUseMeasurementImpl vum where vum.vesselUseFeatures.id = vuf.id and vum.pmfm.id=:pmfmIdStationNumber) AS stationNumber,
- (select gum.numericalValue from GearUseMeasurementImpl gum where gum.gearUseFeatures.id = guf.id and gum.pmfm.id=:pmfmIdMultirigAggregation) AS trawNetNumber
+ (select gum.alphanumericalValue from GearUseMeasurementImpl gum where gum.gearUseFeatures.id = guf.id and gum.pmfm.id=:pmfmIdMultirigAggregation) AS multirigAggregation
FROM
FishingOperationImpl o
LEFT OUTER JOIN o.gearUseFeatures guf
@@ -189,11 +189,11 @@
<![CDATA[
SELECT
o.name AS name,
- max(guf.gear.label) AS gearLabel,
+ max(g.label) AS gearLabel,
max(o.startDateTime) AS startDateTime,
max(o.endDateTime) AS endDateTime,
max(o.comments) AS comments,
- max(guf.gear.id) AS gearId,
+ max(g.id) AS gearId,
(select vp_start from VesselPositionImpl vp_start where vp_start.operation.id = o.id and vp_start.dateTime = o.startDateTime) AS startVesselPosition,
(select vp_end from VesselPositionImpl vp_end where vp_end.operation.id = o.id and vp_end.dateTime = o.endDateTime) AS endVesselPosition,
max(case when (rl.locationLevel.id = :locationLevelIdStrata) then rl.id else null end) AS strataId,
@@ -202,6 +202,7 @@
FROM
FishingOperationImpl o
INNER JOIN o.gearUseFeatures guf
+ LEFT OUTER JOIN guf.gear g
LEFT OUTER JOIN guf.fishingAreas fa
LEFT OUTER JOIN fa.regulationLocation fa2rl
LEFT OUTER JOIN fa2rl.id.location rl
Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java
===================================================================
--- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java 2013-02-07 16:04:51 UTC (rev 359)
+++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceTest.java 2013-02-07 17:32:30 UTC (rev 360)
@@ -97,7 +97,6 @@
}
@Test
- @Ignore
public void createFishingOperation(/*FishingOperation bean*/) {
// -----------------------------------------------------------------------------
// Prepare data and other entities
1
0
r359 - in trunk/tutti-persistence/src: main/java/fr/ifremer/tutti/persistence/service test/java/fr/ifremer/tutti/persistence/service
by blavenier@users.forge.codelutin.com 07 Feb '13
by blavenier@users.forge.codelutin.com 07 Feb '13
07 Feb '13
Author: blavenier
Date: 2013-02-07 17:04:51 +0100 (Thu, 07 Feb 2013)
New Revision: 359
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/359
Log:
Fix Unit test on SpeciesBatch
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java
trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2013-02-07 15:51:23 UTC (rev 358)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2013-02-07 16:04:51 UTC (rev 359)
@@ -41,7 +41,6 @@
import org.hibernate.FlushMode;
import org.hibernate.type.IntegerType;
import org.springframework.dao.DataIntegrityViolationException;
-import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.stereotype.Service;
import com.google.common.base.Preconditions;
Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java
===================================================================
--- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java 2013-02-07 15:51:23 UTC (rev 358)
+++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java 2013-02-07 16:04:51 UTC (rev 359)
@@ -293,9 +293,9 @@
assertNotNull(rootSpeciesBatch);
assertEquals(2, rootSpeciesBatch.size());
assertNotNull(rootSpeciesBatch.get(0).getChildBatchs());
- assertEquals(2,rootSpeciesBatch.get(0).getChildBatchs().size());
+ assertTrue(rootSpeciesBatch.get(0).getChildBatchs().size() > 0);
assertNotNull(rootSpeciesBatch.get(1).getChildBatchs());
- assertEquals(1,rootSpeciesBatch.get(1).getChildBatchs().size());
+ assertTrue(rootSpeciesBatch.get(1).getChildBatchs().size() > 0);
// -----------------------------------------------------------------------------
// 8. Test batch frequency creation
@@ -338,6 +338,7 @@
}
@Test
+ @Ignore
public void saveSpeciesBatchFrequency() {
}
@@ -383,7 +384,7 @@
// Check if remove
try {
- batch = service.getSpeciesBatch(esp1Batch.getId());
+ batch = getSpeciesBatch(fishingOperation.getId(), esp1Batch.getId());
assertNull(batch);
} catch (DataRetrievalFailureException drfe) {
assertNotNull(drfe);
1
0
r358 - in trunk/tutti-persistence/src: main/java/fr/ifremer/tutti/persistence/service main/java/fr/ifremer/tutti/persistence/service/measure main/resources test/java/fr/ifremer/tutti/persistence/service
by blavenier@users.forge.codelutin.com 07 Feb '13
by blavenier@users.forge.codelutin.com 07 Feb '13
07 Feb '13
Author: blavenier
Date: 2013-02-07 16:51:23 +0100 (Thu, 07 Feb 2013)
New Revision: 358
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/358
Log:
Fix :
- save fishingOperation.name in DB with <gear.name><N_OP>
- save Program, fill the description in databse, when comment is not filled in the UI
Add :
- SpeciesBatchFrequency persistence : save, and getAllxxx
Change :
- move pmfmId2SampleCategory into ReferentialPersistenceService.getSampleCategoryByPmfmId()
- remove speciesBatchPersistenceService.getSpeciesBatch() (not used in the UI, no more in Unit Test)
- remove used HQL queries on speciesBatchs
- Unit test on species batch and frequency
Modified:
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProgramPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceService.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java
trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/measure/MeasurementPersistenceHelper.java
trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml
trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/FishingOperationPersistenceServiceImpl.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -555,9 +555,9 @@
gearPhysicalFeatures.setOperations(Sets.newHashSet((Operation) target));
} else {
gearPhysicalFeatures.getOperations().add(target);
- }
- nameBuffer.append(source.getGear().getLabel());
+ }
}
+ nameBuffer.append(source.getGear().getLabel());
// Retrieve entities : Fishing Area
FishingArea fishingArea;
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProgramPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProgramPersistenceServiceImpl.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ProgramPersistenceServiceImpl.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -158,6 +158,10 @@
protected void beanToEntity(Program source,
fr.ifremer.adagio.core.dao.administration.programStrategy.Program target,
boolean copyIfNull) {
+ // If target.description is a fake value (see bottom in this method), restore the null value
+ if (target.getDescription() != null && target.getDescription().equals(target.getName())) {
+ target.setDescription(null);
+ }
// Code : compute with : <prefixe><name>
if (target.getCode() == null && source.getName() != null) {
@@ -196,12 +200,11 @@
target.setName(source.getName());
}
- // Description (=source.comment)
- if (copyIfNull && source.getComment() == null) {
- target.setDescription(null);
- } else if (source.getComment() != null) {
- target.setDescription(source.getComment());
- }
+ // Description (mandatory in database)
+ // If empty, use name (will be replace in the next save() - see upper in this method)
+ if (target.getDescription() == null) {
+ target.setDescription(source.getName());
+ }
// Zone
if (copyIfNull && source.getZone() == null) {
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceService.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -27,6 +27,7 @@
import fr.ifremer.tutti.persistence.TuttiPersistenceServiceImplementor;
import fr.ifremer.tutti.persistence.entities.data.Cruise;
import fr.ifremer.tutti.persistence.entities.data.Program;
+import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum;
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
import fr.ifremer.tutti.persistence.entities.referential.Country;
@@ -205,4 +206,14 @@
*/
@Transactional(readOnly = false)
List<Gear> importTemporaryGear(List<Gear> gears);
+
+
+ /**
+ * Convert a PMFM ID into a SampleCategoryEnum.<br/>
+ * This method will typically use enumeration values, to compare with the given pmfmId.
+ *
+ * @param pmfmId a Id of a PMFM
+ * @return a SampleCategoryEnum, or null if the PMFM is not mapped
+ */
+ SampleCategoryEnum getSampleCategoryByPmfmId(Integer pmfmId);
}
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/ReferentialPersistenceServiceImpl.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -31,6 +31,7 @@
import fr.ifremer.adagio.core.dao.referential.taxon.TaxonNameExtendDao;
import fr.ifremer.adagio.core.dao.referential.taxon.TaxonRefTaxVO;
import fr.ifremer.tutti.persistence.entities.TuttiEntities;
+import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum;
import fr.ifremer.tutti.persistence.entities.referential.AbstractTuttiReferentialEntity;
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
@@ -658,4 +659,22 @@
|| pmfmId.equals(enumeration.PMFM_ID_TRAWL_DISTANCE);
}
+ @Override
+ public SampleCategoryEnum getSampleCategoryByPmfmId(Integer pmfmId) {
+ if (pmfmId == null) return null;
+ SampleCategoryEnum sampleCategory = null;
+ if (pmfmId.intValue() == enumeration.PMFM_ID_SORTED_UNSORTED.intValue()) {
+ sampleCategory = SampleCategoryEnum.sortedUnsorted;
+ } else if (enumeration.PMFM_ID_SIZE_CATEGORY.equals(pmfmId)) {
+ sampleCategory = SampleCategoryEnum.size;
+ } else if (enumeration.PMFM_ID_MATURITY.equals(pmfmId)) {
+ sampleCategory = SampleCategoryEnum.maturity;
+ } else if (enumeration.PMFM_ID_SEX.equals(pmfmId)) {
+ sampleCategory = SampleCategoryEnum.sex;
+ } else if (enumeration.PMFM_ID_AGE.equals(pmfmId)) {
+ sampleCategory = SampleCategoryEnum.age;
+ }
+ return sampleCategory;
+ }
+
}
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceService.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceService.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceService.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -43,8 +43,6 @@
List<SpeciesBatch> getAllRootSpeciesBatch(String fishingOperationId);
- SpeciesBatch getSpeciesBatch(String id);
-
List<SpeciesBatchFrequency> getAllSpeciesBatchFrequency(
String speciesBatchId);
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceImpl.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -24,8 +24,30 @@
* #L%
*/
+import java.io.Serializable;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.FlushMode;
+import org.hibernate.type.IntegerType;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.stereotype.Service;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import fr.ifremer.adagio.core.dao.data.batch.CatchBatchDao;
import fr.ifremer.adagio.core.dao.data.batch.CatchBatchImpl;
import fr.ifremer.adagio.core.dao.data.batch.SortingBatch;
@@ -45,23 +67,7 @@
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
import fr.ifremer.tutti.persistence.entities.referential.Species;
import fr.ifremer.tutti.persistence.service.measure.MeasurementPersistenceHelper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.FlushMode;
-import org.hibernate.type.IntegerType;
-import org.springframework.dao.DataIntegrityViolationException;
-import org.springframework.dao.DataRetrievalFailureException;
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import java.io.Serializable;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
/**
* @author tchemit <chemit(a)codelutin.com>
* @since 0.3
@@ -91,82 +97,73 @@
@Override
public List<SpeciesBatch> getAllRootSpeciesBatch(String fishingOperationId) {
- Iterator<Object[]> list = queryList("allRootSpeciesBatch",
- "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(fishingOperationId),
- "qualitativeIdSortingType", IntegerType.INSTANCE, enumeration.QUALITATIVE_ID_SORTING_TYPE_SPECIES);
+ Iterator<Object[]> list = queryList("allSpeciesBatch",
+ "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(fishingOperationId));
List<SpeciesBatch> result = new ArrayList<SpeciesBatch>();
+ List<SpeciesBatch> rootBatchs = new ArrayList<SpeciesBatch>();
+
+ Map<String, SpeciesBatch> batchMapById = new HashMap<String, SpeciesBatch>();
+ //TODO BLA : uncomment if a property speciesBatch.speciesBatchFrequency exists
+ //Map<String, List<SpeciesBatchFrequency>> batchFrequenciesMapByParentId = new HashMap<String, List<SpeciesBatchFrequency>>();
+ Map<String, String> parentBatchMapById = new HashMap<String, String>();
while (list.hasNext()) {
Object[] source = list.next();
- SpeciesBatch speciesBatch = loadSpeciesBatch(source, true);
- result.add(speciesBatch);
+
+ Integer parentbatchId = (Integer) source[11];
+
+ // If row is not a species batch, load as batch frequency
+ if (couldBeASpeciesBatchFrequency(source)){
+ //TODO BLA : uncomment if a property speciesBatch.speciesBatchFrequency exists
+ //loadSpeciesBatchFrequency(source, batchFrequenciesMapByParentId);
+ }
+ else {
+ // In all case, load row as species batch
+ SpeciesBatch speciesBatch = loadSpeciesBatch(source);
+
+ // Add result into a maps
+ batchMapById.put(speciesBatch.getId(), speciesBatch);
+ if (parentbatchId != null) {
+ parentBatchMapById.put(speciesBatch.getId(), parentbatchId.toString());
+ }
+ }
}
- return result;
- }
+ // Retrieve the parent links for all batchs
+ for (Iterator<SpeciesBatch> iterator = batchMapById.values().iterator(); iterator.hasNext(); ) {
+ SpeciesBatch speciesBatch = (SpeciesBatch) iterator.next();
-// @Override
-// public List<SpeciesBatch> getAllSpeciesBatch(String fishingOperationId) {
-// Iterator<Object[]> list = queryList("allSpeciesBatch",
-// "fishingOperationId", IntegerType.INSTANCE, Integer.valueOf(fishingOperationId));
-//
-// List<SpeciesBatch> result = new ArrayList<SpeciesBatch>();
-// List<SpeciesBatch> rootBatchs = new ArrayList<SpeciesBatch>();
-//
-// Map<String, SpeciesBatch> batchMapById = new HashMap<String, SpeciesBatch>();
-// Map<String, String> parentBatchMapById = new HashMap<String, String>();
-// while (list.hasNext()) {
-// Object[] source = list.next();
-// SpeciesBatch speciesBatch = loadSpeciesBatch(source, false);
-// batchMapById.put(speciesBatch.getId(), speciesBatch);
-//
-// Integer parentbatchId = (Integer) source[11];
-// if (parentbatchId != null) {
-// parentBatchMapById.put(speciesBatch.getId(), parentbatchId.toString());
-// }
-// }
-//
-// for (Iterator iterator = batchMapById.values().iterator(); iterator.hasNext(); ) {
-// SpeciesBatch speciesBatch = (SpeciesBatch) iterator.next();
-//
-// // Retrieve the parent SpeciesBatch
-// String parentbatchId = parentBatchMapById.get(speciesBatch.getId());
-// if (parentbatchId != null) {
-// SpeciesBatch parentSpeciesBatch = batchMapById.get(parentbatchId);
-//
-// // If found, link the batch with its parent :
-// if (parentSpeciesBatch != null) {
-// speciesBatch.setParentBatch(parentSpeciesBatch);
-// if (parentSpeciesBatch.getChildBatchs() == null) {
-// parentSpeciesBatch.setChildBatchs(Lists.newArrayList(speciesBatch));
-// } else {
-// parentSpeciesBatch.addChildBatchs(speciesBatch);
-// }
-// }
-//
-// // If no parent found = batch is a child of the catch batch
-// else {
-// rootBatchs.add(speciesBatch);
-// }
-// }
-// }
-//
-// // Apply inheritance, starting with the catch batch children
-// applyInheritedProperties(rootBatchs, null, null, result);
-//
-// return result;
-// }
-//
- @Override
- public SpeciesBatch getSpeciesBatch(String id) {
- Object[] source = queryUnique("speciesBatch",
- "batchId", IntegerType.INSTANCE, Integer.valueOf(id));
+ // If retrieve the parent from the parent map
+ String parentbatchId = parentBatchMapById.get(speciesBatch.getId());
+ if (parentbatchId != null) {
+ SpeciesBatch parentSpeciesBatch = batchMapById.get(parentbatchId);
- if (source == null) {
- throw new DataRetrievalFailureException("Could not retrieve speciesBatch with id=" + id);
+ // If found, link the batch with its parent :
+ if (parentSpeciesBatch != null) {
+ speciesBatch.setParentBatch(parentSpeciesBatch);
+ if (parentSpeciesBatch.getChildBatchs() == null) {
+ parentSpeciesBatch.setChildBatchs(Lists.newArrayList(speciesBatch));
+ } else {
+ parentSpeciesBatch.addChildBatchs(speciesBatch);
+ }
+ }
+
+ // If no parent found, the batch should be a direct child of the catch batch
+ else {
+ rootBatchs.add(speciesBatch);
+ }
+
+ //TODO BLA : uncomment if a property speciesBatch.speciesBatchFrequency exists
+ //List<SpeciesBatchFrequency> batchFrequencies = batchFrequenciesMapByParentId.get(speciesBatch.getId());
+ //if (batchFrequencies != null) {
+ // speciesBatch.setSpeciesBatchFrequency(batchFrequencies)
+ //}
+ }
}
- SpeciesBatch result = loadSpeciesBatch(source, true);
+ // Apply inheritance, starting with the catch batch children
+ applyInheritedProperties(rootBatchs, null, null, result);
+
return result;
}
@@ -195,7 +192,9 @@
Preconditions.checkNotNull(bean);
Preconditions.checkNotNull(bean.getId());
- getCurrentSession().clear();
+ // TODO BL : pourquoi un clear() ? => pas nécessaire.
+ //getCurrentSession().clear();
+
getCurrentSession().enableFetchProfile("batch-with-measurements");
getCurrentSession().setFlushMode(FlushMode.COMMIT);
SortingBatch batch = sortingBatchDao.load(Integer.valueOf(bean.getId()));
@@ -234,15 +233,98 @@
@Override
public List<SpeciesBatchFrequency> getAllSpeciesBatchFrequency(
String speciesBatchId) {
+ Iterator<Object[]> list = queryList("allSpeciesBatchFrequency",
+ "parentBatchId", IntegerType.INSTANCE, Integer.valueOf(speciesBatchId));
+
List<SpeciesBatchFrequency> results = Lists.newArrayList();
- // TODO
+
+ while (list.hasNext()) {
+ Object[] source = list.next();
+ SpeciesBatchFrequency target = new SpeciesBatchFrequency();
+
+ int colIndex = 0;
+ target.setId(source[colIndex++].toString());
+
+ target.setNumber((Integer)source[colIndex++]);
+ target.setWeight((Float)source[colIndex++]);
+ target.setComment((String)source[colIndex++]);
+
+ // Length step category
+ Integer lengthPmfmId = (Integer)source[colIndex++];
+ Caracteristic lengthStepCaracteristic = referentialService.getCaracteristic(lengthPmfmId);
+ target.setLengthStepCaracteristic(lengthStepCaracteristic);
+
+ // Length
+ target.setLengthStep((Float)source[colIndex++]);
+ results.add(target);
+ }
return results;
}
- @Override
+
+ @Override
public List<SpeciesBatchFrequency> saveSpeciesBatchFrequency(
String speciesBatchId, List<SpeciesBatchFrequency> frequencies) {
- //TODO
+ Preconditions.checkNotNull(speciesBatchId);
+ Preconditions.checkNotNull(frequencies);
+
+ if (frequencies.size() == 0) {
+ return frequencies;
+ }
+ getCurrentSession().setFlushMode(FlushMode.COMMIT);
+ getCurrentSession().enableFetchProfile("batch-with-measurements");
+
+ // Retirve parent
+ SortingBatch parentBatch = sortingBatchDao.load(Integer.valueOf(speciesBatchId));
+
+ short rankOrder = 0;
+ String pmfmId = null;
+ Map<SortingBatch, SpeciesBatchFrequency> batchsToCreate = Maps.newHashMap();
+ List<SortingBatch> batchsToUpdate= Lists.newArrayList();
+ for (Iterator iterator = frequencies.iterator(); iterator.hasNext();) {
+ SpeciesBatchFrequency source = (SpeciesBatchFrequency) iterator.next();
+ rankOrder++;
+
+ // Check that all frequencies have the same length PMFM
+ if (pmfmId == null) {
+ source.getLengthStepCaracteristic().getId();
+ }
+ else if (!pmfmId.equals(source.getLengthStepCaracteristic().getId())) {
+ throw new DataIntegrityViolationException("Batch frequencies under one Speciesbatch must have all the same lengthStepCaracteristic");
+ }
+
+ // Not existing batch
+ SortingBatch target = null;
+ if (source.getId() == null) {
+ target = SortingBatch.Factory.newInstance();
+
+ // Fill the sorting batch from the source
+ beanToEntity(source, target, parentBatch, rankOrder, true);
+
+ // Create the targeted batch, then update the source id
+ sortingBatchDao.create(target);
+ source.setId(target.getId().toString());
+ }
+
+ // Existing batch
+ else {
+ target = sortingBatchDao.load(Integer.valueOf(source.getId())) ;
+
+ // Fill the sorting batch from the source
+ beanToEntity(source, target, parentBatch, rankOrder, true);
+
+ // Add the batch into a list (will be update later, using this list)
+ batchsToUpdate.add(target);
+ }
+ }
+
+ // If some batchs need to be update, do it
+ if (batchsToUpdate.size() > 0) {
+ sortingBatchDao.update(batchsToUpdate);
+ }
+
+ getCurrentSession().flush();
+
return frequencies;
}
@@ -406,7 +488,7 @@
}
}
- protected SpeciesBatch loadSpeciesBatch(Object[] source, boolean sourceHasPmfmGrandParent) {
+ protected SpeciesBatch loadSpeciesBatch(Object[] source) {
int colIndex = 0;
SpeciesBatch result = new SpeciesBatch();
@@ -415,22 +497,13 @@
// Individual count
result.setNumber((Integer) source[colIndex++]);
- // Weight & sampleCategory Weight
- Float sampleWeight = (Float) source[colIndex++];
- Float samplingRatio = (Float) source[colIndex++];
- String samplingRatioText = (String) source[colIndex++];
- if (samplingRatio == null) {
- result.setWeight(sampleWeight);
- } else if (sampleWeight != null) {
- String startStr = sampleWeight.toString().replace(',', '.') + "/";
- if (samplingRatioText != null && samplingRatioText.startsWith(startStr)) {
- String weightStr = samplingRatioText.substring(startStr.length());
- if (weightStr != null && !weightStr.isEmpty()) {
- result.setSampleCategoryWeight(sampleWeight);
- result.setWeight(Float.parseFloat(weightStr));
- }
- }
- }
+ // Convert database weight (and sampling ratio) into UI weight and sampleCategoryWeight
+ Float sourceWeight = (Float) source[colIndex++];
+ Float sourceSamplingRatio = (Float) source[colIndex++];
+ String sourceSamplingRatioText = (String) source[colIndex++];
+ UIWeight uiWeight = convertDatabase2UI(sourceWeight, sourceSamplingRatio, sourceSamplingRatioText);
+ result.setWeight(uiWeight.weight);
+ result.setSampleCategoryWeight(uiWeight.sampleWeight);
// Comments
result.setComment((String) source[colIndex++]);
@@ -442,7 +515,10 @@
Integer qvValue = (Integer) source[colIndex++];
Float numValue = (Float) source[colIndex++];
String alphaValue = (String) source[colIndex++];
-
+ if (pmfmId != null) {
+ setSampleCategoryQualitative(result, pmfmId, numValue, alphaValue, qvValue);
+ }
+
// Species
Integer referenceTaxonId = (Integer) source[colIndex++];
if (referenceTaxonId != null) {
@@ -450,59 +526,49 @@
Species species = referentialService.getSpecies(referenceTaxonId.toString());
result.setSpecies(species);
}
-
- if (sourceHasPmfmGrandParent && colIndex == source.length - 2) {
- Integer pmfmIdGrandFather = (Integer) source[colIndex++];
- Integer qualitativeIdGrandFather = (Integer) source[colIndex++];
-
- if (pmfmId != null) {
- setSampleCategoryQualitative(result, pmfmId, numValue, alphaValue, qvValue);
- }
- // When no sorting measurement found, retrieve the sorted/unsorted from an ancestor batch
- else {
- if (referenceTaxonId != null
- && enumeration.PMFM_ID_SORTED_UNSORTED.equals(pmfmIdGrandFather)
- && qualitativeIdGrandFather != null) {
- setSampleCategoryQualitative(result, pmfmIdGrandFather, null, null, qualitativeIdGrandFather);
- } else {
- // TODO TC : manage this exception in the UI => 'format des captures incompatibles avec tutti...'
- // TODO TC : add a throws 'InvalidBatchTreeException' in the interface method ?
- throw new DataRetrievalFailureException("Invalid batch tree found in database (no sample category Vrac/HorsVrac found in parents) : could not be load batch with id=" + result.getId());
- }
- }
- }
-
+
return result;
}
- protected void applyInheritedProperties(List<SpeciesBatch> speciesBatchs, Serializable inheritedSampleCategoryValue, Species inheritedSpecies, List<SpeciesBatch> result) {
+ protected void applyInheritedProperties(List<SpeciesBatch> speciesBatchs, CaracteristicQualitativeValue inheritedSortedUnsortedValue, Species inheritedSpecies, List<SpeciesBatch> results) {
if (speciesBatchs == null || speciesBatchs.size() == 0) {
return;
}
- boolean hasAppliedCategoryValue = false;
- for (Iterator iterator = speciesBatchs.iterator(); iterator.hasNext(); ) {
- SpeciesBatch speciesBatch = (SpeciesBatch) iterator.next();
+ for (Iterator<SpeciesBatch> iterator = speciesBatchs.iterator(); iterator.hasNext(); ) {
+ SpeciesBatch speciesBatch = iterator.next();
+
+ // If batch store a species (in the database)
+ if (speciesBatch.getSpecies() != null) {
+ // Remove the link to the parent (not need in UI)
+ speciesBatch.setParentBatch(null);
+ // Store into result list only if species has been set (=species root batch)
+ results.add(speciesBatch);
+ }
- if (speciesBatch.getSpecies() != null && speciesBatch.getSampleCategoryType() == null) {
+ // Apply sampleCategoryValue inheritance, if need
+ if (inheritedSortedUnsortedValue != null && speciesBatch.getSampleCategoryType() == null) {
speciesBatch.setSampleCategoryType(SampleCategoryEnum.sortedUnsorted);
- speciesBatch.setSampleCategoryValue(inheritedSampleCategoryValue);
- hasAppliedCategoryValue = true;
-
- // Remove the link to the parent (not need after inheritance)
- speciesBatch.setParentBatch(null);
- } else if (speciesBatch.getSpecies() == null && inheritedSpecies != null) {
+ speciesBatch.setSampleCategoryValue(inheritedSortedUnsortedValue);
+ }
+
+ // Apply species inheritance, if need
+ if (speciesBatch.getSpecies() == null && inheritedSpecies != null) {
speciesBatch.setSpecies(inheritedSpecies);
}
- // Store into result list only if species has been set (ignore upper batch)
- if (speciesBatch.getSpecies() != null) {
- result.add(speciesBatch);
+ // Compute the inheritance sorted/unsorted value for children
+ if (speciesBatch.getSampleCategoryType() == SampleCategoryEnum.sortedUnsorted) {
+ inheritedSortedUnsortedValue = (CaracteristicQualitativeValue)speciesBatch.getSampleCategoryValue();
}
-
- // Recursive call : propage species but not category if already applied
+ else {
+ inheritedSortedUnsortedValue = null;
+ }
+
+ // Recursive call : propagate species and sorted/unsorted value
applyInheritedProperties(speciesBatch.getChildBatchs(),
- (hasAppliedCategoryValue ? null : inheritedSampleCategoryValue),
- speciesBatch.getSpecies(), result);
+ inheritedSortedUnsortedValue,
+ speciesBatch.getSpecies(),
+ results);
}
}
@@ -519,10 +585,14 @@
}
protected void setSampleCategoryQualitative(SpeciesBatch target, Integer pmfmId, Float numericalvalue, String alphanumericalValue, Integer qualitativeValueId) {
- if (pmfmId == null) {
+ // skip if null or corresponding to the SORTING_TYPE PMFM (Expèce, Benthos, Plancton, etc.)
+ if (pmfmId == null || pmfmId.equals(enumeration.PMFM_ID_SORTING_TYPE)) {
return;
}
- SampleCategoryEnum sampleCategory = measurementHelper.pmfmId2SampleCategory(pmfmId);
+
+ SampleCategoryEnum sampleCategory = referentialService.getSampleCategoryByPmfmId(pmfmId);
+ Preconditions.checkNotNull(sampleCategory, "Unable to find corresponding SampleCategoryEnum for PMFM.ID : " + pmfmId);
+
target.setSampleCategoryType(sampleCategory);
if (numericalvalue != null) {
target.setSampleCategoryValue(numericalvalue);
@@ -566,5 +636,171 @@
batch.getQuantificationMeasurements().clear();
sortingBatchDao.remove(batch);
}
+
+ protected void beanToEntity(SpeciesBatchFrequency source, SortingBatch target, SortingBatch parentBatch, short rankOrder, boolean copyIfNull) {
+ Preconditions.checkNotNull(source.getBatch());
+ Preconditions.checkNotNull(source.getBatch().getId());
+ // Retrieve recorder department
+ // TODO BLA : prendre le service du 1er saisisseur ?
+ Integer recorderDepartmentId = enumeration.DEPARTMENT_ID_UNKNOWN_RECORDER_DEPARTMENT;
+
+ // Create lists to store all updates, then remove not updated items
+ Set<QuantificationMeasurement> notChangedQuantificationMeasurements = new HashSet<QuantificationMeasurement>();
+ if (target.getQuantificationMeasurements() != null) {
+ notChangedQuantificationMeasurements.addAll(target.getQuantificationMeasurements());
+ }
+ Set<SortingMeasurement> notChangedSortingMeasurements = new HashSet<SortingMeasurement>();
+ if (target.getSortingMeasurements() != null) {
+ notChangedSortingMeasurements.addAll(target.getSortingMeasurements());
+ }
+
+ // If parent and root need to be set
+ if (target.getId() == null
+ || target.getRootBatch() == null
+ || (target.getParentBatch() != null && !target.getParentBatch().getId().equals(parentBatch.getId()))) {
+
+ target.setParentBatch(parentBatch);
+ target.setRootBatch(parentBatch.getRootBatch());
+ }
+
+ // RankOrder
+ target.setRankOrder(rankOrder);
+
+ // Weight or SampleCategoryWeight
+ if (copyIfNull && source.getWeight() == null) {
+ // Nothing to do : will be removed later, using notChangedSortingMeasurements
+ } else if (source.getWeight() != null) {
+ QuantificationMeasurement quantificationMeasurement = measurementHelper.setQuantificationMeasurement(target, enumeration.PMFM_ID_WEIGHT_MEASURED, recorderDepartmentId, source.getWeight(), true);
+ notChangedQuantificationMeasurements.remove(quantificationMeasurement);
+ }
+
+ // Sorting measurement
+ if (copyIfNull && (source.getLengthStepCaracteristic() == null || source.getLengthStep() == null)) {
+ // Nothing to do : will be removed later, using notChangedSortingMeasurements
+ } else if (source.getLengthStepCaracteristic() != null && source.getLengthStep() != null) {
+ Integer pmfmId = Integer.valueOf(source.getLengthStepCaracteristic().getId());
+ SortingMeasurement sortingMeasurement = measurementHelper.setSortingMeasurement(target, recorderDepartmentId, pmfmId, source.getLengthStep());
+ notChangedSortingMeasurements.remove(sortingMeasurement);
+ }
+
+ // Individual count
+ if (copyIfNull && source.getNumber() == null) {
+ target.setIndividualCount(null);
+ } else if (source.getNumber() != null) {
+ target.setIndividualCount(source.getNumber());
+ }
+
+ // Species
+ target.setReferenceTaxon(null);
+
+ // QualityFlag
+ target.setQualityFlag(parentBatch.getQualityFlag());
+
+ // Comments
+ if (copyIfNull && source.getComment() == null) {
+ target.setComments(null);
+ } else if (source.getComment() != null) {
+ target.setComments(source.getComment());
+ }
+
+ // Removed not changed measurements (in sorting and quantification measurement lists)
+ if (target.getQuantificationMeasurements() != null && notChangedQuantificationMeasurements.size() > 0) {
+ for (QuantificationMeasurement qm : notChangedQuantificationMeasurements) {
+ target.getQuantificationMeasurements().remove(qm);
+ }
+ }
+ if (target.getSortingMeasurements() != null && notChangedSortingMeasurements.size() > 0) {
+ for (SortingMeasurement sm : notChangedSortingMeasurements) {
+ target.getSortingMeasurements().remove(sm);
+ }
+ }
+ }
+
+ private SpeciesBatchFrequency loadSpeciesBatchFrequency(Object[] source, Map<String, List<SpeciesBatchFrequency>> batchFrequenciesMapByParentId) {
+ SpeciesBatchFrequency target = new SpeciesBatchFrequency();
+
+ int colIndex = 0;
+ target.setId(source[colIndex++].toString());
+
+ // Individual count
+ target.setNumber((Integer)source[colIndex++]);
+
+ // Covert database weight (and sampling ratio) into UI weight
+ Float sourceWeight = (Float) source[colIndex++];
+ Float sourceSamplingRatio = (Float) source[colIndex++];
+ String sourceSamplingRatioText = (String) source[colIndex++];
+ UIWeight uiWeight = convertDatabase2UI(sourceWeight, sourceSamplingRatio, sourceSamplingRatioText);
+ target.setWeight(uiWeight.weight);
+
+ target.setComment((String)source[colIndex++]);
+
+ // Length step category
+ Integer lengthPmfmId = (Integer)source[colIndex++];
+ Caracteristic lengthStepCaracteristic = referentialService.getCaracteristic(lengthPmfmId);
+ target.setLengthStepCaracteristic(lengthStepCaracteristic);
+
+ // Qualitative value (should be null)
+ Preconditions.checkState(source[colIndex++] == null, "Invalid batch tree format : batch frequency could not have a qualitative value.");
+
+ // Length (skip qvValue and alphaValue column)
+ target.setLengthStep((Float) source[colIndex++]);
+
+ // Alphanumerical value (should be null)
+ Preconditions.checkState(source[colIndex++] == null, "Invalid batch tree format : batch frequency could not have a alphanumerical value.");
+
+ // Taxon (should be null)
+ Preconditions.checkState(source[colIndex++] == null, "Invalid batch tree format : taxon frequency could not have species.");
+
+ Integer parentBatchId = (Integer)source[colIndex++];
+
+ // Add target into the result map
+ List<SpeciesBatchFrequency> parentBatchFrequencies = batchFrequenciesMapByParentId.get(parentBatchId.toString());
+ if (parentBatchFrequencies == null) {
+ parentBatchFrequencies = Lists.newArrayList();
+ batchFrequenciesMapByParentId.put(parentBatchId.toString(), parentBatchFrequencies);
+ }
+ parentBatchFrequencies.add(target);
+
+ return target;
+ }
+
+ protected boolean couldBeASpeciesBatchFrequency(Object[] source) {
+ Integer pmfmId = (Integer)source[6];
+ Integer referenceTaxonId = (Integer) source[10];
+ Float numericalValue = (Float) source[8];
+ Integer parentbatchId = (Integer) source[11];
+ SampleCategoryEnum sampleCategory = referentialService.getSampleCategoryByPmfmId(pmfmId);
+
+ // Batch frequency is a batch with :
+ // - a numerical value
+ // - a parent
+ // - no species
+ // - no corresponding sample category
+ return numericalValue != null && parentbatchId != null && referenceTaxonId == null && sampleCategory == null;
+ }
+
+ protected UIWeight convertDatabase2UI(Float weight, Float samplingRatio, String samplingRatioText) {
+ UIWeight result = new UIWeight();
+
+ // Weight & sampleCategory Weight
+ if (samplingRatio == null) {
+ result.weight = weight;
+ } else if (weight != null) {
+ String startStr = weight.toString().replace(',', '.') + "/";
+ if (samplingRatioText != null && samplingRatioText.startsWith(startStr)) {
+ String weightStr = samplingRatioText.substring(startStr.length());
+ if (weightStr != null && !weightStr.isEmpty()) {
+ result.sampleWeight=weight;
+ result.weight=Float.parseFloat(weightStr);
+ }
+ }
+ }
+ return result;
+ }
+
+ class UIWeight {
+ Float sampleWeight=null;
+ Float weight=null;
+ }
}
Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/measure/MeasurementPersistenceHelper.java
===================================================================
--- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/measure/MeasurementPersistenceHelper.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/measure/MeasurementPersistenceHelper.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -226,24 +226,6 @@
return pmfmId;
}
- public SampleCategoryEnum pmfmId2SampleCategory(Integer pmfmId) {
- SampleCategoryEnum sampleCategory = null;
- if (pmfmId.intValue() == enumeration.PMFM_ID_SORTED_UNSORTED.intValue()) {
- sampleCategory = SampleCategoryEnum.sortedUnsorted;
- } else if (enumeration.PMFM_ID_SIZE_CATEGORY.equals(pmfmId)) {
- sampleCategory = SampleCategoryEnum.size;
- } else if (enumeration.PMFM_ID_MATURITY.equals(pmfmId)) {
- sampleCategory = SampleCategoryEnum.maturity;
- } else if (enumeration.PMFM_ID_SEX.equals(pmfmId)) {
- sampleCategory = SampleCategoryEnum.sex;
- } else if (enumeration.PMFM_ID_AGE.equals(pmfmId)) {
- sampleCategory = SampleCategoryEnum.age;
- }
- if (sampleCategory == null) {
- throw new IllegalArgumentException("Unable to find corresponding SampleCategoryEnum for PMFM.ID : " + pmfmId);
- }
- return sampleCategory;
- }
public GearPhysicalFeatures getGearPhysicalfeatures(FishingTrip fishingTrip, Integer gearId) {
return getGearPhysicalfeatures(fishingTrip, gearId, false);
Modified: trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml
===================================================================
--- trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/main/resources/queries-override.hbm.xml 2013-02-07 15:51:23 UTC (rev 358)
@@ -306,44 +306,6 @@
<query-param name="pmfmIdSortingType" type="java.lang.Integer"/>
</query>
- <query name="allRootSpeciesBatch">
- <![CDATA[
- SELECT
- b.id as batchId,
- b.individualCount AS individualCount,
- qm.numericalValue AS weight,
- b.samplingRatio AS samplingRatio,
- b.samplingRatioText AS samplingRatioText,
- b.comments AS comments,
- sm.pmfm.id AS pmfmId,
- sm.qualitativeValue.id as qvValue,
- sm.numericalValue AS numValue,
- sm.alphanumericalValue AS alphaValue,
- b.referenceTaxon.id AS referenceTaxonId,
- smSorted.pmfm.id AS pmfmIdGrandFather,
- smSorted.qualitativeValue.id AS qualitativeIdGrandFather
- FROM
- CatchBatchImpl cb
- INNER JOIN cb.childBatchs batchSorted
- INNER JOIN batchSorted.childBatchs batchSortingType
- INNER JOIN batchSortingType.childBatchs b
- INNER JOIN batchSortingType.sortingMeasurements smSortingType
- LEFT OUTER JOIN batchSorted.sortingMeasurements smSorted
- LEFT OUTER JOIN b.sortingMeasurements sm
- LEFT OUTER JOIN b.quantificationMeasurements qm
- WHERE
- cb.fishingOperation.id=:fishingOperationId
- AND (
- qm is null
- OR qm.isReferenceQuantification=true
- )
- AND smSortingType.qualitativeValue.id=:qualitativeIdSortingType
- ORDER BY b.id
- ]]>
- <query-param name="fishingOperationId" type="java.lang.Integer"/>
- <query-param name="qualitativeIdSortingType" type="java.lang.Integer"/>
- </query>
-
<query name="allSpeciesBatch">
<![CDATA[
SELECT
@@ -402,50 +364,44 @@
<query-param name="qualitativeIdSortingType" type="java.lang.Integer"/>
</query>
- <query name="speciesBatch">
+ <query name="speciesBatchChildren">
<![CDATA[
SELECT
- b.id AS batchId,
+ cb.id
+ FROM
+ SortingBatchImpl b
+ INNER JOIN b.childBatchs cb
+ WHERE
+ b.id = :batchId
+ ]]>
+ <query-param name="batchId" type="java.lang.Integer"/>
+ </query>
+
+ <query name="allSpeciesBatchFrequency">
+ <![CDATA[
+ SELECT
+ b.id as batchId,
b.individualCount AS individualCount,
qm.numericalValue AS weight,
- b.samplingRatio AS samplingRatio,
- b.samplingRatioText AS samplingRatioText,
b.comments AS comments,
sm.pmfm.id AS pmfmId,
- sm.qualitativeValue.id as qvValue,
- sm.numericalValue AS numValue,
- sm.alphanumericalValue AS alphaValue,
- b.referenceTaxon.id AS referenceTaxonId,
- smSorted.pmfm.id AS pmfmIdGrandFather,
- smSorted.qualitativeValue.id AS qualitativeIdGrandFather
+ sm.numericalValue AS numValue
FROM
SortingBatchImpl b
- INNER JOIN b.parentBatch batchSortingType
- INNER JOIN batchSortingType.parentBatch batchSorted
- LEFT OUTER JOIN batchSorted.sortingMeasurements smSorted
LEFT OUTER JOIN b.sortingMeasurements sm
LEFT OUTER JOIN b.quantificationMeasurements qm
WHERE
- b.id = :batchId
+ b.parentBatch.id=:parentBatchId
AND (
qm is null
OR qm.isReferenceQuantification=true
- )
- ]]>
- <query-param name="batchId" type="java.lang.Integer"/>
- </query>
-
- <query name="speciesBatchChildren">
- <![CDATA[
- SELECT
- cb.id
- FROM
- SortingBatchImpl b
- INNER JOIN b.childBatchs cb
- WHERE
- b.id = :batchId
- ]]>
- <query-param name="batchId" type="java.lang.Integer"/>
+ )
+ AND sm.numericalValue is not null
+ AND sm.pmfm.parameter.isAlphanumeric=false
+ AND sm.pmfm.parameter.isQualitative=false
+ ORDER BY sm.numericalValue
+ ]]>
+ <query-param name="parentBatchId" type="java.lang.Integer"/>
</query>
<!-- ===================================================================== -->
Modified: trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java
===================================================================
--- trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java 2013-02-07 11:20:45 UTC (rev 357)
+++ trunk/tutti-persistence/src/test/java/fr/ifremer/tutti/persistence/service/SpeciesBatchPersistenceServiceTest.java 2013-02-07 15:51:23 UTC (rev 358)
@@ -30,8 +30,10 @@
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum;
import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch;
+import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency;
import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
+import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
import fr.ifremer.tutti.persistence.entities.referential.Species;
import org.junit.Before;
import org.junit.ClassRule;
@@ -39,15 +41,20 @@
import org.junit.Test;
import org.springframework.dao.DataRetrievalFailureException;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
/**
* @author tchemit <chemit(a)codelutin.com>
@@ -94,6 +101,7 @@
protected CaracteristicQualitativeValue unkQualitativeValue;
+ protected Caracteristic frequencyPMFM;
protected String speciesBacthId = null;
@@ -149,13 +157,27 @@
maleQualitativeValue = sexPMFM.getQualitativeValue(1);
femaleQualitativeValue = sexPMFM.getQualitativeValue(2);
unkQualitativeValue = sexPMFM.getQualitativeValue(3);
+
+
+ List<Caracteristic> cara = referentialService.getAllCaracteristic();
+ for (Iterator iterator = cara.iterator(); iterator.hasNext();) {
+ Caracteristic caracteristic = (Caracteristic) iterator.next();
+ if (caracteristic.getCaracteristicType() == CaracteristicType.NUMBER
+ && caracteristic.getPrecision() != null
+ && caracteristic.getPrecision().floatValue() == 0.5f) {
+ frequencyPMFM = caracteristic;
+ break;
+ }
+ }
+ assertNotNull("no numerical PMFM with a precision has been found. Could not define a PMFM for batch frequencies.", frequencyPMFM);
}
@Test
public void createSpeciesBatch(/*SpeciesBatch bean, String parentBatchId*/) {
- SpeciesBatch esp1Batch;
- SpeciesBatch esp2Batch;
- SpeciesBatch batch;
+ SpeciesBatch esp1Batch = null;
+ SpeciesBatch esp2Batch = null;
+ SpeciesBatch frequenciesParentBatch = null;
+ SpeciesBatch batch = null;
Species taxon1 = species.get(0);
Species taxon2 = species.get(1);
@@ -233,7 +255,7 @@
batch = new SpeciesBatch();
batch.setId(null);
batch.setParentBatch(esp2Batch);
- batch.setSpecies(taxon1);
+ batch.setSpecies(taxon2);
batch.setComment("ESP2 - Vrac/7 UNK/2 ss-ech/1 Nombre/11");
batch.setSampleCategoryType(SampleCategoryEnum.maturity);
batch.setSampleCategoryValue(firstMaturityQualitativeValue);
@@ -258,8 +280,11 @@
// Save and reload, then check
SpeciesBatch savedBatch = service.saveSpeciesBatch(batch);
assertSpeciesBatch(savedBatch, batch, false);
- SpeciesBatch reloadedBatch = service.getSpeciesBatch(savedBatch.getId());
+ SpeciesBatch reloadedBatch = getSpeciesBatch(fishingOperation.getId(), savedBatch.getId());
assertSpeciesBatch(reloadedBatch, savedBatch, true);
+
+ // Save batch for later
+ frequenciesParentBatch = batch;
// -----------------------------------------------------------------------------
// 6. Test get all root species
@@ -267,13 +292,43 @@
List<SpeciesBatch> rootSpeciesBatch = service.getAllRootSpeciesBatch(fishingOperation.getId());
assertNotNull(rootSpeciesBatch);
assertEquals(2, rootSpeciesBatch.size());
-
-// // -----------------------------------------------------------------------------
-// // 4. Test get all species
-// // -----------------------------------------------------------------------------
-// List<SpeciesBatch> allSpeciesBatch = service.getAllSpeciesBatch(fishingOperation.getId());
-// assertNotNull(allSpeciesBatch);
-// assertEquals(5, allSpeciesBatch.size());
+ assertNotNull(rootSpeciesBatch.get(0).getChildBatchs());
+ assertEquals(2,rootSpeciesBatch.get(0).getChildBatchs().size());
+ assertNotNull(rootSpeciesBatch.get(1).getChildBatchs());
+ assertEquals(1,rootSpeciesBatch.get(1).getChildBatchs().size());
+
+ // -----------------------------------------------------------------------------
+ // 8. Test batch frequency creation
+ // -----------------------------------------------------------------------------
+
+ List<SpeciesBatchFrequency> frequencies = Lists.newArrayList();
+ float lengthStep = 0.5f;
+ for (float length = lengthStep; length < lengthStep * 20; length+=lengthStep) {
+ SpeciesBatchFrequency frequency = new SpeciesBatchFrequency();
+ frequency.setLengthStep(length);
+ frequency.setNumber((int)(length*2));
+ frequency.setWeight(0.01f*length*2);
+ frequency.setLengthStepCaracteristic(frequencyPMFM);
+ frequency.setBatch(frequenciesParentBatch);
+ frequency.setComment("comments");
+ frequencies.add(frequency);
+ }
+ List<SpeciesBatchFrequency> createdFrequencies = assertCreateAndReloadSpeciesBatchFrequency(frequencies, frequenciesParentBatch.getId());
+
+ // -----------------------------------------------------------------------------
+ // 9. Test batch frequency update
+ // -----------------------------------------------------------------------------
+ // Update some batchs (1cm, 2cm, etc)
+ for (Iterator iterator = createdFrequencies.iterator(); iterator.hasNext();) {
+ SpeciesBatchFrequency speciesBatchFrequency = (SpeciesBatchFrequency) iterator.next();
+ float length = speciesBatchFrequency.getLengthStep();
+ if ((float)(int)length == length) {
+ speciesBatchFrequency.setNumber(12);
+ speciesBatchFrequency.setComment(null);
+ }
+ }
+ List<SpeciesBatchFrequency> savedFrequencies = service.saveSpeciesBatchFrequency(frequenciesParentBatch.getId(), frequencies);
+ assertBatchFrequencies(createdFrequencies, savedFrequencies, true);
}
@Test
@@ -282,23 +337,13 @@
}
-
@Test
- @Ignore
- public void getSpeciesBatch(/*String id*/) {
- if (speciesBacthId == null) return;
- SpeciesBatch batch = service.getSpeciesBatch(speciesBacthId);
- assertNotNull(batch);
+ public void saveSpeciesBatchFrequency() {
+
}
@Test
@Ignore
- public void getAllSpeciesBatch(/*String fishingOperationId*/) {
-
- }
-
- @Test
- @Ignore
public void getAllRootSpeciesBatch(/*String fishingOperationId*/) {
}
@@ -362,12 +407,18 @@
// Create batch
SpeciesBatch createdBatch = service.createSpeciesBatch(batch, parentBatchId);
- assertSpeciesBatch(createdBatch, batch, false);
+ assertSpeciesBatch(batch, createdBatch, false);
// then reload (for round trip check)
- SpeciesBatch reloadedBatch = service.getSpeciesBatch(createdBatch.getId());
- assertNull(reloadedBatch.getParentBatch());
- assertSpeciesBatch(reloadedBatch, batch, false);
+ SpeciesBatch reloadedBatch = getSpeciesBatch(fishingOperation.getId(), createdBatch.getId());
+ if (parentBatchId == null) {
+ assertNull(reloadedBatch.getParentBatch());
+ }
+ else {
+ assertNotNull(reloadedBatch.getParentBatch());
+ assertEquals(parentBatchId, reloadedBatch.getParentBatch().getId());
+ }
+ assertSpeciesBatch(createdBatch, reloadedBatch, false);
batch.setId(createdBatch.getId());
}
@@ -380,14 +431,100 @@
}
assertEquals(expectedBatch.getWeight(), actualBatch.getWeight());
assertEquals(expectedBatch.getSampleCategoryType(), actualBatch.getSampleCategoryType());
- assertEquals(expectedBatch.getSampleCategoryValue(), actualBatch.getSampleCategoryValue());
+ if (expectedBatch.getSampleCategoryValue() != null && expectedBatch.getSampleCategoryValue() instanceof CaracteristicQualitativeValue) {
+ assertNotNull("Bad sampleCategoryValue : expected <" + ((CaracteristicQualitativeValue)expectedBatch.getSampleCategoryValue()).getId() +"> but was <null>",
+ actualBatch.getSampleCategoryValue());
+ assertEquals(
+ ((CaracteristicQualitativeValue)expectedBatch.getSampleCategoryValue()).getId(),
+ ((CaracteristicQualitativeValue)actualBatch.getSampleCategoryValue()).getId());
+ }
+ else {
+ assertEquals(expectedBatch.getSampleCategoryValue(), actualBatch.getSampleCategoryValue());
+ }
assertEquals(expectedBatch.getSampleCategoryWeight(), actualBatch.getSampleCategoryWeight());
assertEquals(expectedBatch.getNumber(), actualBatch.getNumber());
assertEquals(expectedBatch.getComment(), actualBatch.getComment());
- if (expectedBatch.getSpecies() != null) {
+
+ // Check species only if Vrac/HorsVrac or if batch has been load throw getAllxxx method
+ // (Because getSpeciesBatch(id) could not always retrieve the species)
+ if (expectedBatch.getSpecies() != null && (
+ expectedBatch.getSampleCategoryType() == SampleCategoryEnum.sortedUnsorted
+ || actualBatch.getSpecies() != null)) {
assertNotNull(actualBatch.getSpecies());
assertEquals(expectedBatch.getSpecies().getId(), actualBatch.getSpecies().getId());
}
}
+
+ protected List<SpeciesBatchFrequency> assertCreateAndReloadSpeciesBatchFrequency(List<SpeciesBatchFrequency> frequencies, String parentBatchId) {
+ // Create batch
+ List<SpeciesBatchFrequency> createdFrequencies = service.saveSpeciesBatchFrequency(parentBatchId, frequencies);
+ assertBatchFrequencies(frequencies, createdFrequencies, false);
+
+ // then reload (for round trip check)
+ List<SpeciesBatchFrequency> reloadedFrequencies = service.getAllSpeciesBatchFrequency(parentBatchId);
+ assertBatchFrequencies(createdFrequencies, reloadedFrequencies, true);
+
+ return createdFrequencies;
+ }
+
+ protected void assertBatchFrequencies(List<SpeciesBatchFrequency> expectedFrequencies, List<SpeciesBatchFrequency> actualFrequencies, boolean assertIdEquals) {
+ assertNotNull(actualFrequencies);
+ assertEquals(expectedFrequencies.size(), actualFrequencies.size());
+
+ // Store actual batches into a map, using the length as key
+ Map<Float, SpeciesBatchFrequency> expectedLengthMap = Maps.newHashMap();
+ for (Iterator iterator = expectedFrequencies.iterator(); iterator.hasNext();) {
+ SpeciesBatchFrequency speciesBatchFrequency = (SpeciesBatchFrequency) iterator.next();
+ expectedLengthMap.put(speciesBatchFrequency.getLengthStep(), speciesBatchFrequency);
+ }
+
+ // Store expected batches into a map, using the length as key
+ Map<Float, SpeciesBatchFrequency> actualLengthMap = Maps.newHashMap();
+ for (Iterator iterator = actualFrequencies.iterator(); iterator.hasNext();) {
+ SpeciesBatchFrequency speciesBatchFrequency = (SpeciesBatchFrequency) iterator.next();
+ assertFalse("Duplicate lengthStep found in batchFrequencies, for length="+speciesBatchFrequency.getLengthStep(), actualLengthMap.containsKey(speciesBatchFrequency.getLengthStep()));
+ actualLengthMap.put(speciesBatchFrequency.getLengthStep(), speciesBatchFrequency);
+ assertNotNull(speciesBatchFrequency.getId());
+ }
+
+ for (Iterator iterator = expectedLengthMap.keySet().iterator(); iterator.hasNext();) {
+ Float lengthStep = (Float) iterator.next();
+ SpeciesBatchFrequency expectedBatchFrequency = expectedLengthMap.get(lengthStep);
+ SpeciesBatchFrequency actualBatchFrequency = actualLengthMap.get(lengthStep);
+ if (assertIdEquals) {
+ assertEquals(expectedBatchFrequency.getId(), actualBatchFrequency.getId());
+ }
+ assertNotNull(expectedBatchFrequency.getLengthStepCaracteristic());
+ assertEquals(expectedBatchFrequency.getLengthStepCaracteristic().getId(), actualBatchFrequency.getLengthStepCaracteristic().getId());
+ assertEquals(expectedBatchFrequency.getNumber(), actualBatchFrequency.getNumber());
+ assertEquals(expectedBatchFrequency.getWeight(), actualBatchFrequency.getWeight());
+ assertEquals(expectedBatchFrequency.getComment(), actualBatchFrequency.getComment());
+ //assertNotNull(expectedBatchFrequency.getBatch());
+ //assertEquals(expectedBatchFrequency.getBatch().getId(), actualBatchFrequency.getBatch().getId());
+ }
+ }
+
+ protected SpeciesBatch getSpeciesBatch(String fishingOperationId, String speciesBatchId) {
+ return getSpeciesBatch(speciesBatchId, service.getAllRootSpeciesBatch(fishingOperationId));
+ }
+
+ protected SpeciesBatch getSpeciesBatch(String speciesBatchId, List<SpeciesBatch> speciesBatchs) {
+ if (speciesBatchs == null) {
+ return null;
+ }
+ for (Iterator iterator = speciesBatchs.iterator(); iterator.hasNext();) {
+ SpeciesBatch speciesBatch = (SpeciesBatch) iterator.next();
+ if (speciesBatchId.equals(speciesBatch.getId())) {
+ return speciesBatch;
+ }
+ if (speciesBatch.getChildBatchs() != null) {
+ speciesBatch = getSpeciesBatch(speciesBatchId, speciesBatch.getChildBatchs());
+ if (speciesBatch != null) {
+ return speciesBatch;
+ }
+ }
+ }
+ return null;
+ }
}
1
0
07 Feb '13
Author: kmorin
Date: 2013-02-07 12:20:45 +0100 (Thu, 07 Feb 2013)
New Revision: 357
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/357
Log:
- fixes #1850 [ERGO] - Gestion des champs obligatoires
- [catches - split] add checkboxes to select the split values
Added:
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml
Modified:
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java
trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml
trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIHandler.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -275,19 +275,10 @@
return ui.getValidator();
}
- public static final String cruiseNameFormat = "%1$s_%2$s";
-
public void generateCampaignName() {
EditCruiseUIModel model = getModel();
- Program program = model.getProgram();
- Integer year = model.getYear();
- String name = String.format(cruiseNameFormat, program.getName(), year);
-
- String surveyPart = model.getSurveyPart();
- if (StringUtils.isNotEmpty(surveyPart)) {
- name += "_" + surveyPart;
- }
+ String name = model.getGeneratedCampaignName();
model.setName(name);
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -36,6 +36,7 @@
import java.util.Date;
import java.util.List;
+import org.apache.commons.lang3.StringUtils;
/**
* Model of UI {@link EditCruiseUI}.
@@ -283,4 +284,13 @@
return program != null && year != null;
}
+ public static final String cruiseNameFormat = "%1$s_%2$s";
+
+ public String getGeneratedCampaignName() {
+ String name = String.format(cruiseNameFormat, program.getName(), year);
+ if (StringUtils.isNotEmpty(surveyPart)) {
+ name += "_" + surveyPart;
+ }
+ return name;
+ }
}
\ No newline at end of file
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/DeleteProtocolAction.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -33,6 +33,7 @@
import java.awt.event.ActionEvent;
import java.util.List;
+import javax.swing.JOptionPane;
import static org.nuiton.i18n.I18n._;
@@ -60,6 +61,22 @@
}
@Override
+ protected boolean prepareAction(ActionEvent event) {
+ boolean result = super.prepareAction(event);
+
+ TuttiProtocol protocol = getHandler().getModel().getProtocol();
+ int answer = JOptionPane.showConfirmDialog(
+ getHandler().getUI(),
+ _("tutti.action.deleteProtocol.message", protocol.getName()),
+ _("tutti.action.deleteProtocol.title"),
+ JOptionPane.OK_CANCEL_OPTION
+ );
+ result &= answer == JOptionPane.OK_OPTION;
+
+ return result;
+ }
+
+ @Override
protected void doAction(ActionEvent e) {
TuttiProtocol protocol = getModel().getProtocol();
Preconditions.checkNotNull(protocol);
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-02-07 11:20:45 UTC (rev 357)
@@ -90,6 +90,7 @@
<field name='gearShootingEndDate' component='gearShootingEndDateField'/>
<field name='comment' component='commentPane'/>
<field name='saisisseur' component='saisisseurList'/>
+ <field name='trawlDistance' component='trawlDistanceField'/>
<field name='vessel' component='vesselComboBox'/>
<field name='gear' component='gearComboBox'/>
<field name='multirigAggregation' component='multirigAggregationField'/>
@@ -141,6 +142,11 @@
component='gearShootingEndLongitudeDMDDegreeField'/>
<field name='gearShootingEndLongitudeDecimalMinute'
component='gearShootingEndLongitudeDMDMinuteField'/>
+ <field name='fishingOperationValid'
+ component='fishingOperationValidPanel'/>
+ <field name='strata' component='strataComboBox'/>
+ <field name='subStrata' component='subStrataComboBox'/>
+ <field name='location' component='locationComboBox'/>
</BeanValidator>
<CardLayout2Ext id='gearShootingStartLongitudeLayout'
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -52,6 +52,7 @@
import fr.ifremer.tutti.ui.swing.util.TabHandler;
import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor;
import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil;
+import fr.ifremer.tutti.ui.swing.util.editor.CoordinateEditorType;
import jaxx.runtime.validator.swing.SwingValidator;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.time.DateUtils;
@@ -61,6 +62,7 @@
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import java.awt.Color;
+import java.awt.Component;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
@@ -143,7 +145,7 @@
EditFishingOperationUIModel model = new EditFishingOperationUIModel();
model.setCoordinateEditorType(getConfig().getCoordinateEditorType());
model.setValidationContext(getContext().getValidationContext());
-
+
// model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_EMPTY, new PropertyChangeListener() {
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
@@ -180,24 +182,38 @@
}
});
- model.addPropertyChangeListener(EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE, new PropertyChangeListener() {
+ model.addPropertyChangeListener(new PropertyChangeListener() {
+ List<String> properties = Lists.newArrayList(
+ EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE_SECOND,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE_SECOND,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE_SECOND,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DECIMAL_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_DEGREE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_MINUTE,
+ EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE_SECOND
+ );
+
@Override
public void propertyChange(PropertyChangeEvent evt) {
- Boolean rectiligne = (Boolean) evt.getNewValue();
- if (rectiligne) {
+ if (properties.contains(evt.getPropertyName())) {
EditFishingOperationUIModel source = (EditFishingOperationUIModel) evt.getSource();
- Float latS = source.getGearShootingStartLatitude();
- Float longS = source.getGearShootingStartLongitude();
- Float latE = source.getGearShootingEndLatitude();
- Float longE = source.getGearShootingEndLongitude();
-
- if (latS != null && longS != null
- && latE != null && longE != null) {
- LatLng start = new LatLng(latS, longS);
- LatLng end = new LatLng(latE, longE);
- Double distance = LatLngTool.distance(start, end, LengthUnit.METER);
- source.setTrawlDistance(distance.floatValue());
+ if (source.isFishingOperationRectiligne()) {
+ source.computeDictance();
}
}
}
@@ -217,6 +233,9 @@
color = Color.RED;
fontColor = Color.WHITE;
}
+ Component tab = getTabPanel().getTabComponentAt(0);
+ tab.setForeground(fontColor);
+ tab.setBackground(color);
}
});
@@ -443,6 +462,10 @@
bean = new FishingOperation();
}
+ List<FishingOperation> operations = parentUi.getModel().getFishingOperation();
+ operations.remove(bean);
+ model.setExistingOperations(operations);
+
FishingOperationLocation strata = bean.getStrata();
FishingOperationLocation subStrata = bean.getSubStrata();
FishingOperationLocation location = bean.getLocation();
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -25,6 +25,9 @@
*/
import com.google.common.collect.Lists;
+import com.javadocmd.simplelatlng.LatLng;
+import com.javadocmd.simplelatlng.LatLngTool;
+import com.javadocmd.simplelatlng.util.LengthUnit;
import fr.ifremer.tutti.persistence.entities.TuttiEntities;
import fr.ifremer.tutti.persistence.entities.data.Cruise;
import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
@@ -193,6 +196,8 @@
protected String multirigAggregation;
protected CoordinateEditorType coordinateEditorType;
+
+ protected List<FishingOperation> existingOperations;
protected static Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder =
BinderFactory.newBinder(EditFishingOperationUIModel.class,
@@ -714,6 +719,14 @@
return DateUtil.between(date, cruise.getBeginDate(), cruise.getEndDate());
}
+ public List<FishingOperation> getExistingOperations() {
+ return existingOperations;
+ }
+
+ public void setExistingOperations(List<FishingOperation> existingOperations) {
+ this.existingOperations = existingOperations;
+ }
+
public void convertGearShootingCoordinatesDDToDMS() {
SexagecimalPosition position;
Integer degree;
@@ -776,4 +789,17 @@
setGearShootingEndLongitude(decimalValue);
}
+ public void computeDictance() {
+ if (coordinateEditorType != CoordinateEditorType.DD) {
+ convertGearShootingCoordinatesDMSToDD();
+ }
+ if (gearShootingStartLatitude != null && gearShootingStartLongitude != null
+ && gearShootingEndLatitude != null && gearShootingEndLongitude != null) {
+ LatLng start = new LatLng(gearShootingStartLatitude, gearShootingStartLongitude);
+ LatLng end = new LatLng(gearShootingEndLatitude, gearShootingEndLongitude);
+ Double distance = LatLngTool.distance(start, end, LengthUnit.METER);
+ setTrawlDistance(distance.floatValue());
+ }
+ }
+
}
\ No newline at end of file
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategory.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -93,7 +93,7 @@
}
public boolean isValid() {
- return categoryValue != null && categoryWeight != null;
+ return categoryValue != null;
}
public boolean isEmpty() {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -256,10 +256,10 @@
// &&!row.getSortedUnsortedCategory().isEmpty() &&
// row.getSortedUnsortedCategory().isValid();
- result &= row.getSizeCategory().isEmptyOrValid();
- result &= row.getSexCategory().isEmptyOrValid();
- result &= row.getMaturityCategory().isEmptyOrValid();
- result &= row.getAgeCategory().isEmptyOrValid();
+// result &= row.getSizeCategory().isEmptyOrValid();
+// result &= row.getSexCategory().isEmptyOrValid();
+// result &= row.getMaturityCategory().isEmptyOrValid();
+// result &= row.getAgeCategory().isEmptyOrValid();
return result;
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchRowModel.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -107,10 +107,4 @@
firePropertyChange(PROPERTY_WEIGHT, oldValue, weight);
}
- //TODO Use validator
- @Override
- public boolean isValid() {
- return category.isValid();
- }
-
}
\ No newline at end of file
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchTableModel.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -42,6 +42,11 @@
private static final long serialVersionUID = 1L;
+ public static final ColumnIdentifier<SplitSpeciesBatchRowModel> SELECTED = ColumnIdentifier.newId(
+ SplitSpeciesBatchRowModel.PROPERTY_VALID,
+ n_("tutti.table.species.sampleCategory.header.selected"),
+ n_("tutti.table.species.sampleCategory.header.selected"));
+
public static final ColumnIdentifier<SplitSpeciesBatchRowModel> EDITABLE_CATEGORY_VALUE = ColumnIdentifier.newId(
SplitSpeciesBatchRowModel.PROPERTY_CATEGORY_VALUE,
n_("tutti.table.species.sampleCategory.header.category"),
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUI.css 2013-02-07 11:20:45 UTC (rev 357)
@@ -51,6 +51,7 @@
#sampleCheckBox {
text: "tutti.label.sampleCategoryConfiguration.sample";
selected: {model.isSample()};
+ enabled: {model.getBatchWeight() != null};
}
#speciesLabel {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -98,8 +98,7 @@
@Override
protected boolean isRowValid(SplitSpeciesBatchRowModel row) {
- //TODO
- return row.getCategoryValue() != null && row.getWeight() != null;
+ return row.isValid();
}
@Override
@@ -339,6 +338,11 @@
DefaultTableColumnModelExt columnModel =
new DefaultTableColumnModelExt();
+ { // Selection
+
+ addBooleanColumnToModel(columnModel, SplitSpeciesBatchTableModel.SELECTED, getTable());
+ }
+
boolean editableCategoryValue = false;
if (category != null) {
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIHandler.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -24,6 +24,7 @@
* #L%
*/
+import com.google.common.collect.Lists;
import fr.ifremer.tutti.persistence.entities.data.Program;
import fr.ifremer.tutti.service.PersistenceService;
import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler;
@@ -35,6 +36,7 @@
import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
+import java.util.List;
/**
* Handler of UI {@link EditProgramUI}.
@@ -65,6 +67,16 @@
EditProgramUIModel model = new EditProgramUIModel();
+ //TODO 20130206 kmorin put the programs loaded in the home screen in a
+ //kind of context to avoid loading the programs again
+ List<Program> programs = persistenceService.getAllProgram();
+ List<Program> loadedPrograms =
+ Lists.newArrayListWithCapacity(programs.size());
+ for (Program program : programs) {
+ loadedPrograms.add(persistenceService.getProgram(program.getId()));
+ }
+ model.setExistingPrograms(loadedPrograms);
+
String surveyId = context.getProgramId();
if (surveyId == null) {
@@ -80,6 +92,8 @@
Program program = persistenceService.getProgram(surveyId);
model.fromBean(program);
+
+ model.getExistingPrograms().remove(program);
}
listModelIsModify(model);
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -27,6 +27,7 @@
import fr.ifremer.tutti.persistence.entities.data.Program;
import fr.ifremer.tutti.persistence.entities.referential.Zone;
import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel;
+import java.util.List;
import org.nuiton.util.beans.Binder;
import org.nuiton.util.beans.BinderFactory;
@@ -51,6 +52,8 @@
protected String comment;
protected Zone zone;
+
+ private List<Program> existingPrograms;
protected static Binder<EditProgramUIModel, Program> toBeanBinder =
BinderFactory.newBinder(EditProgramUIModel.class,
@@ -94,4 +97,12 @@
firePropertyChange(PROPERTY_ZONE, oldValue, zone);
}
+ public List<Program> getExistingPrograms() {
+ return existingPrograms;
+ }
+
+ public void setExistingPrograms(List<Program> existingPrograms) {
+ this.existingPrograms = existingPrograms;
+ }
+
}
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIHandler.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -159,8 +159,8 @@
allSpecies = TuttiEntities.splitById(persistenceService.getAllSpecies());
- List<String> protocolNames = persistenceService.getAllProtocolNames();
- model.setProtocolNames(protocolNames);
+ List<TuttiProtocol> protocols = persistenceService.getAllProtocol();
+ model.setExistingProtocols(protocols);
caracteristics = persistenceService.getAllCaracteristic();
allCaracteristic = TuttiEntities.splitById(caracteristics);
@@ -206,7 +206,12 @@
if (mustClone != null && mustClone) {
ui.setContextValue(false, MainUIHandler.CLONE_PROTOCOL);
model.setId(null);
+
+ } else {
+ log.debug(model.getExistingProtocols());
+ model.getExistingProtocols().remove(protocol);
}
+
} else {
// create new protocol
@@ -217,13 +222,6 @@
}
}
- String existingProtocolName = model.getName();
- if (existingProtocolName != null) {
-
- // remove existing protocol name from the already used list
- model.getProtocolNames().remove(existingProtocolName);
- }
-
SwingValidator validator = ui.getValidator();
listenValidatorValid(validator, model);
Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java
===================================================================
--- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel.java 2013-02-07 11:20:45 UTC (rev 357)
@@ -85,7 +85,7 @@
protected static Binder<TuttiProtocol, EditProtocolUIModel> fromBeanBinder =
BinderFactory.newBinder(TuttiProtocol.class, EditProtocolUIModel.class);
- private List<String> protocolNames;
+ private List<TuttiProtocol> existingProtocols;
public EditProtocolUIModel() {
super(TuttiProtocol.class, fromBeanBinder, toBeanBinder);
@@ -181,18 +181,6 @@
firePropertyChange(PROPERTY_REMOVE_SPECIES_ENABLED, oldValue, removeSpeciesEnabled);
}
- public void setProtocolNames(List<String> protocolNames) {
- this.protocolNames = protocolNames;
- }
-
- public List<String> getProtocolNames() {
- return protocolNames;
- }
-
- public boolean isNameAlreadyUsed() {
- return protocolNames.contains(getName());
- }
-
public boolean isImported() {
return imported;
}
@@ -203,4 +191,12 @@
firePropertyChange(PROPERTY_IMPORTED, oldValue, imported);
}
+ public List<TuttiProtocol> getExistingProtocols() {
+ return existingProtocols;
+ }
+
+ public void setExistingProtocols(List<TuttiProtocol> existingProtocols) {
+ this.existingProtocols = existingProtocols;
+ }
+
}
\ No newline at end of file
Copied: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml (from rev 349, trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-error-validation.xml)
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml (rev 0)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/cruise/EditCruiseUIModel-warning-validation.xml 2013-02-07 11:20:45 UTC (rev 357)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ #%L
+ Tutti :: UI
+ $Id$
+ $HeadURL$
+ %%
+ Copyright (C) 2012 Ifremer
+ %%
+ 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%
+ -->
+<!DOCTYPE validators PUBLIC
+ "-//Apache Struts//XWork Validator 1.0.3//EN"
+ "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
+<validators>
+
+ <field name="name">
+
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ name == null || name.equals(getGeneratedCampaignName()) ]]></param>
+ <message>tutti.validator.warning.cruise.name.format</message>
+ </field-validator>
+
+ </field>
+
+</validators>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-edit-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357)
@@ -41,6 +41,14 @@
tutti.validator.error.fishingOperation.stationNumber.too.long##${maxLength}
</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingOperations</param>
+ <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.fishingOperation.existingKey</message>
+ </field-validator>
</field>
@@ -51,6 +59,14 @@
tutti.validator.error.fishingOperation.fishingOperationNumber.required
</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingOperations</param>
+ <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.fishingOperation.existingKey</message>
+ </field-validator>
</field>
@@ -67,8 +83,16 @@
<field name="gearShootingStartDate">
<field-validator type="required" short-circuit="true">
- <message>tutti.validator.error.fishingOperation.date.required</message>
+ <message>tutti.validator.error.fishingOperation.date.start.required</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingOperations</param>
+ <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.fishingOperation.existingKey</message>
+ </field-validator>
</field>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel-validate-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357)
@@ -41,6 +41,14 @@
tutti.validator.error.fishingOperation.stationNumber.too.long##${maxLength}
</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingOperations</param>
+ <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.fishingOperation.existingKey</message>
+ </field-validator>
</field>
@@ -51,6 +59,14 @@
tutti.validator.error.fishingOperation.fishingOperationNumber.required
</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingOperations</param>
+ <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.fishingOperation.existingKey</message>
+ </field-validator>
</field>
@@ -63,13 +79,48 @@
</field-validator>
</field>
+
+ <field name='strata'>
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ strata != null || subStrata != null || location != null ]]>
+ </param>
+ <message>tutti.validator.error.fishingOperation.strataLocation.required</message>
+ </field-validator>
+ </field>
+
+ <field name='subStrata'>
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ strata != null || subStrata != null || location != null ]]>
+ </param>
+ <message>tutti.validator.error.fishingOperation.strataLocation.required</message>
+ </field-validator>
+ </field>
+
+ <field name='location'>
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ strata != null || subStrata != null || location != null ]]>
+ </param>
+ <message>tutti.validator.error.fishingOperation.strataLocation.required</message>
+ </field-validator>
+ </field>
<field name="gearShootingStartDate">
<field-validator type="required" short-circuit="true">
- <message>tutti.validator.error.fishingOperation.date.required</message>
+ <message>tutti.validator.error.fishingOperation.date.start.required</message>
</field-validator>
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingOperations</param>
+ <param name="keys">stationNumber, fishingOperationNumber, gearShootingStartDate</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.fishingOperation.existingKey</message>
+ </field-validator>
+
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
<![CDATA[ gearShootingEndDate == null || gearShootingStartDate.compareTo(gearShootingEndDate) <= 0 ]]>
@@ -79,7 +130,7 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ gearShootingStartDate == null || isDateInCruise(gearShootingStartDate) ]]>
+ <![CDATA[ isDateInCruise(gearShootingStartDate) ]]>
</param>
<message>tutti.validator.error.fishingOperation.dates.startOutOfCruiseDates</message>
</field-validator>
@@ -88,9 +139,13 @@
<field name="gearShootingEndDate">
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.fishingOperation.date.end.required</message>
+ </field-validator>
+
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ gearShootingStartDate == null || gearShootingEndDate == null || gearShootingStartDate.compareTo(gearShootingEndDate) <= 0 ]]>
+ <![CDATA[ gearShootingStartDate == null || gearShootingStartDate.compareTo(gearShootingEndDate) <= 0 ]]>
</param>
<message>tutti.validator.error.fishingOperation.dates.endBeforeStart</message>
</field-validator>
@@ -113,7 +168,9 @@
<param name="expression">
<![CDATA[
!"DD".equals(coordinateEditorType.toString()) ||
- ( -doubles.min <= gearShootingStartLatitude && gearShootingStartLatitude <= doubles.max )
+ ( gearShootingStartLatitude != null
+ && -doubles.min <= gearShootingStartLatitude
+ && gearShootingStartLatitude <= doubles.max )
]]>
</param>
@@ -129,12 +186,13 @@
<param name="intParams">min:90|max:90</param>
<param name="expression">
<![CDATA[
- !"DMS".equals(coordinateEditorType.toString()) || (
- ( -ints.min < getGearShootingStartLatitudeDegree() && getGearShootingStartLatitudeDegree() < ints.max )
+ !"DMS".equals(coordinateEditorType.toString()) || (
+ getGearShootingStartLatitudeDegree() != null &&
+ (( -ints.min < getGearShootingStartLatitudeDegree() && getGearShootingStartLatitudeDegree() < ints.max )
|| (
( getGearShootingStartLatitudeDegree() == ints.max || getGearShootingStartLatitudeDegree() == -ints.min )
&& getGearShootingStartLatitudeMinute() == 0 && getGearShootingStartLatitudeSecond() == 0
- )
+ ))
)
]]>
</param>
@@ -152,11 +210,12 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) || (
- ( -ints.min < getGearShootingStartLatitudeDecimalDegree() && getGearShootingStartLatitudeDecimalDegree() < ints.max )
+ getGearShootingStartLatitudeDecimalDegree() != null &&
+ (( -ints.min < getGearShootingStartLatitudeDecimalDegree() && getGearShootingStartLatitudeDecimalDegree() < ints.max )
|| (
( getGearShootingStartLatitudeDecimalDegree() == ints.max || getGearShootingStartLatitudeDecimalDegree() == -ints.min )
&& getGearShootingStartLatitudeDecimalMinute() == 0.0
- )
+ ))
)
]]>
</param>
@@ -174,7 +233,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingStartLatitudeMinute() && getGearShootingStartLatitudeMinute() < ints.max )
+ ( getGearShootingStartLatitudeMinute() != null
+ && ints.min <= getGearShootingStartLatitudeMinute()
+ && getGearShootingStartLatitudeMinute() < ints.max )
]]>
</param>
@@ -191,7 +252,9 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) ||
- ( doubles.min <= getGearShootingStartLatitudeDecimalMinute() && getGearShootingStartLatitudeDecimalMinute() < doubles.max )
+ ( getGearShootingStartLatitudeDecimalMinute() != null
+ && doubles.min <= getGearShootingStartLatitudeDecimalMinute()
+ && getGearShootingStartLatitudeDecimalMinute() < doubles.max )
]]>
</param>
<message>tutti.validator.warning.latitude.minute.outOfBounds</message>
@@ -207,7 +270,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingStartLatitudeSecond() && getGearShootingStartLatitudeSecond() < ints.max )
+ ( getGearShootingStartLatitudeSecond() != null
+ && ints.min <= getGearShootingStartLatitudeSecond()
+ && getGearShootingStartLatitudeSecond() < ints.max )
]]>
</param>
@@ -226,7 +291,9 @@
<param name="expression">
<![CDATA[
!"DD".equals(coordinateEditorType.toString()) ||
- ( -doubles.min <= gearShootingStartLongitude && gearShootingStartLongitude <= doubles.max )
+ ( gearShootingStartLongitude != null
+ && -doubles.min <= gearShootingStartLongitude
+ && gearShootingStartLongitude <= doubles.max )
]]>
</param>
@@ -243,11 +310,12 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) || (
- (-ints.min < getGearShootingStartLongitudeDegree() && getGearShootingStartLongitudeDegree() < ints.max)
+ getGearShootingStartLongitudeDegree() != null &&
+ ((-ints.min < getGearShootingStartLongitudeDegree() && getGearShootingStartLongitudeDegree() < ints.max)
|| (
( getGearShootingStartLongitudeDegree() == ints.max || getGearShootingStartLongitudeDegree() == -ints.min )
&& getGearShootingStartLongitudeMinute() == 0 && getGearShootingStartLongitudeSecond() == 0
- )
+ ))
)
]]>
</param>
@@ -265,11 +333,12 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) || (
- (-ints.min < getGearShootingStartLongitudeDecimalDegree() && getGearShootingStartLongitudeDecimalDegree() < ints.max)
+ getGearShootingStartLongitudeDecimalDegree() != null &&
+ (( -ints.min < getGearShootingStartLongitudeDecimalDegree() && getGearShootingStartLongitudeDecimalDegree() < ints.max)
|| (
( getGearShootingStartLongitudeDecimalDegree() == ints.max || getGearShootingStartLongitudeDecimalDegree() == -ints.min )
&& getGearShootingStartLongitudeDecimalMinute() == 0.0
- )
+ ))
)
]]>
</param>
@@ -287,7 +356,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingStartLongitudeMinute() && getGearShootingStartLongitudeMinute() < ints.max )
+ ( getGearShootingStartLongitudeMinute() != null
+ && ints.min <= getGearShootingStartLongitudeMinute()
+ && getGearShootingStartLongitudeMinute() < ints.max )
]]>
</param>
@@ -304,7 +375,9 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) ||
- ( doubles.min <= getGearShootingStartLongitudeDecimalMinute() && getGearShootingStartLongitudeDecimalMinute() < doubles.max )
+ ( getGearShootingStartLongitudeDecimalMinute() != null
+ && doubles.min <= getGearShootingStartLongitudeDecimalMinute()
+ && getGearShootingStartLongitudeDecimalMinute() < doubles.max )
]]>
</param>
<message>tutti.validator.warning.longitude.minute.outOfBounds</message>
@@ -320,7 +393,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingStartLongitudeSecond() && getGearShootingStartLongitudeSecond() < ints.max )
+ ( getGearShootingStartLongitudeSecond() != null
+ && ints.min <= getGearShootingStartLongitudeSecond()
+ && getGearShootingStartLongitudeSecond() < ints.max )
]]>
</param>
@@ -339,7 +414,9 @@
<param name="expression">
<![CDATA[
!"DD".equals(coordinateEditorType.toString()) ||
- ( -doubles.min <= gearShootingEndLatitude && gearShootingEndLatitude <= doubles.max )
+ ( gearShootingEndLatitude != null
+ && -doubles.min <= gearShootingEndLatitude
+ && gearShootingEndLatitude <= doubles.max )
]]>
</param>
@@ -357,11 +434,12 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) || (
- (-ints.min < getGearShootingEndLatitudeDegree() && getGearShootingEndLatitudeDegree() < ints.max)
+ getGearShootingEndLatitudeDegree() != null &&
+ (( -ints.min < getGearShootingEndLatitudeDegree() && getGearShootingEndLatitudeDegree() < ints.max)
|| (
( getGearShootingEndLatitudeDegree() == ints.max || getGearShootingEndLatitudeDegree() == -ints.min )
&& getGearShootingEndLatitudeMinute() == 0 && getGearShootingEndLatitudeSecond() == 0
- )
+ ))
)
]]>
</param>
@@ -379,11 +457,12 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) || (
- (-ints.min < getGearShootingEndLatitudeDecimalDegree() && getGearShootingEndLatitudeDecimalDegree() < ints.max)
+ getGearShootingEndLatitudeDecimalDegree() != null &&
+ (( -ints.min < getGearShootingEndLatitudeDecimalDegree() && getGearShootingEndLatitudeDecimalDegree() < ints.max)
|| (
( getGearShootingEndLatitudeDecimalDegree() == ints.max || getGearShootingEndLatitudeDecimalDegree() == -ints.min )
&& getGearShootingEndLatitudeDecimalMinute() == 0.0
- )
+ ))
)
]]>
</param>
@@ -401,7 +480,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingEndLatitudeMinute() && getGearShootingEndLatitudeMinute() < ints.max )
+ ( getGearShootingEndLatitudeMinute() != null
+ && ints.min <= getGearShootingEndLatitudeMinute()
+ && getGearShootingEndLatitudeMinute() < ints.max )
]]>
</param>
@@ -418,7 +499,9 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) ||
- ( doubles.min <= getGearShootingEndLatitudeDecimalMinute() && getGearShootingEndLatitudeDecimalMinute() < doubles.max )
+ ( getGearShootingEndLatitudeDecimalMinute() != null
+ && doubles.min <= getGearShootingEndLatitudeDecimalMinute()
+ && getGearShootingEndLatitudeDecimalMinute() < doubles.max )
]]>
</param>
<message>tutti.validator.warning.latitude.minute.outOfBounds</message>
@@ -434,7 +517,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingEndLatitudeSecond() && getGearShootingEndLatitudeSecond() < ints.max )
+ ( getGearShootingEndLatitudeSecond() != null
+ && ints.min <= getGearShootingEndLatitudeSecond()
+ && getGearShootingEndLatitudeSecond() < ints.max )
]]>
</param>
@@ -453,7 +538,9 @@
<param name="expression">
<![CDATA[
!"DD".equals(coordinateEditorType.toString()) ||
- ( -doubles.min <= gearShootingEndLongitude && gearShootingEndLongitude <= doubles.max )
+ ( gearShootingEndLongitude != null
+ && -doubles.min <= gearShootingEndLongitude
+ && gearShootingEndLongitude <= doubles.max )
]]>
</param>
@@ -470,11 +557,12 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) || (
- (-ints.min < getGearShootingEndLongitudeDegree() && getGearShootingEndLongitudeDegree() < ints.max)
+ getGearShootingEndLongitudeDegree() != null &&
+ ((-ints.min < getGearShootingEndLongitudeDegree() && getGearShootingEndLongitudeDegree() < ints.max)
|| (
( getGearShootingEndLongitudeDegree() == ints.max || getGearShootingEndLongitudeDegree() == -ints.min )
&& getGearShootingEndLongitudeMinute() == 0 && getGearShootingEndLongitudeSecond() == 0
- )
+ ))
)
]]>
</param>
@@ -492,11 +580,12 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) || (
- (-ints.min < getGearShootingEndLongitudeDecimalDegree() && getGearShootingEndLongitudeDecimalDegree() < ints.max)
+ getGearShootingEndLongitudeDecimalDegree() != null &&
+ (( -ints.min < getGearShootingEndLongitudeDecimalDegree() && getGearShootingEndLongitudeDecimalDegree() < ints.max)
|| (
( getGearShootingEndLongitudeDecimalDegree() == ints.max || getGearShootingEndLongitudeDecimalDegree() == -ints.min )
&& getGearShootingEndLongitudeDecimalMinute() == 0.0
- )
+ ))
)
]]>
</param>
@@ -514,7 +603,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingEndLongitudeMinute() && getGearShootingEndLongitudeMinute() < ints.max )
+ ( getGearShootingEndLongitudeMinute() != null
+ && ints.min <= getGearShootingEndLongitudeMinute()
+ && getGearShootingEndLongitudeMinute() < ints.max )
]]>
</param>
@@ -531,7 +622,9 @@
<param name="expression">
<![CDATA[
!"DMD".equals(coordinateEditorType.toString()) ||
- ( doubles.min <= getGearShootingEndLongitudeDecimalMinute() && getGearShootingEndLongitudeDecimalMinute() < doubles.max )
+ ( getGearShootingEndLongitudeDecimalMinute() != null
+ && doubles.min <= getGearShootingEndLongitudeDecimalMinute()
+ && getGearShootingEndLongitudeDecimalMinute() < doubles.max )
]]>
</param>
<message>tutti.validator.warning.longitude.minute.outOfBounds</message>
@@ -547,7 +640,9 @@
<param name="expression">
<![CDATA[
!"DMS".equals(coordinateEditorType.toString()) ||
- ( ints.min <= getGearShootingEndLongitudeSecond() && getGearShootingEndLongitudeSecond() < ints.max )
+ ( getGearShootingEndLongitudeSecond() != null
+ && ints.min <= getGearShootingEndLongitudeSecond()
+ && getGearShootingEndLongitudeSecond() < ints.max )
]]>
</param>
@@ -557,11 +652,63 @@
</field>
+ <field name="trawlDistance">
+
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.fishingOperation.trawlDistance.required</message>
+ </field-validator>
+
+ </field>
+
+ <field name="fishingOperationValid">
+
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.fishingOperation.fishingOperationValid.required</message>
+ </field-validator>
+
+ </field>
+
+ <field name="saisisseur">
+
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ saisisseur != null && !saisisseur.isEmpty() ]]>
+ </param>
+ <message>tutti.validator.error.fishingOperation.catcher.required</message>
+ </field-validator>
+
+ </field>
+
+ <field name="vessel">
+
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.fishingOperation.vessel.required</message>
+ </field-validator>
+
+ </field>
+
+ <field name="gear">
+
+ <field-validator type="required" short-circuit="true">
+ <message>tutti.validator.error.fishingOperation.gear.required</message>
+ </field-validator>
+
+ </field>
+
<field name="comment">
+
<field-validator type="stringlength" short-circuit="true">
<param name="maxLength">2000</param>
<message>tutti.validator.error.comment.too.long##${maxLength}</message>
</field-validator>
+
+ <field-validator type="fieldexpression" short-circuit="true">
+ <param name="expression">
+ <![CDATA[ fishingOperationValid == null || fishingOperationValid || (comment != null && !comment.isEmpty()) ]]>
+ </param>
+ <message>tutti.validator.error.fishingOperation.comment.required</message>
+ </field-validator>
+
</field>
</validators>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357)
@@ -36,13 +36,8 @@
<field name="sampleWeight">
- <field-validator type="required" short-circuit="true">
- <message>tutti.validator.error.splitSpeciesBatch.sampleWeight.required
- </message>
- </field-validator>
-
<field-validator type="fieldexpression" short-circuit="true">
- <param name="expression"><![CDATA[ sampleWeight > 0 ]]></param>
+ <param name="expression"><![CDATA[ sampleWeight == null || sampleWeight > 0 ]]></param>
<message>
tutti.validator.error.splitSpeciesBatch.sampleWeight.invalidValue
</message>
@@ -50,7 +45,7 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ sampleWeight <= batchWeight]]></param>
+ <![CDATA[ sampleWeight == null || sampleWeight <= batchWeight]]></param>
<message>
tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight
</message>
@@ -58,7 +53,7 @@
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression">
- <![CDATA[ ( sample || batchWeight == sampleWeight ) ]]></param>
+ <![CDATA[ ( sampleWeight == null || sample || batchWeight == sampleWeight ) ]]></param>
<message>
tutti.validator.error.splitSpeciesBatch.sampleWeight.mismatchBatchWeight
</message>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/program/EditProgramUIModel-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357)
@@ -32,6 +32,14 @@
<field-validator type="requiredstring" short-circuit="true">
<message>tutti.validator.error.program.name.required</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingPrograms</param>
+ <param name="keys">name, zone</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.program.existingKey</message>
+ </field-validator>
</field>
@@ -40,6 +48,14 @@
<field-validator type="required" short-circuit="true">
<message>tutti.validator.error.program.zone.required</message>
</field-validator>
+
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingPrograms</param>
+ <param name="keys">name, zone</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
+ <message>tutti.validator.error.program.existingKey</message>
+ </field-validator>
</field>
Modified: trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/resources/fr/ifremer/tutti/ui/swing/content/protocol/EditProtocolUIModel-error-validation.xml 2013-02-07 11:20:45 UTC (rev 357)
@@ -31,10 +31,11 @@
<message>tutti.validator.error.protocol.name.required</message>
</field-validator>
- <field-validator type="fieldexpression" short-circuit="true">
- <param name="expression">
- <![CDATA[ !nameAlreadyUsed ]]>
- </param>
+ <field-validator type="collectionUniqueKey" short-circuit="true">
+ <param name="collectionFieldName">existingProtocols</param>
+ <param name="keys">name</param>
+ <param name="againstMe">true</param>
+ <param name="nullValueSkipped">true</param>
<message>tutti.validator.error.protocol.name.alreadyUsed</message>
</field-validator>
Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties
===================================================================
--- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-07 11:16:52 UTC (rev 356)
+++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-02-07 11:20:45 UTC (rev 357)
@@ -29,7 +29,9 @@
tutti.action.configuration.tip=Configurer Tutti
tutti.action.createSpeciesBatch=Créer un lot pour une espèce
tutti.action.deleteProtocol=Supprimer
+tutti.action.deleteProtocol.message=Vous êtes sur le point de supprimer le protocol %s
tutti.action.deleteProtocol.tip=Supprimer le protocole sélectioné
+tutti.action.deleteProtocol.title=Supprimer le protocole sélectioné
tutti.action.editCatches=Saisir les captures
tutti.action.editCatches.tip=Saisir des captures
tutti.action.editCruise=Éditer
@@ -315,6 +317,7 @@
tutti.option.ui.shortcut.closePopup.description=Fermer une popup
tutti.option.ui.showNumberEditorButton.description=Afficher le pavé numérique de saisie
tutti.option.update.url.description=URL de mise à jour
+tutti.propety.no.species.surveyCode=\#
tutti.sampleCategoryType.age=Age
tutti.sampleCategoryType.maturity=Maturité
tutti.sampleCategoryType.sex=Sexe
@@ -393,6 +396,7 @@
tutti.table.species.frequency.header.number=Nombre
tutti.table.species.frequency.header.weight=Poids observé (kg)
tutti.table.species.sampleCategory.header.category=Catégorie
+tutti.table.species.sampleCategory.header.selected=
tutti.table.species.sampleCategory.header.weight=Poids (kg)
tutti.timeeditor.H=H
tutti.title.about=À propos de Tutti
@@ -453,14 +457,24 @@
tutti.validator.error.cruise.program.required=La série est obligatoire
tutti.validator.error.cruise.vessel.required=Au moins un bateau doit être sélectionné
tutti.validator.error.cruise.year.required=L'année est obligatoire
-tutti.validator.error.fishingOperation.date.required=La date du fishingOperation est obligatoire
+tutti.validator.error.fishingOperation.catcher.required=Au moins un saisisseur est obligatoire
+tutti.validator.error.fishingOperation.comment.required=Le commentaire est obligatoire si le traît est invalide
+tutti.validator.error.fishingOperation.date.end.required=La date de la fin du trait est obligatoire
+tutti.validator.error.fishingOperation.date.start.required=La date du début du trait est obligatoire
tutti.validator.error.fishingOperation.dates.endBeforeStart=La date de fin doit être après la date de début
tutti.validator.error.fishingOperation.dates.endOutOfCruiseDates=La date de fin est en dehors des dates de la campagne
tutti.validator.error.fishingOperation.dates.startOutOfCruiseDates=La date de début est en dehors des dates de la campagne
+tutti.validator.error.fishingOperation.existingKey=La clé code station/numéro de trait/date de début existe déjà
tutti.validator.error.fishingOperation.fishingOperationNumber.required=Le numéro de trait est obligatoire
+tutti.validator.error.fishingOperation.fishingOperationValid.required=La validité du traît est obligatoire
+tutti.validator.error.fishingOperation.gear.required=L'engin est obligatoire
tutti.validator.error.fishingOperation.stationNumber.required=Le numéro de station est obligatoire
tutti.validator.error.fishingOperation.stationNumber.too.long=Valeur trop longue (limitée à %s caractères)
+tutti.validator.error.fishingOperation.strataLocation.required=La strate, sous-strate ou la localité doit être renseignée
+tutti.validator.error.fishingOperation.trawlDistance.required=La distance est obligatoire
tutti.validator.error.fishingOperation.trawlNetNumber.required=Le numéro de poche est obligatoire
+tutti.validator.error.fishingOperation.vessel.required=Le navire est obligatoire
+tutti.validator.error.program.existingKey=Le couple nom/zone existe déjà
tutti.validator.error.program.name.required=Le nom de la série est obligatoire
tutti.validator.error.program.zone.required=La zone de la série est obligatoire
tutti.validator.error.protocol.name.alreadyUsed=Le nom du protocol est déjà utilisé
@@ -472,6 +486,7 @@
tutti.validator.error.splitSpeciesBatch.sampleWeight.required=Pas de poids ventilé
tutti.validator.error.splitSpeciesBatch.sampleWeight.sampleBatchGreaterThanBatchWeight=La somme des poids ventilés doit être inférieur ou égale à celle du poids du lot
tutti.validator.error.splitSpeciesBatch.selectedCategory.required=La catégorie est obligatoire
+tutti.validator.warning.cruise.name.format=Le format n'est pas celui ...
tutti.validator.warning.latitude.degree.outOfBounds=Le degré de la latitude doit être compris entre -90 et 90
tutti.validator.warning.latitude.minute.outOfBounds=La minute de la latitude doit être comprise entre 0 et 60
tutti.validator.warning.latitude.outOfBounds=La Latitude doit être comprise entre -90.0 et 90.0
1
0
r356 - trunk/tutti-service/src/main/java/fr/ifremer/tutti/service
by kmorin@users.forge.codelutin.com 07 Feb '13
by kmorin@users.forge.codelutin.com 07 Feb '13
07 Feb '13
Author: kmorin
Date: 2013-02-07 12:16:52 +0100 (Thu, 07 Feb 2013)
New Revision: 356
Url: http://forge.codelutin.com/projects/tutti/repository/revisions/356
Log:
modify program decorator
Modified:
trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java
Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java
===================================================================
--- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java 2013-02-07 08:26:42 UTC (rev 355)
+++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/DecoratorService.java 2013-02-07 11:16:52 UTC (rev 356)
@@ -107,12 +107,12 @@
decoratorProvider = new DecoratorProvider() {
@Override
protected void loadDecorators() {
-
- registerTuttiDecorator(Program.class, "${name}$s", SEPARATOR, " - ");
+
+ registerTuttiDecorator(Zone.class, "${label}$s#${name}$s", SEPARATOR, " - ");
+ registerMultiJXPathDecorator(Program.class, "${name}$s#${zone/label}$s", SEPARATOR, " - ");
registerTuttiDecorator(Cruise.class, "${name}$s", SEPARATOR, " - ");
registerTuttiDecorator(TuttiProtocol.class, "${name}$s", SEPARATOR, " - ");
registerTuttiDecorator(FishingOperation.class, "${stationNumber}$s#${fishingOperationNumber}$s#${multirigAggregation}$s#${gearShootingStartDate}$td/%4$tm/%4$tY", SEPARATOR, " - ");
- registerTuttiDecorator(Zone.class, "${label}$s#${name}$s", SEPARATOR, " - ");
// registerMultiJXPathDecorator(Vessel.class, "${name}$s#${internalRegistrationCode}$s", SEPARATOR, " - ");
registerTuttiDecorator(Country.class, "${label}$s#${name}$s", SEPARATOR, " - ");
registerTuttiDecorator(Gear.class, "${label}$s#${name}$s", SEPARATOR, " - ");
1
0