JUNIT tester les log d’erreur

Il peut arriver des situations, ou l’on a envie de s’assurer qu’un log.error() est bien effectué lorsqu’on rentre dans une condition. Exemple de classe à tester : Java @Component public class VendeurUtil { private static final Logger LOGGER = LoggerFactory.getLogger(VendeurUtil.class); // ... private void ajouterNouveauCompte(@Nonnull final Marchand vendeur, final PaymentInfoDTO paymentInfoDTO, @Nonnull final Devise devise, final TypeEtatKYC typeEtatHistoKYC, final Utilisateur currentUser, @Nonnull final Marketplace marketplace) { if (!(paymentInfoDTO instanceof IbanBankAccountInformation)) { LOGGER.error( "Les informations bancaire du vendeur {} de la marketplace {} n'est pas un 'IBAN' et n'est pas géré. Aucune infos bancaire ajoutées pour le vendeur.", vendeur.getIdShop(), marketplace.getCodeClient()); return; } } 12345678910111213141516 @Componentpublic class VendeurUtil {  private static final Logger LOGGER = LoggerFactory.getLogger(VendeurUtil.class); // ... private void ajouterNouveauCompte(@Nonnull final Marchand vendeur, final PaymentInfoDTO paymentInfoDTO,                                    @Nonnull final Devise devise, final TypeEtatKYC typeEtatHistoKYC, final Utilisateur currentUser,                                    @Nonnull final Marketplace marketplace) {      if (!(paymentInfoDTO instanceof IbanBankAccountInformation)) {      LOGGER.error(              "Les informations bancaire du vendeur {} de la marketplace {} n'est pas un 'IBAN' et n'est pas géré. Aucune infos bancaire ajoutées pour le vendeur.",              vendeur.getIdShop(), marketplace.getCodeClient());      return;    } } Et dans le teste on peut tester cela comme ceci :   Java import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; import org.assertj.core.groups.Tuple; import static org.assertj.core.api.Assertions.assertThat; @RunWith(MockitoJUnitRunner.class)<br />public class VendeurUtilTest { @Before<br />public void init() { // log Logger logger = (Logger) LoggerFactory.getLogger(CantonnementService.class); logAppender = new ListAppender<>(); logAppender.start(); logger.addAppender(logAppender); } @Test public void createVendeurFromShopMarketplace_withoutBank_shouldAlertSupport() { //GIVEN : a non supported payment info myShop.setPayment_info(new UKBankAccountInformation()); //WHEN Marchand vendeur = instance.createVendeurFromShopMarketplace(myShop, marketplace, null, EUR, histoKYC, user, null); //THEN assertLogContains(logAppender, Level.ERROR, "Les informations bancaire du vendeur 1 de la marketplace CASTO n'est pas un 'IBAN' et n'est pas géré. Aucune infos bancaire ajoutées pour le vendeur.", null); } 123456789101112131415161718192021222324252627282930 import ch.qos.logback.classic.Level;import ch.qos.logback.classic.spi.ILoggingEvent;import ch.qos.logback.core.read.ListAppender;import org.assertj.core.groups.Tuple;import static org.assertj.core.api.Assertions.assertThat; @RunWith(MockitoJUnitRunner.class)<br />public class VendeurUtilTest { @Before<br />public void init() { // log    Logger logger = (Logger) LoggerFactory.getLogger(CantonnementService.class);     logAppender = new ListAppender<>();    logAppender.start();     logger.addAppender(logAppender);} @Testpublic void createVendeurFromShopMarketplace_withoutBank_shouldAlertSupport() {   //GIVEN : a non supported payment infomyShop.setPayment_info(new UKBankAccountInformation()); //WHEN Marchand vendeur = instance.createVendeurFromShopMarketplace(myShop, marketplace, null, EUR, histoKYC, user, null); //THENassertLogContains(logAppender, Level.ERROR,                    "Les informations bancaire du vendeur 1 de la marketplace CASTO n'est pas un 'IBAN' et n'est pas géré. Aucune infos bancaire ajoutées pour le vendeur.",                   null);} Shell private assertLogContains(@Nonnull ListAppender&lt;ILoggingEvent&gt; logAppender, @Nonnull Level level, @Nonnull String formattedMessage, @Nullable<br /> Throwable throwable) {<br /> List&lt;Tuple&gt; expectedLogLines = logAppender.list.stream()<br /> .map(l -&gt; new Tuple(l.getLevel(), l.getFormattedMessage(), l.getThrowableProxy() == null ? null : l.getThrowableProxy().getClassName(),<br /> l.getThrowableProxy() == null ? null : l.getThrowableProxy().getMessage()))<br /> .collect(toList());<br /><br /> assertThat(expectedLogLines).contains(<br /> new Tuple(level, formattedMessage, throwable == null ? null : throwable.getClass().getCanonicalName(),<br...

Read More

Réduire le temps de build maven

L’idée serait de détecter les modules maven impactés par les modifications. Puis de builder ces modules ainsi que les modules qui dépendent de celui-ci au sein du même repo. C’est possible à l’aide des arguments pl et -amd (-also-make-dependents)exemple:mvn install -pl artemis-javalib-impayes,artemis-javalib-common -amd Pour avoir tous les fichiers changés dans une branche Shell git whatchanged --name-only --pretty="" origin..HEAD 1 git whatchanged --name-only --pretty="" origin..HEAD Pour avoir tous les modules de premier niveau Shell git whatchanged --name-only --pretty="" origin..HEAD | awk "{print $1}" | cut -f1 -d"/" | uniq | tr "\r\n" "\n" | tr "\n" "," | sed "s/,$/\n/" 1 git whatchanged --name-only --pretty="" origin..HEAD | awk "{print $1}" | cut -f1 -d"/" | uniq | tr "\r\n" "\n" | tr "\n" "," | sed "s/,$/\n/" Pour builder Shell mvn -amd -pl "module list" install 1 mvn -amd -pl "module list" install 2 problèmes :seul le premier niveau est pris en comptele module maven doit avoir le même nom que le dossier du module plugin maven qui pourrait permettre d’identifier les modules affectés par une...

Read More

Jasper Report – Ajouter une interligne dans un tableau

Le but est de pouvoir ajouter une interligne dans un tableau. Cela peut-ête très utile, par exemple lors d’une facture et que l’on voudrais pouvoir préciser la taxe.   Pour ce faire, il faut faire des groupes dans le tableau. Don un group footer (qu’on va appeler « Group1 » car on a beaucoup d’imagination). A l’intérieur de ce groupe, on va ajouter un texteField (qui s’appel ici compléments). A ce stade, lorsque vous allez générer le pdf, la ligne sera afficher uniquement tout en bas du tableau, comme un footer.   Et c’est ici que réside l’astuce, il faut définir le group1 comme étant la concaténation de tous les champs de la colonne. Ainsi, chaque nouvelle ligne sera considéré comme un nouveau group et l’interligne sera répété. En bonus, je vous met la définition du groupe de donnée (subDataSet) . Shell &lt;subDataset name="FACTURE_LIGNE_DETAIL" uuid="d6f6b8e3-dd07-442d-a637-1f0536066d26"&gt;<br />&lt;parameter name="PIECE" class="com.fdilogbox.artemis.jreport.bean.marketplace.StandardReportParam"/&gt;<br />&lt;field name="reference" class="java.lang.String"/&gt;<br />&lt;field name="description" class="java.lang.String"/&gt;<br />&lt;field name="quantite" class="java.lang.String"/&gt;<br />&lt;field name="unitOfMeasure" class="java.lang.String"/&gt;<br />&lt;field name="prixUnitaireHT" class="java.lang.String"/&gt;<br />&lt;field name="montantTotalHT" class="java.lang.String"/&gt;<br />&lt;field name="tauxTaxe" class="java.lang.String"/&gt;<br />&lt;field name="complements" class="java.lang.String"/&gt;<br />&lt;group name="Group1"&gt;<br />&lt;groupExpression&gt;&lt;![CDATA[$F{reference}+$F{description}+$F{quantite}+$F{unitOfMeasure}+$F{prixUnitaireHT}+$F{montantTotalHT}+$F{tauxTaxe}+$F{complements}]]&gt;&lt;/groupExpression&gt;<br />&lt;/group&gt;<br />&lt;/subDataset&gt; 1 &lt;subDataset name="FACTURE_LIGNE_DETAIL" uuid="d6f6b8e3-dd07-442d-a637-1f0536066d26"&gt;<br />&lt;parameter name="PIECE" class="com.fdilogbox.artemis.jreport.bean.marketplace.StandardReportParam"/&gt;<br />&lt;field name="reference" class="java.lang.String"/&gt;<br />&lt;field name="description" class="java.lang.String"/&gt;<br />&lt;field name="quantite" class="java.lang.String"/&gt;<br />&lt;field name="unitOfMeasure" class="java.lang.String"/&gt;<br />&lt;field name="prixUnitaireHT" class="java.lang.String"/&gt;<br />&lt;field name="montantTotalHT" class="java.lang.String"/&gt;<br />&lt;field name="tauxTaxe" class="java.lang.String"/&gt;<br />&lt;field name="complements" class="java.lang.String"/&gt;<br />&lt;group name="Group1"&gt;<br />&lt;groupExpression&gt;&lt;![CDATA[$F{reference}+$F{description}+$F{quantite}+$F{unitOfMeasure}+$F{prixUnitaireHT}+$F{montantTotalHT}+$F{tauxTaxe}+$F{complements}]]&gt;&lt;/groupExpression&gt;<br />&lt;/group&gt;<br />&lt;/subDataset&gt;...

Read More

Maven ne fonctionne plus à cause de ssl

Salut à tous,   Aujourd’hui, j’ai voulu joué avec spring, et créer une petite application avec springboot, impossible de téléchargé le pom parent, rien ne fonctionnais ! Après avoir pas mal tatoné, je me suis rendu compte que c’était ssl qui était complètement cassé (peut-être à cause d’une mise à jour foireuse ?).   En tout, avec cette petite commande magique (sous ubuntu / debian), j’ai pu tout réparer en clin d’oeil : sudo apt-get install -y ca-certificates-java && sudo update-ca-certificates -f  ...

Read More

créer une application spring-boot déployable en war (tomcat)

Bonjour à tous,   après m’être cassé les dents pas mal de temps sur ce problème, j’ai ENFIN trouvé la solution. Et évidement, c’était tout bête.   pour créer une appllication springboot que l’on peut déployer dans un tomcat   il faut que votre classe application hérite de SpringBootServletInitializer et override la méthode configure   comme ceci : Java @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } 12345678910111213 @SpringBootApplicationpublic class Application extends SpringBootServletInitializer {     @Override    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {        return application.sources(Application.class);    }     public static void main(String[] args) throws Exception {        SpringApplication.run(Application.class, args);    } }   et votre pom.xml doit ressembler à ceci : XHTML <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>huseyinbabal.net</groupId> <artifactId>spring-mongodb-data-rest</artifactId> <version>0.1.0</version> <packaging>war</packaging> <properties> <java.version>1.7</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.2.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://localhost:8080/manager/text</url> <server>TomcatServer</server> <path>/morgan</path> <username>openfoodfacts</username> <password>password</password> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </pluginManagement> <finalName>restWS</finalName> </build> </project> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>  <groupId>huseyinbabal.net</groupId> <artifactId>spring-mongodb-data-rest</artifactId> <version>0.1.0</version> <packaging>war</packaging>  <properties> <java.version>1.7</java.version> </properties>  <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.2.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>   <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>   <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-tomcat</artifactId>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency> </dependencies>  <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>  <pluginManagement> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://localhost:8080/manager/text</url> <server>TomcatServer</server> <path>/morgan</path> <username>openfoodfacts</username> <password>password</password> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </pluginManagement> <finalName>restWS</finalName> </build> </project>   il doit générer un fichier war grâce à la propriété : XHTML <packaging>war</packaging> 1 <packaging>war</packaging> utiliser la dépendence : XHTML <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> 12345   <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-tomcat</artifactId>            <scope>provided</scope>        </dependency> et normalement le problème devrais etre...

