This is an automated email from the git hooks/post-receive script. New commit to branch feature/8180 in repository echobase. See https://gitlab.nuiton.org/codelutin/echobase.git commit a20955403871109879bfdfa6d209707ffdbcb4a5 Author: Julien Ruchaud <julien.ruchaud@debux.org> Date: Wed Jun 22 17:11:46 2016 +0200 Begin create table in dashboard for mooring --- .../fr/ifremer/echobase/entities/ImportType.java | 130 +++++++++++++++------ .../services/service/UserDbPersistenceService.java | 27 +++++ .../service/importdata/ImportDataService.java | 1 + .../MooringCommonsImportConfiguration.java | 2 +- .../importdb/strategy/FreeImportDbStrategy.java | 2 +- .../service/removedata/RemoveDataService.java | 2 +- .../strategy/MooringRemoveDataStrategy.java | 2 +- .../echobase/ui/actions/dbeditor/GetEntities.java | 24 ++-- .../echobase/ui/actions/workingDb/DashBoard.java | 23 +++- .../ui/actions/workingDb/GetImportLogDetail.java | 7 +- .../src/main/resources/config/struts-workingDb.xml | 8 +- .../webapp/WEB-INF/jsp/workingDb/dashboard.jsp | 27 ++++- 12 files changed, 193 insertions(+), 62 deletions(-) diff --git a/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java b/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java index dbbbd07..90e192c 100644 --- a/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java +++ b/echobase-domain/src/main/java/fr/ifremer/echobase/entities/ImportType.java @@ -33,73 +33,124 @@ import static org.nuiton.i18n.I18n.n; */ public enum ImportType implements I18nAble { - /** Import a voyage with all his data. */ - VOYAGE(n("echobase.common.importType.voyage"), - n("echobase.common.importType.voyage.short")), + /** Import a voyage with all his data. *//** Import a voyage with all his data. */ + VOYAGE( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.voyage"), + n("echobase.common.importType.voyage.short") + ), /** Import Voyage / Transit / Transect. */ - COMMON_ALL(n("echobase.common.importType.commonDataAll"), - n("echobase.common.importType.commonDataAll.short")), + COMMON_ALL( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.commonDataAll"), + n("echobase.common.importType.commonDataAll.short") + ), /** Import Voyage. */ - COMMON_VOYAGE(n("echobase.common.importType.commonDataVoyage"), - n("echobase.common.importType.commonDataVoyage.short")), + COMMON_VOYAGE( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.commonDataVoyage"), + n("echobase.common.importType.commonDataVoyage.short") + ), /** Import Transit. */ - COMMON_TRANSIT(n("echobase.common.importType.commonDataTransit"), - n("echobase.common.importType.commonDataTransit.short")), + COMMON_TRANSIT( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.commonDataTransit"), + n("echobase.common.importType.commonDataTransit.short") + ), /** Import Transect. */ - COMMON_TRANSECT(n("echobase.common.importType.commonDataTransect"), - n("echobase.common.importType.commonDataTransect.short")), + COMMON_TRANSECT( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.commonDataTransect"), + n("echobase.common.importType.commonDataTransect.short") + ), /** Import Operations. */ - OPERATION(n("echobase.common.importType.operation"), - n("echobase.common.importType.operation.short")), + OPERATION( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.operation"), + n("echobase.common.importType.operation.short") + ), /** Import Catches (unsorted, total, but no individual ones). */ - CATCHES(n("echobase.common.importType.catches"), - n("echobase.common.importType.catches.short")), + CATCHES( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.catches"), + n("echobase.common.importType.catches.short") + ), /** Import accoustic data (Cells ESDU and Elementary). */ - ACOUSTIC(n("echobase.common.importType.acoustic"), - n("echobase.common.importType.acoustic.short")), + ACOUSTIC( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.acoustic"), + n("echobase.common.importType.acoustic.short") + ), /** Import results at voyage level. */ - RESULT_VOYAGE(n("echobase.common.importType.resultsVoyage"), - n("echobase.common.importType.resultsVoyage.short")), + RESULT_VOYAGE( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.resultsVoyage"), + n("echobase.common.importType.resultsVoyage.short") + ), /** Import esdu results by echotype. */ - RESULT_ESDU(n("echobase.common.importType.resultsEsdu"), - n("echobase.common.importType.resultsEsdu.short")), + RESULT_ESDU( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.resultsEsdu"), + n("echobase.common.importType.resultsEsdu.short") + ), /** Import cells Region. */ - RESULT_REGION(n("echobase.common.importType.resultsRegion"), - n("echobase.common.importType.resultsRegion.short")), + RESULT_REGION( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.resultsRegion"), + n("echobase.common.importType.resultsRegion.short") + ), /** Import cells Map Fish. */ - RESULT_MAP_FISH(n("echobase.common.importType.resultsMapFish"), - n("echobase.common.importType.resultsMapFish.short")), + RESULT_MAP_FISH( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.resultsMapFish"), + n("echobase.common.importType.resultsMapFish.short") + ), /** Import cells Map Other. */ - RESULT_MAP_OTHER(n("echobase.common.importType.resultsMapOther"), - n("echobase.common.importType.resultsMapOther.short")), + RESULT_MAP_OTHER( + EchoBaseUserEntityEnum.Voyage, + n("echobase.common.importType.resultsMapOther"), + n("echobase.common.importType.resultsMapOther.short") + ), /** Import mooring data. */ - MOORING(n("echobase.common.importType.mooring"), - n("echobase.common.importType.mooring.short")), + MOORING_COMMONS( + EchoBaseUserEntityEnum.Mooring, + n("echobase.common.importType.mooring"), + n("echobase.common.importType.mooring.short") + ), /** Import accoustic data (Cells ESDU and Elementary). */ - MOORING_ACOUSTIC(n("echobase.common.importType.acoustic"), - n("echobase.common.importType.acoustic.short")), + MOORING_ACOUSTIC( + EchoBaseUserEntityEnum.Mooring, + n("echobase.common.importType.acoustic"), + n("echobase.common.importType.acoustic.short") + ), /** Import results at voyage level. */ - RESULT_MOORING(n("echobase.common.importType.resultsMooring"), - n("echobase.common.importType.resultsMooring.short")), + RESULT_MOORING( + EchoBaseUserEntityEnum.Mooring, + n("echobase.common.importType.resultsMooring"), + n("echobase.common.importType.resultsMooring.short") + ), /** Import esdu results by echotype. */ - RESULT_MOORING_ESDU(n("echobase.common.importType.resultsMooringEsdu"), - n("echobase.common.importType.resultsMooringEsdu.short")); + RESULT_MOORING_ESDU( + EchoBaseUserEntityEnum.Mooring, + n("echobase.common.importType.resultsMooringEsdu"), + n("echobase.common.importType.resultsMooringEsdu.short") + ); /** * All common import types. @@ -123,12 +174,15 @@ public enum ImportType implements I18nAble { RESULT_REGION, RESULT_MAP_FISH, RESULT_MAP_OTHER}; + + private final EchoBaseUserEntityEnum entityType; private final String i18nKey; private final String shortI18nKey; - ImportType(String i18nKey, String shortI18nKey) { + ImportType(EchoBaseUserEntityEnum entityType, String i18nKey, String shortI18nKey) { + this.entityType = entityType; this.i18nKey = i18nKey; this.shortI18nKey = shortI18nKey; } @@ -142,6 +196,10 @@ public enum ImportType implements I18nAble { return shortI18nKey; } + public EchoBaseUserEntityEnum getEntityType() { + return entityType; + } + public static ImportType[] getCommonImportType() { return COMMON_IMPORT_TYPES; } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java index 9c14106..68e9f52 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/UserDbPersistenceService.java @@ -26,7 +26,9 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; +import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.entities.EchoBaseUserPersistenceContext; @@ -683,6 +685,31 @@ public class UserDbPersistenceService extends EchoBaseServiceSupport { .exists(); } + public Multimap<String, ImportLog> indexImportLogByEntityId() { + List<ImportLog> importLogs = getImportLogs(); + Multimap<String, ImportLog> indexes = LinkedListMultimap.create(); + + for (ImportLog importLog : importLogs) { + String entityId = importLog.getEntityId(); + if (entityId == null) { + + Collection<ImportFile> importFiles = importLog.getImportFile(); + for (ImportFile importFile : importFiles) { + Iterable<ImportFileId> importFileIds = getImportFileIdsForImportFile(importFile); + + for (ImportFileId importFileId : importFileIds) { + String id = importFileId.getEntityId(); + indexes.put(id, importLog); + } + } + } else { + indexes.put(entityId, importLog); + } + } + + return indexes; + } + //------------------------------------------------------------------------// //--- AcousticInstrument -------------------------------------------------// //------------------------------------------------------------------------// diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java index 4867799..154fd2d 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/ImportDataService.java @@ -346,6 +346,7 @@ public class ImportDataService extends EchoBaseServiceSupport { // add result in log book and compute resume to show in result ImportLog importLog = importDataContext.getImportLog(); String importSummary = computeImportSummary(importLog); + importLog.setImportText(importSummary); String importType = getImportLabel(configuration); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java index 21792af..7e16fc1 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdata/configurations/MooringCommonsImportConfiguration.java @@ -39,7 +39,7 @@ public class MooringCommonsImportConfiguration extends MooringImportDataConfigur public MooringCommonsImportConfiguration(Locale locale) { mooringFile = InputFile.newFile(l(locale, "echobase.common.mooringFile")); - importType = ImportType.MOORING; + importType = ImportType.MOORING_COMMONS; } public InputFile getMooringFile() { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdb/strategy/FreeImportDbStrategy.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdb/strategy/FreeImportDbStrategy.java index fe64c1d..b48e2c4 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdb/strategy/FreeImportDbStrategy.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/importdb/strategy/FreeImportDbStrategy.java @@ -81,7 +81,7 @@ public class FreeImportDbStrategy extends AbstractImportDbStrategy { if (topiaId.startsWith(Voyage.class.getName())) { type = ImportType.VOYAGE; } else { - type = ImportType.MOORING; + type = ImportType.MOORING_COMMONS; } // create a importLog entry diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java index c4dfbb2..3ee2fb2 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/RemoveDataService.java @@ -293,7 +293,7 @@ public class RemoveDataService extends EchoBaseServiceSupport { strategies.put(ImportType.RESULT_MAP_FISH, ResultMapFishRemoveDataStrategy.class); strategies.put(ImportType.RESULT_MAP_OTHER, ResultMapOtherRemoveDataStrategy.class); strategies.put(ImportType.RESULT_REGION, ResultRegionRemoveDataStrategy.class); - strategies.put(ImportType.MOORING, MooringRemoveDataStrategy.class); + strategies.put(ImportType.MOORING_COMMONS, MooringRemoveDataStrategy.class); strategies.put(ImportType.MOORING_ACOUSTIC, MooringAcousticRemoveDataStrategy.class); strategies.put(ImportType.RESULT_MOORING, DummyMooringRemoveDataStrategy.class); strategies.put(ImportType.RESULT_MOORING_ESDU, DummyMooringRemoveDataStrategy.class); diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/MooringRemoveDataStrategy.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/MooringRemoveDataStrategy.java index 4a52c93..547b5eb 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/MooringRemoveDataStrategy.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/removedata/strategy/MooringRemoveDataStrategy.java @@ -33,7 +33,7 @@ import org.nuiton.topia.persistence.TopiaException; import java.util.Set; /** - * Remove a {@link ImportType#MOORING} import. + * Remove a {@link ImportType#MOORING_COMMONS} import. * * Can remove only {@link Mooring}. * diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java index cf51d35..6a1871a 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java @@ -136,17 +136,21 @@ public class GetEntities extends AbstractJSONPaginedAction { return SUCCESS; } - public String dashboardImportLogs() throws Exception { - entityType = EchoBaseUserEntityEnum.Voyage; - execute(); + public String dashboardVoyageImportLogs() throws Exception { + return dashboardImportLogs(EchoBaseUserEntityEnum.Voyage); + } + + public String dashboardMooringImportLogs() throws Exception { + return dashboardImportLogs(EchoBaseUserEntityEnum.Mooring); + } + public String dashboardImportLogs(EchoBaseUserEntityEnum type) throws Exception { + entityType = type; + execute(); - Decorator<ImportLog> importLogDecorator = decoratorService.getDecorator( - ImportLog.class, DecoratorService.DATE_ONLY); + Decorator<ImportLog> importLogDecorator = decoratorService.getDecorator(ImportLog.class, DecoratorService.DATE_ONLY); - Multimap<String, ImportLog> importLogsByEntity = Multimaps.index( - userDbPersistenceService.getImportLogs(), - ImportLogs.IMPORT_LOG_ENTITY_ID); + Multimap<String, ImportLog> importLogsByEntity = userDbPersistenceService.indexImportLogByEntityId(); for (Map row : datas) { @@ -164,8 +168,7 @@ public class GetEntities extends AbstractJSONPaginedAction { Multimap<ImportType, String> result = ArrayListMultimap.create(); for (ImportLog importLog : importLogs) { - String importLogToString = - importLogDecorator.toString(importLog); + String importLogToString = importLogDecorator.toString(importLog); String importId = importLog.getTopiaId(); imports.put(importId, importLogToString); result.put(importLog.getImportType(), importId); @@ -176,7 +179,6 @@ public class GetEntities extends AbstractJSONPaginedAction { row.put("importType." + importType.name(), result.get(importType)); } - } return SUCCESS; } diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/DashBoard.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/DashBoard.java index ad623c7..886bb6f 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/DashBoard.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/DashBoard.java @@ -22,6 +22,7 @@ package fr.ifremer.echobase.ui.actions.workingDb; */ import com.google.common.collect.Lists; +import fr.ifremer.echobase.entities.EchoBaseUserEntityEnum; import fr.ifremer.echobase.entities.ImportType; import fr.ifremer.echobase.ui.actions.EchoBaseActionSupport; @@ -38,23 +39,35 @@ public class DashBoard extends EchoBaseActionSupport { private static final long serialVersionUID = 1L; - protected List<ImportTypeEntry> importTypes; + protected List<ImportTypeEntry> importVoyageTypes; - public List<ImportTypeEntry> getImportTypes() { - return importTypes; + public List<ImportTypeEntry> getImportVoyageTypes() { + return importVoyageTypes; + } + + protected List<ImportTypeEntry> importMooringTypes; + + public List<ImportTypeEntry> getImportMooringTypes() { + return importMooringTypes; } @Override public String execute() throws Exception { + importVoyageTypes = Lists.newLinkedList(); + importMooringTypes = Lists.newLinkedList(); - importTypes = Lists.newLinkedList(); for (ImportType importType : ImportType.values()) { ImportTypeEntry entry = new ImportTypeEntry( importType.name(), t(importType.getShortI18nKey()), t(importType.getI18nKey()) ); - importTypes.add(entry); + + if (importType.getEntityType() == EchoBaseUserEntityEnum.Voyage) { + importVoyageTypes.add(entry); + } else { + importMooringTypes.add(entry); + } } return SUCCESS; } diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/GetImportLogDetail.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/GetImportLogDetail.java index 232d79d..9a18313 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/GetImportLogDetail.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/workingDb/GetImportLogDetail.java @@ -71,8 +71,11 @@ public class GetImportLogDetail extends EchoBaseActionSupport { data.put(ImportLog.PROPERTY_IMPORT_TYPE, importTypes.get(importType)); // decorate foreign keys - TopiaEntity entity = userDbPersistenceService.getEntity((String) data.get(ImportLog.PROPERTY_ENTITY_ID)); - decoratorService.decorateForeignKey(data, ImportLog.PROPERTY_ENTITY_ID, entity, null); + String id = (String) data.get(ImportLog.PROPERTY_ENTITY_ID); + if (id != null && !id.isEmpty()) { + TopiaEntity entity = userDbPersistenceService.getEntity(id); + decoratorService.decorateForeignKey(data, ImportLog.PROPERTY_ENTITY_ID, entity, null); + } // get import files Collection<ImportFile> importFiles = userDbPersistenceService.getImportFiles(importLogId); diff --git a/echobase-ui/src/main/resources/config/struts-workingDb.xml b/echobase-ui/src/main/resources/config/struts-workingDb.xml index 201af08..60d5979 100644 --- a/echobase-ui/src/main/resources/config/struts-workingDb.xml +++ b/echobase-ui/src/main/resources/config/struts-workingDb.xml @@ -155,7 +155,13 @@ </action> <!-- Get dashboard values --> - <action name="getDashboardImportLogs" method="dashboardImportLogs" + <action name="getDashboardVoyageImportLogs" method="dashboardVoyageImportLogs" + class="fr.ifremer.echobase.ui.actions.dbeditor.GetEntities"> + <interceptor-ref name="basicStackLogguedWithdb"/> + <result type="jsonWithPager"/> + + </action> + <action name="getDashboardMooringImportLogs" method="dashboardMooringImportLogs" class="fr.ifremer.echobase.ui.actions.dbeditor.GetEntities"> <interceptor-ref name="basicStackLogguedWithdb"/> <result type="jsonWithPager"/> diff --git a/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/dashboard.jsp b/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/dashboard.jsp index cf025c1..f9d674f 100644 --- a/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/dashboard.jsp +++ b/echobase-ui/src/main/webapp/WEB-INF/jsp/workingDb/dashboard.jsp @@ -158,8 +158,7 @@ </script> <title><s:text name="echobase.title.dashboard"/></title> -<s:url id="loadUrl" action="getDashboardImportLogs" namespace="/workingDb" - escapeAmp="false"/> +<s:url id="loadUrl" action="getDashboardVoyageImportLogs" namespace="/workingDb" escapeAmp="false"/> <sjg:grid id="voyages" dataType="json" href="%{loadUrl}" gridModel="datas" pager="true" pagerButtons="true" pagerInput="true" navigator="true" autowidth="true" rownumbers="false" viewrecords="true" @@ -174,7 +173,7 @@ <sjg:gridColumn name="name" sortable="true" formatter="formatVoyageName" title="%{getText('echobase.common.voyage')}"/> - <s:iterator value="%{importTypes}" var="entry"> + <s:iterator value="%{importVoyageTypes}" var="entry"> <sjg:gridColumn name="importType.%{#entry.name}" sortable="false" title="%{#entry.label}" tooltip="%{#entry.title}" formatter="formatImportLogs"/> @@ -182,6 +181,28 @@ </sjg:grid> <br/> +<s:url id="loadUrl" action="getDashboardMooringImportLogs" namespace="/workingDb" escapeAmp="false"/> +<sjg:grid id="moorings" dataType="json" href="%{loadUrl}" gridModel="datas" + pager="true" pagerButtons="true" pagerInput="true" navigator="true" + autowidth="true" rownumbers="false" viewrecords="true" + navigatorEdit="false" navigatorSearch="false" + navigatorDelete="false" + navigatorAdd="false" rowList="10,15,20,50,100,250,500" rowNum="10" + onSelectRowTopics="voyages-rowSelect" + onCellSelectTopics="voyages-rowSelect" + onCompleteTopics="voyages-clearSelect,voyages-CompleteTopics"> + + <sjg:gridColumn name="id" title="id" hidden="true"/> + <sjg:gridColumn name="name" sortable="true" formatter="formatVoyageName" + title="%{getText('echobase.common.mooring')}"/> + + <s:iterator value="%{importMooringTypes}" var="entry"> + <sjg:gridColumn name="importType.%{#entry.name}" sortable="false" + title="%{#entry.label}" tooltip="%{#entry.title}" + formatter="formatImportLogs"/> + </s:iterator> +</sjg:grid> +<br/> <fieldset> <legend><s:text name="echobase.title.voyage.detail"/></legend> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.