diff --git a/bin/sloccount.sh b/bin/sloccount.sh index 41aed14ea0f8c5c79791e5e73a8d16a9aa995695..7b599e8fc8e9bb77a96b270bfc918c4fc17c1f12 100755 --- a/bin/sloccount.sh +++ b/bin/sloccount.sh @@ -21,8 +21,8 @@ fi echo "tokei is installed at $TOKEI" $TOKEI --version mkdir -p $ROOT_DIR/target -if [ ! -d $ROOT_DIR/www-client ]; then +if [ ! -d $ROOT_DIR/cli ]; then $TOKEI -f -o json $ROOT_DIR/src | $TOKEI2CLOC > $ROOT_DIR/target/cloc.xml exit fi -$TOKEI -f -o json $ROOT_DIR/www-client/src $ROOT_DIR/www-server/src $ROOT_DIR/www-shared/src | $TOKEI2CLOC > $ROOT_DIR/target/cloc.xml +$TOKEI -f -o json $ROOT_DIR/cli/src $ROOT_DIR/core/src $ROOT_DIR/core-test/src | $TOKEI2CLOC > $ROOT_DIR/target/cloc.xml diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java index 032009b634dbcdb01749a1651181b530574c3924..c93956299d16e057f596a21525a1f039a21e20c6 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/CliHelper.java @@ -7,6 +7,8 @@ import jakarta.jms.JMSException; import javax.naming.NamingException; import fr.inrae.agroclim.indicators.model.Evaluation; +import fr.inrae.agroclim.season.cli.error.EvaluationErrorType; +import fr.inrae.agroclim.season.cli.error.SeasonCliException; import fr.inrae.agroclim.season.cli.jms.Receiver; import fr.inrae.agroclim.season.core.InputHelper; import fr.inrae.agroclim.season.core.dao.CellDao; @@ -63,13 +65,14 @@ public final class CliHelper { * @param computation computation details * @return treatment with evaluation without data * @throws IndicatorsException while loading XML. + * @throws SeasonCliException if evaluation is null after loading */ public static Treatment loadTreatment( final CellDao cellDao, final VarietyParameterDao varietyParameterDao, final SimulationProperties props, final int cell, final Computation computation) - throws IndicatorsException { + throws IndicatorsException, SeasonCliException { final String filePath; try { filePath = props.getEvaluationPath(); @@ -80,7 +83,7 @@ public final class CliHelper { } final Evaluation evaluation = InputHelper.loadEvaluation(filePath); if (evaluation == null) { - throw new RuntimeException("Evaluation is null from " + filePath); + throw new SeasonCliException(EvaluationErrorType.LOAD, filePath); } return InputHelper.loadTreatment(cellDao, varietyParameterDao, evaluation, props, cell, computation); diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java index 7dfe45a079b16a6c23af2fa461100bd198063510..ee65a55ad61085d30c16cc8183dffdf91ca7be04 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/Main.java @@ -4,8 +4,6 @@ import java.util.Locale; import java.util.Map; import java.util.concurrent.Callable; -import org.apache.logging.log4j.Level; - import fr.inrae.agroclim.indicators.resources.I18n; import fr.inrae.agroclim.season.cli.clioptionhandlers.CancelCliOptionHandler; import fr.inrae.agroclim.season.cli.clioptionhandlers.ConfigCliOptionHandler; @@ -32,6 +30,7 @@ import fr.inrae.agroclim.season.core.model.PhenologicalModel; import fr.inrae.agroclim.season.core.service.SimulationService; import lombok.Setter; import lombok.extern.log4j.Log4j2; +import org.apache.logging.log4j.Level; import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.IVersionProvider; @@ -288,12 +287,6 @@ public final class Main implements Callable<Integer>, IVersionProvider { if (receivers == null) { PersistenceManager.getINSTANCE().close(); } else { -/*- - LOGGER.info("Waiting for treatments..."); -Thread t = new Thread(() -> {Thread.currentThread().interrupt(); System.out.println("ok");}); -t.setDaemon(true); -t.start(); - */ try { LOGGER.info("Waiting for treatments..."); // Sleep forever, waiting for ourselves to finish diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java index bf29b4ca4bd9684797b24d3e79134e25d17fdc4b..d1a0cfeeb4fdffd8a836ffcd63a5cb64d5d125f7 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/PurgeCliOptionHandler.java @@ -50,7 +50,7 @@ public final class PurgeCliOptionHandler implements Runnable { public void run() { final List<Simulation> sims = simulationDao.findExpired(); LOGGER.info("{} simulations to purge", sims.size()); - sims.forEach((sim) -> { + sims.forEach(sim -> { boolean deletion = simulationErrorDao.delete(sim); if (!deletion) { return; diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java index c97749097cb8d54608772656c61115eb2092fea4..0c26574ae9dd116ab36649c13764d257c810eca5 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/SimulationCliOptionHandler.java @@ -214,7 +214,8 @@ public final class SimulationCliOptionHandler implements Consumer<String> { final Treatment treatment; try { treatment = CliHelper.loadTreatment(cellDao, varietyParameterDao, props, cell, computation); - } catch (IndicatorsException ex) { + } catch (final IndicatorsException | SeasonCliException ex) { + LOGGER.fatal("Failed to load treatment", ex); System.exit(1); return; } diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java index 198aaec3113de8fa56fbc6e46c60b04cdf963803..be5b6697821613b780d0558c8d19d436f4efd4fa 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/clioptionhandlers/VerboseCliOptionHandler.java @@ -1,7 +1,7 @@ package fr.inrae.agroclim.season.cli.clioptionhandlers; import java.util.function.Consumer; - +import lombok.extern.log4j.Log4j2; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; @@ -9,11 +9,9 @@ import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.util.Strings; -import lombok.extern.log4j.Log4j2; - /** * Handler for the option "--verbose" of the command line interface. - * + * * @author Olivier Maury */ @Log4j2 diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java index 527aaf18bb67e4a1d5075a47328ab0b7b1843259..bc328bdff7180afe26c11d2749f05c5e002f28bf 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/di/GeneralModule.java @@ -44,7 +44,7 @@ public final class GeneralModule { } }); // Override default config from "-D" arguments - config.getKeys().forEach((conf) -> { + config.getKeys().forEach(conf -> { final String val = System.getProperty(conf); if (val != null && !val.isEmpty()) { config.set(conf, val); diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java index 6ab3158717e7780cd7107bfd9d48fe413a7244b8..bdad449c51d962e2b4159169b7edbbd86b054a7d 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/jms/Receiver.java @@ -1,19 +1,15 @@ package fr.inrae.agroclim.season.cli.jms; +import java.time.LocalDate; import java.util.List; import java.util.Map; -import jakarta.jms.Destination; -import jakarta.jms.JMSConsumer; -import jakarta.jms.JMSContext; -import jakarta.jms.JMSException; -import jakarta.jms.Message; -import jakarta.jms.MessageListener; -import jakarta.jms.ObjectMessage; -import jakarta.jms.TextMessage; import javax.naming.NamingException; +import org.semver4j.Semver; + import fr.inrae.agroclim.indicators.exception.ErrorMessageException; +import fr.inrae.agroclim.indicators.exception.IndicatorsException; import fr.inrae.agroclim.indicators.model.Evaluation; import fr.inrae.agroclim.indicators.model.result.EvaluationResult; import fr.inrae.agroclim.season.cli.CliConfiguration; @@ -31,12 +27,18 @@ import fr.inrae.agroclim.season.core.dao.SimulationSoilDao; import fr.inrae.agroclim.season.core.jms.JMSUtils; import fr.inrae.agroclim.season.core.model.Simulation; import fr.inrae.agroclim.season.core.model.Treatment; -import java.time.LocalDate; +import jakarta.jms.Destination; +import jakarta.jms.JMSConsumer; +import jakarta.jms.JMSContext; +import jakarta.jms.JMSException; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; +import jakarta.jms.ObjectMessage; +import jakarta.jms.TextMessage; import lombok.Getter; import lombok.NonNull; import lombok.Setter; import lombok.extern.log4j.Log4j2; -import org.semver4j.Semver; /** * JMS message receiver to handle Treatment. @@ -266,10 +268,10 @@ public final class Receiver implements MessageListener, Runnable { return; } try { - if (message instanceof TextMessage textMessage) { + if (message instanceof final TextMessage textMessage) { // test with message containing only text onTextMessage(textMessage); - } else if (message instanceof ObjectMessage objectMessage) { + } else if (message instanceof final ObjectMessage objectMessage) { // The message contains treatment. onObjectMessage(objectMessage); } else { diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java index ea5a2a8b2bb039bb1a4ee8bcd9bd973a50f62fcd..bc54575dfc656d9dfb50e691818afcd7260cc7d5 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/mail/MailService.java @@ -7,6 +7,8 @@ import java.util.Date; import java.util.List; import java.util.Properties; +import fr.inrae.agroclim.season.cli.CliConfiguration; +import fr.inrae.agroclim.season.cli.di.GeneralModule; import jakarta.activation.DataHandler; import jakarta.activation.DataSource; import jakarta.activation.FileDataSource; @@ -24,9 +26,6 @@ import jakarta.mail.internet.InternetAddress; import jakarta.mail.internet.MimeBodyPart; import jakarta.mail.internet.MimeMessage; import jakarta.mail.internet.MimeMultipart; - -import fr.inrae.agroclim.season.cli.CliConfiguration; -import fr.inrae.agroclim.season.cli.di.GeneralModule; import lombok.NonNull; import lombok.extern.log4j.Log4j2; @@ -38,6 +37,30 @@ import lombok.extern.log4j.Log4j2; */ @Log4j2 public final class MailService { + /** + * SMTP property. + */ + private static final String PROPERTY_PASSWORD = "mail.smtp.auth.password"; + + /** + * SMTP property. + */ + private static final String PROPERTY_USER = "mail.smtp.auth.user"; + + /** + * SMTP property. + */ + private static final String PROPERTY_ENVIRONMENT = "mail.header.environment"; + + /** + * SMTP property. + */ + private static final String PROPERTY_FROM = "mail.smtp.from"; + + /** + * SMTP property. + */ + private static final String PROPERTY_TO = "mail.smtp.to"; /** * Handle exception occured while sending message. @@ -49,12 +72,12 @@ public final class MailService { LOGGER.error(mex); Exception ex = mex; do { - if (ex instanceof AddressException ae) { + if (ex instanceof final AddressException ae) { throw new SendMailException("send : Invalid Address : " + ae.getRef() + " : " + ex.getMessage()); } else if (ex instanceof AuthenticationFailedException) { throw new SendMailException("send : wrong credentials : " + ex.getMessage()); - } else if (ex instanceof SendFailedException sfex) { + } else if (ex instanceof final SendFailedException sfex) { final Address[] invalid = sfex.getInvalidAddresses(); final StringBuilder messageException = new StringBuilder(); if (invalid != null) { @@ -80,7 +103,7 @@ public final class MailService { throw new SendMailException(ex, "send : Valid Sent Addresses : " + messageException.toString()); } } - if (ex instanceof MessagingException messagingException) { + if (ex instanceof final MessagingException messagingException) { ex = messagingException.getNextException(); } else if (ex instanceof java.net.SocketException) { LOGGER.error(ex); @@ -101,12 +124,12 @@ public final class MailService { */ public static void main(final String[] args) throws SendMailException { final CliConfiguration config = GeneralModule.provideCliConfiguration(); - if (!config.getKeys().contains("mail.smtp.auth.password")) { + if (!config.getKeys().contains(PROPERTY_PASSWORD)) { final BufferedReader prompt = new BufferedReader(new InputStreamReader(System.in)); System.out.println("SMTP password:\n"); try { final String pwd = prompt.readLine(); - config.set("mail.smtp.auth.password", pwd); + config.set(PROPERTY_PASSWORD, pwd); } catch (final IOException ex) { LOGGER.fatal(ex); return; @@ -153,20 +176,20 @@ public final class MailService { final boolean sendCopyToSupport = mail.getSendCopytoSupport(); if (mail.getTo() == null) { - to = props.getProperty("mail.smtp.to"); + to = props.getProperty(PROPERTY_TO); } else { to = mail.getTo(); } if (mail.getFrom() == null) { - from = props.getProperty("mail.smtp.from"); + from = props.getProperty(PROPERTY_FROM); if (from == null) { - from = props.getProperty("mail.smtp.to"); + from = props.getProperty(PROPERTY_TO); } } else { from = mail.getFrom(); } if (from == null) { - throw new RuntimeException("from not set!"); + throw new SendMailException("configuration: from not set!"); } final Session session = Session.getInstance(props, null); @@ -225,20 +248,19 @@ public final class MailService { // Send the complete message parts msg.setContent(multipart); } - final String environment = props.getProperty("mail.header.environment"); + final String environment = props.getProperty(PROPERTY_ENVIRONMENT); if (environment != null) { msg.setHeader("X-Environment", environment); } - final String user = props.getProperty("mail.smtp.auth.user"); - final String password = props.getProperty("mail.smtp.auth.password"); + final String user = props.getProperty(PROPERTY_USER); + final String password = props.getProperty(PROPERTY_PASSWORD); if (user != null && password != null) { LOGGER.trace("user with password : " + user); Transport.send(msg, user, password); } else if (user != null && password == null) { - LOGGER.warn("mail.smtp.auth.user is set but " - + "mail.smtp.auth.password is not set! " - + "E-mail won't be sent!"); + LOGGER.warn(PROPERTY_USER + " is set but " + + PROPERTY_PASSWORD + " is not set! E-mail won't be sent!"); } else { Transport.send(msg); } diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java index d97940a0ac7853bd11c880273f4f9accebdc9b91..228bb33e8c45cb1b47f600cdb5e357fa568e63f3 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/AbstractOutput.java @@ -162,7 +162,7 @@ public abstract class AbstractOutput { final LocalDate lastDate = results.keySet().stream().sorted().reduce((first, second) -> second).get(); final List<AnnualPhase> computedPhases = results.get(lastDate).values().stream() // .flatMap(r -> r.getPhaseResults().stream()) // - .map(r -> r.getAnnualPhase()) // + .map(PhaseResult::getAnnualPhase) // .toList(); beforeLoopOnResults(computedPhases); final long startTime = System.currentTimeMillis(); diff --git a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java index 2b52ef386940e3fd33f182354f54cbb12db30130..a101dd902ee355ce4189a29bee3f9c8ebabbe48c 100644 --- a/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java +++ b/cli/src/main/java/fr/inrae/agroclim/season/cli/output/LogOutput.java @@ -1,9 +1,9 @@ package fr.inrae.agroclim.season.cli.output; import fr.inrae.agroclim.indicators.model.AnnualPhase; -import fr.inrae.agroclim.season.core.model.Treatment; import fr.inrae.agroclim.indicators.model.result.IndicatorResult; import fr.inrae.agroclim.indicators.model.result.PhaseResult; +import fr.inrae.agroclim.season.core.model.Treatment; import java.util.List; import lombok.extern.log4j.Log4j2; @@ -27,6 +27,7 @@ public final class LogOutput extends AbstractOutput { @Override public void clear() { + // no temporary files to clear in log output. } @Override @@ -51,7 +52,7 @@ public final class LogOutput extends AbstractOutput { if (!indicator.getIndicatorResults().isEmpty()) { nbOfResults += indicator.getIndicatorResults() .stream() - .map((res) -> handleIndicator(year, res)) + .map(res -> handleIndicator(year, res)) .reduce(nbOfResults, Integer::sum); } return nbOfResults; diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java b/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java index a3e79a020d0b95aa366fb11f4d1dca675f63932c..cbac45ffa34fa5f696ae0ac3b2ce6dfcf62a2a0f 100644 --- a/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java +++ b/core/src/main/java/fr/inrae/agroclim/season/core/climate/PhenologyCalculatorBuilder.java @@ -2,14 +2,13 @@ package fr.inrae.agroclim.season.core.climate; import java.util.Map; -import javax.inject.Inject; - import fr.inrae.agroclim.indicators.model.data.phenology.PhenologicalModelType; import fr.inrae.agroclim.indicators.model.data.phenology.PhenologyCalculator; import fr.inrae.agroclim.indicators.model.data.phenology.Stage; import fr.inrae.agroclim.season.core.dao.CellDao; import fr.inrae.agroclim.season.core.model.Cell; import fr.inrae.agroclim.season.core.model.ClimaticBase; +import javax.inject.Inject; import lombok.Setter; import lombok.extern.log4j.Log4j2; @@ -124,7 +123,6 @@ public final class PhenologyCalculatorBuilder { //- for (final String param : varietyParameters.keySet()) { final double value = varietyParameters.get(param); - // LOGGER.trace("{}={}", param, value); if (isWb) { switch (param) { case "ST_Phase_bh_1": diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java b/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java index ae293b4938529305aab93a65be98737dd3c944f2..ec8dc695466b10496a5c203684dc92a8ab6e1854 100644 --- a/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java +++ b/core/src/main/java/fr/inrae/agroclim/season/core/dao/CellDaoHibernate.java @@ -43,13 +43,13 @@ public final class CellDaoHibernate extends DaoHibernate implements CellDao { @Override public List<Cell> findAllByClimaticbaseName(final String baseName) { final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName"; - return findAllByJPQL(stmt, Map.of("baseName", baseName), Cell.class); + return findAllByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName), Cell.class); } @Override public Cell findAllByClimaticbaseNameAndCellNumber(final String baseName, final Integer cellNumber) { final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName AND t.cellNumber = :cellNumber"; - return findOneByJPQL(stmt, Map.of("baseName", baseName, "cellNumber", cellNumber), Cell.class); + return findOneByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName, "cellNumber", cellNumber), Cell.class); } @Override @@ -59,7 +59,7 @@ public final class CellDaoHibernate extends DaoHibernate implements CellDao { cellNumbers.forEach(n -> sj.add(String.valueOf(n))); final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName AND t.cellNumber IN (" + sj.toString() + ")"; - return findAllByJPQL(stmt, Map.of("baseName", baseName), Cell.class); + return findAllByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName), Cell.class); } @Override @@ -71,7 +71,7 @@ public final class CellDaoHibernate extends DaoHibernate implements CellDao { @Override public List<Cell> findByClimaticbaseNameAndCellNumberIsNotNull(final String baseName) { final String stmt = "SELECT t FROM Cell t WHERE t.climaticbaseName = :baseName AND t.cellNumber IS NOT NULL"; - return findAllByJPQL(stmt, Map.of("baseName", baseName), Cell.class); + return findAllByJPQL(stmt, Map.of(PROPERTY_BASENAME, baseName), Cell.class); } @Override diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java b/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java index 446658389edf71944e7ba28b55f1ec7a7ab27e51..b23525cd8f4100696e9d87c15373c71fd84c44c7 100644 --- a/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java +++ b/core/src/main/java/fr/inrae/agroclim/season/core/dao/ClimaticScenarioDaoHibernate.java @@ -31,8 +31,9 @@ public final class ClimaticScenarioDaoHibernate extends DaoHibernate implements @Override public List<ClimaticScenario> findAll() { - final String stmt = "SELECT t FROM ClimaticScenario t " - + "ORDER BY t.climaticModel.climaticBase.name ASC, t.climaticModel.name ASC, t.name ASC"; + final String stmt = """ + SELECT t FROM ClimaticScenario t + ORDER BY t.climaticModel.climaticBase.name ASC, t.climaticModel.name ASC, t.name ASC"""; return findAllByJPQL(stmt, null, ClimaticScenario.class); } @@ -45,8 +46,9 @@ public final class ClimaticScenarioDaoHibernate extends DaoHibernate implements @Override public ClimaticScenario findByBaseCodeAndModelCodeAndScenarioName(final String baseCode, final String modelCode, final String name) { - final String stmt = "SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b " - + "WHERE s.name = :name AND b.code = :baseCode AND m.code = :modelCode"; + final String stmt = """ + SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b + WHERE s.name = :name AND b.code = :baseCode AND m.code = :modelCode"""; return findOneByJPQL(stmt, Map.of("name", name, "baseCode", baseCode, "modelCode", modelCode), ClimaticScenario.class); } @@ -54,9 +56,10 @@ public final class ClimaticScenarioDaoHibernate extends DaoHibernate implements @Override public ClimaticScenario findByBaseNameAndModelNameAndName(final String baseName, final String modelName, final String scenarioName) { - final String stmt = "SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b " - + "WHERE s.name = :name AND b.name = :baseName AND m.name = :modelName"; - return findOneByJPQL(stmt, Map.of("name", scenarioName, "baseName", baseName, "modelName", modelName), + final String stmt = """ + SELECT s FROM ClimaticScenario s JOIN s.climaticModel m JOIN m.climaticBase b + WHERE s.name = :name AND b.name = :baseName AND m.name = :modelName"""; + return findOneByJPQL(stmt, Map.of("name", scenarioName, PROPERTY_BASENAME, baseName, "modelName", modelName), ClimaticScenario.class); } diff --git a/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java b/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java index 97bb1e7b70a97202d62e8b1441190731c5b2babc..d083346439d334a051f2b969b13db59cf7054af7 100644 --- a/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java +++ b/core/src/main/java/fr/inrae/agroclim/season/core/dao/DaoHibernate.java @@ -16,11 +16,10 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import org.hibernate.Session; - import fr.inrae.agroclim.season.core.DatabaseRoles; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import org.hibernate.Session; /** * Managing transactions in database. @@ -30,6 +29,16 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @RequiredArgsConstructor public class DaoHibernate implements Dao { + /** + * Column schema. + */ + private static final String COLUMN_SCHEMA = "schema"; + + /** + * Property baseName for Cell, ClimaticScenario. + */ + protected static final String PROPERTY_BASENAME = "baseName"; + /** * Generate the SQL statement for the database driver. * @@ -96,7 +105,7 @@ public class DaoHibernate implements Dao { throw new UnsupportedOperationException("Database driver not handled: " + getDriver(em)); } final Query query = em.createNativeQuery(sb.toString()); - query.setParameter("schema", schema); + query.setParameter(COLUMN_SCHEMA, schema); query.setParameter("index", index); final Object result = query.getSingleResult(); return result != null && (Boolean) result; @@ -543,7 +552,7 @@ public class DaoHibernate implements Dao { FROM pg_catalog.pg_tables WHERE schemaname=:schema """; final Query query = em.createNativeQuery(sql); - query.setParameter("schema", schema); + query.setParameter(COLUMN_SCHEMA, schema); return (BigDecimal) query.getSingleResult(); } else { throw new UnsupportedOperationException("Database driver not handled!"); @@ -588,7 +597,7 @@ public class DaoHibernate implements Dao { FROM information_schema.tables WHERE table_schema = :schema AND LOWER(table_name) = :table """; - return findFirstScalarWithNamedParameters(sql, Map.of("schema", schema, "table", table.toLowerCase())); + return findFirstScalarWithNamedParameters(sql, Map.of(COLUMN_SCHEMA, schema, "table", table.toLowerCase())); } @Override @@ -598,6 +607,6 @@ public class DaoHibernate implements Dao { FROM information_schema.views WHERE table_schema = :schema AND LOWER(table_name) = :view """; - return findFirstScalarWithNamedParameters(sql, Map.of("schema", schema, "view", view.toLowerCase())); + return findFirstScalarWithNamedParameters(sql, Map.of(COLUMN_SCHEMA, schema, "view", view.toLowerCase())); } }