Add serviceOrder rest services
[externalapi/nbi.git] / src / main / java / org / onap / nbi / apis / serviceorder / MultiCriteriaRequestBuilder.java
1 package org.onap.nbi.apis.serviceorder;
2
3 import org.onap.nbi.apis.serviceorder.model.StateType;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
6 import org.springframework.data.domain.PageRequest;
7 import org.springframework.data.domain.Pageable;
8 import org.springframework.data.mongodb.core.query.Criteria;
9 import org.springframework.data.mongodb.core.query.Query;
10 import org.springframework.stereotype.Service;
11 import org.springframework.util.CollectionUtils;
12 import org.springframework.util.MultiValueMap;
13 import java.text.ParseException;
14 import java.text.SimpleDateFormat;
15 import java.util.Date;
16 import java.util.List;
17
18 @Service
19 public class MultiCriteriaRequestBuilder {
20
21     private static final Logger LOGGER = LoggerFactory.getLogger(ServiceOrderResource.class);
22
23
24     public Query buildRequest(MultiValueMap<String, String> params) {
25         Query query = new Query();
26
27         List<String> externalIds = params.get("externalId");
28         if (!CollectionUtils.isEmpty(externalIds)) {
29             String externalId = externalIds.get(0);
30             LOGGER.debug("add criterion externalId {0}", externalId);
31             query.addCriteria(Criteria.where("externalId").is(externalId));
32
33         }
34         List<String> states = params.get("state");
35         if (!CollectionUtils.isEmpty(states)) {
36             String state = states.get(0);
37             LOGGER.debug("add criterion state {0}", state);
38             query.addCriteria(Criteria.where("state").is(StateType.fromValue(state)));
39
40         }
41         List<String> descriptions = params.get("description");
42         if (!CollectionUtils.isEmpty(descriptions)) {
43             String description = descriptions.get(0);
44             LOGGER.debug("add criterion description {0}", description);
45             query.addCriteria(Criteria.where("description").is(description));
46
47         }
48
49         handleDate(params, query);
50
51         handleOffsetAndLimit(params, query);
52
53         return query;
54     }
55
56     private void handleDate(MultiValueMap<String, String> params, Query query) {
57         List<String> orderDateLts = params.get("orderDate.lt");
58         List<String> orderDateGts = params.get("orderDate.gt");
59         if (!CollectionUtils.isEmpty(orderDateLts) || !CollectionUtils.isEmpty(orderDateGts)) {
60             Criteria orderDateCriteria = Criteria.where("orderDate");
61
62             if (!CollectionUtils.isEmpty(orderDateLts)) {
63                 String orderDateLt = orderDateLts.get(0);
64                 LOGGER.debug("add criterion orderDate.lt {0}", orderDateLt);
65                 orderDateCriteria.lt(convertDate(orderDateLt));
66             }
67             if (!CollectionUtils.isEmpty(orderDateGts)) {
68                 String orderDateGt = orderDateGts.get(0);
69                 LOGGER.debug("add criterion orderDate.gt {0}", orderDateGt);
70                 orderDateCriteria.gt(convertDate(orderDateGt));
71             }
72             query.addCriteria(orderDateCriteria);
73         }
74     }
75
76     private void handleOffsetAndLimit(MultiValueMap<String, String> params, Query query) {
77         List<String> offsets = params.get("offset");
78         List<String> limits = params.get("limit");
79         if (!CollectionUtils.isEmpty(offsets) && !CollectionUtils.isEmpty(limits)) {
80             String offsetString = offsets.get(0);
81             String limitString = limits.get(0);
82             int offset = Integer.parseInt(offsetString);
83             int limit = Integer.parseInt(limitString);
84             final Pageable pageableRequest = new PageRequest(offset, limit);
85             query.with(pageableRequest);
86         } else if (!CollectionUtils.isEmpty(limits)) {
87             String limitString = limits.get(0);
88             int limit = Integer.parseInt(limitString);
89             final Pageable pageableRequest = new PageRequest(0, limit);
90             query.with(pageableRequest);
91         }
92     }
93
94     private Date convertDate(String dateString) {
95         String dateFormat = "yyyy-MM-dd HH:mm:ss.SSS";
96         SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
97         try {
98             return formatter.parse(dateString);
99         } catch (ParseException e) {
100             LOGGER.error("unable to convert date " + dateString + ", the pattern is " + dateFormat + " ; " + e);
101         }
102         return null;
103
104     }
105
106 }