Read More

Savoir si un utilisateur à fini de télécharger un fichier

Savoir si un utilisateur à fini de télécharger un fichier

Bonjour à tous, Récemment j’ai eu la problématique d’effectuer une action uniquement dans l’utilisateur à fini de télécharger un fichier. Pour résoudre ce problème j’ai du utiliser FileChannel qui permet de savoir exactement où l’on en est dans la lecture du fichier. La solution est tellement simple qu’elle en est élégante : il suffit de overrider la méthode close de FileInputStream Java final FileInputStream fileInputStream = new FileInputStream(zipFile){ @Override public void close() throws IOException { FileChannel fc = this.getChannel(); if (fc.position() == fc.size()) { LOGGER.warn("#### download finished ###"); } else { LOGGER.warn("#### File is not finished to download ###"); } super.close(); } }; 1234567891011121314 final FileInputStream fileInputStream = new FileInputStream(zipFile){ @Override public void close() throws IOException { FileChannel fc = this.getChannel();  if (fc.position() ==  fc.size()) { LOGGER.warn("#### download finished ###");  } else { LOGGER.warn("#### File is not finished to download ###"); } super.close(); }}; Enfaîte, la méthode close est appelé quand la connexion est close. Si la position du fileChannel est égale à la taille totale, cela veux dire que le téléchargement à été terminé (tout le fichier à été lu). Hors si la position n’est pas égale à la taille, c’est que la connexion à été close par le client avant la fin du téléchargement (téléchargement annulé par l’utilisateur)....

Read More