This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git commit 7440c251e020ab8d97ad31fbf8699e397952d44c Author: Yannick Martel <martel@©odelutin.com> Date: Wed Dec 23 17:44:41 2015 +0100 refs-40 #7858 Revue coté service de la recherche avancée de projet/questions --- .../coselmar/beans/DocumentSearchExample.java | 24 +++++ .../ifremer/coselmar/beans/QuestionSearchBean.java | 59 ----------- .../coselmar/beans/QuestionSearchExample.java | 110 +++++++++++++++++++++ .../fr/ifremer/coselmar/beans/SearchExample.java | 20 +++- .../persistence/entity/QuestionTopiaDao.java | 77 +++++++++++---- .../ifremer/coselmar/beans/QuestionSearchBean.java | 105 ++++++++++++++++++++ .../coselmar/converter/BeanEntityConverter.java | 58 +++++++++++ .../services/CoselmarRestApplicationListener.java | 4 +- .../indexation/QuestionsIndexationService.java | 1 + .../indexation/TransverseIndexationService.java | 13 --- .../coselmar/services/v1/DocumentsWebService.java | 28 +++--- .../coselmar/services/v1/HealthService.java | 1 + .../coselmar/services/v1/QuestionsWebService.java | 67 ++++++++----- .../coselmar/services/QuestionsWebServiceTest.java | 2 +- 14 files changed, 436 insertions(+), 133 deletions(-) diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/DocumentSearchExample.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/DocumentSearchExample.java index d63ac3b..2b8c463 100644 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/DocumentSearchExample.java +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/DocumentSearchExample.java @@ -36,6 +36,8 @@ public class DocumentSearchExample extends SearchExample<Document> { DocumentSearchExample searchExample = new DocumentSearchExample(); searchExample.setPage(DEFAULT_PAGE); searchExample.setLimit(DEFAULT_PAGE_SIZE); + searchExample.setOrderClause(Document.PROPERTY_DEPOSIT_DATE); + searchExample.setOrderDesc(true); return searchExample; } @@ -49,6 +51,10 @@ public class DocumentSearchExample extends SearchExample<Document> { protected String ownerName; + protected String orderClause; + + protected boolean orderDesc; + public Date getPublicationAfterDate() { return publicationAfterDate; } @@ -88,4 +94,22 @@ public class DocumentSearchExample extends SearchExample<Document> { public void setOwnerName(String ownerName) { this.ownerName = ownerName; } + + @Override + public String getOrderClause() { + return orderClause; + } + + public void setOrderClause(String orderClause) { + this.orderClause = orderClause; + } + + @Override + public boolean isOrderDesc() { + return orderDesc; + } + + public void setOrderDesc(boolean orderDesc) { + this.orderDesc = orderDesc; + } } diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchBean.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchBean.java deleted file mode 100644 index 656fb3e..0000000 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchBean.java +++ /dev/null @@ -1,59 +0,0 @@ -package fr.ifremer.coselmar.beans; - -/* - * #%L - * Coselmar :: Persistence - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2014 - 2015 Ifremer, Code Lutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import fr.ifremer.coselmar.persistence.entity.Question; - -import java.io.Serializable; -import java.util.List; - -/** - * @author ymartel <martel@codelutin.com> - */ -public class QuestionSearchBean extends SearchExample<Question> { - - private static final long serialVersionUID = -3318003570685481073L; - - protected String status; - protected String privacy; - - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public String getPrivacy() { - return privacy; - } - - public void setPrivacy(String privacy) { - this.privacy = privacy; - } - -} diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchExample.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchExample.java new file mode 100644 index 0000000..3ac3c15 --- /dev/null +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchExample.java @@ -0,0 +1,110 @@ +package fr.ifremer.coselmar.beans; + +/* + * #%L + * Coselmar :: Persistence + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2014 - 2015 Ifremer, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ifremer.coselmar.persistence.entity.Question; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author ymartel <martel@codelutin.com> + */ +public class QuestionSearchExample extends SearchExample<Question> { + + private static final long serialVersionUID = -3318003570685481073L; + + public static final QuestionSearchExample newDefaultSearchExample() { + QuestionSearchExample searchExample = new QuestionSearchExample(); + searchExample.setPage(DEFAULT_PAGE); + searchExample.setLimit(DEFAULT_PAGE_SIZE); + searchExample.setOrderClause(Question.PROPERTY_SUBMISSION_DATE); + searchExample.setOrderDesc(true); + return searchExample; + } + + protected Date submissionAfterDate; + + protected Date submissionBeforeDate; + + protected Date deadlineAfterDate; + + protected Date deadlineBeforeDate; + + protected String orderClause; + + protected boolean orderDesc; + + public Date getSubmissionAfterDate() { + return submissionAfterDate; + } + + public void setSubmissionAfterDate(Date submissionAfterDate) { + this.submissionAfterDate = submissionAfterDate; + } + + public Date getSubmissionBeforeDate() { + return submissionBeforeDate; + } + + public void setSubmissionBeforeDate(Date submissionBeforeDate) { + this.submissionBeforeDate = submissionBeforeDate; + } + + public Date getDeadlineAfterDate() { + return deadlineAfterDate; + } + + public void setDeadlineAfterDate(Date deadlineAfterDate) { + this.deadlineAfterDate = deadlineAfterDate; + } + + public Date getDeadlineBeforeDate() { + return deadlineBeforeDate; + } + + public void setDeadlineBeforeDate(Date deadlineBeforeDate) { + this.deadlineBeforeDate = deadlineBeforeDate; + } + + @Override + public String getOrderClause() { + return orderClause; + } + + public void setOrderClause(String orderClause) { + this.orderClause = orderClause; + } + + @Override + public boolean isOrderDesc() { + return orderDesc; + } + + public void setOrderDesc(boolean orderDesc) { + this.orderDesc = orderDesc; + } +} diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/SearchExample.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/SearchExample.java index 029767f..376d2e6 100644 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/SearchExample.java +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/beans/SearchExample.java @@ -22,7 +22,9 @@ package fr.ifremer.coselmar.beans; * #L% */ +import fr.ifremer.coselmar.persistence.entity.Question; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.pagination.PaginationParameter; import java.io.Serializable; import java.util.List; @@ -30,13 +32,26 @@ import java.util.List; /** * @author ymartel (martel@codelutin.com) */ -public class SearchExample<E extends TopiaEntity> implements Serializable { +public abstract class SearchExample<E extends TopiaEntity> implements Serializable { private static final long serialVersionUID = 4024861043438299258L; public static final int DEFAULT_PAGE_SIZE = -1; public static final int DEFAULT_PAGE = 0; + public PaginationParameter getPaginationParameter() { + + PaginationParameter paginationParameter = null; + if (this.limit != null) { + int wantedPage = this.page != null ? this.page.intValue() : 0; + paginationParameter = PaginationParameter.of(wantedPage, this.limit.intValue(), getOrderClause(), isOrderDesc()); + } else { + paginationParameter = PaginationParameter.of(DEFAULT_PAGE, DEFAULT_PAGE_SIZE, getOrderClause(), isOrderDesc()); + } + + return paginationParameter; + } + protected E example; protected List<String> fullTextSearch; @@ -84,4 +99,7 @@ public class SearchExample<E extends TopiaEntity> implements Serializable { this.page = page; } } + + public abstract String getOrderClause(); + public abstract boolean isOrderDesc(); } diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java index 9983f18..b23f1e3 100644 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java @@ -28,7 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import fr.ifremer.coselmar.beans.QuestionSearchBean; +import fr.ifremer.coselmar.beans.QuestionSearchExample; import fr.ifremer.coselmar.persistence.DaoUtils; import org.apache.commons.lang3.StringUtils; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; @@ -36,7 +36,7 @@ import org.nuiton.util.pagination.PaginationParameter; public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { - public List<Question> findForExpert(CoselmarUser expert, QuestionSearchBean searchBean, PaginationParameter page) { + public List<Question> findForExpert(CoselmarUser expert, QuestionSearchExample questionSearchExample, PaginationParameter page) { StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q " + " INNER JOIN Q." + Question.PROPERTY_PARTICIPANTS + " CUG "); @@ -58,7 +58,7 @@ public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { hqlBuilder.append(clientCondition + ") )"); - String finerHql = refineSearch(searchBean, "Q", args); + String finerHql = refineSearch(questionSearchExample, "Q", args); hqlBuilder.append(" AND (" + finerHql + ")" ); @@ -135,7 +135,7 @@ public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { return questions; } - public List<Question> findForClient(CoselmarUser client, QuestionSearchBean searchBean, PaginationParameter page) { + public List<Question> findForClient(CoselmarUser client, QuestionSearchExample searchExample, PaginationParameter page) { StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q "); @@ -145,8 +145,8 @@ public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { hqlBuilder.append(" WHERE 1=1 AND (" + clientCondition + " ) "); - if (searchBean != null) { - String finerHql = refineSearch(searchBean, "Q", args); + if (searchExample != null) { + String finerHql = refineSearch(searchExample, "Q", args); hqlBuilder.append(" AND (" + finerHql + ")" ); } @@ -175,14 +175,14 @@ public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { return questions; } - public List<Question> findWithSearchBean(QuestionSearchBean searchBean, PaginationParameter page) { + public List<Question> findWithSearchExample(QuestionSearchExample searchExample, PaginationParameter page) { StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q "); Map<String, Object> args = new HashMap<>(); - if (searchBean != null) { - String finerHql = refineSearch(searchBean, "Q", args); + if (searchExample != null) { + String finerHql = refineSearch(searchExample, "Q", args); hqlBuilder.append(" WHERE (" + finerHql + ")" ); } @@ -219,25 +219,62 @@ public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { return values; } - public String refineSearch(QuestionSearchBean searchBean, String alias, Map args) { + public String refineSearch(QuestionSearchExample searchExample, String alias, Map args) { StringBuilder finerHqlBuilder = new StringBuilder(" 1=1 "); - String privacy = searchBean.getPrivacy(); + Question example = searchExample.getExample(); - if (StringUtils.isNotBlank(privacy)) { - String privacyHql = DaoUtils.andAttributeEquals(alias, Question.PROPERTY_PRIVACY, args, Privacy.valueOf(privacy.toUpperCase())); - finerHqlBuilder.append(privacyHql); - } + if (example != null) { + + Privacy privacy = example.getPrivacy(); + if (privacy != null) { + String privacyHql = DaoUtils.andAttributeEquals(alias, Question.PROPERTY_PRIVACY, args, privacy); + finerHqlBuilder.append(privacyHql); + } + + Status status = example.getStatus(); + if (status != null) { + String statusHql = DaoUtils.andAttributeEquals(alias, Question.PROPERTY_STATUS, args, status); + finerHqlBuilder.append(statusHql); + } + + if (StringUtils.isNotBlank(example.getTitle())) { + String titleHql = DaoUtils.andAttributeEquals(alias, Question.PROPERTY_TITLE, args, example.getTitle()); + finerHqlBuilder.append(titleHql); + } + + if (example.getTheme() != null && !example.getTheme().isEmpty()) { + for (String keyword : example.getTheme()) { + String themesCondition = DaoUtils.andAttributeContains(alias, Question.PROPERTY_THEME, args, keyword); + finerHqlBuilder.append(themesCondition); + } + } + + // Manage date range + if (searchExample.getSubmissionBeforeDate() != null) { + String submissionDateConditionBefore = DaoUtils.andAttributeLesserOrEquals(alias, Question.PROPERTY_SUBMISSION_DATE, args, searchExample.getSubmissionBeforeDate()); + finerHqlBuilder.append(submissionDateConditionBefore); + } + + if (searchExample.getSubmissionAfterDate() != null) { + String submissionDateConditionAfter = DaoUtils.andAttributeGreaterOrEquals(alias, Question.PROPERTY_SUBMISSION_DATE, args, searchExample.getSubmissionAfterDate()); + finerHqlBuilder.append(submissionDateConditionAfter); + } + + if (searchExample.getDeadlineBeforeDate() != null) { + String deadlineConditionBefore = DaoUtils.andAttributeLesserOrEquals(alias, Question.PROPERTY_DEADLINE, args, searchExample.getDeadlineBeforeDate()); + finerHqlBuilder.append(deadlineConditionBefore); + } - String status = searchBean.getStatus(); + if (searchExample.getDeadlineAfterDate() != null) { + String deadlineDateConditionAfter = DaoUtils.andAttributeGreaterOrEquals(alias, Question.PROPERTY_DEADLINE, args, searchExample.getDeadlineAfterDate()); + finerHqlBuilder.append(deadlineDateConditionAfter); + } - if (StringUtils.isNotBlank(status)) { - String statusHql = DaoUtils.andAttributeEquals(alias, Question.PROPERTY_STATUS, args, Status.valueOf(status.toUpperCase())); - finerHqlBuilder.append(statusHql); } - List<String> keywords = searchBean.getFullTextSearch(); + List<String> keywords = searchExample.getFullTextSearch(); if (keywords != null && !keywords.isEmpty()) { // should be like : """ ( (1=1) // AND ( 1=0 OR title like keyword1 OR summary like keyword1 OR theme contains keyword1 ) diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchBean.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchBean.java new file mode 100644 index 0000000..3ef65bd --- /dev/null +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/QuestionSearchBean.java @@ -0,0 +1,105 @@ +package fr.ifremer.coselmar.beans; + +/* + * #%L + * Coselmar :: Rest Services + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2014 Ifremer, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * @author ymartel <martel@codelutin.com> + */ +public class QuestionSearchBean extends QuestionBean { + + private static final long serialVersionUID = -2665085000774964576L; + + protected Integer limit; + protected Integer page; + protected List<String> fullTextSearch; + + protected Date submissionAfterDate; + + protected Date submissionBeforeDate; + + protected Date deadlineAfterDate; + + protected Date deadlineBeforeDate; + + public Integer getLimit() { + return limit; + } + + public void setLimit(Integer limit) { + this.limit = limit; + } + + public Integer getPage() { + return page; + } + + public void setPage(Integer page) { + this.page = page; + } + + public List<String> getFullTextSearch() { + return fullTextSearch; + } + + public void setFullTextSearch(List<String> fullTextSearch) { + this.fullTextSearch = fullTextSearch; + } + + public Date getSubmissionAfterDate() { + return submissionAfterDate; + } + + public void setSubmissionAfterDate(Date submissionAfterDate) { + this.submissionAfterDate = submissionAfterDate; + } + + public Date getSubmissionBeforeDate() { + return submissionBeforeDate; + } + + public void setSubmissionBeforeDate(Date submissionBeforeDate) { + this.submissionBeforeDate = submissionBeforeDate; + } + + public Date getDeadlineAfterDate() { + return deadlineAfterDate; + } + + public void setDeadlineAfterDate(Date deadlineAfterDate) { + this.deadlineAfterDate = deadlineAfterDate; + } + + public Date getDeadlineBeforeDate() { + return deadlineBeforeDate; + } + + public void setDeadlineBeforeDate(Date deadlineBeforeDate) { + this.deadlineBeforeDate = deadlineBeforeDate; + } +} diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java index 25914fe..e7ca0b2 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/converter/BeanEntityConverter.java @@ -31,6 +31,7 @@ import java.util.LinkedList; import java.util.Set; import com.google.common.collect.Sets; +import com.google.common.primitives.Booleans; import fr.ifremer.coselmar.beans.DocumentBean; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.UserBean; @@ -42,6 +43,9 @@ import fr.ifremer.coselmar.persistence.entity.Document; import fr.ifremer.coselmar.persistence.entity.DocumentImpl; import fr.ifremer.coselmar.persistence.entity.Privacy; import fr.ifremer.coselmar.persistence.entity.Question; +import fr.ifremer.coselmar.persistence.entity.QuestionImpl; +import fr.ifremer.coselmar.persistence.entity.Status; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.nuiton.topia.persistence.TopiaIdFactory; @@ -322,5 +326,59 @@ public class BeanEntityConverter { return document; } + /** + * Convert simple fields from {@link QuestionBean} into a {@link Question}. + * So, this does not convert : + * <ul> + * <li>Question#experts</li> + * <li>Question#contributors</li> + * <li>Question#clients</li> + * <li>Question#documents</li> + * </ul> + * If questionBean is null, simply return null Question. + */ + public static Question fromBean(QuestionBean questionBean) { + Question question = new QuestionImpl(); + + question.setTitle(questionBean.getTitle()); + question.setSummary(questionBean.getSummary()); + question.setType(questionBean.getType()); + + String privacy = questionBean.getPrivacy(); + if (StringUtils.isNotBlank(privacy)) { + question.setPrivacy(Privacy.valueOf(privacy.toUpperCase())); + } + + String status = questionBean.getStatus(); + if (StringUtils.isNotBlank(status)) { + question.setStatus(Status.valueOf(status.toUpperCase())); + } + + Collection<String> theme = questionBean.getThemes(); + if (theme != null && !theme.isEmpty()) { + question.setTheme(new HashSet(theme)); + } + + Date submissionDate = questionBean.getSubmissionDate(); + if (submissionDate != null){ + question.setSubmissionDate(new Date(submissionDate.getTime())); + } + + Date deadline = questionBean.getDeadline(); + if (deadline != null){ + question.setDeadline(new Date(deadline.getTime())); + } + + Date closingDate = questionBean.getClosingDate(); + if (closingDate != null){ + question.setClosingDate(new Date(closingDate.getTime())); + question.setConclusion(questionBean.getConclusion()); + } + + question.setUnavailable(BooleanUtils.toBoolean(questionBean.getIsRestricted())); + + return question; + } + } diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java index 58b4b23..d0df76f 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/CoselmarRestApplicationListener.java @@ -32,6 +32,7 @@ import fr.ifremer.coselmar.beans.DocumentBean; import fr.ifremer.coselmar.beans.DocumentSearchBean; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.QuestionSearchBean; +import fr.ifremer.coselmar.beans.QuestionSearchExample; import fr.ifremer.coselmar.beans.UserBean; import fr.ifremer.coselmar.beans.UserSearchBean; import fr.ifremer.coselmar.converter.DateConverter; @@ -54,7 +55,8 @@ public class CoselmarRestApplicationListener implements WebMotionServerListener QuestionBean.class, UserSearchBean.class, QuestionSearchBean.class, - DocumentSearchBean.class + DocumentSearchBean.class, + QuestionSearchExample.class ); @Override diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/QuestionsIndexationService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/QuestionsIndexationService.java index 65756af..b59fb41 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/QuestionsIndexationService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/QuestionsIndexationService.java @@ -26,6 +26,7 @@ package fr.ifremer.coselmar.services.indexation; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.QuestionSearchBean; +import fr.ifremer.coselmar.beans.QuestionSearchExample; import fr.ifremer.coselmar.services.CoselmarSimpleServiceSupport; import org.apache.commons.lang3.StringUtils; import org.apache.lucene.document.Document; diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/TransverseIndexationService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/TransverseIndexationService.java index ab15112..7510e9a 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/TransverseIndexationService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/indexation/TransverseIndexationService.java @@ -25,13 +25,7 @@ package fr.ifremer.coselmar.services.indexation; */ import fr.ifremer.coselmar.beans.QuestionBean; -import fr.ifremer.coselmar.beans.QuestionSearchBean; import fr.ifremer.coselmar.services.CoselmarSimpleServiceSupport; -import org.apache.commons.lang3.StringUtils; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.StringField; -import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.Term; import org.apache.lucene.misc.HighFreqTerms; @@ -40,18 +34,11 @@ import org.apache.lucene.misc.TermStats; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; -import org.apache.lucene.search.TopDocs; -import org.apache.lucene.search.WildcardQuery; import java.io.IOException; -import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; -import java.util.Set; /** * This Services provides operations about indexed Objects. diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/DocumentsWebService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/DocumentsWebService.java index 8848067..91f56cf 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/DocumentsWebService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/DocumentsWebService.java @@ -24,18 +24,6 @@ package fr.ifremer.coselmar.services.v1; * #L% */ -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.collect.Collections2; @@ -44,13 +32,10 @@ import fr.ifremer.coselmar.beans.DocumentBean; import fr.ifremer.coselmar.beans.DocumentSearchBean; import fr.ifremer.coselmar.beans.DocumentSearchExample; import fr.ifremer.coselmar.beans.QuestionBean; -import fr.ifremer.coselmar.beans.QuestionSearchBean; import fr.ifremer.coselmar.beans.UserBean; -import fr.ifremer.coselmar.beans.UserSearchBean; import fr.ifremer.coselmar.beans.UserWebToken; import fr.ifremer.coselmar.converter.BeanEntityConverter; import fr.ifremer.coselmar.exceptions.CoselmarTechnicalException; -import fr.ifremer.coselmar.persistence.SearchRequestBean; import fr.ifremer.coselmar.persistence.entity.CoselmarUser; import fr.ifremer.coselmar.persistence.entity.CoselmarUserGroup; import fr.ifremer.coselmar.persistence.entity.CoselmarUserRole; @@ -64,7 +49,6 @@ import fr.ifremer.coselmar.services.errors.UnauthorizedException; import fr.ifremer.coselmar.services.indexation.DocumentsIndexationService; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.logging.Log; import org.apache.lucene.queryparser.classic.ParseException; @@ -73,6 +57,18 @@ import org.debux.webmotion.server.render.Render; import org.nuiton.topia.persistence.TopiaNoResultException; import org.nuiton.util.DateUtil; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import static org.apache.commons.logging.LogFactory.getLog; /** diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/HealthService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/HealthService.java index 8415042..5b68539 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/HealthService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/HealthService.java @@ -2,6 +2,7 @@ package fr.ifremer.coselmar.services.v1; import fr.ifremer.coselmar.beans.HealthBean; import fr.ifremer.coselmar.beans.QuestionSearchBean; +import fr.ifremer.coselmar.beans.QuestionSearchExample; import fr.ifremer.coselmar.persistence.entity.Privacy; import fr.ifremer.coselmar.services.CoselmarWebServiceSupport; import fr.ifremer.coselmar.services.indexation.QuestionsIndexationService; diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java index 457cac9..0ce8299 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java @@ -25,9 +25,6 @@ package fr.ifremer.coselmar.services.v1; */ import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; -import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -43,6 +40,7 @@ import fr.ifremer.coselmar.beans.DocumentBean; import fr.ifremer.coselmar.beans.QuestionBean; import fr.ifremer.coselmar.beans.QuestionExportModel; import fr.ifremer.coselmar.beans.QuestionSearchBean; +import fr.ifremer.coselmar.beans.QuestionSearchExample; import fr.ifremer.coselmar.beans.UserBean; import fr.ifremer.coselmar.beans.UserWebToken; import fr.ifremer.coselmar.converter.BeanEntityConverter; @@ -59,7 +57,6 @@ import fr.ifremer.coselmar.services.errors.InvalidCredentialException; import fr.ifremer.coselmar.services.errors.UnauthorizedException; import fr.ifremer.coselmar.services.indexation.QuestionsIndexationService; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.WriterOutputStream; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -68,10 +65,9 @@ import org.debux.webmotion.server.render.Render; import org.nuiton.csv.Export; import org.nuiton.topia.persistence.TopiaIdFactory; import org.nuiton.topia.persistence.TopiaNoResultException; +import org.nuiton.util.DateUtil; import org.nuiton.util.pagination.PaginationParameter; -import javax.activation.MimeType; - /** * @author ymartel <martel@codelutin.com> */ @@ -262,15 +258,15 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { public List<QuestionBean> getPublicQuestions() throws InvalidCredentialException, UnauthorizedException { // No authentication needed, just filter to get last 5 public questions - QuestionSearchBean searchOption = new QuestionSearchBean(); - searchOption.setPrivacy(Privacy.PUBLIC.name()); - searchOption.setStatus(Status.OPEN.name()); + QuestionSearchExample searchOption = QuestionSearchExample.newDefaultSearchExample(); + searchOption.getExample().setPrivacy(Privacy.PUBLIC); + searchOption.getExample().setStatus(Status.OPEN); searchOption.setLimit(5); searchOption.setPage(1); PaginationParameter paginationParameter = PaginationParameter.of(0, 5, Question.PROPERTY_SUBMISSION_DATE, true); - List<Question> questionList = getQuestionDao().findWithSearchBean(searchOption, paginationParameter); + List<Question> questionList = getQuestionDao().findWithSearchExample(searchOption, paginationParameter); List<QuestionBean> result = new ArrayList<>(questionList.size()); @@ -1028,17 +1024,44 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { List<Question> questionList; String currentUserRole = currentUser.getRole().name(); - Integer limit = searchBean.getLimit(); - PaginationParameter paginationParameter = null; - if (limit != null) { - Integer page = searchBean.getPage(); - int wantedPage = page != null ? page.intValue() : 0; - paginationParameter = PaginationParameter.of(wantedPage, limit.intValue(), Question.PROPERTY_SUBMISSION_DATE, true); - } else { - paginationParameter = PaginationParameter.of(0, Integer.MAX_VALUE, Question.PROPERTY_SUBMISSION_DATE, true); + + QuestionSearchExample searchExample = QuestionSearchExample.newDefaultSearchExample(); + if (searchBean != null) { + if (searchBean.getPage() != null) { + searchExample.setPage(searchBean.getPage()); + } + if (searchBean.getLimit() != null) { + searchExample.setLimit(searchBean.getLimit()); + } + searchExample.setFullTextSearch(searchBean.getFullTextSearch()); + + Question example = BeanEntityConverter.fromBean(searchBean); + searchExample.setExample(example); + + if (searchBean.getSubmissionAfterDate() != null) { + Date submissionAfterDate = DateUtil.getEndOfDay(DateUtil.getYesterday(searchBean.getSubmissionAfterDate())); + searchExample.setSubmissionAfterDate(submissionAfterDate); + } + + if (searchBean.getSubmissionBeforeDate() != null) { + Date submissionBeforeDate = DateUtil.getEndOfDay((searchBean.getSubmissionBeforeDate())); + searchExample.setSubmissionBeforeDate(submissionBeforeDate); + } + + if (searchBean.getDeadlineAfterDate() != null) { + Date deadlineAfterDate = DateUtil.getEndOfDay(DateUtil.getYesterday(searchBean.getDeadlineAfterDate())); + searchExample.setDeadlineAfterDate(deadlineAfterDate); + } + + if (searchBean.getDeadlineBeforeDate() != null) { + Date deadlineBeforeDate = DateUtil.getEndOfDay((searchBean.getDeadlineBeforeDate())); + searchExample.setDeadlineBeforeDate(deadlineBeforeDate); + } } + // Supervisor or Admin : access to all questions, no restriction + PaginationParameter paginationParameter = searchExample.getPaginationParameter(); if (StringUtils.equalsIgnoreCase(CoselmarUserRole.ADMIN.name(), currentUserRole) || StringUtils.equalsIgnoreCase(CoselmarUserRole.SUPERVISOR.name(), currentUserRole)) { @@ -1047,7 +1070,7 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { // classical search with DAO } else { - questionList = getQuestionDao().findWithSearchBean(searchBean, paginationParameter); + questionList = getQuestionDao().findWithSearchExample(searchExample, paginationParameter); } @@ -1065,7 +1088,7 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { // classical search with DAO } else { - questionList = getQuestionDao().findWithSearchBean(searchBean, paginationParameter); + questionList = getQuestionDao().findWithSearchExample(searchExample, paginationParameter); } } @@ -1075,7 +1098,7 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { questionList = getQuestionDao().findForExpert(currentUser, fromIndexQuestionIds, paginationParameter); } else { - questionList = getQuestionDao().findForExpert(currentUser, searchBean, paginationParameter); + questionList = getQuestionDao().findForExpert(currentUser, searchExample, paginationParameter); } // Client : access to question he is client @@ -1084,7 +1107,7 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { questionList = getQuestionDao().findForClient(currentUser, fromIndexQuestionIds, paginationParameter); } else { - questionList = getQuestionDao().findForClient(currentUser, searchBean, paginationParameter); + questionList = getQuestionDao().findForClient(currentUser, searchExample, paginationParameter); } } else { diff --git a/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/QuestionsWebServiceTest.java b/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/QuestionsWebServiceTest.java index 1d8903f..fd56396 100644 --- a/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/QuestionsWebServiceTest.java +++ b/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/QuestionsWebServiceTest.java @@ -139,7 +139,7 @@ public class QuestionsWebServiceTest extends AbstractCoselmarWebServiceTest { // Second search : as supervisor, searchBean only with public privacy : retrieve two documents (one and two) searchRequest = createRequest("/v1/questions") - .addParameter("searchOption", "{privacy : 'public'}") + .addParameter("searchOption", "{privacy : 'PUBLIC'}") .Get() .addHeader("Authorization", "Bearer " + supervisorToken); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.