001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.journal.service.persistence.impl;
016    
017    import com.liferay.portal.kernel.dao.orm.QueryDefinition;
018    import com.liferay.portal.kernel.dao.orm.QueryPos;
019    import com.liferay.portal.kernel.dao.orm.QueryUtil;
020    import com.liferay.portal.kernel.dao.orm.SQLQuery;
021    import com.liferay.portal.kernel.dao.orm.Session;
022    import com.liferay.portal.kernel.dao.orm.Type;
023    import com.liferay.portal.kernel.exception.SystemException;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.StringUtil;
027    import com.liferay.portal.security.permission.InlineSQLHelperUtil;
028    import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
029    import com.liferay.portlet.journal.model.JournalArticle;
030    import com.liferay.portlet.journal.model.JournalFolder;
031    import com.liferay.portlet.journal.model.impl.JournalArticleImpl;
032    import com.liferay.portlet.journal.model.impl.JournalFolderImpl;
033    import com.liferay.portlet.journal.service.persistence.JournalArticleUtil;
034    import com.liferay.portlet.journal.service.persistence.JournalFolderFinder;
035    import com.liferay.portlet.journal.service.persistence.JournalFolderUtil;
036    import com.liferay.util.dao.orm.CustomSQLUtil;
037    
038    import java.util.ArrayList;
039    import java.util.Iterator;
040    import java.util.List;
041    
042    /**
043     * @author Juan Fern??ndez
044     * @author Zsolt Berentey
045     */
046    public class JournalFolderFinderImpl extends BasePersistenceImpl<JournalFolder>
047            implements JournalFolderFinder {
048    
049            public static final String COUNT_A_BY_G_F =
050                    JournalFolderFinder.class.getName() + ".countA_ByG_F";
051    
052            public static final String COUNT_F_BY_G_F =
053                    JournalFolderFinder.class.getName() + ".countF_ByG_F";
054    
055            public static final String FIND_A_BY_G_F =
056                    JournalFolderFinder.class.getName() + ".findA_ByG_F";
057    
058            public static final String FIND_F_BY_NO_ASSETS =
059                    JournalFolderFinder.class.getName() + ".findByF_ByNoAssets";
060    
061            public static final String FIND_F_BY_G_F =
062                    JournalFolderFinder.class.getName() + ".findF_ByG_F";
063    
064            @Override
065            public int countF_A_ByG_F(
066                    long groupId, long folderId, QueryDefinition<?> queryDefinition) {
067    
068                    return doCountF_A_ByG_F(groupId, folderId, queryDefinition, false);
069            }
070    
071            @Override
072            public int filterCountF_A_ByG_F(
073                    long groupId, long folderId, QueryDefinition<?> queryDefinition) {
074    
075                    return doCountF_A_ByG_F(groupId, folderId, queryDefinition, true);
076            }
077    
078            @Override
079            public List<Object> filterFindF_A_ByG_F(
080                    long groupId, long folderId, QueryDefinition<?> queryDefinition) {
081    
082                    return doFindF_A_ByG_F(groupId, folderId, queryDefinition, true);
083            }
084    
085            @Override
086            public List<JournalFolder> findF_ByNoAssets() {
087                    Session session = null;
088    
089                    try {
090                            session = openSession();
091    
092                            String sql = CustomSQLUtil.get(FIND_F_BY_NO_ASSETS);
093    
094                            SQLQuery q = session.createSynchronizedSQLQuery(sql);
095    
096                            q.addEntity(JournalFolderImpl.TABLE_NAME, JournalFolderImpl.class);
097    
098                            return q.list(true);
099                    }
100                    catch (Exception e) {
101                            throw new SystemException(e);
102                    }
103                    finally {
104                            closeSession(session);
105                    }
106            }
107    
108            @Override
109            public List<Object> findF_A_ByG_F(
110                    long groupId, long folderId, QueryDefinition<?> queryDefinition) {
111    
112                    return doFindF_A_ByG_F(groupId, folderId, queryDefinition, false);
113            }
114    
115            protected int doCountF_A_ByG_F(
116                    long groupId, long folderId, QueryDefinition<?> queryDefinition,
117                    boolean inlineSQLHelper) {
118    
119                    Session session = null;
120    
121                    try {
122                            session = openSession();
123    
124                            StringBundler sb = new StringBundler(5);
125    
126                            sb.append(StringPool.OPEN_PARENTHESIS);
127                            sb.append(
128                                    getFoldersSQL(
129                                            COUNT_F_BY_G_F, groupId, queryDefinition, inlineSQLHelper));
130                            sb.append(") UNION ALL (");
131                            sb.append(
132                                    getArticlesSQL(
133                                            COUNT_A_BY_G_F, groupId, queryDefinition, inlineSQLHelper));
134                            sb.append(StringPool.CLOSE_PARENTHESIS);
135    
136                            String sql = updateSQL(sb.toString(), folderId);
137    
138                            SQLQuery q = session.createSynchronizedSQLQuery(sql);
139    
140                            q.addScalar(COUNT_COLUMN_NAME, Type.LONG);
141    
142                            QueryPos qPos = QueryPos.getInstance(q);
143    
144                            qPos.add(groupId);
145                            qPos.add(queryDefinition.getStatus());
146    
147                            if (folderId >= 0) {
148                                    qPos.add(folderId);
149                            }
150    
151                            qPos.add(groupId);
152                            qPos.add(queryDefinition.getStatus());
153    
154                            if (folderId >= 0) {
155                                    qPos.add(folderId);
156                            }
157    
158                            int count = 0;
159    
160                            Iterator<Long> itr = q.iterate();
161    
162                            while (itr.hasNext()) {
163                                    Long l = itr.next();
164    
165                                    if (l != null) {
166                                            count += l.intValue();
167                                    }
168                            }
169    
170                            return count;
171                    }
172                    catch (Exception e) {
173                            throw new SystemException(e);
174                    }
175                    finally {
176                            closeSession(session);
177                    }
178            }
179    
180            protected List<Object> doFindF_A_ByG_F(
181                    long groupId, long folderId, QueryDefinition<?> queryDefinition,
182                    boolean inlineSQLHelper) {
183    
184                    Session session = null;
185    
186                    try {
187                            session = openSession();
188    
189                            StringBundler sb = new StringBundler(5);
190    
191                            sb.append(StringPool.OPEN_PARENTHESIS);
192                            sb.append(
193                                    getFoldersSQL(
194                                            FIND_F_BY_G_F, groupId, queryDefinition, inlineSQLHelper));
195                            sb.append(") UNION ALL (");
196                            sb.append(
197                                    getArticlesSQL(
198                                            FIND_A_BY_G_F, groupId, queryDefinition, inlineSQLHelper));
199                            sb.append(StringPool.CLOSE_PARENTHESIS);
200    
201                            String sql = updateSQL(sb.toString(), folderId);
202    
203                            sql = CustomSQLUtil.replaceOrderBy(
204                                    sql, queryDefinition.getOrderByComparator());
205    
206                            SQLQuery q = session.createSynchronizedSQLQuery(sql);
207    
208                            q.addScalar("modelFolderId", Type.LONG);
209                            q.addScalar("modelFolder", Type.LONG);
210                            q.addScalar("articleId", Type.STRING);
211                            q.addScalar("version", Type.DOUBLE);
212    
213                            QueryPos qPos = QueryPos.getInstance(q);
214    
215                            qPos.add(groupId);
216                            qPos.add(queryDefinition.getStatus());
217    
218                            if (folderId >= 0) {
219                                    qPos.add(folderId);
220                            }
221    
222                            qPos.add(groupId);
223                            qPos.add(queryDefinition.getStatus());
224    
225                            if (folderId >= 0) {
226                                    qPos.add(folderId);
227                            }
228    
229                            List<Object> models = new ArrayList<Object>();
230    
231                            Iterator<Object[]> itr = (Iterator<Object[]>)QueryUtil.iterate(
232                                    q, getDialect(), queryDefinition.getStart(),
233                                    queryDefinition.getEnd());
234    
235                            while (itr.hasNext()) {
236                                    Object[] array = itr.next();
237    
238                                    long curFolderId = (Long)array[0];
239                                    long modelFolder = (Long)array[1];
240    
241                                    Object obj = null;
242    
243                                    if (modelFolder == 1) {
244                                            obj = JournalFolderUtil.findByPrimaryKey(curFolderId);
245                                    }
246                                    else {
247                                            String articleId = (String)array[2];
248                                            double version = (Double)array[3];
249    
250                                            obj = JournalArticleUtil.findByG_A_V(
251                                                    groupId, articleId, version);
252                                    }
253    
254                                    models.add(obj);
255                            }
256    
257                            return models;
258                    }
259                    catch (Exception e) {
260                            throw new SystemException(e);
261                    }
262                    finally {
263                            closeSession(session);
264                    }
265            }
266    
267            protected String getArticlesSQL(
268                    String id, long groupId, QueryDefinition<?> queryDefinition,
269                    boolean inlineSQLHelper) {
270    
271                    String sql = CustomSQLUtil.get(
272                            id, queryDefinition, JournalArticleImpl.TABLE_NAME);
273    
274                    if (inlineSQLHelper) {
275                            sql = InlineSQLHelperUtil.replacePermissionCheck(
276                                    sql, JournalArticle.class.getName(),
277                                    "JournalArticle.resourcePrimKey", groupId);
278                    }
279    
280                    return sql;
281            }
282    
283            protected String getFolderId(long folderId, String tableName) {
284                    if (folderId < 0) {
285                            return StringPool.BLANK;
286                    }
287    
288                    StringBundler sb = new StringBundler(5);
289    
290                    sb.append(" AND ");
291                    sb.append(tableName);
292                    sb.append(".");
293    
294                    if (tableName.equals(JournalFolderImpl.TABLE_NAME)) {
295                            sb.append("parentFolderId");
296                    }
297                    else {
298                            sb.append("folderId");
299                    }
300    
301                    sb.append(" = ? ");
302    
303                    return sb.toString();
304            }
305    
306            protected String getFoldersSQL(
307                    String id, long groupId, QueryDefinition<?> queryDefinition,
308                    boolean inlineSQLHelper) {
309    
310                    String sql = CustomSQLUtil.get(
311                            id, queryDefinition, JournalFolderImpl.TABLE_NAME);
312    
313                    if (inlineSQLHelper) {
314                            sql = InlineSQLHelperUtil.replacePermissionCheck(
315                                    sql, JournalFolder.class.getName(), "JournalFolder.folderId",
316                                    groupId);
317                    }
318    
319                    return sql;
320            }
321    
322            protected String updateSQL(String sql, long folderId) {
323                    sql = StringUtil.replace(
324                            sql,
325                            new String[] {
326                                    "[$ARTICLE_FOLDER_ID$]", "[$FOLDER_PARENT_FOLDER_ID$]"
327                            },
328                            new String[] {
329                                    getFolderId(folderId, JournalArticleImpl.TABLE_NAME),
330                                    getFolderId(folderId, JournalFolderImpl.TABLE_NAME)
331                            });
332    
333                    return sql;
334            }
335    
336    }