Author: bleny Date: 2014-03-25 15:18:40 +0100 (Tue, 25 Mar 2014) New Revision: 1745 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1745 Log: refs #4487 introduce contact filter api Added: trunk/wao-persistence/src/main/java/fr/ifremer/wao/ContactsFilter.java trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerContactsServiceTest.java Added: trunk/wao-persistence/src/main/java/fr/ifremer/wao/ContactsFilter.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/ContactsFilter.java (rev 0) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/ContactsFilter.java 2014-03-25 14:18:40 UTC (rev 1745) @@ -0,0 +1,227 @@ +package fr.ifremer.wao; + +import fr.ifremer.wao.entity.ContactState; +import fr.ifremer.wao.entity.DataReliability; +import fr.ifremer.wao.entity.ObservationType; +import fr.ifremer.wao.entity.ObservedDataControl; +import fr.ifremer.wao.entity.SamplingStrategy; + +import java.util.Date; +import java.util.Set; + +public class ContactsFilter { + + protected SampleRowsFilter sampleRowFilter; + + protected Date periodFrom; + + protected Date periodTo; + + protected Set<ContactState> contactStates; + + protected Set<DataReliability> dataReliabilities; + + protected Set<SamplingStrategy> actualSamplingStrategies; + + protected Set<ObservationType> observationTypes; + + protected Set<ObservedDataControl> observedDataControls; + + protected Set<String> observerIds; + + protected Set<String> terrestrialLocationIds; + + protected Set<String> contactStateMotiveIds; + + protected boolean mammalsCaptureOnly; + + protected boolean mammalsObservationOnly; + + protected boolean commentDefinedOnly; + + protected boolean commentAdminDefinedOnly; + + protected boolean commentCompanyDefinedOnly; + + protected Set<Boolean> companyAcceptations; + + protected Set<Boolean> programAcceptations; + + protected Set<Boolean> completeSamplings; + + protected boolean filterOnObservationBeginDate; + + protected boolean sortedByBoardingDate; + + public ContactsFilter() { + sampleRowFilter = new SampleRowsFilter(); + } + + public SampleRowsFilter getSampleRowFilter() { + return sampleRowFilter; + } + + public void setSampleRowFilter(SampleRowsFilter sampleRowFilter) { + this.sampleRowFilter = sampleRowFilter; + } + + public Date getPeriodFrom() { + return periodFrom; + } + + public void setPeriodFrom(Date periodFrom) { + this.periodFrom = periodFrom; + } + + public Date getPeriodTo() { + return periodTo; + } + + public void setPeriodTo(Date periodTo) { + this.periodTo = periodTo; + } + + public Set<ContactState> getContactStates() { + return contactStates; + } + + public void setContactStates(Set<ContactState> contactStates) { + this.contactStates = contactStates; + } + + public Set<DataReliability> getDataReliabilities() { + return dataReliabilities; + } + + public void setDataReliabilities(Set<DataReliability> dataReliabilities) { + this.dataReliabilities = dataReliabilities; + } + + public Set<SamplingStrategy> getActualSamplingStrategies() { + return actualSamplingStrategies; + } + + public void setActualSamplingStrategies(Set<SamplingStrategy> actualSamplingStrategies) { + this.actualSamplingStrategies = actualSamplingStrategies; + } + + public Set<ObservationType> getObservationTypes() { + return observationTypes; + } + + public void setObservationTypes(Set<ObservationType> observationTypes) { + this.observationTypes = observationTypes; + } + + public Set<ObservedDataControl> getObservedDataControls() { + return observedDataControls; + } + + public void setObservedDataControls(Set<ObservedDataControl> observedDataControls) { + this.observedDataControls = observedDataControls; + } + + public Set<String> getObserverIds() { + return observerIds; + } + + public void setObserverIds(Set<String> observerIds) { + this.observerIds = observerIds; + } + + public Set<String> getTerrestrialLocationIds() { + return terrestrialLocationIds; + } + + public void setTerrestrialLocationIds(Set<String> terrestrialLocationIds) { + this.terrestrialLocationIds = terrestrialLocationIds; + } + + public Set<String> getContactStateMotiveIds() { + return contactStateMotiveIds; + } + + public void setContactStateMotiveIds(Set<String> contactStateMotiveIds) { + this.contactStateMotiveIds = contactStateMotiveIds; + } + + public boolean isMammalsCaptureOnly() { + return mammalsCaptureOnly; + } + + public void setMammalsCaptureOnly(boolean mammalsCaptureOnly) { + this.mammalsCaptureOnly = mammalsCaptureOnly; + } + + public boolean isMammalsObservationOnly() { + return mammalsObservationOnly; + } + + public void setMammalsObservationOnly(boolean mammalsObservationOnly) { + this.mammalsObservationOnly = mammalsObservationOnly; + } + + public boolean isCommentDefinedOnly() { + return commentDefinedOnly; + } + + public void setCommentDefinedOnly(boolean commentDefinedOnly) { + this.commentDefinedOnly = commentDefinedOnly; + } + + public boolean isCommentAdminDefinedOnly() { + return commentAdminDefinedOnly; + } + + public void setCommentAdminDefinedOnly(boolean commentAdminDefinedOnly) { + this.commentAdminDefinedOnly = commentAdminDefinedOnly; + } + + public boolean isCommentCompanyDefinedOnly() { + return commentCompanyDefinedOnly; + } + + public void setCommentCompanyDefinedOnly(boolean commentCompanyDefinedOnly) { + this.commentCompanyDefinedOnly = commentCompanyDefinedOnly; + } + + public Set<Boolean> getCompanyAcceptations() { + return companyAcceptations; + } + + public void setCompanyAcceptations(Set<Boolean> companyAcceptations) { + this.companyAcceptations = companyAcceptations; + } + + public Set<Boolean> getProgramAcceptations() { + return programAcceptations; + } + + public void setProgramAcceptations(Set<Boolean> programAcceptations) { + this.programAcceptations = programAcceptations; + } + + public Set<Boolean> getCompleteSamplings() { + return completeSamplings; + } + + public void setCompleteSamplings(Set<Boolean> completeSamplings) { + this.completeSamplings = completeSamplings; + } + + public boolean isFilterOnObservationBeginDate() { + return filterOnObservationBeginDate; + } + + public void setFilterOnObservationBeginDate(boolean filterOnObservationBeginDate) { + this.filterOnObservationBeginDate = filterOnObservationBeginDate; + } + + public boolean isSortedByBoardingDate() { + return sortedByBoardingDate; + } + + public void setSortedByBoardingDate(boolean sortedByBoardingDate) { + this.sortedByBoardingDate = sortedByBoardingDate; + } +} Added: trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java =================================================================== --- trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java (rev 0) +++ trunk/wao-persistence/src/main/java/fr/ifremer/wao/entity/ContactTopiaDao.java 2014-03-25 14:18:40 UTC (rev 1745) @@ -0,0 +1,138 @@ +package fr.ifremer.wao.entity; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import fr.ifremer.wao.ContactsFilter; +import fr.ifremer.wao.WaoUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.HqlAndParametersBuilder; + +import java.util.Collection; +import java.util.List; + +public class ContactTopiaDao extends AbstractContactTopiaDao<Contact> { + + private static final Log log = LogFactory.getLog(ContactTopiaDao.class); + + public List<Contact> findAll(ContactsFilter filter) { + + HqlAndParametersBuilder<Contact> query = toSampleRowHqlAndParametersBuilder(filter); + + if (filter.isSortedByBoardingDate()) { + query.setOrderByArguments(Contact.PROPERTY_OBSERVATION_BEGIN_DATE); + } else { + query.setOrderByArguments(Contact.PROPERTY_CREATION_DATE); + } + + List<Contact> all = findAll(query.getHql(), query.getHqlParameters()); + + return all; + + } + + protected HqlAndParametersBuilder<Contact> toSampleRowHqlAndParametersBuilder(ContactsFilter filter) { + + HqlAndParametersBuilder<Contact> query = newHqlAndParametersBuilder(); + + query.setAlias("c"); + + SampleRowTopiaDao sampleRowTopiaDao = + topiaDaoSupplier.getDao(SampleRow.class, SampleRowTopiaDao.class); + HqlAndParametersBuilder<SampleRow> sampleRowsQuery = + sampleRowTopiaDao.toSampleRowHqlAndParametersBuilder( + filter.getSampleRowFilter() + ); + query.addWhereClause( + "c.sampleRow.topiaId in (select sr.topiaId " + sampleRowsQuery.getHql() + ")", + sampleRowsQuery.getHqlParameters()); + + String periodProperty; + if (filter.isFilterOnObservationBeginDate()) { + periodProperty = Contact.PROPERTY_OBSERVATION_BEGIN_DATE; + } else { + periodProperty = Contact.PROPERTY_CREATION_DATE; + } + + if (filter.getPeriodFrom() != null) { + query.addWhereClause("c." + periodProperty + " >= :periodFrom", ImmutableMap.of("periodFrom", (Object) filter.getPeriodFrom())); + } + + if (filter.getPeriodTo() != null) { + query.addWhereClause("c." + periodProperty + " <= :periodTo", ImmutableMap.of("periodTo", (Object) filter.getPeriodTo())); + } + + if (CollectionUtils.isNotEmpty(filter.getContactStates())) { + Collection<Integer> contactStateOrdinals = WaoUtils.toOrdinals(filter.getContactStates()); + query.addIn(Contact.PROPERTY_STATE, contactStateOrdinals); + } + + if (CollectionUtils.isNotEmpty(filter.getDataReliabilities())) { + Collection<Integer> dataReliabilityOrdinals = WaoUtils.toOrdinals(filter.getDataReliabilities()); + query.addIn(Contact.PROPERTY_DATA_RELIABILITY_ORDINAL, dataReliabilityOrdinals); + } + + if (CollectionUtils.isNotEmpty(filter.getActualSamplingStrategies())) { + Collection<Integer> actualSamplingStrategyOrdinals = WaoUtils.toOrdinals(filter.getActualSamplingStrategies()); + query.addIn(Contact.PROPERTY_SAMPLING_STRATEGY_ORDINAL, actualSamplingStrategyOrdinals); + } + + if (CollectionUtils.isNotEmpty(filter.getObservedDataControls())) { + query.addIn(Contact.PROPERTY_OBSERVED_DATA_CONTROL, filter.getObservedDataControls()); + } + + if (CollectionUtils.isNotEmpty(filter.getTerrestrialLocationIds())) { + query.addTopiaIdIn(Contact.PROPERTY_TERRESTRIAL_LOCATION, filter.getTerrestrialLocationIds()); + } + + if (CollectionUtils.isNotEmpty(filter.getContactStateMotiveIds())) { + query.addTopiaIdIn(Contact.PROPERTY_CONTACT_STATE_MOTIF, filter.getContactStateMotiveIds()); + } + + if (CollectionUtils.isNotEmpty(filter.getObserverIds())) { + String hql = "c.mainObserver.topiaId in (:observerIds) or c.topiaId in (select c2.topiaId from fr.ifremer.wao.entity.ContactImpl as c2 join c2.secondaryObservers as observer where observer.topiaId in (:observerIds))"; + query.addWhereClause(hql, ImmutableMap.of("observerIds", (Object) filter.getObserverIds())); + } + + if (filter.isMammalsObservationOnly()) { + query.addEquals(Contact.PROPERTY_MAMMALS_OBSERVATION, true); + } + + if (filter.isMammalsCaptureOnly()) { + query.addEquals(Contact.PROPERTY_MAMMALS_CAPTURE, true); + } + + if (filter.isCommentDefinedOnly()) { + query.addNotIn(Contact.PROPERTY_COMMENT, ImmutableSet.of("", null)); + } + + if (filter.isCommentCompanyDefinedOnly()) { + query.addNotIn(Contact.PROPERTY_COMMENT_COORDINATOR, ImmutableSet.of("", null)); + } + + if (filter.isCommentAdminDefinedOnly()) { + query.addNotIn(Contact.PROPERTY_COMMENT_ADMIN, ImmutableSet.of("", null)); + } + + if (CollectionUtils.isNotEmpty(filter.getCompanyAcceptations())) { + query.addIn(Contact.PROPERTY_VALIDATION_COMPANY, filter.getCompanyAcceptations()); + } + + if (CollectionUtils.isNotEmpty(filter.getProgramAcceptations())) { + query.addIn(Contact.PROPERTY_VALIDATION_PROGRAM, filter.getProgramAcceptations()); + } + + if (CollectionUtils.isNotEmpty(filter.getCompleteSamplings())) { + query.addIn(Contact.PROPERTY_COMPLETE_SAMPLING, filter.getCompleteSamplings()); + } + + if (log.isTraceEnabled()) { + log.trace("query to filter contacts " + query.getHql() + " " + query.getHqlParameters()); + } + + return query; + + } + +} Added: trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java =================================================================== --- trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java (rev 0) +++ trunk/wao-services/src/main/java/fr/ifremer/wao/services/service/ObsMerContactsService.java 2014-03-25 14:18:40 UTC (rev 1745) @@ -0,0 +1,70 @@ +package fr.ifremer.wao.services.service; + +import com.google.common.collect.ImmutableSet; +import fr.ifremer.wao.ContactsFilter; +import fr.ifremer.wao.entity.Boat; +import fr.ifremer.wao.entity.Contact; +import fr.ifremer.wao.services.AuthenticatedWaoUser; +import org.apache.commons.lang3.time.DateUtils; + +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +public class ObsMerContactsService extends WaoServiceSupport { + + public List<Contact> findAll(ContactsFilter filter) { + + List<Contact> all = getContactDao().findAll(filter); + + return all; + + } + + public ContactsFilter newContactFilter(AuthenticatedWaoUser authenticatedWaoUser) { + + ContactsFilter newContactsFilter = new ContactsFilter(); + + newContactsFilter.getSampleRowFilter().setObsProgram(authenticatedWaoUser.getObsProgram()); + + // DO NOT REMOVE THIS + if (authenticatedWaoUser.isCoordinatorOrObserver()) { + String authenticatedWaoUserCompanyTopiaId = authenticatedWaoUser.getWaoUser().getCompany().getTopiaId(); + newContactsFilter.getSampleRowFilter().setCompanyIds(ImmutableSet.of(authenticatedWaoUserCompanyTopiaId)); + } + + Calendar periodFromCalendar = Calendar.getInstance(); + periodFromCalendar.setTime(serviceContext.getNow()); + + // in the firsts months of a new year go from now to 6 months before + // in the rest of the year, just start at the beginning of the current year + if (periodFromCalendar.get(Calendar.MONTH) < 3) { + periodFromCalendar.add(Calendar.MONTH, -6); + } else { + periodFromCalendar.set(Calendar.DAY_OF_YEAR, 1); + } + + Date periodFrom = periodFromCalendar.getTime(); + Date periodTo = DateUtils.addYears(periodFromCalendar.getTime(), 1); + + newContactsFilter.setPeriodFrom(periodFrom); + newContactsFilter.setPeriodTo(periodTo); + + if (authenticatedWaoUser.isProfessional()) { + // Pour le profesionnel, on restreint d'office à la liste des contacts portant sur les bateaux qu'il peut voir + Collection<Boat> canReadBoats = authenticatedWaoUser.getWaoUser().getCanReadBoats(); +// FIXME brendan 25/03/14 +// if (CollectionUtils.isEmpty(canReadBoats)) { +// if (log.isWarnEnabled()) { +// log.warn("user " + connectedUser.getUser() + " is professional but can't read any boat"); +// } +// } else { +// newContactsFilter.getBoatFilter().setBoats(new ArrayList<Boat>(canReadBoats)); +// } + } + + return newContactsFilter; + + } +} Added: trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerContactsServiceTest.java =================================================================== --- trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerContactsServiceTest.java (rev 0) +++ trunk/wao-services/src/test/java/fr/ifremer/wao/services/service/ObsMerContactsServiceTest.java 2014-03-25 14:18:40 UTC (rev 1745) @@ -0,0 +1,34 @@ +package fr.ifremer.wao.services.service; + +import fr.ifremer.wao.ContactsFilter; +import fr.ifremer.wao.services.AbstractWaoServiceTest; +import fr.ifremer.wao.services.ObsMerFixtures; +import org.junit.Before; +import org.junit.Test; + +public class ObsMerContactsServiceTest extends AbstractWaoServiceTest { + + protected ObsMerContactsService service; + + protected ObsMerFixtures fixtures; + + @Before + public void setUp() { + service = newService(ObsMerContactsService.class); + fixtures = new ObsMerFixtures(newServiceContext()); + } + + protected boolean isDatabaseWithReferential() { + return true; + } + + @Test + public void testFindAll() { + + ContactsFilter filter = service.newContactFilter(fixtures.admin()); + + service.findAll(filter); + + } + +}