1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.announcements.service.persistence;
24  
25  import com.liferay.portal.PortalException;
26  import com.liferay.portal.SystemException;
27  import com.liferay.portal.kernel.dao.orm.QueryPos;
28  import com.liferay.portal.kernel.dao.orm.QueryUtil;
29  import com.liferay.portal.kernel.dao.orm.SQLQuery;
30  import com.liferay.portal.kernel.dao.orm.Session;
31  import com.liferay.portal.kernel.dao.orm.Type;
32  import com.liferay.portal.kernel.util.CalendarUtil;
33  import com.liferay.portal.kernel.util.StringPool;
34  import com.liferay.portal.kernel.util.StringUtil;
35  import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
36  import com.liferay.portal.util.PortalUtil;
37  import com.liferay.portlet.announcements.model.AnnouncementsEntry;
38  import com.liferay.portlet.announcements.model.impl.AnnouncementsEntryImpl;
39  import com.liferay.portlet.announcements.model.impl.AnnouncementsFlagImpl;
40  import com.liferay.util.dao.orm.CustomSQLUtil;
41  
42  import java.sql.Timestamp;
43  
44  import java.util.Date;
45  import java.util.Iterator;
46  import java.util.LinkedHashMap;
47  import java.util.List;
48  import java.util.Map;
49  
50  /**
51   * <a href="AnnouncementsEntryFinderImpl.java.html"><b><i>View Source</i></b>
52   * </a>
53   *
54   * @author Thiago Moreira
55   * @author Raymond Augé
56   *
57   */
58  public class AnnouncementsEntryFinderImpl
59      extends BasePersistenceImpl implements AnnouncementsEntryFinder {
60  
61      public static String COUNT_BY_HIDDEN =
62          AnnouncementsEntryFinder.class.getName() + ".countByHidden";
63  
64      public static String COUNT_BY_NOT_HIDDEN =
65          AnnouncementsEntryFinder.class.getName() + ".countByNotHidden";
66  
67      public static String FIND_BY_DISPLAY_DATE =
68          AnnouncementsEntryFinder.class.getName() + ".findByDisplayDate";
69  
70      public static String FIND_BY_HIDDEN =
71          AnnouncementsEntryFinder.class.getName() + ".findByHidden";
72  
73      public static String FIND_BY_NOT_HIDDEN =
74          AnnouncementsEntryFinder.class.getName() + ".findByNotHidden";
75  
76      public int countByScope(
77              long userId, long classNameId, long[] classPKs,
78              int displayDateMonth, int displayDateDay, int displayDateYear,
79              int displayDateHour, int displayDateMinute, int expirationDateMonth,
80              int expirationDateDay, int expirationDateYear,
81              int expirationDateHour, int expirationDateMinute, boolean alert,
82              int flagValue)
83          throws SystemException {
84  
85          Session session = null;
86  
87          try {
88              session = openSession();
89  
90              String sql = CustomSQLUtil.get(COUNT_BY_HIDDEN);
91  
92              if (flagValue == AnnouncementsFlagImpl.NOT_HIDDEN) {
93                  sql = CustomSQLUtil.get(COUNT_BY_NOT_HIDDEN);
94              }
95  
96              sql = StringUtil.replace(
97                  sql, "[$CLASS_PKS$]", getClassPKs(classNameId, classPKs));
98              sql = CustomSQLUtil.replaceAndOperator(sql, true);
99  
100             SQLQuery q = session.createSQLQuery(sql);
101 
102             q.addScalar(COUNT_COLUMN_NAME, Type.LONG);
103 
104             QueryPos qPos = QueryPos.getInstance(q);
105 
106             setClassPKs(qPos, classNameId, classPKs);
107 
108             setDates(
109                 qPos, displayDateMonth, displayDateDay, displayDateYear,
110                 displayDateHour, displayDateMinute, expirationDateMonth,
111                 expirationDateDay, expirationDateYear, expirationDateHour,
112                 expirationDateMinute);
113 
114             qPos.add(alert);
115             qPos.add(userId);
116             qPos.add(AnnouncementsFlagImpl.HIDDEN);
117 
118             Iterator<Long> itr = q.list().iterator();
119 
120             if (itr.hasNext()) {
121                 Long count = itr.next();
122 
123                 if (count != null) {
124                     return count.intValue();
125                 }
126             }
127 
128             return 0;
129         }
130         catch (Exception e) {
131             throw new SystemException(e);
132         }
133         finally {
134             closeSession(session);
135         }
136     }
137 
138     public int countByScopes(
139             long userId, LinkedHashMap<Long, long[]> scopes,
140             int displayDateMonth, int displayDateDay, int displayDateYear,
141             int displayDateHour, int displayDateMinute, int expirationDateMonth,
142             int expirationDateDay, int expirationDateYear,
143             int expirationDateHour, int expirationDateMinute, boolean alert,
144             int flagValue)
145         throws SystemException {
146 
147         Session session = null;
148 
149         try {
150             session = openSession();
151 
152             String sql = CustomSQLUtil.get(COUNT_BY_HIDDEN);
153 
154             if (flagValue == AnnouncementsFlagImpl.NOT_HIDDEN) {
155                 sql = CustomSQLUtil.get(COUNT_BY_NOT_HIDDEN);
156             }
157 
158             sql = StringUtil.replace(sql, "[$CLASS_PKS$]", getClassPKs(scopes));
159             sql = CustomSQLUtil.replaceAndOperator(sql, true);
160 
161             SQLQuery q = session.createSQLQuery(sql);
162 
163             q.addScalar(COUNT_COLUMN_NAME, Type.LONG);
164 
165             QueryPos qPos = QueryPos.getInstance(q);
166 
167             setClassPKs(qPos, scopes);
168 
169             setDates(
170                 qPos, displayDateMonth, displayDateDay, displayDateYear,
171                 displayDateHour, displayDateMinute, expirationDateMonth,
172                 expirationDateDay, expirationDateYear, expirationDateHour,
173                 expirationDateMinute);
174 
175             qPos.add(alert);
176             qPos.add(userId);
177             qPos.add(AnnouncementsFlagImpl.HIDDEN);
178 
179             Iterator<Long> itr = q.list().iterator();
180 
181             if (itr.hasNext()) {
182                 Long count = itr.next();
183 
184                 if (count != null) {
185                     return count.intValue();
186                 }
187             }
188 
189             return 0;
190         }
191         catch (Exception e) {
192             throw new SystemException(e);
193         }
194         finally {
195             closeSession(session);
196         }
197     }
198 
199     public List<AnnouncementsEntry> findByDisplayDate(
200             Date displayDateLT, Date displayDateGT)
201         throws SystemException {
202 
203         Timestamp displayDateLT_TS = CalendarUtil.getTimestamp(displayDateLT);
204         Timestamp displayDateGT_TS = CalendarUtil.getTimestamp(displayDateGT);
205 
206         Session session = null;
207 
208         try {
209             session = openSession();
210 
211             String sql = CustomSQLUtil.get(FIND_BY_DISPLAY_DATE);
212 
213             SQLQuery q = session.createSQLQuery(sql);
214 
215             q.addEntity("AnnouncementsEntry", AnnouncementsEntryImpl.class);
216 
217             QueryPos qPos = QueryPos.getInstance(q);
218 
219             qPos.add(displayDateGT_TS);
220             qPos.add(displayDateLT_TS);
221 
222             return q.list();
223         }
224         catch (Exception e) {
225             throw new SystemException(e);
226         }
227         finally {
228             closeSession(session);
229         }
230     }
231 
232     public List<AnnouncementsEntry> findByScope(
233             long userId, long classNameId, long[] classPKs,
234             int displayDateMonth, int displayDateDay, int displayDateYear,
235             int displayDateHour, int displayDateMinute, int expirationDateMonth,
236             int expirationDateDay, int expirationDateYear,
237             int expirationDateHour, int expirationDateMinute, boolean alert,
238             int flagValue, int start, int end)
239         throws SystemException {
240 
241         Session session = null;
242 
243         try {
244             session = openSession();
245 
246             String sql = CustomSQLUtil.get(FIND_BY_HIDDEN);
247 
248             if (flagValue == AnnouncementsFlagImpl.NOT_HIDDEN) {
249                 sql = CustomSQLUtil.get(FIND_BY_NOT_HIDDEN);
250             }
251 
252             sql = StringUtil.replace(
253                 sql, "[$CLASS_PKS$]", getClassPKs(classNameId, classPKs));
254             sql = CustomSQLUtil.replaceAndOperator(sql, true);
255 
256             SQLQuery q = session.createSQLQuery(sql);
257 
258             q.addEntity("AnnouncementsEntry", AnnouncementsEntryImpl.class);
259 
260             QueryPos qPos = QueryPos.getInstance(q);
261 
262             setClassPKs(qPos, classNameId, classPKs);
263 
264             setDates(
265                 qPos, displayDateMonth, displayDateDay, displayDateYear,
266                 displayDateHour, displayDateMinute, expirationDateMonth,
267                 expirationDateDay, expirationDateYear, expirationDateHour,
268                 expirationDateMinute);
269 
270             qPos.add(alert);
271             qPos.add(userId);
272             qPos.add(AnnouncementsFlagImpl.HIDDEN);
273 
274             return (List<AnnouncementsEntry>)QueryUtil.list(
275                 q, getDialect(), start, end);
276         }
277         catch (Exception e) {
278             throw new SystemException(e);
279         }
280         finally {
281             closeSession(session);
282         }
283     }
284 
285     public List<AnnouncementsEntry> findByScopes(
286             long userId, LinkedHashMap<Long, long[]> scopes,
287             int displayDateMonth, int displayDateDay, int displayDateYear,
288             int displayDateHour, int displayDateMinute, int expirationDateMonth,
289             int expirationDateDay, int expirationDateYear,
290             int expirationDateHour, int expirationDateMinute, boolean alert,
291             int flagValue, int start, int end)
292         throws SystemException {
293 
294         Session session = null;
295 
296         try {
297             session = openSession();
298 
299             String sql = CustomSQLUtil.get(FIND_BY_HIDDEN);
300 
301             if (flagValue == AnnouncementsFlagImpl.NOT_HIDDEN) {
302                 sql = CustomSQLUtil.get(FIND_BY_NOT_HIDDEN);
303             }
304 
305             sql = StringUtil.replace(sql, "[$CLASS_PKS$]", getClassPKs(scopes));
306             sql = CustomSQLUtil.replaceAndOperator(sql, true);
307 
308             SQLQuery q = session.createSQLQuery(sql);
309 
310             q.addEntity("AnnouncementsEntry", AnnouncementsEntryImpl.class);
311 
312             QueryPos qPos = QueryPos.getInstance(q);
313 
314             setClassPKs(qPos, scopes);
315 
316             setDates(
317                 qPos, displayDateMonth, displayDateDay, displayDateYear,
318                 displayDateHour, displayDateMinute, expirationDateMonth,
319                 expirationDateDay, expirationDateYear, expirationDateHour,
320                 expirationDateMinute);
321 
322             qPos.add(alert);
323             qPos.add(userId);
324             qPos.add(AnnouncementsFlagImpl.HIDDEN);
325 
326             return (List<AnnouncementsEntry>)QueryUtil.list(
327                 q, getDialect(), start, end);
328         }
329         catch (Exception e) {
330             throw new SystemException(e);
331         }
332         finally {
333             closeSession(session);
334         }
335     }
336 
337     protected String getClassPKs(long classNameId, long[] classPKs) {
338         StringBuilder sb = new StringBuilder();
339 
340         sb.append("(AnnouncementsEntry.classNameId = ?) AND (");
341 
342         for (int i = 0; i < classPKs.length; i++) {
343             sb.append("(AnnouncementsEntry.classPK = ?)");
344 
345             if ((i + 1) < classPKs.length) {
346                 sb.append(" OR ");
347             }
348             else {
349                 sb.append(")");
350             }
351         }
352 
353         return sb.toString();
354     }
355 
356     protected String getClassPKs(LinkedHashMap<Long, long[]> scopes) {
357         if (scopes == null) {
358             return StringPool.BLANK;
359         }
360 
361         StringBuilder sb = new StringBuilder();
362 
363         Iterator<Map.Entry<Long, long[]>> itr = scopes.entrySet().iterator();
364 
365         while (itr.hasNext()) {
366             Map.Entry<Long, long[]> entry = itr.next();
367 
368             Long classNameId = entry.getKey();
369             long[] classPKs = entry.getValue();
370 
371             sb.append("(");
372             sb.append(getClassPKs(classNameId.longValue(), classPKs));
373             sb.append(")");
374 
375             if (itr.hasNext()) {
376                 sb.append(" OR ");
377             }
378         }
379 
380         return sb.toString();
381     }
382 
383     protected void setClassPKs(
384         QueryPos qPos, long classNameId, long[] classPKs) {
385 
386         qPos.add(classNameId);
387 
388         for (int i = 0; i < classPKs.length; i++) {
389             qPos.add(classPKs[i]);
390         }
391     }
392 
393     protected void setClassPKs(
394         QueryPos qPos, LinkedHashMap<Long, long[]> scopes) {
395 
396         if (scopes == null) {
397             return;
398         }
399 
400         Iterator<Map.Entry<Long, long[]>> itr = scopes.entrySet().iterator();
401 
402         while (itr.hasNext()) {
403             Map.Entry<Long, long[]> entry = itr.next();
404 
405             Long classNameId = entry.getKey();
406             long[] classPKs = entry.getValue();
407 
408             setClassPKs(qPos, classNameId.longValue(), classPKs);
409         }
410     }
411 
412     protected void setDates(
413         QueryPos qPos, int displayDateMonth, int displayDateDay,
414         int displayDateYear, int displayDateHour, int displayDateMinute,
415         int expirationDateMonth, int expirationDateDay, int expirationDateYear,
416         int expirationDateHour, int expirationDateMinute) {
417 
418         Date displayDate = null;
419 
420         try {
421             displayDate = PortalUtil.getDate(
422                 displayDateMonth, displayDateDay, displayDateYear,
423                 displayDateHour, displayDateMinute, new PortalException());
424         }
425         catch (PortalException pe) {
426             displayDate = new Date();
427         }
428 
429         Timestamp displayDateTS = CalendarUtil.getTimestamp(displayDate);
430 
431         Date expirationDate = null;
432 
433         try {
434             expirationDate = PortalUtil.getDate(
435                 expirationDateMonth, expirationDateDay, expirationDateYear,
436                 expirationDateHour, expirationDateMinute,
437                 new PortalException());
438         }
439         catch (PortalException pe) {
440             expirationDate = new Date();
441         }
442 
443         Timestamp expirationDateTS = CalendarUtil.getTimestamp(expirationDate);
444 
445         qPos.add(displayDateTS);
446         qPos.add(displayDateTS);
447         qPos.add(expirationDateTS);
448         qPos.add(expirationDateTS);
449     }
450 
451 }