This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository wao. See http://git.codelutin.com/wao.git commit 26102edd13dd8548146f0583088d1b9e8155ffa4 Author: Brendan Le Ny <bleny@codelutin.com> Date: Mon Mar 2 18:20:30 2015 +0100 On revoit le calcul de la synthèse pour exprimer le prévisionnel, on introduit une nouvelle action pour le filtrage vu que les filtres doivent intégrer le planifé et pas seulement les contacts --- .../service/ContactsFilterValuesCacheKey.java | 3 +- .../services/service/SampleRowsFilterValues.java | 9 +- .../fr/ifremer/wao/services/service/Synthesis.java | 22 +++++ .../wao/services/service/SynthesisCacheKey.java | 49 +++++++++- .../wao/services/service/SynthesisService.java | 103 +++++++++++++++------ .../fr/ifremer/wao/web/action/SynthesisAction.java | 2 +- ...n.java => SynthesisFilterValuesJsonAction.java} | 65 ++++++------- .../src/main/webapp/WEB-INF/content/synthesis.jsp | 4 +- .../src/main/webapp/WEB-INF/decorators/layout.jsp | 2 + 9 files changed, 182 insertions(+), 77 deletions(-) diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java index afdf023..9b418dd 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/ContactsFilterValuesCacheKey.java @@ -82,8 +82,9 @@ public class ContactsFilterValuesCacheKey implements WaoCacheKey { @Override public String toString() { return ReflectionToStringBuilder.reflectionToString(this); - } @Override + } + @Override public ContactsFilterValuesCacheKey clone() { ContactsFilter contactsFilterClone = this.contactsFilter.clone(); ContactsFilterValuesCacheKey clone = new ContactsFilterValuesCacheKey(locale, obsProgram, optionalCompanyId, contactsFilterClone); diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java index 74b8ae8..3bdfe6c 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/SampleRowsFilterValues.java @@ -30,6 +30,7 @@ import fr.ifremer.wao.entity.Organisation; import fr.ifremer.wao.entity.SampleRow; import fr.ifremer.wao.entity.TargetSpeciesDcf; import fr.ifremer.wao.entity.TerrestrialLocation; +import org.apache.commons.lang3.StringUtils; import java.util.Locale; import java.util.SortedSet; @@ -110,9 +111,11 @@ public class SampleRowsFilterValues extends AbstractFilterValues { } sampleRowCodes.add(FilterOption.forString(sampleRow.getCode())); - if ( ! fromBoatFilter) { - // XXX brendan 07/07/14 dans le calcul des filter values, on évite tout ça pour les perfs - programNames.add(FilterOption.forString(sampleRow.getProgramName())); + if ( ! fromBoatFilter) { // XXX brendan 07/07/14 dans le calcul des filter values, on évite tout ça pour les perfs + + if (StringUtils.isNotBlank(sampleRow.getProgramName())) { + programNames.add(FilterOption.forString(sampleRow.getProgramName())); + } Organisation organisation = sampleRow.getOrganisation(); if (organisation != null) { diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/Synthesis.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/Synthesis.java index b0e0c2d..5de6ccd 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/Synthesis.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/Synthesis.java @@ -22,8 +22,10 @@ package fr.ifremer.wao.services.service; */ import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.ContactState; import org.jfree.chart.JFreeChart; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -53,6 +55,8 @@ public class Synthesis { protected Set<String> sampleRowIds = new HashSet<>(); + protected ContactsFilterValues contactsFilterValues; + public Map<String, CompanySynthesis> getCompanySyntheses() { return companySyntheses; } @@ -162,4 +166,22 @@ public class Synthesis { public boolean isEmpty() { return sampleRowIds.isEmpty(); } + + public void setContactsFilterValues(ContactsFilterValues contactsFilterValues) { + this.contactsFilterValues = contactsFilterValues; + } + + public ContactsFilterValues getContactsFilterValues() { + return contactsFilterValues; + } + + public Set<ContactState> getContactStates() { + Set<ContactState> contactStates = Collections.emptySet(); + if ( ! companySyntheses.isEmpty()) { + CompanySynthesis aCompanySynthesis = companySyntheses.values().iterator().next(); + contactStates = aCompanySynthesis.getContactsStatesStatistics().keySet(); + } + return contactStates; + } + } diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisCacheKey.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisCacheKey.java index 9118035..accc657 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisCacheKey.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisCacheKey.java @@ -22,13 +22,27 @@ package fr.ifremer.wao.services.service; */ import com.google.common.base.Objects; +import com.google.common.base.Optional; import fr.ifremer.wao.ContactsFilter; +import fr.ifremer.wao.entity.ObsProgram; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + +import java.util.Locale; public class SynthesisCacheKey implements WaoCacheKey { + protected Locale locale; + + protected ObsProgram obsProgram; + + protected Optional<String> optionalCompanyId; + protected ContactsFilter contactsFilter; - public SynthesisCacheKey(ContactsFilter contactsFilter) { + public SynthesisCacheKey(Locale locale, ObsProgram obsProgram, Optional<String> optionalCompanyId, ContactsFilter contactsFilter) { + this.locale = locale; + this.obsProgram = obsProgram; + this.optionalCompanyId = optionalCompanyId; this.contactsFilter = contactsFilter; } @@ -37,18 +51,43 @@ public class SynthesisCacheKey implements WaoCacheKey { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SynthesisCacheKey that = (SynthesisCacheKey) o; - boolean equals = Objects.equal(contactsFilter, that.contactsFilter); + boolean equals = Objects.equal(locale, that.locale) + && Objects.equal(optionalCompanyId, that.optionalCompanyId) + && Objects.equal(obsProgram, that.obsProgram) + && Objects.equal(contactsFilter, that.contactsFilter); return equals; } @Override public int hashCode() { - return Objects.hashCode(contactsFilter); + return Objects.hashCode(locale, optionalCompanyId, obsProgram, contactsFilter); + } + + public Locale getLocale() { + return locale; + } + + public ObsProgram getObsProgram() { + return obsProgram; + } + + public Optional<String> getOptionalCompanyId() { + return optionalCompanyId; + } + + public ContactsFilter getContactsFilter() { + return contactsFilter; } @Override - protected SynthesisCacheKey clone() { - return new SynthesisCacheKey(contactsFilter.clone()); + public String toString() { + return ReflectionToStringBuilder.reflectionToString(this); } + @Override + public SynthesisCacheKey clone() { + ContactsFilter contactsFilterClone = this.contactsFilter.clone(); + SynthesisCacheKey clone = new SynthesisCacheKey(locale, obsProgram, optionalCompanyId, contactsFilterClone); + return clone; + } } diff --git a/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java b/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java index b31e032..e48744b 100644 --- a/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java +++ b/wao-services/src/main/java/fr/ifremer/wao/services/service/SynthesisService.java @@ -22,6 +22,7 @@ package fr.ifremer.wao.services.service; */ import com.google.common.base.MoreObjects; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.cache.Cache; import com.google.common.collect.ImmutableMap; @@ -87,50 +88,95 @@ public class SynthesisService extends WaoServiceSupport { } - public Synthesis getSynthesis(ContactsFilter filter) { + public Synthesis getSynthesis(AuthenticatedWaoUser authenticatedWaoUser, ContactsFilter filter) { - ObsProgram obsProgram = filter.getSampleRowFilter().getObsProgram(); + Locale locale = serviceContext.getLocale(); + ObsProgram obsProgram = authenticatedWaoUser.getObsProgram(); - Cache<SynthesisCacheKey, Synthesis> cache = serviceContext.getSynthesesCache(); + Optional<String> optionalCompanyId = Optional.absent(); + if (authenticatedWaoUser.isCoordinatorOrObserver()) { + optionalCompanyId = Optional.of(authenticatedWaoUser.getCompany().getTopiaId()); + } + + SynthesisCacheKey cacheKey = + new SynthesisCacheKey(locale, obsProgram, optionalCompanyId, filter); + + Synthesis synthesis = getSynthesis(cacheKey); + + return synthesis; - SynthesisCacheKey synthesisCacheKey = new SynthesisCacheKey(filter); + } + + protected Synthesis getSynthesis(SynthesisCacheKey synthesisCacheKey) { + + Cache<SynthesisCacheKey, Synthesis> cache = serviceContext.getSynthesesCache(); Synthesis synthesis = cache.getIfPresent(synthesisCacheKey); if (synthesis == null) { + SynthesisCacheKey synthesisCacheKeyClone = synthesisCacheKey.clone(); + synthesis = computeSynthesis(synthesisCacheKey); + cache.put(synthesisCacheKeyClone, synthesis); + } + + return synthesis; - ContactTopiaDao dao = getContactDao(); + } - synthesis = new Synthesis(); + protected Synthesis computeSynthesis(SynthesisCacheKey synthesisCacheKey) { - filter.setFilterOnObservationBeginDate(true); - synthesis.getSampleRowIds().addAll(dao.getSampleRowsIds(filter)); + ObsProgram obsProgram = synthesisCacheKey.getObsProgram(); + ContactsFilter contactsFilter = synthesisCacheKey.getContactsFilter(); + Locale locale = synthesisCacheKey.getLocale(); + Optional<String> optionalCompanyId = synthesisCacheKey.getOptionalCompanyId(); - setExpectedVsActualBarChartDatas(synthesis, filter); - if (obsProgram.isObsMer()) { - setComplianceBoardingIndicator(synthesis, filter); - setDataReliability(synthesis, filter); - } - if (obsProgram.isObsMer() || obsProgram.isObsVente()) { - setBoardingBoatsData(synthesis, filter); - setDataInputDateReactivity(synthesis, filter); - filter.setFilterOnObservationBeginDate(false); - synthesis.getSampleRowIds().addAll(dao.getSampleRowsIds(filter)); - setContactStatesStatistics(synthesis, filter); - } + Synthesis synthesis = new Synthesis(); - for (CompanySynthesis companySynthesis : synthesis.getCompanySyntheses().values()) { - String companyId = companySynthesis.getCompanyId(); - Company company = getCompanyDao().forTopiaIdEquals(companyId).findUnique(); - companySynthesis.setCompanyName(company.getName()); - } + // on calcule d'abord le filterValues + SampleRowsFilter sampleRowFilterClone = contactsFilter.getSampleRowFilter().clone(); + sampleRowFilterClone.setPeriodFrom(contactsFilter.getPeriodFrom()); + sampleRowFilterClone.setPeriodTo(contactsFilter.getPeriodTo()); + Collection<SampleRow> sampleRows = getSampleRowDao().findAll(sampleRowFilterClone); - cache.put(synthesisCacheKey.clone(), synthesis); + ContactsFilterValues contactsFilterValues = + new ContactsFilterValues(locale, obsProgram, optionalCompanyId); + synthesis.setContactsFilterValues(contactsFilterValues); + for (SampleRow sampleRow : sampleRows) { + String sampleRowId = sampleRow.getTopiaId(); + synthesis.getSampleRowIds().add(sampleRowId); + contactsFilterValues.getSampleRowsFilterValues().addSampleRow(sampleRow); + } + + // on travaille toujours sur un filtrage par date d'observation (sauf pour le tableau de l'état des contacts) + contactsFilter.setFilterOnObservationBeginDate(true); + List<Contact> contacts = getContactDao().forFilter(contactsFilter, false).findAll(); + for (Contact contact : contacts) { + contactsFilterValues.addContact(contact); } - return synthesis; + // puis la synthèse elle-même + setExpectedVsActualBarChartDatas(synthesis, contactsFilter, sampleRows); + if (obsProgram.isObsMer()) { + setComplianceBoardingIndicator(synthesis, contactsFilter); + setDataReliability(synthesis, contactsFilter); + } + if (obsProgram.isObsMer() || obsProgram.isObsVente()) { + setBoardingBoatsData(synthesis, contactsFilter); + setDataInputDateReactivity(synthesis, contactsFilter); + + // attention pour le tableau de l'état des contacts en particulier on passe en filtrage selon la date de création + contactsFilter.setFilterOnObservationBeginDate(false); + setContactStatesStatistics(synthesis, contactsFilter); + } + for (CompanySynthesis companySynthesis : synthesis.getCompanySyntheses().values()) { + String companyId = companySynthesis.getCompanyId(); + Company company = getCompanyDao().forTopiaIdEquals(companyId).findUnique(); + companySynthesis.setCompanyName(company.getName()); + } + + return synthesis; } protected void setDataReliability(Synthesis synthesis, ContactsFilter filter) { @@ -219,7 +265,7 @@ public class SynthesisService extends WaoServiceSupport { * Un graphique avec, pour chaque mois, deux barres qui représentent l'effort demandé * vs l'effort réalisé. */ - protected void setExpectedVsActualBarChartDatas(Synthesis synthesis, ContactsFilter filter) { + protected void setExpectedVsActualBarChartDatas(Synthesis synthesis, ContactsFilter filter, Collection<SampleRow> sampleRows) { Preconditions.checkArgument(filter.isFilterOnObservationBeginDate()); @@ -229,7 +275,6 @@ public class SynthesisService extends WaoServiceSupport { Locale locale = serviceContext.getLocale(); Date periodFrom = filter.getPeriodFrom(); Date periodTo = filter.getPeriodTo(); - Collection<SampleRow> sampleRows = getSampleRowDao().findAll(sampleRowFilter); Collection<Contact> contacts = getContactDao().getContactsWithObservationDoneState(filter); boolean realVsEstimated = filter.getRealVsEstimated(); diff --git a/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java b/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java index 09db78d..ee7adac 100644 --- a/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java +++ b/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java @@ -87,7 +87,7 @@ public class SynthesisAction extends WaoJspActionSupport implements Preparable { getSession().setSynthesisFilter(filter); - synthesis = service.getSynthesis(filter); + synthesis = service.getSynthesis(getSession().getAuthenticatedWaoUser(), filter); return SUCCESS; } diff --git a/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java b/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisFilterValuesJsonAction.java similarity index 53% copy from wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java copy to wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisFilterValuesJsonAction.java index 09db78d..6f0d8d7 100644 --- a/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisAction.java +++ b/wao-web/src/main/java/fr/ifremer/wao/web/action/SynthesisFilterValuesJsonAction.java @@ -21,26 +21,38 @@ package fr.ifremer.wao.web.action; * #L% */ -import com.google.common.base.MoreObjects; import com.opensymphony.xwork2.Preparable; import fr.ifremer.wao.ContactsFilter; -import fr.ifremer.wao.services.service.Synthesis; +import fr.ifremer.wao.services.service.ContactsFilterValues; import fr.ifremer.wao.services.service.SynthesisService; -import fr.ifremer.wao.web.WaoJspActionSupport; -import org.nuiton.i18n.I18n; +import fr.ifremer.wao.web.WaoJsonActionSupport; +import org.apache.commons.lang3.StringUtils; -public class SynthesisAction extends WaoJspActionSupport implements Preparable { +/** + * Action pour récupérer les valeurs dans les filtres de l'écran synthèse. + * + * @since 5.1 + */ +public class SynthesisFilterValuesJsonAction extends WaoJsonActionSupport implements Preparable { + + private static final long serialVersionUID = 1L; + + protected transient SynthesisService service; protected ContactsFilter filter; - protected SynthesisService service; + protected ContactsFilterValues filterValues; - protected Synthesis synthesis; + protected String filterValuesField; public void setService(SynthesisService service) { this.service = service; } + public void setFilterValuesField(String filterValuesField) { + this.filterValuesField = filterValuesField; + } + public ContactsFilter getFilter() { if (filter == null) { prepare(); @@ -51,48 +63,29 @@ public class SynthesisAction extends WaoJspActionSupport implements Preparable { @Override public void prepare() { - if (filter == null) { - filter = service.newFilter(getAuthenticatedWaoUser()); - } - - } - - @Override - public void validate() { - - if (filter.getPeriodFrom() != null && filter.getPeriodTo() != null && filter.getPeriodTo().before(filter.getPeriodFrom())) { - addFieldError("filter.periodTo", I18n.l(getLocale(), "wao.ui.periodToMustBeAfterPeriodFrom")); - } + filter = service.newFilter(session.getAuthenticatedWaoUser()); } @Override public String execute() { - filter = MoreObjects.firstNonNull(session.getSynthesisFilter(), filter); + filterValues = service.getSynthesis(session.getAuthenticatedWaoUser(), filter).getContactsFilterValues(); - return applyFilter(); + if (StringUtils.isNotBlank(filterValuesField)) { - } + // le client ne demande qu'un seul champ, on peut éviter de retourner l'objet complet - public String resetFilter() { + filterValues = filterValues.getCopyWithSingleProperty(filterValuesField); - filter = service.newFilter(getAuthenticatedWaoUser()); + } - return applyFilter(); + return SUCCESS; } - public String applyFilter() { - - getSession().setSynthesisFilter(filter); - - synthesis = service.getSynthesis(filter); - - return SUCCESS; + public ContactsFilterValues getFilterValues() { + return filterValues; } - public Synthesis getSynthesis() { - return synthesis; - } -} +} \ No newline at end of file diff --git a/wao-web/src/main/webapp/WEB-INF/content/synthesis.jsp b/wao-web/src/main/webapp/WEB-INF/content/synthesis.jsp index f6e23b3..fa34a77 100644 --- a/wao-web/src/main/webapp/WEB-INF/content/synthesis.jsp +++ b/wao-web/src/main/webapp/WEB-INF/content/synthesis.jsp @@ -149,7 +149,7 @@ filter = <s:property value="filter" escapeHtml="false"/>; - contactsFilterController2 = new FilterController2(contactsFilterMappings, filter, WAO.CONTACTS_FILTER_VALUES_JSON_URL, $('#synthesis-filters-form fieldset.extra-filters')); + contactsFilterController2 = new FilterController2(contactsFilterMappings, filter, WAO.SYNTHESIS_FILTER_VALUES_JSON_URL, $('#synthesis-filters-form fieldset.extra-filters')); contactsFilterController2.init(); }); @@ -312,7 +312,7 @@ <th> <s:text name="wao.ui.entity.Company"/> </th> - <s:iterator value="synthesis.companySynthesesOrderedByName.iterator.next().contactsStatesStatistics.keySet()" var="contactState"> + <s:iterator value="synthesis.contactStates" var="contactState"> <th> <s:text name="%{#contactState.getI18nKey(obsProgram)}"/> </th> diff --git a/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp b/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp index 275b2dd..c8ab0d3 100644 --- a/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp +++ b/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp @@ -88,6 +88,8 @@ WAO.CONTACTS_FILTER_VALUES_JSON_URL = '<s:url namespace="/" action="contacts-filter-values-json"/>'; + WAO.SYNTHESIS_FILTER_VALUES_JSON_URL = '<s:url namespace="/" action="synthesis-filter-values-json"/>'; + // fragments WAO.BOAT_DETAILS_URL = '<s:url namespace="/" action="boat-details"/>'; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.