r145 - in trunk: tutti-persistence/src/main/java/fr/ifremer/tutti/persistence tutti-persistence/src/main/xmi tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence tutti-service/src/main/java/fr/ifremer/tutti/service tutti-ui-swing tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split
Author: tchemit Date: 2013-01-02 19:17:45 +0100 (Wed, 02 Jan 2013) New Revision: 145 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/145 Log: refs #1805: [Onglet Poisson] Assistance ?\195?\160 la saisie des lots de poissons (presque fini at last\!) Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java trunk/tutti-persistence/src/main/xmi/tutti-persistence.properties trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java trunk/tutti-ui-swing/pom.xml 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/SampleCategoryType.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/SpeciesBatchUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java 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/SplitSpeciesBatchUIModel.java Modified: trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java =================================================================== --- trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistence.java 2013-01-02 18:17:45 UTC (rev 145) @@ -162,6 +162,8 @@ //-- Species Batch methods --// //------------------------------------------------------------------------// + List<SpeciesBatch> getAllRootSpeciesBatch(String fishingOperationId); + List<SpeciesBatch> getAllSpeciesBatch(String fishingOperationId); SpeciesBatch getSpeciesBatch(String id); Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.properties =================================================================== --- trunk/tutti-persistence/src/main/xmi/tutti-persistence.properties 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-persistence/src/main/xmi/tutti-persistence.properties 2013-01-02 18:17:45 UTC (rev 145) @@ -35,6 +35,7 @@ fr.ifremer.tutti.persistence.entities.data.FishingOperation.attribute.saisisseur.stereotype=ordered fr.ifremer.tutti.persistence.entities.data.MacroWasteBatch.attribute.macroWasteCategory.stereotype=ordered +fr.ifremer.tutti.persistence.entities.data.SpeciesBatch.attribute.childBatchs.stereotype=ordered fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.gearPmfmId.stereotype=ordered fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol.attribute.environmentPmfmId.stereotype=ordered Modified: trunk/tutti-persistence/src/main/xmi/tutti-persistence.zargo =================================================================== (Binary files differ) Modified: trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java =================================================================== --- trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-persistence-dev/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceDevImpl.java 2013-01-02 18:17:45 UTC (rev 145) @@ -27,6 +27,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -446,9 +447,22 @@ //------------------------------------------------------------------------// @Override + public List<SpeciesBatch> getAllRootSpeciesBatch(String fishingOperationId) { + List<SpeciesBatch> result = getAllTraitFilterBatches( + SpeciesBatch.class, fishingOperationId, new Predicate<SpeciesBatch>() { + + @Override + public boolean apply(SpeciesBatch input) { + return input.getParentBatch() == null; + } + }); + return result; + } + + @Override public List<SpeciesBatch> getAllSpeciesBatch(final String fishingOperationId) { List<SpeciesBatch> result = getAllTraitFilterBatches( - SpeciesBatch.class, fishingOperationId); + SpeciesBatch.class, fishingOperationId, null); return result; } @@ -508,7 +522,7 @@ @Override public List<BenthosBatch> getAllBenthosBatch(String fishingOperationId) { List<BenthosBatch> result = getAllTraitFilterBatches( - BenthosBatch.class, fishingOperationId); + BenthosBatch.class, fishingOperationId, null); return result; } @@ -542,7 +556,7 @@ @Override public List<PlanktonBatch> getAllPlanktonBatch(String fishingOperationId) { List<PlanktonBatch> result = getAllTraitFilterBatches( - PlanktonBatch.class, fishingOperationId); + PlanktonBatch.class, fishingOperationId, null); return result; } @@ -576,7 +590,7 @@ @Override public List<MacroWasteBatch> getAllMacroWasteBatch(String fishingOperationId) { List<MacroWasteBatch> result = getAllTraitFilterBatches( - MacroWasteBatch.class, fishingOperationId); + MacroWasteBatch.class, fishingOperationId, null); return result; } @@ -610,7 +624,7 @@ @Override public List<AccidentalBatch> getAllAccidentalBatch(String fishingOperationId) { List<AccidentalBatch> result = getAllTraitFilterBatches( - AccidentalBatch.class, fishingOperationId); + AccidentalBatch.class, fishingOperationId, null); return result; } @@ -837,8 +851,14 @@ return Lists.newArrayList(result); } - protected <B extends FishingOperationAware> List<B> getAllTraitFilterBatches(Class<B> beanType, String traitId) { + protected <B extends FishingOperationAware> List<B> getAllTraitFilterBatches( + Class<B> beanType, + String traitId, + Predicate<B> extraPredicate) { Predicate<B> predicate = TuttiEntities.newTraitIdPredicate(traitId); + if (extraPredicate != null) { + predicate = Predicates.and(predicate, extraPredicate); + } List<B> result = Lists.newArrayList(Iterables.filter(getData(beanType), predicate)); return result; } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java 2013-01-02 18:17:45 UTC (rev 145) @@ -367,7 +367,14 @@ //-- Species Batch methods --// //------------------------------------------------------------------------// + @Override + public List<SpeciesBatch> getAllRootSpeciesBatch(String fishingOperationId) { + checkDriverExists(); + return driver.getAllRootSpeciesBatch(fishingOperationId); + } + + @Override public List<SpeciesBatch> getAllSpeciesBatch(String fishingOperationId) { checkDriverExists(); return driver.getAllSpeciesBatch(fishingOperationId); Modified: trunk/tutti-ui-swing/pom.xml =================================================================== --- trunk/tutti-ui-swing/pom.xml 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/pom.xml 2013-01-02 18:17:45 UTC (rev 145) @@ -52,7 +52,7 @@ <!--<jaxx.helpBrokerFQN>fr.ird.observe.ui.ObserveHelpBroker</jaxx.helpBrokerFQN>--> <!-- jaxx help configuration --> - <jaxx.helpsetName>sammoa</jaxx.helpsetName> + <jaxx.helpsetName>tutti</jaxx.helpsetName> <jaxx.locales>fr</jaxx.locales> <!--<jaxx.helpTarget>src/main/help</jaxx.helpTarget>--> 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-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryComponent.java 2013-01-02 18:17:45 UTC (rev 145) @@ -213,14 +213,18 @@ String text = null; if (sampleCategory != null) { C categoryValue = sampleCategory.getCategoryValue(); - Float number = sampleCategory.getCategoryWeight(); + if (categoryValue == null) { + text = ""; + } else { + Float number = sampleCategory.getCategoryWeight(); - text = categoryDecorator.toString(categoryValue) + " / "; + text = categoryDecorator.toString(categoryValue) + " / "; - if (number == null) { - text = "-"; - } else { - text += number; + if (number == null) { + text += "-"; + } else { + text += number; + } } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SampleCategoryType.java 2013-01-02 18:17:45 UTC (rev 145) @@ -24,10 +24,12 @@ * #L% */ +import com.google.common.collect.Maps; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryEnum; import fr.ifremer.tutti.service.DecoratorService; -import org.apache.commons.lang3.ObjectUtils; +import java.util.EnumMap; + import static org.nuiton.i18n.I18n._; import static org.nuiton.i18n.I18n.n_; @@ -40,7 +42,7 @@ public enum SampleCategoryType implements DecoratorService.LabelAware { species( n_("tutti.sampleCategoryType.species"), - null), + SampleCategoryEnum.species), sortedUnsorted( n_("tutti.sampleCategoryType.sortedUnsorted"), SampleCategoryEnum.sortedUnsorted), @@ -76,13 +78,20 @@ } public static SampleCategoryType valueOf(SampleCategoryEnum type) { - SampleCategoryType result = null; - for (SampleCategoryType sampleCategoryType : values()) { - if (ObjectUtils.equals(type, sampleCategoryType.type)) { - result = sampleCategoryType; - break; - } - } + SampleCategoryType result = enumToType.get(type); return result; } + + public static final EnumMap<SampleCategoryEnum, SampleCategoryType> enumToType; + + static { + enumToType = Maps.newEnumMap(SampleCategoryEnum.class); + enumToType.put(SampleCategoryEnum.species, species); + enumToType.put(SampleCategoryEnum.sortedUnsorted, sortedUnsorted); + enumToType.put(SampleCategoryEnum.size, size); + enumToType.put(SampleCategoryEnum.sex, sex); + enumToType.put(SampleCategoryEnum.maturity, maturity); + enumToType.put(SampleCategoryEnum.age, age); + + } } 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-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchRowModel.java 2013-01-02 18:17:45 UTC (rev 145) @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.data.Attachment; +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.CaracteristicQualitativeValue; @@ -35,7 +36,6 @@ import org.apache.commons.collections.CollectionUtils; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; -import org.nuiton.util.beans.BinderModelBuilder; import java.util.Collections; import java.util.List; @@ -110,6 +110,8 @@ public static final String PROPERTY_BATCH_ROOT = "batchRoot"; + public static final String PROPERTY_SAMPLE_CATEGORY = "sampleCategory"; + /** * Species category. * @@ -153,6 +155,16 @@ protected final SampleCategory<Float> ageSampleCategory; /** + * Sample category of this batch. + * <p/> + * This is one of the sample category befined above, used to know if the + * table row which sample category affects this row exactly. + * + * @since 0.3 + */ + private SampleCategory<?> sampleCategory; + + /** * Species observed. * * @since 0.2 @@ -232,10 +244,8 @@ protected List<SpeciesBatchRowModel> batchChild; protected static final Binder<SpeciesBatch, SpeciesBatchRowModel> fromBeanBinder = - BinderModelBuilder. - newDefaultBuilder(SpeciesBatch.class,SpeciesBatchRowModel.class). - addProperty(SpeciesBatch.PROPERTY_SPECIES, SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY). - addProperty(SpeciesBatch.PROPERTY_SPECIES, SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY).toBinder(); + BinderFactory.newBinder(SpeciesBatch.class, + SpeciesBatchRowModel.class); protected static final Binder<SpeciesBatchRowModel, SpeciesBatch> toBeanBinder = BinderFactory.newBinder(SpeciesBatchRowModel.class, @@ -256,7 +266,6 @@ List<SpeciesBatchFrequency> frequencies) { this(); fromBean(aBatch); - setSpeciesCategory(aBatch.getSpecies()); List<SpeciesFrequencyRowModel> frequencyRows = SpeciesFrequencyRowModel.fromBeans(frequencies); frequency.addAll(frequencyRows); @@ -264,6 +273,46 @@ } //------------------------------------------------------------------------// + //-- Sample category --// + //------------------------------------------------------------------------// + + public SampleCategory<?> getSampleCategory() { + return sampleCategory; + } + + public void setSampleCategory(SampleCategory<?> sampleCategory) { + Object oldValue = getSampleCategory(); + this.sampleCategory = sampleCategory; + firePropertyChange(PROPERTY_SAMPLE_CATEGORY, oldValue, sampleCategory); + } + + public SampleCategory<?> getSampleCategory(SampleCategoryEnum sampleCategoryEnum) { + switch (sampleCategoryEnum) { + + case species: + sampleCategory = getSpeciesSampleCategory(); + break; + case sortedUnsorted: + sampleCategory = getSortedUnsortedSampleCategory(); + break; + case size: + sampleCategory = getSizeSampleCategory(); + break; + case sex: + sampleCategory = getSexSampleCategory(); + break; + case maturity: + sampleCategory = getMaturitySampleCategory(); + break; + case age: + sampleCategory = getAgeSampleCategory(); + break; + default: + } + return sampleCategory; + } + + //------------------------------------------------------------------------// //-- Species category --// //------------------------------------------------------------------------// 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-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchTableModel.java 2013-01-02 18:17:45 UTC (rev 145) @@ -24,7 +24,9 @@ * #L% */ +import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; @@ -48,63 +50,79 @@ public static <R> SampleColumnIdentifier<R> newId(String propertyName, String weightPropertyName, + SampleCategoryType sampleCategoryType, String headerI18nKey, String headerTipI18nKey) { return new SampleColumnIdentifier<R>(propertyName, weightPropertyName, + sampleCategoryType, headerI18nKey, headerTipI18nKey); } + private final SampleCategoryType sampleCategoryType; + private final String weightPropertyName; protected SampleColumnIdentifier(String propertyName, String weightPropertyName, + SampleCategoryType sampleCategoryType, String headerI18nKey, String headerTipI18nKey ) { super(propertyName, headerI18nKey, headerTipI18nKey); this.weightPropertyName = weightPropertyName; + this.sampleCategoryType = sampleCategoryType; } public void setWeightValue(R entry, Object value) { TuttiUIUtil.setProperty(entry, weightPropertyName, value); } + + public SampleCategoryType getSampleCategoryType() { + return sampleCategoryType; + } } public static final ColumnIdentifier<SpeciesBatchRowModel> SPECIES_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_SPECIES_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY_WEIGHT, + SampleCategoryType.species, n_("tutti.table.species.batch.header.speciesCategory"), n_("tutti.table.species.batch.header.speciesCategory")); public static final ColumnIdentifier<SpeciesBatchRowModel> SORTED_UNSORTED_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY_WEIGHT, + SampleCategoryType.sortedUnsorted, n_("tutti.table.species.batch.header.sortedUnsortedCategory"), n_("tutti.table.species.batch.header.sortedUnsortedCategory")); public static final ColumnIdentifier<SpeciesBatchRowModel> SIZE_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_SIZE_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SIZE_CATEGORY_WEIGHT, + SampleCategoryType.size, n_("tutti.table.species.batch.header.sizeCategory"), n_("tutti.table.species.batch.header.sizeCategory")); public static final ColumnIdentifier<SpeciesBatchRowModel> SEX_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_SEX_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SEX_CATEGORY_WEIGHT, + SampleCategoryType.sex, n_("tutti.table.species.batch.header.sexCategory"), n_("tutti.table.species.batch.header.sexCategory")); public static final ColumnIdentifier<SpeciesBatchRowModel> MATURITY_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_MATURITY_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_MATURITY_CATEGORY_WEIGHT, + SampleCategoryType.maturity, n_("tutti.table.species.batch.header.maturityCategory"), n_("tutti.table.species.batch.header.maturityCategory")); public static final ColumnIdentifier<SpeciesBatchRowModel> AGE_CATEGORY = SampleColumnIdentifier.newId( SpeciesBatchRowModel.PROPERTY_AGE_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_AGE_CATEGORY_WEIGHT, + SampleCategoryType.age, n_("tutti.table.species.batch.header.ageCategory"), n_("tutti.table.species.batch.header.ageCategory")); @@ -143,18 +161,36 @@ n_("tutti.table.species.batch.header.toConfirm"), n_("tutti.table.species.batch.header.toConfirm")); - protected final Set<ColumnIdentifier<SpeciesBatchRowModel>> noneEditableColIfNoSpecies; + /** + * Columns for the frequency edition. + * + * @since 0.2 + */ + protected final Set<ColumnIdentifier<SpeciesBatchRowModel>> frequencyCols; + /** + * Columns implies in the sample category definition. + * + * @since 0.2 + */ protected final Set<ColumnIdentifier<SpeciesBatchRowModel>> sampleCols; - public SpeciesBatchTableModel(TableColumnModel columnModel) { + /** + * Mapping for each species of authroized sample category. + * + * @since 0.3 + */ + protected final Multimap<Species, SampleCategoryType> speciesSampleCategories; + + public SpeciesBatchTableModel(TableColumnModel columnModel, + Multimap<Species, SampleCategoryType> speciesSampleCategories) { super(columnModel, false, false); - + this.speciesSampleCategories = speciesSampleCategories; setNoneEditableCols(); - noneEditableColIfNoSpecies = Sets.newHashSet(); - noneEditableColIfNoSpecies.add(COMPUTED_NUMBER); - noneEditableColIfNoSpecies.add(COMPUTED_WEIGHT); + frequencyCols = Sets.newHashSet(); + frequencyCols.add(COMPUTED_NUMBER); + frequencyCols.add(COMPUTED_WEIGHT); sampleCols = Sets.newHashSet(); sampleCols.add(SPECIES_CATEGORY); @@ -216,17 +252,45 @@ propertyName); if (result) { - if (noneEditableColIfNoSpecies.contains(propertyName)) { + if (frequencyCols.contains(propertyName)) { // must have filled a species to edit this column SpeciesBatchRowModel entry = getEntry(rowIndex); result = entry.isValid() && entry.isBatchLeaf(); + } else if (sampleCols.contains(propertyName)) { + SampleColumnIdentifier<SpeciesBatchRowModel> samplePropertyName = (SampleColumnIdentifier<SpeciesBatchRowModel>) propertyName; + // can only edit if a category value is setted SpeciesBatchRowModel entry = getEntry(rowIndex); - SampleCategory<?> value = (SampleCategory<?>) propertyName.getValue(entry); - result = value.getCategoryValue() != null; + + // check from protocol what is possible ? + Species species = entry.getSpeciesCategory(); + + if (species == null) { + + // no species, can not edit + result = false; + } else { + + // Is protocol authorize it ? + + result = speciesSampleCategories.containsEntry( + species, + samplePropertyName.getSampleCategoryType()); + + if (result) { + + // protocol authorize it + + // final test: can edit only if sample category is setted + SampleCategory<?> value = + (SampleCategory<?>) propertyName.getValue(entry); + + result = value.getCategoryValue() != null; + } + } } } return result; 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-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIHandler.java 2013-01-02 18:17:45 UTC (rev 145) @@ -25,7 +25,9 @@ */ import com.google.common.base.Preconditions; +import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.Attachment; @@ -85,12 +87,19 @@ SpeciesBatchRowModel.PROPERTY_WEIGHT); public static final Set<String> SAMPLING_PROPERTIES = Sets.newHashSet( + SpeciesBatchRowModel.PROPERTY_SAMPLE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY, SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY, SpeciesBatchRowModel.PROPERTY_SIZE_CATEGORY, SpeciesBatchRowModel.PROPERTY_SEX_CATEGORY, SpeciesBatchRowModel.PROPERTY_MATURITY_CATEGORY, - SpeciesBatchRowModel.PROPERTY_AGE_CATEGORY); + SpeciesBatchRowModel.PROPERTY_AGE_CATEGORY, + SpeciesBatchRowModel.PROPERTY_SPECIES_CATEGORY_WEIGHT, + SpeciesBatchRowModel.PROPERTY_SORTED_UNSORTED_CATEGORY_WEIGHT, + SpeciesBatchRowModel.PROPERTY_SIZE_CATEGORY_WEIGHT, + SpeciesBatchRowModel.PROPERTY_SEX_CATEGORY_WEIGHT, + SpeciesBatchRowModel.PROPERTY_MATURITY_CATEGORY_WEIGHT, + SpeciesBatchRowModel.PROPERTY_AGE_CATEGORY_WEIGHT); /** * UI. @@ -159,15 +168,21 @@ Set<Species> speciesUsed = Sets.newHashSet(); + // get all batch species root (says the one with only a species sample category) List<SpeciesBatch> catches = - persistenceService.getAllSpeciesBatch(bean.getId()); + persistenceService.getAllRootSpeciesBatch(bean.getId()); + for (SpeciesBatch aBatch : catches) { - List<SpeciesBatchFrequency> frequencies = - persistenceService.getAllSpeciesBatchFrequency(aBatch.getId()); - SpeciesBatchRowModel entry = - new SpeciesBatchRowModel(aBatch, frequencies); - rows.add(entry); - speciesUsed.add(entry.getSpeciesCategory()); + + // root batch sample categroy is species + Preconditions.checkState( + aBatch.getSampleCategoryType() == SampleCategoryEnum.species, + "Root species batch must be a species sample " + + "category but was:" + aBatch.getSampleCategoryType()); + + SpeciesBatchRowModel rootRow = + loadSpeciesBatch(aBatch, null, rows); + speciesUsed.add(rootRow.getSpeciesCategory()); } availableSpecies.removeAll(speciesUsed); } @@ -343,7 +358,11 @@ TuttiProtocol protocol = ui.getContextValue(TuttiProtocol.class); + Multimap<Species, SampleCategoryType> speciesSampleCategories = + HashMultimap.create(); + if (protocol != null) { + // fill sampling order from protocol List<SampleCategoryEnum> sampleCategoryOrder = @@ -364,6 +383,23 @@ Species species = persistenceService.getSpecies( protocolSpecy.getSpeciesId()); allSpecies.add(species); + speciesSampleCategories.put(species,SampleCategoryType.species); + + if (protocolSpecy.isSortedUnsortedEnabled()) { + speciesSampleCategories.put(species, SampleCategoryType.sortedUnsorted); + } + if (protocolSpecy.isSizeEnabled()) { + speciesSampleCategories.put(species, SampleCategoryType.size); + } + if (protocolSpecy.isSexEnabled()) { + speciesSampleCategories.put(species, SampleCategoryType.sex); + } + if (protocolSpecy.isMaturityEnabled()) { + speciesSampleCategories.put(species, SampleCategoryType.maturity); + } + if (protocolSpecy.isAgeEnabled()) { + speciesSampleCategories.put(species, SampleCategoryType.age); + } } } else { @@ -378,6 +414,16 @@ allSpecies = Lists.newArrayList( persistenceService.getAllSpecies()); + + // each species can use any category + for (Species species : allSpecies) { + speciesSampleCategories.put(species,SampleCategoryType.species); + speciesSampleCategories.put(species, SampleCategoryType.sortedUnsorted); + speciesSampleCategories.put(species, SampleCategoryType.size); + speciesSampleCategories.put(species, SampleCategoryType.sex); + speciesSampleCategories.put(species, SampleCategoryType.maturity); + speciesSampleCategories.put(species, SampleCategoryType.age); + } } if (log.isInfoEnabled()) { @@ -498,7 +544,7 @@ // create table model SpeciesBatchTableModel tableModel = - new SpeciesBatchTableModel(columnModel); + new SpeciesBatchTableModel(columnModel, speciesSampleCategories); table.setModel(tableModel); table.setColumnModel(columnModel); @@ -553,6 +599,7 @@ SpeciesBatchRowModel newRow = tableModel.createNewRow(); newRow.setSpeciesCategory(createModel.getSpecies()); newRow.setSpeciesCategoryWeight(createModel.getBatchWeight()); + newRow.setSampleCategory(newRow.getSpeciesSampleCategory()); recomputeRowValidState(newRow); @@ -586,7 +633,7 @@ SpeciesBatchRowModel parentBatch = tableModel.getEntry(rowIndex); if (log.isInfoEnabled()) { - log.info("Open split batch ui for row [" + rowIndex + "]"); + log.info("Open split batch ui for row [" + rowIndex + ']'); } SplitSpeciesBatchUI splitBatchEditor = getSplitSpeciesBatchEditor(); splitBatchEditor.getHandler().editBatch(parentBatch); @@ -606,7 +653,9 @@ int insertRow = rowIndex; SampleCategoryType selectedCategory = splitModel.getSelectedCategory(); + SampleCategoryEnum sampleCategoryEnum = selectedCategory.getType(); + // Create rows in batch table model List<SpeciesBatchRowModel> newBatches = Lists.newArrayList(); @@ -615,43 +664,13 @@ // can keep this row SpeciesBatchRowModel newBatch = tableModel.createNewRow(); - newBatch.setSpeciesCategory(parentBatch.getSpeciesCategory()); - newBatch.setSpeciesToConfirm(parentBatch.getSpeciesToConfirm()); - if (selectedCategory == SampleCategoryType.sortedUnsorted) { - newBatch.setSortedUnsortedCategory((CaracteristicQualitativeValue) row.getCategoryValue()); - newBatch.setSortedUnsortedCategoryWeight(row.getWeight()); - } else { - newBatch.setSortedUnsortedCategory(parentBatch.getSortedUnsortedCategory()); - newBatch.setSortedUnsortedCategoryWeight(parentBatch.getSortedUnsortedCategoryWeight()); - } - if (selectedCategory == SampleCategoryType.size) { - newBatch.setSizeCategory((CaracteristicQualitativeValue) row.getCategoryValue()); - newBatch.setSizeCategoryWeight(row.getWeight()); - } else { - newBatch.setSizeCategory(parentBatch.getSizeCategory()); - newBatch.setSizeCategoryWeight(parentBatch.getSizeCategoryWeight()); - } - if (selectedCategory == SampleCategoryType.sex) { - newBatch.setSexCategory((CaracteristicQualitativeValue) row.getCategoryValue()); - newBatch.setSexCategoryWeight(row.getWeight()); - } else { - newBatch.setSexCategory(parentBatch.getSexCategory()); - newBatch.setSexCategoryWeight(parentBatch.getSexCategoryWeight()); - } - if (selectedCategory == SampleCategoryType.maturity) { - newBatch.setMaturityCategory((CaracteristicQualitativeValue) row.getCategoryValue()); - newBatch.setMaturityCategoryWeight(row.getWeight()); - } else { - newBatch.setMaturityCategory(parentBatch.getMaturityCategory()); - newBatch.setMaturityCategoryWeight(parentBatch.getMaturityCategoryWeight()); - } - if (selectedCategory == SampleCategoryType.age) { - newBatch.setAgeCategory((Float) row.getCategoryValue()); - newBatch.setAgeCategoryWeight(row.getWeight()); - } else { - newBatch.setAgeCategory(parentBatch.getAgeCategory()); - newBatch.setAgeCategoryWeight(parentBatch.getAgeCategoryWeight()); - } + + loadBatchRow(parentBatch, + newBatch, + sampleCategoryEnum, + row.getCategoryValue(), + row.getWeight()); + tableModel.addNewRow(++insertRow, newBatch); boolean rowValid = isRowValid(newBatch); newBatch.setValid(rowValid); @@ -659,6 +678,7 @@ newBatches.add(newBatch); } } + // add new batches to his parent parentBatch.setChilds(newBatches); @@ -907,47 +927,121 @@ columnIdentifier); } - // protected void recomputeSuperSamplingRatio(SpeciesBatchTreeModel samplingTreeModel, -// SpeciesBatchTreeNode node) { + protected SpeciesBatchRowModel loadSpeciesBatch(SpeciesBatch aBatch, + SpeciesBatchRowModel parentRow, + List<SpeciesBatchRowModel> rows) { + + List<SpeciesBatchFrequency> frequencies = + persistenceService.getAllSpeciesBatchFrequency(aBatch.getId()); + + SpeciesBatchRowModel newRow = + new SpeciesBatchRowModel(aBatch, frequencies); + + SampleCategoryEnum sampleCategoryEnum = + aBatch.getSampleCategoryType(); + + Preconditions.checkNotNull( + sampleCategoryEnum, + "Can't have a batch with no sample category, but was: " + aBatch); + + loadBatchRow(parentRow, newRow, + sampleCategoryEnum, + aBatch.getSampleCategoryValue(), + aBatch.getSampleCategoryWeight()); + +// SampleCategory sampleCategory = +// newRow.getSampleCategory(sampleCategoryEnum); // -// SpeciesBatchTreeNode superSamplingNode = node.getParent(); +// // set sample category data from batch +// sampleCategory.setCategoryValue(aBatch.getSampleCategoryValue()); +// sampleCategory.setCategoryWeight(aBatch.getSampleCategoryWeight()); +// newRow.setSampleCategory(sampleCategory); // -// Preconditions.checkNotNull(superSamplingNode, -// "Super sampling node can't be null"); +// if (parentRow != null) { // -// SpeciesBatchTreeModel.SamplingContext samplingContext = -// samplingTreeModel.createSamplingContext(superSamplingNode); +// // copy back parent data (mainly other sample categories // -// float samplingTotalWeight = samplingContext.getTotalWeight(); -// Float superSamplingTotalWeight; -// SpeciesBatchRowModel superSamplingRow = -// samplingContext.getSuperSamplingRow(); -// if (superSamplingRow == null) { -// -// // Use directly the batch total weight (means no super-sampling) -// -// superSamplingTotalWeight = getModel().getSpeciesTotalWeight(); -// } else { -// superSamplingTotalWeight = superSamplingRow.getWeight(); +// newRow.setBatchParent(parentRow); +// if (sampleCategoryEnum != SampleCategoryEnum.species) { +// newRow.setSpeciesCategory(parentRow.getSpeciesCategory()); +// } +// if (sampleCategoryEnum != SampleCategoryEnum.sortedUnsorted) { +// newRow.setSortedUnsortedCategory(parentRow.getSortedUnsortedCategory()); +// } +// if (sampleCategoryEnum != SampleCategoryEnum.size) { +// newRow.setSizeCategory(parentRow.getSizeCategory()); +// } +// if (sampleCategoryEnum != SampleCategoryEnum.sex) { +// newRow.setSexCategory(parentRow.getSexCategory()); +// } +// if (sampleCategoryEnum != SampleCategoryEnum.maturity) { +// newRow.setMaturityCategory(parentRow.getMaturityCategory()); +// } +// if (sampleCategoryEnum != SampleCategoryEnum.age) { +// newRow.setAgeCategory(parentRow.getAgeCategory()); +// } // } -// -// if (log.isInfoEnabled()) { -// log.info("Super sampling total weight: " + -// superSamplingTotalWeight); -// } -// -// Float samplingRatio = null; -// if (superSamplingTotalWeight != null) { -// samplingRatio = samplingTotalWeight / superSamplingTotalWeight; -// } -// -// if (log.isInfoEnabled()) { -// log.info("Sampling ratio: " + samplingRatio); -// } -// -// samplingContext.applyNewSampleValues(samplingTotalWeight, -// samplingRatio); -// -// getTableModel().updateSamplingRatio(samplingContext.getSamplingRows()); -// } + + rows.add(newRow); + + if (!aBatch.isChildBatchsEmpty()) { + + // create batch childs rows + + for (SpeciesBatch childBatch : aBatch.getChildBatchs()) { + SpeciesBatchRowModel childRow = loadSpeciesBatch(childBatch, newRow, rows); + childRow.setBatchParent(newRow); + } + } + + return newRow; + } + + protected void loadBatchRow(SpeciesBatchRowModel parentRow, + SpeciesBatchRowModel newRow, + SampleCategoryEnum sampleCategoryEnum, + Serializable categoryValue, + Float categoryWeight) { + + // get sample category from his type + SampleCategory sampleCategory = + newRow.getSampleCategory(sampleCategoryEnum); + + // fill it + sampleCategory.setCategoryValue(categoryValue); + sampleCategory.setCategoryWeight(categoryWeight); + + // push it back to row as his *main* sample category + newRow.setSampleCategory(sampleCategory); + + if (parentRow != null) { + + // copy back parent data (mainly other sample categories) + + newRow.setSpeciesToConfirm(parentRow.getSpeciesToConfirm()); + + newRow.setBatchParent(parentRow); + if (sampleCategoryEnum != SampleCategoryEnum.species) { + newRow.setSpeciesCategory(parentRow.getSpeciesCategory()); + } + if (sampleCategoryEnum != SampleCategoryEnum.sortedUnsorted) { + newRow.setSortedUnsortedCategory(parentRow.getSortedUnsortedCategory()); + } + if (sampleCategoryEnum != SampleCategoryEnum.size) { + newRow.setSizeCategory(parentRow.getSizeCategory()); + } + if (sampleCategoryEnum != SampleCategoryEnum.sex) { + newRow.setSexCategory(parentRow.getSexCategory()); + } + if (sampleCategoryEnum != SampleCategoryEnum.maturity) { + newRow.setMaturityCategory(parentRow.getMaturityCategory()); + } + if (sampleCategoryEnum != SampleCategoryEnum.age) { + newRow.setAgeCategory(parentRow.getAgeCategory()); + } + } + + + } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java 2013-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/SpeciesBatchUIModel.java 2013-01-02 18:17:45 UTC (rev 145) @@ -100,20 +100,12 @@ */ protected boolean removeSpeciesSubBatchEnabled; - /** - * Tree of sampling for batch rows. - * - * @since 0.2 - */ - protected final SpeciesBatchTreeModel samplingTreeModel; - public SpeciesBatchUIModel(EditCatchesUIModel catchesUIModel) { super(catchesUIModel, EditCatchesUIModel.PROPERTY_SPECIES_TOTAL_WEIGHT, EditCatchesUIModel.PROPERTY_SPECIES_TOTAL_SORTED_WEIGHT, EditCatchesUIModel.PROPERTY_SPECIES_TOTAL_UNSORTED_WEIGHT, EditCatchesUIModel.PROPERTY_SPECIES_TOTAL_SAMPLE_SORTED_WEIGHT); - this.samplingTreeModel = new SpeciesBatchTreeModel(); } public Float getSpeciesTotalWeight() { @@ -148,10 +140,6 @@ catchesUIModel.setSpeciesTotalUnsortedWeight(speciesTotalUnsortedWeight); } - public SpeciesBatchTreeModel getSamplingTreeModel() { - return samplingTreeModel; - } - public List<SampleCategoryType> getSamplingOrder() { return samplingOrder; } 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-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIHandler.java 2013-01-02 18:17:45 UTC (rev 145) @@ -24,6 +24,7 @@ * #L% */ +import com.ezware.oxbow.swingbits.util.Preconditions; import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; @@ -158,7 +159,6 @@ SplitSpeciesBatchUIModel model = getModel(); - //TODO Use protocol to have lengthStepCaracteristic to use (if any protocol) initBeanComboBox(ui.getCategoryComboBox(), Lists.<SampleCategoryType>newArrayList(), model.getSelectedCategory()); @@ -249,51 +249,36 @@ List<SampleCategoryType> categories = Lists.newArrayList(SampleCategoryType.values()); - Float batchWeight = null; - if (batch != null) { - //TODO Use the samplingOrder + //TODO Use the samplingOrder (+ the one from the table model) List<SampleCategoryType> samplingOrder = parentUi.getModel().getSamplingOrder(); - SampleCategory<?> lastCategory = null; + SampleCategory<?> lastCategory = batch.getSampleCategory(); + Preconditions.checkNotNull( + lastCategory, + "Can't split a species batch with no sample category."); + if (batch.getSortedUnsortedSampleCategory().isValid()) { categories.remove(SampleCategoryType.sortedUnsorted); - lastCategory = batch.getSortedUnsortedSampleCategory(); } if (batch.getSizeSampleCategory().isValid()) { categories.remove(SampleCategoryType.size); - lastCategory = batch.getSizeSampleCategory(); } if (batch.getSexSampleCategory().isValid()) { categories.remove(SampleCategoryType.sex); - lastCategory = batch.getSexSampleCategory(); } if (batch.getMaturitySampleCategory().isValid()) { categories.remove(SampleCategoryType.maturity); - lastCategory = batch.getMaturitySampleCategory(); } if (batch.getAgeSampleCategory().isValid()) { categories.remove(SampleCategoryType.age); - lastCategory = batch.getAgeSampleCategory(); } - - - if (lastCategory == null) { - - // no category, then must only come from the weight - batchWeight = batch.getWeight(); - - } else { - - // use last category weight - batchWeight = lastCategory.getCategoryWeight(); - } } SplitSpeciesBatchUIModel model = getModel(); @@ -303,7 +288,6 @@ model.setSampleWeight(null); model.setCategory(categories); - model.setBatchWeight(batchWeight); // keep batch (will be used to push back editing entry) model.setBatch(batch); @@ -433,7 +417,7 @@ if (log.isDebugEnabled()) { log.debug("Will add " + rows.size() + " rows in table model " + - "(can add a first empty row? " + editableCategoryValue + ")."); + "(can add a first empty row? " + editableCategoryValue + ")."); } getModel().setRows(rows); 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-01-02 14:22:01 UTC (rev 144) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/split/SplitSpeciesBatchUIModel.java 2013-01-02 18:17:45 UTC (rev 145) @@ -83,13 +83,6 @@ protected boolean sample; /** - * Incoming batch weight to split. - * - * @since 0.3 - */ - protected Float batchWeight; - - /** * Sample weight of split batches. * * @since 0.3 @@ -106,8 +99,11 @@ public void setBatch(SpeciesBatchRowModel batch) { Object oldSpecies = getSpecies(); + Object oldWeight = getBatchWeight(); + this.batch = batch; firePropertyChange(PROPERTY_SPECIES, oldSpecies, getSpecies()); + firePropertyChange(PROPERTY_BATCH_WEIGHT, oldWeight, getBatchWeight()); } public Species getSpecies() { @@ -145,15 +141,9 @@ } public Float getBatchWeight() { - return batchWeight; + return batch == null ? null : batch.getSampleCategory().getCategoryWeight(); } - public void setBatchWeight(Float batchWeight) { - Object oldValue = getBatchWeight(); - this.batchWeight = batchWeight; - firePropertyChange(PROPERTY_BATCH_WEIGHT, oldValue, batchWeight); - } - public Float getSampleWeight() { return sampleWeight; }
participants (1)
-
tchemit@users.forge.codelutin.com