Commits (25)
## Sprint 84 - v3.8.3 ## Sprint 88 - v3.9.5
- Pas de mise à jour de modèle
## Sprint 87 - v3.9.4
- Pas de mise à jour de modèle
## Sprint 86 - v3.9.3
- Pas de mise à jour de modèle
## Sprint 85 - v3.8.3
- Pas de mise à jour de modèle - Pas de mise à jour de modèle
- Version corrective devant utiliser le server de synchronisation 3.6.3.2 uniquement - Version corrective devant utiliser le server de synchronisation 3.6.3.2 uniquement
## Sprint 84 - v3.8.2
- Pas de mise à jour de modèle
- Version corrective devant utiliser le server de synchronisation 3.6.3.1 uniquement
## Sprint 83 - v3.9.2
- Pas de mise à jour de modèle
- Une nouvelle option a été ajoutée pour gérer les transcodages des référentiels suivant :
reefdb.transcribingItemType.label.pmfmExtraction
Sa valeur par défaut est `REEFDB-PMFM.PMFM_EXTRACTION`. Couplée avec l'option `reefdb.transcribingItemType.label.pmfmNm`, elle permet de transcoder les libellé des PSFMU lors des extractions avec la priorité suivante:
1- libellé transcodé pour extraction
2- libellé transcodé pour écran de saisie
3- libellé interne du psfmu (issu du transcodage pour écran de saisie)
4- libellé du paramètre
- Pour simplifier la configuration du serveur de synchronisation, l'option `quadrige3.synchro.import.referential.transcribingItemType.label.includes`
qui doit contenir tous les libellés des types de transcodage à importer, accepte désormais le caractère '%'.
quadrige3.synchro.import.referential.transcribingItemType.label.includes=REEFDB% (tous les types de transcodage commençant par REEFDB seront importés)
## Sprint 82 - v3.9.1
- Pas de mise à jour de modèle
## Sprint 81 - v3.9.0
- Pas de mise à jour de modèle
## Sprint 80 - v3.8.1 ## Sprint 80 - v3.8.1
- Pas de mise à jour de modèle - Pas de mise à jour de modèle
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<groupId>fr.ifremer.reefdb</groupId> <groupId>fr.ifremer.reefdb</groupId>
<artifactId>reefdb</artifactId> <artifactId>reefdb</artifactId>
<version>3.8.3</version> <version>3.9.5</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Reef DB</name> <name>Reef DB</name>
...@@ -171,7 +171,7 @@ ...@@ -171,7 +171,7 @@
<maven.compiler.debug>true</maven.compiler.debug> <maven.compiler.debug>true</maven.compiler.debug>
<!-- Quadrige3 Core version --> <!-- Quadrige3 Core version -->
<quadrige3-core.version>3.6.3.2</quadrige3-core.version> <quadrige3-core.version>3.6.10</quadrige3-core.version>
<!-- Last ReefDb launcher version --> <!-- Last ReefDb launcher version -->
<launcherVersion>3.0.3</launcherVersion> <launcherVersion>3.0.3</launcherVersion>
...@@ -261,7 +261,7 @@ ...@@ -261,7 +261,7 @@
<repositories> <repositories>
<repository> <repository>
<id>reefdb-public-group</id> <id>reefdb-public-group</id>
<url>http://server.e-is.pro/nexus/content/groups/reefdb</url> <url>https://nexus.e-is.pro/nexus/content/groups/reefdb</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy> <checksumPolicy>fail</checksumPolicy>
...@@ -276,7 +276,7 @@ ...@@ -276,7 +276,7 @@
<pluginRepositories> <pluginRepositories>
<pluginRepository> <pluginRepository>
<id>reefdb-public-group</id> <id>reefdb-public-group</id>
<url>http://server.e-is.pro/nexus/content/groups/reefdb</url> <url>https://nexus.e-is.pro/nexus/content/groups/reefdb</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy> <checksumPolicy>fail</checksumPolicy>
...@@ -342,6 +342,18 @@ ...@@ -342,6 +342,18 @@
<version>${junit.version}</version> <version>${junit.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>junit-addons</groupId>
<artifactId>junit-addons</artifactId>
<version>1.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <dependency>
<groupId>fr.ifremer.quadrige3</groupId> <groupId>fr.ifremer.quadrige3</groupId>
<artifactId>quadrige3-test-shared</artifactId> <artifactId>quadrige3-test-shared</artifactId>
...@@ -1119,10 +1131,10 @@ ...@@ -1119,10 +1131,10 @@
<distribution.site.repository>scpexe://${distribution.site.host}${distribution.site.path}</distribution.site.repository> <distribution.site.repository>scpexe://${distribution.site.host}${distribution.site.path}</distribution.site.repository>
<distribution.repository.id>eis-nexus-deploy</distribution.repository.id> <distribution.repository.id>eis-nexus-deploy</distribution.repository.id>
<distribution.repository.url>http://server.e-is.pro/nexus/content/repositories/reefdb-releases</distribution.repository.url> <distribution.repository.url>https://nexus.e-is.pro/nexus/content/repositories/reefdb-releases</distribution.repository.url>
<distribution.snapshotRepository.id>eis-nexus-deploy</distribution.snapshotRepository.id> <distribution.snapshotRepository.id>eis-nexus-deploy</distribution.snapshotRepository.id>
<distribution.snapshotRepository.url>http://server.e-is.pro/nexus/content/repositories/reefdb-snapshots</distribution.snapshotRepository.url> <distribution.snapshotRepository.url>https://nexus.e-is.pro/nexus/content/repositories/reefdb-snapshots</distribution.snapshotRepository.url>
<distribution.internet.url>${distribution.repository.url}</distribution.internet.url> <distribution.internet.url>${distribution.repository.url}</distribution.internet.url>
</properties> </properties>
......
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
<repositories> <repositories>
<repository> <repository>
<id>reefdb-public-group</id> <id>reefdb-public-group</id>
<url>http://server.e-is.pro/nexus/content/groups/reefdb</url> <url>https://nexus.e-is.pro/nexus/content/groups/reefdb</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy> <checksumPolicy>fail</checksumPolicy>
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
<pluginRepositories> <pluginRepositories>
<pluginRepository> <pluginRepository>
<id>reefdb-public-group</id> <id>reefdb-public-group</id>
<url>http://server.e-is.pro/nexus/content/groups/reefdb</url> <url>https://nexus.e-is.pro/nexus/content/groups/reefdb</url>
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy> <checksumPolicy>fail</checksumPolicy>
...@@ -242,12 +242,12 @@ ...@@ -242,12 +242,12 @@
<properties> <properties>
<distribution.repository.id>eis-nexus-deploy</distribution.repository.id> <distribution.repository.id>eis-nexus-deploy</distribution.repository.id>
<distribution.repository.url>http://server.e-is.pro/nexus/content/repositories/reefdb-releases</distribution.repository.url> <distribution.repository.url>https://nexus.e-is.pro/nexus/content/repositories/reefdb-releases</distribution.repository.url>
<distribution.snapshotRepository.id>eis-nexus-deploy</distribution.snapshotRepository.id> <distribution.snapshotRepository.id>eis-nexus-deploy</distribution.snapshotRepository.id>
<distribution.snapshotRepository.url>http://server.e-is.pro/nexus/content/repositories/reefdb-snapshots</distribution.snapshotRepository.url> <distribution.snapshotRepository.url>https://nexus.e-is.pro/nexus/content/repositories/reefdb-snapshots</distribution.snapshotRepository.url>
<distribution.internet.url>http://server.e-is.pro/nexus/content/groups/public</distribution.internet.url> <distribution.internet.url>https://nexus.e-is.pro/nexus/content/groups/public</distribution.internet.url>
</properties> </properties>
</profile> </profile>
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<parent> <parent>
<groupId>fr.ifremer.reefdb</groupId> <groupId>fr.ifremer.reefdb</groupId>
<artifactId>reefdb</artifactId> <artifactId>reefdb</artifactId>
<version>3.8.3</version> <version>3.9.5</version>
</parent> </parent>
<artifactId>reefdb-core</artifactId> <artifactId>reefdb-core</artifactId>
...@@ -60,6 +60,16 @@ ...@@ -60,6 +60,16 @@
<artifactId>quadrige3-test-shared</artifactId> <artifactId>quadrige3-test-shared</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit-addons</groupId>
<artifactId>junit-addons</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
......
...@@ -35,8 +35,11 @@ ...@@ -35,8 +35,11 @@
# Please fill the missing licenses for dependencies : # Please fill the missing licenses for dependencies :
# #
# #
#Fri Feb 09 17:30:26 CET 2018 #Fri Mar 06 09:36:42 CET 2020
com.oracle--ojdbc7--12.1.0.2.0=OTN license com.oracle--ojdbc7--12.1.0.2.0=OTN license
commons-primitives--commons-primitives--1.0=The Apache Software License, Version 2.0 commons-primitives--commons-primitives--1.0=The Apache Software License, Version 2.0
dom4j--dom4j--1.6.1=BSD License dom4j--dom4j--1.6.1=BSD License
junit-addons--junit-addons--1.4=
org.hibernate--hibernate-spatial--4.3-20140213=Lesser General Public License (LGPL) org.hibernate--hibernate-spatial--4.3-20140213=Lesser General Public License (LGPL)
xerces--xercesImpl--2.6.2=
xerces--xmlParserAPIs--2.6.2=
...@@ -967,6 +967,10 @@ public final class ReefDbConfiguration extends QuadrigeCoreConfiguration { ...@@ -967,6 +967,10 @@ public final class ReefDbConfiguration extends QuadrigeCoreConfiguration {
return applicationConfig.getOption(ReefDbConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM.getKey()); return applicationConfig.getOption(ReefDbConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM.getKey());
} }
public String getTranscribingItemTypeLbForPmfmExtraction() {
return applicationConfig.getOption(ReefDbConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_EXTRACTION.getKey());
}
/** /**
* <p>getAlternativeTaxonOriginTaxRef.</p> * <p>getAlternativeTaxonOriginTaxRef.</p>
* *
......
...@@ -24,7 +24,6 @@ package fr.ifremer.reefdb.config; ...@@ -24,7 +24,6 @@ package fr.ifremer.reefdb.config;
*/ */
import fr.ifremer.quadrige3.core.dao.referential.UnitId; import fr.ifremer.quadrige3.core.dao.referential.UnitId;
import fr.ifremer.quadrige3.core.dao.referential.transcribing.TranscribingItemTypeLb;
import fr.ifremer.quadrige3.core.dao.technical.QuadrigeEnumerationDef; import fr.ifremer.quadrige3.core.dao.technical.QuadrigeEnumerationDef;
import org.nuiton.config.ConfigOptionDef; import org.nuiton.config.ConfigOptionDef;
import org.nuiton.version.Version; import org.nuiton.version.Version;
...@@ -303,7 +302,13 @@ public enum ReefDbConfigurationOption implements ConfigOptionDef { ...@@ -303,7 +302,13 @@ public enum ReefDbConfigurationOption implements ConfigOptionDef {
TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM( TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM(
"reefdb.transcribingItemType.label.pmfmNm", "reefdb.transcribingItemType.label.pmfmNm",
n("reefdb.config.option.transcribingItemType.label.pmfmNm.description"), n("reefdb.config.option.transcribingItemType.label.pmfmNm.description"),
String.format("${%s}", TranscribingItemTypeLb.REEFDB_PMFM_NM.getKey()), // 1 String.format("${%s%s}", QuadrigeEnumerationDef.CONFIG_OPTION_PREFIX, "TranscribingItemTypeLb.REEFDB_PMFM_NM"),
String.class,
false),
TRANSCRIBING_ITEM_TYPE_LB_PMFM_EXTRACTION(
"reefdb.transcribingItemType.label.pmfmExtraction",
n("reefdb.config.option.transcribingItemType.label.pmfmExtraction.description"),
String.format("${%s%s}", QuadrigeEnumerationDef.CONFIG_OPTION_PREFIX, "TranscribingItemTypeLb.REEFDB_PMFM_EXTRACTION"),
String.class, String.class,
false), false),
/* constants used to calculate transition length */ /* constants used to calculate transition length */
......
...@@ -102,6 +102,16 @@ public interface ReefDbStrategyDao { ...@@ -102,6 +102,16 @@ public interface ReefDbStrategyDao {
@Cacheable(value = PMFM_STRATEGIES_BY_PROG_LOC_DATE_CACHE) @Cacheable(value = PMFM_STRATEGIES_BY_PROG_LOC_DATE_CACHE)
Set<PmfmStrategyDTO> getPmfmStrategiesByProgramCodeAndLocation(String programCode, Integer monitoringLocationId, LocalDate date); Set<PmfmStrategyDTO> getPmfmStrategiesByProgramCodeAndLocation(String programCode, Integer monitoringLocationId, LocalDate date);
/**
* Retrieve all PMFM strategies that are applied on given programs and date range
*
* @param programCodes program codes
* @param startDate
* @param endDate
* @return set of pmfm strategies
*/
Set<PmfmStrategyDTO> getPmfmStrategiesByProgramCodesAndDates(Collection<String> programCodes, LocalDate startDate, LocalDate endDate);
/** /**
* Retrieve all strategies that are applied on the given program and monitoring location * Retrieve all strategies that are applied on the given program and monitoring location
* *
......
...@@ -241,6 +241,39 @@ public class ReefDbStrategyDaoImpl extends StrategyDaoImpl implements ReefDbStra ...@@ -241,6 +241,39 @@ public class ReefDbStrategyDaoImpl extends StrategyDaoImpl implements ReefDbStra
return ImmutableSet.copyOf(pmfmStrategies); return ImmutableSet.copyOf(pmfmStrategies);
} }
@Override
public Set<PmfmStrategyDTO> getPmfmStrategiesByProgramCodesAndDates(Collection<String> programCodes, LocalDate startDate, LocalDate endDate) {
Set<PmfmStrategyDTO> pmfmStrategies = new HashSet<>();
List<ProgStratDTO> appliedStrategies = getAppliedStrategiesByProgramCodes(programCodes);
for (ProgStratDTO appliedStrategy: appliedStrategies) {
// filter on date range
if (appliedStrategy.getStartDate() != null && appliedStrategy.getEndDate() != null
&& !appliedStrategy.getStartDate().isAfter(endDate) && !appliedStrategy.getEndDate().isBefore(startDate)) {
// add all pmfm strategies in date range
pmfmStrategies.addAll(getPmfmsAppliedStrategy(appliedStrategy.getId()));
}
}
return ImmutableSet.copyOf(pmfmStrategies);
}
@SuppressWarnings("unchecked")
private List<ProgStratDTO> getAppliedStrategiesByProgramCodes(Collection<String> programCodes) {
Query query = createQuery("appliedStrategiesByProgramCodes").setParameterList("programCodes", programCodes);
Iterator<Object[]> rows = query.iterate();
List<ProgStratDTO> result = Lists.newArrayList();
TimeZone dbTimezone = config.getDbTimezone();
while (rows.hasNext()) {
result.add(toProgStratDTO(Arrays.asList(rows.next()).iterator(), dbTimezone));
}
return result;
}
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public List<ProgStratDTO> getStrategiesByProgramCodeAndMonitoringLocationId(String programCode, int monitoringLocationId) { public List<ProgStratDTO> getStrategiesByProgramCodeAndMonitoringLocationId(String programCode, int monitoringLocationId) {
...@@ -915,7 +948,7 @@ public class ReefDbStrategyDaoImpl extends StrategyDaoImpl implements ReefDbStra ...@@ -915,7 +948,7 @@ public class ReefDbStrategyDaoImpl extends StrategyDaoImpl implements ReefDbStra
// code, name // code, name
program.setCode((String) source.next()); program.setCode((String) source.next());
program.setName((String) source.next()); program.setName((String) source.next());
//TODO (report Q3): program.setStatus(Daos.getStatus((String) source.next())); program.setStatus(Daos.getStatus((String) source.next()));
} }
// strategy: id, name // strategy: id, name
......
...@@ -24,6 +24,7 @@ package fr.ifremer.reefdb.dao.system.extraction; ...@@ -24,6 +24,7 @@ package fr.ifremer.reefdb.dao.system.extraction;
*/ */
import fr.ifremer.quadrige3.core.dao.technical.csv.CSVDao; import fr.ifremer.quadrige3.core.dao.technical.csv.CSVDao;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapper;
import java.util.List; import java.util.List;
...@@ -36,6 +37,14 @@ import java.util.Map; ...@@ -36,6 +37,14 @@ import java.util.Map;
*/ */
public interface ReefDbExtractionResultDao extends CSVDao { public interface ReefDbExtractionResultDao extends CSVDao {
/**
* <p>queryCount.</p>
*
* @param query a {@link String} object.
* @return a {@link java.lang.Long} object.
*/
long queryCount(String query);
/** /**
* <p>queryCount.</p> * <p>queryCount.</p>
* *
...@@ -67,6 +76,14 @@ public interface ReefDbExtractionResultDao extends CSVDao { ...@@ -67,6 +76,14 @@ public interface ReefDbExtractionResultDao extends CSVDao {
List<String> queryStringList(String query, Map<String, Object> queryBindings); List<String> queryStringList(String query, Map<String, Object> queryBindings);
/**
* <p>queryUpdate</p>
*
* @param query a {@link java.lang.String} object.
* @return a int.
*/
int queryUpdate(String query);
/** /**
* <p>queryUpdate.</p> * <p>queryUpdate.</p>
* *
...@@ -75,4 +92,10 @@ public interface ReefDbExtractionResultDao extends CSVDao { ...@@ -75,4 +92,10 @@ public interface ReefDbExtractionResultDao extends CSVDao {
* @return a int. * @return a int.
*/ */
int queryUpdate(String query, Map<String, Object> queryBindings); int queryUpdate(String query, Map<String, Object> queryBindings);
String getPmfmNameForExtraction(PmfmDTO pmfm);
String getPmfmUnitNameForExtraction(PmfmDTO pmfm);
} }
...@@ -23,18 +23,24 @@ package fr.ifremer.reefdb.dao.system.extraction; ...@@ -23,18 +23,24 @@ package fr.ifremer.reefdb.dao.system.extraction;
* #L% * #L%
*/ */
import fr.ifremer.quadrige3.core.dao.referential.transcribing.TranscribingItemExtendDao;
import fr.ifremer.quadrige3.core.dao.technical.Assert;
import fr.ifremer.quadrige3.core.dao.technical.csv.CSVDaoImpl; import fr.ifremer.quadrige3.core.dao.technical.csv.CSVDaoImpl;
import fr.ifremer.reefdb.config.ReefDbConfiguration;
import fr.ifremer.reefdb.dto.referential.pmfm.PmfmDTO;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.math.BigInteger;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Properties; import java.util.Properties;
/** /**
...@@ -50,6 +56,12 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE ...@@ -50,6 +56,12 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE
protected final Properties connectionProperties; protected final Properties connectionProperties;
@Resource
protected ReefDbConfiguration config;
@Resource(name = "transcribingItemDao")
private TranscribingItemExtendDao transcribingItemDao;
/** /**
* <p>Constructor for ReefDbExtractionResultDaoImpl.</p> * <p>Constructor for ReefDbExtractionResultDaoImpl.</p>
* *
...@@ -78,24 +90,19 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE ...@@ -78,24 +90,19 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE
this.connectionProperties = connectionProperties; this.connectionProperties = connectionProperties;
} }
@Override
public long queryCount(String query) {
return queryCount(query, null);
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public Long queryCount(String query, Map<String, Object> queryBindings) { public Long queryCount(String query, Map<String, Object> queryBindings) {
Long count = queryCount(connectionProperties, query, queryBindings);
return query(connectionProperties, query, queryBindings, resultSet -> { if (count == null) throw new DataRetrievalFailureException(String.format("query count result is null: %s ; bindings=%s", query, queryBindings));
Object result = resultSet.getObject(1); return count;
if (log.isDebugEnabled()) {
log.debug(String.format("queryCount result: %s", result));
}
if (result instanceof Integer) {
return ((Integer) result).longValue();
} else if (result instanceof BigInteger) {
return ((BigInteger) result).longValue();
}
return (Long) result;
});
} }
/** /**
...@@ -106,6 +113,11 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE ...@@ -106,6 +113,11 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE
return query(connectionProperties, sql, queryBindings, rowMapper); return query(connectionProperties, sql, queryBindings, rowMapper);
} }
@Override
public int queryUpdate(String query) {
return queryUpdate(query, null);
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
...@@ -114,6 +126,25 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE ...@@ -114,6 +126,25 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE
return queryUpdate(connectionProperties, query, paramMap); return queryUpdate(connectionProperties, query, paramMap);
} }
@Override
public String getPmfmNameForExtraction(PmfmDTO pmfm) {
Assert.notNull(pmfm);
return Optional
.ofNullable(transcribingItemDao.getTranscribingItemById(config.getTranscribingItemTypeLbForPmfmExtraction(), pmfm.getId()))
.orElse(
Optional.ofNullable(transcribingItemDao.getTranscribingItemById(config.getTranscribingItemTypeLbForPmfmNm(), pmfm.getId()))
.orElse(
Optional.ofNullable(pmfm.getName())
.orElse(pmfm.getParameter().getName())
)
); }
@Override
public String getPmfmUnitNameForExtraction(PmfmDTO pmfm) {
Assert.notNull(pmfm);
return pmfm.getUnit() == null || config.getExtractionUnitIdsToIgnore().contains(pmfm.getUnit().getId()) ? "" : pmfm.getUnit().getName();
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
...@@ -126,4 +157,5 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE ...@@ -126,4 +157,5 @@ public class ReefDbExtractionResultDaoImpl extends CSVDaoImpl implements ReefDbE
public List<String> queryStringList(String query, Map<String, Object> queryBindings) { public List<String> queryStringList(String query, Map<String, Object> queryBindings) {
return query(connectionProperties, query, queryBindings, (resultSet, i) -> resultSet.getString(1)); return query(connectionProperties, query, queryBindings, (resultSet, i) -> resultSet.getString(1));
} }
} }
...@@ -287,6 +287,7 @@ public class DecoratorServiceImpl extends fr.ifremer.quadrige3.core.service.deco ...@@ -287,6 +287,7 @@ public class DecoratorServiceImpl extends fr.ifremer.quadrige3.core.service.deco
} }
} }
@Deprecated
private class PMFMExtractionDecorator extends PMFMNameDecorator { private class PMFMExtractionDecorator extends PMFMNameDecorator {
static final String SEPARATOR = "-"; static final String SEPARATOR = "-";
......
...@@ -53,6 +53,7 @@ import org.apache.commons.collections4.CollectionUtils; ...@@ -53,6 +53,7 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.nuiton.util.DateUtil; import org.nuiton.util.DateUtil;
import javax.annotation.Nonnull;
import java.sql.Array; import java.sql.Array;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
...@@ -119,6 +120,10 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -119,6 +120,10 @@ public class ReefDbBeans extends QuadrigeBeans {
return addressBuilder.toString(); return addressBuilder.toString();
} }
public static String toQuotedString(String string) {
return "'" + string.replaceAll("'", "''") + "'";
}
/** /**
* <p>toString.</p> * <p>toString.</p>
* *
...@@ -177,8 +182,8 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -177,8 +182,8 @@ public class ReefDbBeans extends QuadrigeBeans {
} else if (bean instanceof ExtractionPeriodDTO) { } else if (bean instanceof ExtractionPeriodDTO) {
ExtractionPeriodDTO period = (ExtractionPeriodDTO) bean; ExtractionPeriodDTO period = (ExtractionPeriodDTO) bean;
return Dates.formatDate(period.getStartDate(), DEFAULT_DATE_FORMAT) return Dates.formatDate(period.getStartDate(), DEFAULT_DATE_FORMAT)
+ " => " + " => "
+ Dates.formatDate(period.getEndDate(), DEFAULT_DATE_FORMAT); + Dates.formatDate(period.getEndDate(), DEFAULT_DATE_FORMAT);
} }
return bean.toString(); return bean.toString();
...@@ -496,16 +501,30 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -496,16 +501,30 @@ public class ReefDbBeans extends QuadrigeBeans {
public static boolean haveSameMeasurements(Collection<MeasurementDTO> measurements, Collection<MeasurementDTO> otherMeasurements) { public static boolean haveSameMeasurements(Collection<MeasurementDTO> measurements, Collection<MeasurementDTO> otherMeasurements) {
List<Integer> pmfmIds = measurements.stream() List<Integer> pmfmIds = measurements.stream()
.filter(measurement -> !isMeasurementEmpty(measurement)) .filter(measurement -> !isMeasurementEmpty(measurement))
.map(measurement -> measurement.getPmfm().getId()) .map(measurement -> measurement.getPmfm().getId())
.collect(Collectors.toList()); .collect(Collectors.toList());
List<Integer> otherPmfmIds = otherMeasurements.stream() List<Integer> otherPmfmIds = otherMeasurements.stream()
.filter(measurement -> !isMeasurementEmpty(measurement)) .filter(measurement -> !isMeasurementEmpty(measurement))
.map(measurement -> measurement.getPmfm().getId()) .map(measurement -> measurement.getPmfm().getId())
.collect(Collectors.toList()); .collect(Collectors.toList());
return pmfmIds.containsAll(otherPmfmIds) && otherPmfmIds.containsAll(pmfmIds); return pmfmIds.containsAll(otherPmfmIds) && otherPmfmIds.containsAll(pmfmIds);
} }
/**
* Compare measurement values only (not pmfm or other propoerty)
*
* @param measurement1 first measurement
* @param measurement2 second measurement
* @return true if their values are equals or null
*/
public static boolean measurementValuesEquals(@Nonnull MeasurementDTO measurement1, @Nonnull MeasurementDTO measurement2) {
return (measurement1.getNumericalValue() == null && measurement2.getNumericalValue() == null
&& measurement1.getQualitativeValue() == null && measurement2.getQualitativeValue() == null)
|| (measurement1.getNumericalValue() != null && measurement1.getNumericalValue().equals(measurement2.getNumericalValue()))
|| (measurement1.getQualitativeValue() != null && measurement1.getQualitativeValue().equals(measurement2.getQualitativeValue()));
}
/** /**
* Get the unified comments from all individual measurements * Get the unified comments from all individual measurements
* *
...@@ -520,6 +539,38 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -520,6 +539,38 @@ public class ReefDbBeans extends QuadrigeBeans {
return getUnifiedString(comments, DEFAULT_STRING_SEPARATOR); return getUnifiedString(comments, DEFAULT_STRING_SEPARATOR);
} }
/**
* Method used as external function for HSQLDB
* see fr.ifremer.reefdb.service.extraction.ExtractionPerformServiceImpl#createDistinctFunction(java.lang.String, java.lang.String, java.lang.String)
*
* @param array the input array (any type)
* @param nonDistinctResult the result text if the array contains non distinct values
* @return the unified string
*/
@SuppressWarnings(value = "unused")
public static String getDistinctSQLString(Array array, String nonDistinctResult) {
try {
Set<String> strings = new HashSet<>();
for (Object object : (Object[]) array.getArray()) {
if (object != null) {
strings.add(object.toString());
}
}
return strings.isEmpty()
? ""
: strings.size() == 1
? strings.stream().findFirst().get()
: nonDistinctResult;
} catch (SQLException e) {
return "";
}
}
/** /**
* Method used as external function for HSQLDB * Method used as external function for HSQLDB
* see fr.ifremer.reefdb.service.extraction.ExtractionServiceImpl#createConcatDistinctFunction(java.lang.String, java.lang.String, java.lang.String) * see fr.ifremer.reefdb.service.extraction.ExtractionServiceImpl#createConcatDistinctFunction(java.lang.String, java.lang.String, java.lang.String)
...@@ -642,9 +693,9 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -642,9 +693,9 @@ public class ReefDbBeans extends QuadrigeBeans {
return new ArrayList<>(); return new ArrayList<>();
} }
return filterCollection(bean.getErrors(), error -> error.isError() return filterCollection(bean.getErrors(), error -> error.isError()
&& (controlOnly == null || (controlOnly == error.isControl())) && (controlOnly == null || (controlOnly == error.isControl()))
&& error.containsPropertyName(propertyName) && error.containsPropertyName(propertyName)
&& (pmfmId == null || pmfmId.equals(error.getPmfmId()))); && (pmfmId == null || pmfmId.equals(error.getPmfmId())));
} }
/** /**
...@@ -694,14 +745,14 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -694,14 +745,14 @@ public class ReefDbBeans extends QuadrigeBeans {
*/ */
public static List<ErrorDTO> getWarnings(ErrorAware bean, final String propertyName, final Integer pmfmId, final Boolean controlOnly) { public static List<ErrorDTO> getWarnings(ErrorAware bean, final String propertyName, final Integer pmfmId, final Boolean controlOnly) {
if (bean == null || CollectionUtils.isEmpty(bean.getErrors()) if (bean == null || CollectionUtils.isEmpty(bean.getErrors())
// if an error is found, return empty list because error is priority // if an error is found, return empty list because error is priority
|| !getErrors(bean, propertyName, pmfmId, controlOnly).isEmpty()) { || !getErrors(bean, propertyName, pmfmId, controlOnly).isEmpty()) {
return new ArrayList<>(); return new ArrayList<>();
} }
return filterCollection(bean.getErrors(), error -> error.isWarning() return filterCollection(bean.getErrors(), error -> error.isWarning()
&& (controlOnly == null || (controlOnly == error.isControl())) && (controlOnly == null || (controlOnly == error.isControl()))
&& error.containsPropertyName(propertyName) && error.containsPropertyName(propertyName)
&& (pmfmId == null || pmfmId.equals(error.getPmfmId()))); && (pmfmId == null || pmfmId.equals(error.getPmfmId())));
} }
/** /**
...@@ -794,13 +845,13 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -794,13 +845,13 @@ public class ReefDbBeans extends QuadrigeBeans {
private static Predicate<ErrorDTO> errorEqualPredicate(ErrorDTO thisError) { private static Predicate<ErrorDTO> errorEqualPredicate(ErrorDTO thisError) {
return error -> error.isError() == thisError.isError() return error -> error.isError() == thisError.isError()
&& error.isWarning() == thisError.isWarning() && error.isWarning() == thisError.isWarning()
&& error.isControl() == thisError.isControl() && error.isControl() == thisError.isControl()
&& Objects.equals(error.getControlElementCode(), thisError.getControlElementCode()) && Objects.equals(error.getControlElementCode(), thisError.getControlElementCode())
&& Objects.deepEquals(error.getPropertyName().toArray(), thisError.getPropertyName().toArray()) && Objects.deepEquals(error.getPropertyName().toArray(), thisError.getPropertyName().toArray())
&& Objects.equals(error.getPmfmId(), thisError.getPmfmId()) && Objects.equals(error.getPmfmId(), thisError.getPmfmId())
&& Objects.equals(error.getIndividualId(), thisError.getIndividualId()) && Objects.equals(error.getIndividualId(), thisError.getIndividualId())
&& Objects.equals(error.getMessage(), thisError.getMessage()); && Objects.equals(error.getMessage(), thisError.getMessage());
} }
/** /**
...@@ -811,9 +862,9 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -811,9 +862,9 @@ public class ReefDbBeans extends QuadrigeBeans {
*/ */
public static boolean isPmfmMandatory(ControlRuleDTO controlRule) { public static boolean isPmfmMandatory(ControlRuleDTO controlRule) {
return ControlElementValues.MEASUREMENT.equals(controlRule.getControlElement()) && return ControlElementValues.MEASUREMENT.equals(controlRule.getControlElement()) &&
(ControlFeatureMeasurementValues.PMFM.equals(controlRule.getControlFeature()) (ControlFeatureMeasurementValues.PMFM.equals(controlRule.getControlFeature())
|| ControlFeatureMeasurementValues.NUMERICAL_VALUE.equals(controlRule.getControlFeature()) || ControlFeatureMeasurementValues.NUMERICAL_VALUE.equals(controlRule.getControlFeature())
|| ControlFeatureMeasurementValues.QUALITATIVE_VALUE.equals(controlRule.getControlFeature())); || ControlFeatureMeasurementValues.QUALITATIVE_VALUE.equals(controlRule.getControlFeature()));
} }
public static boolean isPreconditionRule(ControlRuleDTO controlRule) { public static boolean isPreconditionRule(ControlRuleDTO controlRule) {
...@@ -826,14 +877,14 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -826,14 +877,14 @@ public class ReefDbBeans extends QuadrigeBeans {
public static boolean isQualitativeControlRule(ControlRuleDTO controlRule) { public static boolean isQualitativeControlRule(ControlRuleDTO controlRule) {
return ControlFunctionValues.IS_AMONG.equals(controlRule.getFunction()) return ControlFunctionValues.IS_AMONG.equals(controlRule.getFunction())
&& ControlElementValues.MEASUREMENT.equals(controlRule.getControlElement()) && ControlElementValues.MEASUREMENT.equals(controlRule.getControlElement())
&& ControlFeatureMeasurementValues.QUALITATIVE_VALUE.equals(controlRule.getControlFeature()); && ControlFeatureMeasurementValues.QUALITATIVE_VALUE.equals(controlRule.getControlFeature());
} }
public static boolean isNumericalControlRule(ControlRuleDTO controlRule) { public static boolean isNumericalControlRule(ControlRuleDTO controlRule) {
return ControlFunctionValues.MIN_MAX.equals(controlRule.getFunction()) return ControlFunctionValues.MIN_MAX.equals(controlRule.getFunction())
&& ControlElementValues.MEASUREMENT.equals(controlRule.getControlElement()) && ControlElementValues.MEASUREMENT.equals(controlRule.getControlElement())
&& ControlFeatureMeasurementValues.NUMERICAL_VALUE.equals(controlRule.getControlFeature()); && ControlFeatureMeasurementValues.NUMERICAL_VALUE.equals(controlRule.getControlFeature());
} }
/** /**
...@@ -844,8 +895,8 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -844,8 +895,8 @@ public class ReefDbBeans extends QuadrigeBeans {
*/ */
public static boolean isSurveyValidated(SurveyDTO survey) { public static boolean isSurveyValidated(SurveyDTO survey) {
return survey.getValidationDate() != null return survey.getValidationDate() != null
|| SynchronizationStatusValues.SYNCHRONIZED.equals(survey.getSynchronizationStatus()) || SynchronizationStatusValues.SYNCHRONIZED.equals(survey.getSynchronizationStatus())
|| SynchronizationStatusValues.READY_TO_SYNCHRONIZE.equals(survey.getSynchronizationStatus()); || SynchronizationStatusValues.READY_TO_SYNCHRONIZE.equals(survey.getSynchronizationStatus());
} }
/** /**
...@@ -858,8 +909,8 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -858,8 +909,8 @@ public class ReefDbBeans extends QuadrigeBeans {
public static FilterDTO getFilterOfType(ExtractionDTO extraction, ExtractionFilterValues extractionFilter) { public static FilterDTO getFilterOfType(ExtractionDTO extraction, ExtractionFilterValues extractionFilter) {
return CollectionUtils.isNotEmpty(extraction.getFilters()) return CollectionUtils.isNotEmpty(extraction.getFilters())
? findByProperty(extraction.getFilters(), FilterDTO.PROPERTY_FILTER_TYPE_ID, extractionFilter.getFilterTypeId()) ? findByProperty(extraction.getFilters(), FilterDTO.PROPERTY_FILTER_TYPE_ID, extractionFilter.getFilterTypeId())
: null; : null;
} }
/** /**
...@@ -881,11 +932,28 @@ public class ReefDbBeans extends QuadrigeBeans { ...@@ -881,11 +932,28 @@ public class ReefDbBeans extends QuadrigeBeans {
return null; return null;
} }
public static void setFilterElements(ExtractionDTO extraction, ExtractionFilterValues extractionFilter, List<? extends QuadrigeBean> elements) {
FilterDTO filter = getFilterOfType(extraction, extractionFilter);
if (filter == null) {
filter = ReefDbBeanFactory.newFilterDTO();
filter.setFilterTypeId(extractionFilter.getFilterTypeId());
extraction.addFilters(filter);
}
filter.setElements(elements);
}
public static List<String> getIdsAsString(Collection<? extends QuadrigeBean> beans) { public static List<String> getIdsAsString(Collection<? extends QuadrigeBean> beans) {
if (beans == null) if (beans == null)
return null; return null;
return beans.stream().map(bean -> bean instanceof CodeOnly ? ((CodeOnly)bean).getCode() : bean.getId().toString()).collect(Collectors.toList()); return beans.stream().map(bean -> bean instanceof CodeOnly ? ((CodeOnly) bean).getCode() : bean.getId().toString()).collect(Collectors.toList());
}
public static List<ExtractionPeriodDTO> getExtractionPeriods(ExtractionDTO extraction) {
FilterDTO periodFilter = getFilterOfType(extraction, ExtractionFilterValues.PERIOD);
if (periodFilter == null || periodFilter.getElements() == null) return new ArrayList<>();
return periodFilter.getElements().stream().map((Function<QuadrigeBean, ExtractionPeriodDTO>) ExtractionPeriodDTO.class::cast).collect(Collectors.toList());
} }
} }
...@@ -36,7 +36,7 @@ public enum ExtractionFilterValues { ...@@ -36,7 +36,7 @@ public enum ExtractionFilterValues {
PERIOD(null, n("reefdb.core.enums.extractionFilter.period"), false), PERIOD(null, n("reefdb.core.enums.extractionFilter.period"), false),
PROGRAM(FilterTypeId.PROGRAM, n("reefdb.core.enums.extractionFilter.program"), false), PROGRAM(FilterTypeId.PROGRAM, n("reefdb.core.enums.extractionFilter.program"), false),
LOCATION(FilterTypeId.MONITORING_LOCATION, n("reefdb.core.enums.extractionFilter.location"), false), LOCATION(FilterTypeId.MONITORING_LOCATION, n("reefdb.core.enums.extractionFilter.location"), false),
// CAMPAIGN(FilterTypeId.CAMPAIGN, n("reefdb.core.enums.extractionFilter.campaign"), false), CAMPAIGN(FilterTypeId.CAMPAIGN, n("reefdb.core.enums.extractionFilter.campaign"), false),
TAXON(FilterTypeId.TAXON_NAME, n("reefdb.core.enums.extractionFilter.taxon"), false), TAXON(FilterTypeId.TAXON_NAME, n("reefdb.core.enums.extractionFilter.taxon"), false),
TAXON_GROUP(FilterTypeId.TAXON_GROUP, n("reefdb.core.enums.extractionFilter.taxonGroup"), false), TAXON_GROUP(FilterTypeId.TAXON_GROUP, n("reefdb.core.enums.extractionFilter.taxonGroup"), false),
DEPARTMENT(FilterTypeId.DEPARTMENT, n("reefdb.core.enums.extractionFilter.department"), false), DEPARTMENT(FilterTypeId.DEPARTMENT, n("reefdb.core.enums.extractionFilter.department"), false),
......
...@@ -29,7 +29,6 @@ import fr.ifremer.quadrige3.core.ProgressionCoreModel; ...@@ -29,7 +29,6 @@ import fr.ifremer.quadrige3.core.ProgressionCoreModel;
import fr.ifremer.quadrige3.core.dao.technical.Assert; import fr.ifremer.quadrige3.core.dao.technical.Assert;
import fr.ifremer.quadrige3.core.dao.technical.Dates; import fr.ifremer.quadrige3.core.dao.technical.Dates;
import fr.ifremer.quadrige3.core.dao.technical.Times; import fr.ifremer.quadrige3.core.dao.technical.Times;
import fr.ifremer.quadrige3.core.security.SecurityContextHelper;
import fr.ifremer.quadrige3.ui.core.dto.referential.BaseReferentialDTO; import fr.ifremer.quadrige3.ui.core.dto.referential.BaseReferentialDTO;
import fr.ifremer.reefdb.config.ReefDbConfiguration; import fr.ifremer.reefdb.config.ReefDbConfiguration;
import fr.ifremer.reefdb.dao.administration.user.ReefDbDepartmentDao; import fr.ifremer.reefdb.dao.administration.user.ReefDbDepartmentDao;
...@@ -177,7 +176,8 @@ public class ObservationServiceImpl implements ObservationInternalService { ...@@ -177,7 +176,8 @@ public class ObservationServiceImpl implements ObservationInternalService {
Collection<String> programCodes; Collection<String> programCodes;
// if no filter on single program, force filter on writable programs // if no filter on single program, force filter on writable programs
if (StringUtils.isBlank(programCode)) { if (StringUtils.isBlank(programCode)) {
programCodes = programStrategyService.getWritableProgramCodesByQuserId(SecurityContextHelper.getQuadrigeUserId()); // get writable programs including locals (Mantis #49917)
programCodes = programStrategyService.getWritablePrograms().stream().map(ProgramDTO::getCode).collect(Collectors.toSet());
} else { } else {
programCodes = Collections.singleton(programCode); programCodes = Collections.singleton(programCode);
} }
...@@ -438,6 +438,7 @@ public class ObservationServiceImpl implements ObservationInternalService { ...@@ -438,6 +438,7 @@ public class ObservationServiceImpl implements ObservationInternalService {
Assert.notNull(duplicateSurvey); Assert.notNull(duplicateSurvey);
// Remove ID // Remove ID
duplicateSurvey.setId(null); duplicateSurvey.setId(null);
duplicateSurvey.setDirty(true);
// duplicated data to keep: // duplicated data to keep:
if (survey.isObserversEmpty() && survey.getId() != null) { if (survey.isObserversEmpty() && survey.getId() != null) {
...@@ -599,8 +600,10 @@ public class ObservationServiceImpl implements ObservationInternalService { ...@@ -599,8 +600,10 @@ public class ObservationServiceImpl implements ObservationInternalService {
if (dataContext.isContextFiltered(FilterTypeValues.PROGRAM) && !forceNoContext) { if (dataContext.isContextFiltered(FilterTypeValues.PROGRAM) && !forceNoContext) {
result = contextService.getFilteredPrograms(dataContext.getContextId()); result = contextService.getFilteredPrograms(dataContext.getContextId());
// context filtered programs can eventually out of user rights, filter them // context filtered programs can eventually out of user rights, filter them
Set<String> writableProgramCodes = programStrategyService.getWritableProgramCodesByQuserId(dataContext.getPrincipalUserId()); // Set<String> writableProgramCodes = programStrategyService.getWritableProgramCodesByQuserId(dataContext.getPrincipalUserId());
result = result.stream().filter(programDTO -> writableProgramCodes.contains(programDTO.getCode())).collect(Collectors.toList()); // Get correct list of writable programs (Mantis #49913)
List<ProgramDTO> writablePrograms = programStrategyService.getWritableProgramsByUserAndStatus(dataContext.getPrincipalUserId(), StatusFilter.ACTIVE);
result = result.stream().filter(writablePrograms::contains).collect(Collectors.toList());
} else if (campaignId != null) { } else if (campaignId != null) {
result = programStrategyService.getWritableProgramsByCampaignId(campaignId); result = programStrategyService.getWritableProgramsByCampaignId(campaignId);
} else { } else {
......
...@@ -1215,4 +1215,9 @@ public interface ReferentialService { ...@@ -1215,4 +1215,9 @@ public interface ReferentialService {
*/ */
QualitativeValueDTO getQualitativeValue(int qualitativeValueId); QualitativeValueDTO getQualitativeValue(int qualitativeValueId);
List<QualitativeValueDTO> getQualitativeValues(Collection<Integer> qualitativeValueIds);} List<QualitativeValueDTO> getQualitativeValues(Collection<Integer> qualitativeValueIds);
List<QualitativeValueDTO> getQualitativeValues(String parameterCode);
}
...@@ -1464,6 +1464,14 @@ public class ReferentialServiceImpl implements ReferentialService { ...@@ -1464,6 +1464,14 @@ public class ReferentialServiceImpl implements ReferentialService {
return result; return result;
} }
@Override
public List<QualitativeValueDTO> getQualitativeValues(String parameterCode) {
if (StringUtils.isBlank(parameterCode))
return null;
return qualitativeValueDao.getQualitativeValuesByParameterCode(parameterCode);
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
......
...@@ -152,6 +152,7 @@ reefdb.config.option.synchro.useServer.description= ...@@ -152,6 +152,7 @@ reefdb.config.option.synchro.useServer.description=
reefdb.config.option.synchro.zipFile.prefix.description= reefdb.config.option.synchro.zipFile.prefix.description=
reefdb.config.option.timezone.description= reefdb.config.option.timezone.description=
reefdb.config.option.tmp.directory.description= reefdb.config.option.tmp.directory.description=
reefdb.config.option.transcribingItemType.label.pmfmExtraction.description=
reefdb.config.option.transcribingItemType.label.pmfmNm.description= reefdb.config.option.transcribingItemType.label.pmfmNm.description=
reefdb.config.option.ui.autoPopupNumberEditor.description= reefdb.config.option.ui.autoPopupNumberEditor.description=
reefdb.config.option.ui.color.alternateRow.description= reefdb.config.option.ui.color.alternateRow.description=
...@@ -370,6 +371,8 @@ reefdb.service.extraction.fieldNamePrefix.SAMPLING_OPER= ...@@ -370,6 +371,8 @@ reefdb.service.extraction.fieldNamePrefix.SAMPLING_OPER=
reefdb.service.extraction.fieldNamePrefix.SURVEY= reefdb.service.extraction.fieldNamePrefix.SURVEY=
reefdb.service.extraction.noData.error= reefdb.service.extraction.noData.error=
reefdb.service.extraction.noPmfm.error= reefdb.service.extraction.noPmfm.error=
reefdb.service.extraction.notDistinct.MEAS_QUALIF_CM=
reefdb.service.extraction.notDistinct.MEAS_QUAL_FLAG_NM=
reefdb.service.observation.duplicate.measurementComment= reefdb.service.observation.duplicate.measurementComment=
reefdb.service.observation.unvalidation.progression= reefdb.service.observation.unvalidation.progression=
reefdb.service.observation.validation.progression= reefdb.service.observation.validation.progression=
......