This is an automated email from the git hooks/post-receive script. New commit to branch feature/5954 in repository tutti. See http://git.codelutin.com/tutti.git commit 4bfd2593e8b7ad33ddb43025d311485c631a0a93 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Dec 11 13:50:44 2014 +0100 renommage de l'action d'import de caracteristiques d'un trait + utilisation du service dédié --- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 5 + ...perationCaracteristicsFromColumnFileAction.java | 138 ++++++++ .../swing/action/ImportFromColumnFileAction.java | 367 --------------------- .../content/operation/EditFishingOperationUI.css | 2 +- 4 files changed, 144 insertions(+), 368 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 3a0e46b..4a48eed 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -42,6 +42,7 @@ import fr.ifremer.tutti.service.catches.multipost.MultiPostImportService; import fr.ifremer.tutti.service.export.generic.TuttiExportService; import fr.ifremer.tutti.service.export.pdf.CatchesPdfExportService; import fr.ifremer.tutti.service.export.sumatra.CatchesSumatraExportService; +import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; import fr.ifremer.tutti.service.protocol.ProtocolImportExportService; import fr.ifremer.tutti.service.psionimport.PsionImportService; import fr.ifremer.tutti.service.pupitri.PupitriImportExportService; @@ -731,6 +732,10 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage return serviceContext.getService(MultiPostExportService.class); } + public FishingOperationImportService getFishingOperationImportService() { + return serviceContext.getService(FishingOperationImportService.class); + } + public ReportService getReportService() { return serviceContext.getService(ReportService.class); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java new file mode 100644 index 0000000..c3382d2 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFishingOperationCaracteristicsFromColumnFileAction.java @@ -0,0 +1,138 @@ +package fr.ifremer.tutti.ui.swing.action; + +import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.service.operationimport.FishingOperationImportService; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileFishingOperationNotFoundException; +import fr.ifremer.tutti.service.operationimport.ImportFromColumnFileInvalidRowException; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; +import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.csv.AbstractImportErrorInfo; +import org.nuiton.jaxx.application.ApplicationBusinessException; + +import java.io.File; + +import static org.nuiton.i18n.I18n.t; + +/** + * @author Kevin Morin (Code Lutin) + * @since 3.10 + */ +public class ImportFishingOperationCaracteristicsFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { + + private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); + + /** + * File to import. + */ + protected File columnsFile; + + /** + * Result fishing operation after import to merge back to ui model. + */ + protected FishingOperation fishingOperationToMerge; + + public ImportFishingOperationCaracteristicsFromColumnFileAction(EditFishingOperationUIHandler handler) { + super(handler, true); + } + + @Override + public boolean prepareAction() throws Exception { + boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); + + if (result) { + columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), + t("tutti.editFishingOperation.action.chooseColumnsFile.import"), + "^.*\\.csv", t("tutti.common.file.csv")); + + result = columnsFile != null; + } + + return result; + } + + @Override + public void doAction() throws ImportFromColumnFileInvalidRowException, ImportFromColumnFileFishingOperationNotFoundException { + + EditFishingOperationUIModel model = getModel(); + + // Create a copy of the ui model to use in the import + // this bean will be merged back after import into ui model + fishingOperationToMerge = model.toEntity(); + + //FIXME Check we don't need this ? +// fishingOperationToMerge = FishingOperations.newFishingOperation(); +// Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = BinderFactory.newBinder(EditFishingOperationUIModel.class, FishingOperation.class); +// toBeanBinder.copy(model, fishingOperationToMerge); + + FishingOperationImportService fishingOperationImportService = getContext().getFishingOperationImportService(); + + fishingOperationImportService.importCaracteristicsFromColumnFile(columnsFile, fishingOperationToMerge); + + } + + @Override + public void postSuccessAction() { + + super.postSuccessAction(); + + // Merge result to ui model + EditFishingOperationUI ui = getUI(); + EditFishingOperationUIModel model = getModel(); + + model.fromEntity(fishingOperationToMerge); + + //FIXME Find out why ? + //these 2 do not refresh correctly + ui.getRecorderPersonList().getHandler().setSelected(fishingOperationToMerge.getRecorderPerson()); + ui.getSecondaryVesselList().getHandler().setSelected(fishingOperationToMerge.getSecondaryVessel()); + + ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperationToMerge); + ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperationToMerge); + + sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); + + } + + @Override + public void postFailedAction(Throwable error) { + + String errorMessage = null; + if (error instanceof ImportFromColumnFileFishingOperationNotFoundException) { + + // no matching fishing operation + errorMessage = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; + + } + + if (error instanceof ImportFromColumnFileInvalidRowException) { + + // matching row is not valid + ImportFromColumnFileInvalidRowException importFromColumnFileInvalidRowException = (ImportFromColumnFileInvalidRowException) error; + + errorMessage = ""; + for (AbstractImportErrorInfo<FishingOperation> errorInfo : importFromColumnFileInvalidRowException.getErrors()) { + if (log.isErrorEnabled()) { + log.error(errorInfo.getCause().getLocalizedMessage()); + } + errorMessage += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; + } + + } + + //TODO Check this is ok, otherwise use below code + throw new ApplicationBusinessException(t("tutti.editFishingOperation.action.importColumns.error", errorMessage)); + +// if (errorMessage != null) { +// +// displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), +// "<html><body>" + +// t("tutti.editFishingOperation.action.importColumns.error", errorMessage) +// + "</body></html>"); +// +// } + + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java deleted file mode 100644 index 4a84e47..0000000 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ /dev/null @@ -1,367 +0,0 @@ -package fr.ifremer.tutti.ui.swing.action; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import fr.ifremer.tutti.persistence.entities.CaracteristicMap; -import fr.ifremer.tutti.persistence.entities.TuttiEntities; -import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.FishingOperations; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType; -import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow; -import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; -import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; -import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; -import fr.ifremer.tutti.persistence.entities.referential.Gear; -import fr.ifremer.tutti.persistence.entities.referential.Person; -import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation; -import fr.ifremer.tutti.persistence.entities.referential.Vessel; -import fr.ifremer.tutti.service.PersistenceService; -import fr.ifremer.tutti.service.TuttiCsvUtil; -import fr.ifremer.tutti.service.TuttiDataContext; -import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; -import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIHandler; -import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.csv.AbstractImportErrorInfo; -import org.nuiton.csv.Import2; -import org.nuiton.csv.ImportConf; -import org.nuiton.csv.ImportRow; -import org.nuiton.csv.ImportRuntimeException; -import org.nuiton.csv.ValueParser; -import org.nuiton.csv.ValueSetter; -import org.nuiton.csv.ext.CsvReaders; -import org.nuiton.util.DateUtil; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; - -import java.io.File; -import java.io.FileInputStream; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -import static org.nuiton.i18n.I18n.t; - -/** - * @author Kevin Morin (Code Lutin) - * @since 3.10 - */ -public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingOperationUIModel, EditFishingOperationUI, EditFishingOperationUIHandler> { - - private static final Log log = LogFactory.getLog(LoadProtocolImportColumnsAction.class); - - protected File columnsFile; - - protected String error; - - public ImportFromColumnFileAction(EditFishingOperationUIHandler handler) { - super(handler, true); - } - - @Override - public boolean prepareAction() throws Exception { - boolean result = super.prepareAction() && getModel().isImportFromColumnFileEnabled(); - - if (result) { - columnsFile = chooseFile(t("tutti.editFishingOperation.action.title.choose.importColumnsFile"), - t("tutti.editFishingOperation.action.chooseColumnsFile.import"), - "^.*\\.csv", t("tutti.common.file.csv")); - - result = columnsFile != null; - } - - return result; - } - - @Override - public void doAction() throws Exception { - - final EditFishingOperationUIModel model = getModel(); - - Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); - - ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); - ImportConf conf = new ImportConf(); - conf.setStrictMode(false); - - Import2<FishingOperation> operationUIModelImport = - Import2.newImport(conf, importModel, new FileInputStream(columnsFile)); - - TuttiProtocol protocol = getDataContext().getProtocol(); - final Map<String, OperationFieldMappingRow> mappingRowsByField = - Maps.uniqueIndex(protocol.getOperationFieldMapping(), new Function<OperationFieldMappingRow, String>() { - @Override - public String apply(OperationFieldMappingRow operationFieldMappingRow) { - return operationFieldMappingRow.getField(); - } - }); - - // predicate to check if the row matches the model key defined by the protocol< - Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { - @Override - public boolean apply(FishingOperation fishingOperation) { - - OperationFieldMappingRow operationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER); - OperationFieldMappingRow stationNumberRow = mappingRowsByField.get(FishingOperation.PROPERTY_STATION_NUMBER); - OperationFieldMappingRow startDateRow = mappingRowsByField.get(FishingOperation.PROPERTY_GEAR_SHOOTING_START_DATE); - - String operationNumberColumn = operationNumberRow != null ? operationNumberRow.getImportColumn() : null; - String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; - String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; - - boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); - boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); - // check if the dates (not time) are equals, but push the time to the model - Date modelGearShootingStartDate = model.getGearShootingStartDate(); - if (modelGearShootingStartDate != null) { - modelGearShootingStartDate = DateUtil.getDay(modelGearShootingStartDate); - } - Date gearShootingStartDate = fishingOperation.getGearShootingStartDate(); - if (gearShootingStartDate != null) { - gearShootingStartDate = DateUtil.getDay(gearShootingStartDate); - } - boolean sameGearShootingStartDate = Objects.equals(modelGearShootingStartDate, gearShootingStartDate); - - return (StringUtils.isBlank(stationColumn) || sameStationNumber) - && (StringUtils.isBlank(operationNumberColumn) || sameFishingOperationNumber) - && (StringUtils.isBlank(startDateColumn) || sameGearShootingStartDate); - } - }; - - boolean found = false; - Iterator<ImportRow<FishingOperation>> iterator = operationUIModelImport.iterator(); - while (!found && iterator.hasNext()) { - ImportRow<FishingOperation> next = iterator.next(); - FishingOperation fishingOperation = next.getBean(); - - if (predicate.apply(fishingOperation)) { - if (next.isValid()) { - EditFishingOperationUI ui = getUI(); - model.fromEntity(fishingOperation); - //these 2 do not refresh correctly - ui.getRecorderPersonList().getHandler().setSelected(model.getRecorderPerson()); - ui.getSecondaryVesselList().getHandler().setSelected(model.getSecondaryVessel()); - - ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - - } else { - error = ""; - for (AbstractImportErrorInfo<FishingOperation> errorInfo : next.getErrors()) { - if (log.isErrorEnabled()) { - log.error(errorInfo.getCause().getLocalizedMessage()); - } - error += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; - } - } - found = true; - } - } - - if (!found) { - error = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; - } - } - - @Override - public void postSuccessAction() { - super.postSuccessAction(); - if (error != null) { - displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), - "<html><body>" + - t("tutti.editFishingOperation.action.importColumns.error", error) - + "</body></html>"); - } else { - sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); - } - error = null; - } - - protected class ImportFromColumnFileModel extends TuttiCsvUtil.AbstractTuttiImportModel<FishingOperation> { - - protected Binder<EditFishingOperationUIModel, FishingOperation> toBeanBinder = - BinderFactory.newBinder(EditFishingOperationUIModel.class, - FishingOperation.class); - - public ImportFromColumnFileModel(char separator, Set<String> headers) { - super(separator); - - PersistenceService persistenceService = getContext().getPersistenceService(); - TuttiDataContext dataContext = getDataContext(); - - TuttiProtocol protocol = dataContext.getProtocol(); - Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping(); - - String zoneId = dataContext.getProgram().getZone().getId(); - - for (OperationFieldMappingRow mappingRow : operationFieldMapping) { - String importColumn = mappingRow.getImportColumn(); - boolean importColumnsInHeaders = headers.remove(importColumn); - if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) { - - String field = mappingRow.getField(); - ValueParser valueParser; - switch (field) { - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_NUMBER: - valueParser = TuttiCsvUtil.INTEGER; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LATITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_LONGITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LATITUDE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_LONGITUDE: - case EditFishingOperationUIModel.PROPERTY_TRAWL_DISTANCE: - valueParser = TuttiCsvUtil.FLOAT; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_START_DATE: - case EditFishingOperationUIModel.PROPERTY_GEAR_SHOOTING_END_DATE: - valueParser = TuttiCsvUtil.DAY_TIME; - break; - - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_RECTILIGNE: - valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN; - break; - - case EditFishingOperationUIModel.PROPERTY_FISHING_OPERATION_VALID: - valueParser = TuttiCsvUtil.BOOLEAN; - break; - - case EditFishingOperationUIModel.PROPERTY_GEAR: - List<Gear> gears = new ArrayList<>(dataContext.getFishingGears()); - gears.addAll(dataContext.getScientificGears()); - Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears); - valueParser = newForeignKeyValue(Gear.class, field, gearUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_VESSEL: - List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); - vessels.addAll(dataContext.getScientificVessels()); - Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); - valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: - vessels = new ArrayList<>(dataContext.getFishingVessels()); - vessels.addAll(dataContext.getScientificVessels()); - vesselUniverse = TuttiEntities.splitById(vessels); - valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_STRATA: - Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationStrata(zoneId)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, strataUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_SUB_STRATA: - Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationSubStrata(zoneId, null)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_LOCATION: - Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( - persistenceService.getAllFishingOperationLocation(zoneId, null, null)); - valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); - break; - - case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: - Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); - valueParser = newForeignKeyListValue(Person.class, field, personUniverse); - break; - - default: - valueParser = TuttiCsvUtil.STRING; - - } - newMandatoryColumn(importColumn, field, valueParser); - - } else if (!importColumnsInHeaders) { - throw new ImportRuntimeException(t("tutti.editFishingOperation.action.importColumns.missingHeader", importColumn)); - } - } - - Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping(); - for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) { - String importColumn = mappingRow.getImportColumn(); - if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) { - - int pmfmId = Integer.parseInt(mappingRow.getPmfmId()); - final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId); - - ValueSetter<FishingOperation, String> setter = new ValueSetter<FishingOperation, String>() { - @Override - public void set(FishingOperation fishingOperation, String value) throws Exception { - - Serializable realValue = null; - if (StringUtils.isNotBlank(value)) { - switch (caracteristic.getCaracteristicType()) { - case QUALITATIVE: - for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) { - if (value.equals(cqv.getId())) { - realValue = cqv; - break; - } - } - break; - - case NUMBER: - realValue = Float.parseFloat(value); - break; - - default: - realValue = value; - } - } - - CaracteristicMap caracteristicMap; - if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) { - caracteristicMap = fishingOperation.getGearUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - fishingOperation.setGearUseFeatures(caracteristicMap); - } - - } else { - caracteristicMap = fishingOperation.getVesselUseFeatures(); - if (caracteristicMap == null) { - caracteristicMap = new CaracteristicMap(); - fishingOperation.setVesselUseFeatures(caracteristicMap); - } - } - caracteristicMap.put(caracteristic, realValue); - - } - }; - newMandatoryColumn(importColumn, setter); - - } - } - - - for (String header : headers) { - newIgnoredColumn(header); - } - } - - @Override - public FishingOperation newEmptyInstance() { - FishingOperation fishingOperation = FishingOperations.newFishingOperation(); - toBeanBinder.copy(getModel(), fishingOperation); - return fishingOperation; - } - } -} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css index d5a42ed..dede964 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css @@ -85,7 +85,7 @@ JXDatePicker { text: "tutti.editFishingOperation.action.importFromColumnFile"; toolTipText: "tutti.editFishingOperation.action.importFromColumnFile.tip"; i18nMnemonic: "tutti.editFishingOperation.action.importFromColumnFile.mnemonic"; - _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFromColumnFileAction.class}; + _applicationAction: {fr.ifremer.tutti.ui.swing.action.ImportFishingOperationCaracteristicsFromColumnFileAction.class}; _help: {"tutti.editFishingOperation.action.importFromColumnFile.help"}; enabled: {model.isImportFromColumnFileEnabled()} } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.