/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. */ package com.liferay.journal.service.persistence.impl; import com.liferay.journal.configuration.JournalServiceConfiguration; import com.liferay.journal.exception.NoSuchArticleException; import com.liferay.journal.model.JournalArticle; import com.liferay.journal.model.impl.JournalArticleImpl; import com.liferay.journal.service.persistence.JournalArticleFinder; import com.liferay.journal.service.persistence.JournalArticleUtil; import com.liferay.portal.dao.orm.custom.sql.CustomSQLUtil; import com.liferay.portal.kernel.dao.orm.QueryDefinition; import com.liferay.portal.kernel.dao.orm.QueryPos; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.dao.orm.SQLQuery; import com.liferay.portal.kernel.dao.orm.Session; import com.liferay.portal.kernel.dao.orm.Type; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.ResourceConstants; import com.liferay.portal.kernel.module.configuration.ConfigurationProviderUtil; import com.liferay.portal.kernel.security.permission.InlineSQLHelperUtil; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.CalendarUtil; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.workflow.WorkflowConstants; import java.sql.Timestamp; import java.util.Date; import java.util.Iterator; import java.util.List; /** * @author Brian Wing Shun Chan * @author Raymond Augé * @author Connor McKay */ public class JournalArticleFinderImpl extends JournalArticleFinderBaseImpl implements JournalArticleFinder { public static final String COUNT_BY_G_F = JournalArticleFinder.class.getName() + ".countByG_F"; public static final String COUNT_BY_G_C_S = JournalArticleFinder.class.getName() + ".countByG_C_S"; public static final String COUNT_BY_G_U_F_C = JournalArticleFinder.class.getName() + ".countByG_U_F_C"; public static final String COUNT_BY_C_G_F_C_A_V_T_D_C_S_T_D_R = JournalArticleFinder.class.getName() + ".countByC_G_F_C_A_V_T_D_C_S_T_D_R"; public static final String FIND_BY_EXPIRATION_DATE = JournalArticleFinder.class.getName() + ".findByExpirationDate"; public static final String FIND_BY_NO_ASSETS = JournalArticleFinder.class.getName() + ".findByNoAssets"; public static final String FIND_BY_NO_PERMISSIONS = JournalArticleFinder.class.getName() + ".findByNoPermissions"; public static final String FIND_BY_REVIEW_DATE = JournalArticleFinder.class.getName() + ".findByReviewDate"; public static final String FIND_BY_R_D = JournalArticleFinder.class.getName() + ".findByR_D"; public static final String FIND_BY_G_F = JournalArticleFinder.class.getName() + ".findByG_F"; public static final String FIND_BY_G_C_S = JournalArticleFinder.class.getName() + ".findByG_C_S"; public static final String FIND_BY_G_U_F_C = JournalArticleFinder.class.getName() + ".findByG_U_F_C"; public static final String FIND_BY_C_G_F_C_A_V_T_D_C_S_T_D_R = JournalArticleFinder.class.getName() + ".findByC_G_F_C_A_V_T_D_C_S_T_D_R"; @Override public int countByKeywords( long companyId, long groupId, List<Long> folderIds, long classNameId, String keywords, Double version, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, int status, Date reviewDate) { String[] articleIds = null; String[] titles = null; String[] descriptions = null; String[] contents = null; String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); boolean andOperator = false; if (Validator.isNotNull(keywords)) { articleIds = CustomSQLUtil.keywords(keywords, false); titles = CustomSQLUtil.keywords(keywords); descriptions = CustomSQLUtil.keywords(keywords, false); if (isdatabaseContentKeywordSearchEnabled(companyId)) { contents = CustomSQLUtil.keywords(keywords, false); } } else { andOperator = true; } QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>( status); return doCountByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, false); } @Override public int countByG_F( long groupId, List<Long> folderIds, QueryDefinition<JournalArticle> queryDefinition) { return doCountByG_F(groupId, folderIds, queryDefinition, false); } @Override public int countByG_C_S( long groupId, long classNameId, String ddmStructureKey, QueryDefinition<JournalArticle> queryDefinition) { return doCountByG_C_S( groupId, classNameId, new String[] {ddmStructureKey}, queryDefinition, false); } @Override public int countByG_F_C( long groupId, List<Long> folderIds, long classNameId, QueryDefinition<JournalArticle> queryDefinition) { return doCountByG_F_C( groupId, folderIds, classNameId, queryDefinition, false); } @Override public int countByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); return countByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleId, version, title, description, content, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public int countByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] articleIds = CustomSQLUtil.keywords(articleId, false); String[] titles = CustomSQLUtil.keywords(title); String[] descriptions = CustomSQLUtil.keywords(description, false); String[] contents = CustomSQLUtil.keywords(content, false); return countByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public int countByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String[] articleIds, Double version, String[] titles, String[] descriptions, String[] contents, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { return doCountByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, false); } @Override public int filterCountByKeywords( long companyId, long groupId, List<Long> folderIds, long classNameId, String keywords, Double version, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, int status, Date reviewDate) { String[] articleIds = null; String[] titles = null; String[] descriptions = null; String[] contents = null; String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); boolean andOperator = false; if (Validator.isNotNull(keywords)) { articleIds = CustomSQLUtil.keywords(keywords, false); titles = CustomSQLUtil.keywords(keywords); descriptions = CustomSQLUtil.keywords(keywords, false); if (isdatabaseContentKeywordSearchEnabled(companyId)) { contents = CustomSQLUtil.keywords(keywords, false); } } else { andOperator = true; } QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>( status); return doCountByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, true); } @Override public int filterCountByG_F( long groupId, List<Long> folderIds, QueryDefinition<JournalArticle> queryDefinition) { return doCountByG_F(groupId, folderIds, queryDefinition, true); } @Override public int filterCountByG_C_S( long groupId, long classNameId, String ddmStructureKey, QueryDefinition<JournalArticle> queryDefinition) { return doCountByG_C_S( groupId, classNameId, new String[] {ddmStructureKey}, queryDefinition, true); } @Override public int filterCountByG_F_C( long groupId, List<Long> folderIds, long classNameId, QueryDefinition<JournalArticle> queryDefinition) { return doCountByG_F_C( groupId, folderIds, classNameId, queryDefinition, true); } @Override public int filterCountByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); return filterCountByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleId, version, title, description, content, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public int filterCountByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] articleIds = CustomSQLUtil.keywords(articleId, false); String[] titles = CustomSQLUtil.keywords(title); String[] descriptions = CustomSQLUtil.keywords(description, false); String[] contents = CustomSQLUtil.keywords(content, false); return filterCountByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public int filterCountByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String[] articleIds, Double version, String[] titles, String[] descriptions, String[] contents, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { return doCountByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, true); } @Override public List<JournalArticle> filterFindByKeywords( long companyId, long groupId, List<Long> folderIds, long classNameId, String keywords, Double version, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, int status, Date reviewDate, int start, int end, OrderByComparator<JournalArticle> orderByComparator) { String[] articleIds = null; String[] titles = null; String[] descriptions = null; String[] contents = null; String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); boolean andOperator = false; if (Validator.isNotNull(keywords)) { articleIds = CustomSQLUtil.keywords(keywords, false); titles = CustomSQLUtil.keywords(keywords); descriptions = CustomSQLUtil.keywords(keywords, false); if (isdatabaseContentKeywordSearchEnabled(companyId)) { contents = CustomSQLUtil.keywords(keywords, false); } } else { andOperator = true; } QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>( status, start, end, orderByComparator); return doFindByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, true); } @Override public List<JournalArticle> filterFindByG_F( long groupId, List<Long> folderIds, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_F(groupId, folderIds, queryDefinition, true); } @Override public List<JournalArticle> filterFindByG_C_S( long groupId, long classNameId, String ddmStructureKey, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_C_S( groupId, classNameId, new String[] {ddmStructureKey}, queryDefinition, true); } @Override public List<JournalArticle> filterFindByG_C_S( long groupId, long classNameId, String[] ddmStructureKeys, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_C_S( groupId, classNameId, ddmStructureKeys, queryDefinition, true); } @Override public List<JournalArticle> filterFindByG_F_C( long groupId, List<Long> folderIds, long classNameId, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_F_C( groupId, folderIds, classNameId, queryDefinition, true); } @Override public List<JournalArticle> filterFindByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); return filterFindByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleId, version, title, description, content, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public List<JournalArticle> filterFindByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] articleIds = CustomSQLUtil.keywords(articleId, false); String[] titles = CustomSQLUtil.keywords(title); String[] descriptions = CustomSQLUtil.keywords(description, false); String[] contents = CustomSQLUtil.keywords(content, false); return filterFindByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public List<JournalArticle> filterFindByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String[] articleIds, Double version, String[] titles, String[] descriptions, String[] contents, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { return doFindByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, true); } @Override public List<JournalArticle> findByExpirationDate( long classNameId, Date expirationDateLT, QueryDefinition<JournalArticle> queryDefinition) { Timestamp expirationDateLT_TS = CalendarUtil.getTimestamp( expirationDateLT); Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), FIND_BY_EXPIRATION_DATE, queryDefinition); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(classNameId); qPos.add(queryDefinition.getStatus()); qPos.add(expirationDateLT_TS); return q.list(true); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } @Override public List<JournalArticle> findByKeywords( long companyId, long groupId, List<Long> folderIds, long classNameId, String keywords, Double version, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, int status, Date reviewDate, int start, int end, OrderByComparator<JournalArticle> orderByComparator) { String[] articleIds = null; String[] titles = null; String[] descriptions = null; String[] contents = null; String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); boolean andOperator = false; if (Validator.isNotNull(keywords)) { articleIds = CustomSQLUtil.keywords(keywords, false); titles = CustomSQLUtil.keywords(keywords); descriptions = CustomSQLUtil.keywords(keywords, false); if (isdatabaseContentKeywordSearchEnabled(companyId)) { contents = CustomSQLUtil.keywords(keywords, false); } } else { andOperator = true; } QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>( status, start, end, orderByComparator); return findByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public List<JournalArticle> findByNoAssets() { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get(getClass(), FIND_BY_NO_ASSETS); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity("JournalArticle", JournalArticleImpl.class); return q.list(true); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } @Override public List<JournalArticle> findByNoPermissions() { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get(getClass(), FIND_BY_NO_PERMISSIONS); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity("JournalArticle", JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(ResourceConstants.SCOPE_INDIVIDUAL); return q.list(true); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } @Override public List<JournalArticle> findByReviewDate( long classNameId, Date reviewDateLT, Date reviewDateGT) { Timestamp reviewDateLT_TS = CalendarUtil.getTimestamp(reviewDateLT); Timestamp reviewDateGT_TS = CalendarUtil.getTimestamp(reviewDateGT); Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get(getClass(), FIND_BY_REVIEW_DATE); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(classNameId); qPos.add(reviewDateGT_TS); qPos.add(reviewDateLT_TS); return q.list(true); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } @Override public JournalArticle findByR_D(long resourcePrimKey, Date displayDate) throws NoSuchArticleException { Timestamp displayDate_TS = CalendarUtil.getTimestamp(displayDate); Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get(getClass(), FIND_BY_R_D); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(resourcePrimKey); qPos.add(displayDate_TS); List<JournalArticle> articles = q.list(); if (!articles.isEmpty()) { return articles.get(0); } } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } StringBundler sb = new StringBundler(5); sb.append("No JournalArticle exists with the key {resourcePrimKey="); sb.append(resourcePrimKey); sb.append(", displayDate="); sb.append(displayDate); sb.append("}"); throw new NoSuchArticleException(sb.toString()); } @Override public List<JournalArticle> findByG_F( long groupId, List<Long> folderIds, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_F(groupId, folderIds, queryDefinition, false); } @Override public List<JournalArticle> findByG_C_S( long groupId, long classNameId, String ddmStructureKey, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_C_S( groupId, classNameId, new String[] {ddmStructureKey}, queryDefinition, false); } @Override public List<JournalArticle> findByG_C_S( long groupId, long classNameId, String[] ddmStructureKeys, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_C_S( groupId, classNameId, ddmStructureKeys, queryDefinition, false); } @Override public List<JournalArticle> findByG_F_C( long groupId, List<Long> folderIds, long classNameId, QueryDefinition<JournalArticle> queryDefinition) { return doFindByG_F_C( groupId, folderIds, classNameId, queryDefinition, false); } @Override public List<JournalArticle> findByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String ddmStructureKey, String ddmTemplateKey, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] articleIds = CustomSQLUtil.keywords(articleId, false); String[] titles = CustomSQLUtil.keywords(title); String[] descriptions = CustomSQLUtil.keywords(description, false); String[] contents = CustomSQLUtil.keywords(content, false); String[] ddmStructureKeys = CustomSQLUtil.keywords( ddmStructureKey, false); String[] ddmTemplateKeys = CustomSQLUtil.keywords( ddmTemplateKey, false); return findByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public List<JournalArticle> findByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String articleId, Double version, String title, String description, String content, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { String[] articleIds = CustomSQLUtil.keywords(articleId, false); String[] titles = CustomSQLUtil.keywords(title); String[] descriptions = CustomSQLUtil.keywords(description, false); String[] contents = CustomSQLUtil.keywords(content, false); return findByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition); } @Override public List<JournalArticle> findByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String[] articleIds, Double version, String[] titles, String[] descriptions, String[] contents, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition) { return doFindByC_G_F_C_A_V_T_D_C_S_T_D_R( companyId, groupId, folderIds, classNameId, articleIds, version, titles, descriptions, contents, ddmStructureKeys, ddmTemplateKeys, displayDateGT, displayDateLT, reviewDate, andOperator, queryDefinition, false); } protected int doCountByG_F( long groupId, List<Long> folderIds, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), COUNT_BY_G_F, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); } sql = StringUtil.replace( sql, "[$FOLDER_ID$]", getFolderIds(folderIds, JournalArticleImpl.TABLE_NAME)); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addScalar(COUNT_COLUMN_NAME, Type.LONG); QueryPos qPos = QueryPos.getInstance(q); qPos.add(groupId); qPos.add(queryDefinition.getStatus()); for (int i = 0; i < folderIds.size(); i++) { Long folderId = folderIds.get(i); qPos.add(folderId); } Iterator<Long> itr = q.iterate(); if (itr.hasNext()) { Long count = itr.next(); if (count != null) { return count.intValue(); } } return 0; } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected int doCountByG_C_S( long groupId, long classNameId, String[] ddmStructureKeys, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), COUNT_BY_G_C_S, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); if (groupId <= 0) { sql = StringUtil.replace( sql, "(JournalArticle.groupId = ?) AND", StringPool.BLANK); } sql = StringUtil.replace( sql, "[$DDM_STRUCTURE_KEY$]", getDDMStructureKeys( ddmStructureKeys, JournalArticleImpl.TABLE_NAME)); if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); } SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addScalar(COUNT_COLUMN_NAME, Type.LONG); QueryPos qPos = QueryPos.getInstance(q); if (groupId > 0) { qPos.add(groupId); } qPos.add(classNameId); qPos.add(ddmStructureKeys); qPos.add(queryDefinition.getStatus()); Iterator<Long> itr = q.iterate(); if (itr.hasNext()) { Long count = itr.next(); if (count != null) { return count.intValue(); } } return 0; } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected int doCountByG_F_C( long groupId, List<Long> folderIds, long classNameId, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), COUNT_BY_G_U_F_C, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); if (folderIds.isEmpty()) { sql = StringUtil.replace( sql, "([$FOLDER_ID$]) AND", StringPool.BLANK); } else { sql = StringUtil.replace( sql, "[$FOLDER_ID$]", getFolderIds(folderIds, JournalArticleImpl.TABLE_NAME)); } if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); } SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addScalar(COUNT_COLUMN_NAME, Type.LONG); QueryPos qPos = QueryPos.getInstance(q); qPos.add(groupId); qPos.add(classNameId); if (queryDefinition.getOwnerUserId() > 0) { qPos.add(queryDefinition.getOwnerUserId()); if (queryDefinition.isIncludeOwner()) { qPos.add(WorkflowConstants.STATUS_IN_TRASH); } } for (long folderId : folderIds) { qPos.add(folderId); } qPos.add(queryDefinition.getStatus()); Iterator<Long> itr = q.iterate(); if (itr.hasNext()) { Long count = itr.next(); if (count != null) { return count.intValue(); } } return 0; } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected int doCountByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String[] articleIds, Double version, String[] titles, String[] descriptions, String[] contents, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { articleIds = CustomSQLUtil.keywords(articleIds, false); titles = CustomSQLUtil.keywords(titles); descriptions = CustomSQLUtil.keywords(descriptions, false); contents = CustomSQLUtil.keywords(contents, false); ddmStructureKeys = CustomSQLUtil.keywords(ddmStructureKeys, false); ddmTemplateKeys = CustomSQLUtil.keywords(ddmTemplateKeys, false); Timestamp displayDateGT_TS = CalendarUtil.getTimestamp(displayDateGT); Timestamp displayDateLT_TS = CalendarUtil.getTimestamp(displayDateLT); Timestamp reviewDate_TS = CalendarUtil.getTimestamp(reviewDate); Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), COUNT_BY_C_G_F_C_A_V_T_D_C_S_T_D_R, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); if (groupId <= 0) { sql = StringUtil.replace( sql, "(JournalArticle.groupId = ?) AND", StringPool.BLANK); } if (folderIds.isEmpty()) { sql = StringUtil.replace( sql, "([$FOLDER_ID$]) AND", StringPool.BLANK); } else { sql = StringUtil.replace( sql, "[$FOLDER_ID$]", getFolderIds(folderIds, JournalArticleImpl.TABLE_NAME)); } sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.articleId", StringPool.LIKE, false, articleIds); if ((version == null) || (version <= 0)) { sql = StringUtil.replace( sql, "(JournalArticle.version = ?) [$AND_OR_CONNECTOR$]", StringPool.BLANK); } sql = CustomSQLUtil.replaceKeywords( sql, "lower(JournalArticleLocalization.title)", StringPool.LIKE, false, titles); sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticleLocalization.description", StringPool.LIKE, false, descriptions); sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.content", StringPool.LIKE, false, contents); sql = replaceStructureTemplate( sql, ddmStructureKeys, ddmTemplateKeys); if (!isNullArray(ddmStructureKeys)) { sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.DDMStructureKey", StringPool.LIKE, false, ddmStructureKeys); } if (!isNullArray(ddmTemplateKeys)) { sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.DDMTemplateKey", StringPool.LIKE, false, ddmTemplateKeys); } sql = CustomSQLUtil.replaceAndOperator(sql, andOperator); if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); sql = StringUtil.replace( sql, "(companyId", "(JournalArticle.companyId"); } SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addScalar(COUNT_COLUMN_NAME, Type.LONG); QueryPos qPos = QueryPos.getInstance(q); qPos.add(companyId); if (groupId > 0) { qPos.add(groupId); } for (long folderId : folderIds) { qPos.add(folderId); } qPos.add(classNameId); qPos.add(queryDefinition.getStatus()); if (!isNullArray(ddmStructureKeys)) { qPos.add(ddmStructureKeys, 2); } if (!isNullArray(ddmTemplateKeys)) { qPos.add(ddmTemplateKeys, 2); } qPos.add(articleIds, 2); if ((version != null) && (version > 0)) { qPos.add(version); } qPos.add(titles, 2); qPos.add(descriptions, 2); qPos.add(contents, 2); qPos.add(displayDateGT_TS); qPos.add(displayDateGT_TS); qPos.add(displayDateLT_TS); qPos.add(displayDateLT_TS); qPos.add(reviewDate_TS); qPos.add(reviewDate_TS); Iterator<Long> itr = q.iterate(); if (itr.hasNext()) { Long count = itr.next(); if (count != null) { return count.intValue(); } } return 0; } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected List<JournalArticle> doFindByG_F( long groupId, List<Long> folderIds, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), FIND_BY_G_F, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); sql = CustomSQLUtil.replaceOrderBy( sql, queryDefinition.getOrderByComparator("JournalArticle")); if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); } sql = StringUtil.replace( sql, "[$FOLDER_ID$]", getFolderIds(folderIds, JournalArticleImpl.TABLE_NAME)); SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(groupId); qPos.add(queryDefinition.getStatus()); for (int i = 0; i < folderIds.size(); i++) { Long folderId = folderIds.get(i); qPos.add(folderId); } return (List<JournalArticle>)QueryUtil.list( q, getDialect(), queryDefinition.getStart(), queryDefinition.getEnd()); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected List<JournalArticle> doFindByG_C_S( long groupId, long classNameId, String[] ddmStructureKeys, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), FIND_BY_G_C_S, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); sql = CustomSQLUtil.replaceOrderBy( sql, queryDefinition.getOrderByComparator("JournalArticle")); if (groupId <= 0) { sql = StringUtil.replace( sql, "(JournalArticle.groupId = ?) AND", StringPool.BLANK); } sql = StringUtil.replace( sql, "[$DDM_STRUCTURE_KEY$]", getDDMStructureKeys( ddmStructureKeys, JournalArticleImpl.TABLE_NAME)); if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); } SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); if (groupId > 0) { qPos.add(groupId); } qPos.add(classNameId); qPos.add(ddmStructureKeys); qPos.add(queryDefinition.getStatus()); return (List<JournalArticle>)QueryUtil.list( q, getDialect(), queryDefinition.getStart(), queryDefinition.getEnd()); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected List<JournalArticle> doFindByG_F_C( long groupId, List<Long> folderIds, long classNameId, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), FIND_BY_G_U_F_C, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); sql = CustomSQLUtil.replaceOrderBy( sql, queryDefinition.getOrderByComparator("JournalArticle")); if (folderIds.isEmpty()) { sql = StringUtil.replace( sql, "([$FOLDER_ID$]) AND", StringPool.BLANK); } else { sql = StringUtil.replace( sql, "[$FOLDER_ID$]", getFolderIds(folderIds, JournalArticleImpl.TABLE_NAME)); } if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); } SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(groupId); qPos.add(classNameId); if (queryDefinition.getOwnerUserId() > 0) { qPos.add(queryDefinition.getOwnerUserId()); if (queryDefinition.isIncludeOwner()) { qPos.add(WorkflowConstants.STATUS_IN_TRASH); } } for (long folderId : folderIds) { qPos.add(folderId); } qPos.add(queryDefinition.getStatus()); return (List<JournalArticle>)QueryUtil.list( q, getDialect(), queryDefinition.getStart(), queryDefinition.getEnd()); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected List<JournalArticle> doFindByC_G_F_C_A_V_T_D_C_S_T_D_R( long companyId, long groupId, List<Long> folderIds, long classNameId, String[] articleIds, Double version, String[] titles, String[] descriptions, String[] contents, String[] ddmStructureKeys, String[] ddmTemplateKeys, Date displayDateGT, Date displayDateLT, Date reviewDate, boolean andOperator, QueryDefinition<JournalArticle> queryDefinition, boolean inlineSQLHelper) { articleIds = CustomSQLUtil.keywords(articleIds, false); titles = CustomSQLUtil.keywords(titles); descriptions = CustomSQLUtil.keywords(descriptions, false); contents = CustomSQLUtil.keywords(contents, false); ddmStructureKeys = CustomSQLUtil.keywords(ddmStructureKeys, false); ddmTemplateKeys = CustomSQLUtil.keywords(ddmTemplateKeys, false); Timestamp displayDateGT_TS = CalendarUtil.getTimestamp(displayDateGT); Timestamp displayDateLT_TS = CalendarUtil.getTimestamp(displayDateLT); Timestamp reviewDate_TS = CalendarUtil.getTimestamp(reviewDate); Session session = null; try { session = openSession(); String sql = CustomSQLUtil.get( getClass(), FIND_BY_C_G_F_C_A_V_T_D_C_S_T_D_R, queryDefinition, "JournalArticle"); sql = replaceStatusJoin(sql, queryDefinition); if (groupId <= 0) { sql = StringUtil.replace( sql, "(JournalArticle.groupId = ?) AND", StringPool.BLANK); } if (folderIds.isEmpty()) { sql = StringUtil.replace( sql, "([$FOLDER_ID$]) AND", StringPool.BLANK); } else { sql = StringUtil.replace( sql, "[$FOLDER_ID$]", getFolderIds(folderIds, JournalArticleImpl.TABLE_NAME)); } sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.articleId", StringPool.LIKE, false, articleIds); if ((version == null) || (version <= 0)) { sql = StringUtil.replace( sql, "(JournalArticle.version = ?) [$AND_OR_CONNECTOR$]", StringPool.BLANK); } sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticleLocalization.title", StringPool.LIKE, false, titles); sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticleLocalization.description", StringPool.LIKE, true, descriptions); sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.content", StringPool.LIKE, false, contents); sql = replaceStructureTemplate( sql, ddmStructureKeys, ddmTemplateKeys); if (!isNullArray(ddmStructureKeys)) { sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.DDMStructureKey", StringPool.LIKE, false, ddmStructureKeys); } if (!isNullArray(ddmTemplateKeys)) { sql = CustomSQLUtil.replaceKeywords( sql, "JournalArticle.DDMTemplateKey", StringPool.LIKE, false, ddmTemplateKeys); } sql = CustomSQLUtil.replaceAndOperator(sql, andOperator); sql = CustomSQLUtil.replaceOrderBy( sql, queryDefinition.getOrderByComparator("JournalArticle")); if (inlineSQLHelper) { sql = InlineSQLHelperUtil.replacePermissionCheck( sql, JournalArticle.class.getName(), "JournalArticle.resourcePrimKey", groupId); sql = StringUtil.replace( sql, "(companyId", "(JournalArticle.companyId"); } SQLQuery q = session.createSynchronizedSQLQuery(sql); q.addEntity( JournalArticleImpl.TABLE_NAME, JournalArticleImpl.class); QueryPos qPos = QueryPos.getInstance(q); qPos.add(titles, 2); qPos.add(descriptions, 2); qPos.add(companyId); if (groupId > 0) { qPos.add(groupId); } for (long folderId : folderIds) { qPos.add(folderId); } qPos.add(classNameId); qPos.add(queryDefinition.getStatus()); if (!isNullArray(ddmStructureKeys)) { qPos.add(ddmStructureKeys, 2); } if (!isNullArray(ddmTemplateKeys)) { qPos.add(ddmTemplateKeys, 2); } qPos.add(articleIds, 2); if ((version != null) && (version > 0)) { qPos.add(version); } qPos.add(contents, 2); qPos.add(displayDateGT_TS); qPos.add(displayDateGT_TS); qPos.add(displayDateLT_TS); qPos.add(displayDateLT_TS); qPos.add(reviewDate_TS); qPos.add(reviewDate_TS); return (List<JournalArticle>)QueryUtil.list( q, getDialect(), queryDefinition.getStart(), queryDefinition.getEnd()); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); } } protected String getDDMStructureKeys( String[] ddmStructureKeys, String tableName) { if (ArrayUtil.isEmpty(ddmStructureKeys)) { return StringPool.BLANK; } StringBundler sb = new StringBundler(ddmStructureKeys.length * 3 + 1); sb.append(StringPool.OPEN_PARENTHESIS); for (int i = 0; i < ddmStructureKeys.length; i++) { sb.append(tableName); sb.append(".DDMStructureKey = ? "); sb.append(WHERE_OR); } sb.setIndex(sb.index() - 1); sb.append(StringPool.CLOSE_PARENTHESIS); return sb.toString(); } protected String getFolderIds(List<Long> folderIds, String tableName) { if (folderIds.isEmpty()) { return StringPool.BLANK; } StringBundler sb = new StringBundler(folderIds.size() * 3 + 1); sb.append(StringPool.OPEN_PARENTHESIS); for (int i = 0; i < folderIds.size(); i++) { sb.append(tableName); sb.append(".folderId = ? "); if ((i + 1) != folderIds.size()) { sb.append(WHERE_OR); } } sb.append(StringPool.CLOSE_PARENTHESIS); return sb.toString(); } protected JournalArticle getLatestArticle( long groupId, String articleId, int status) { List<JournalArticle> articles = null; if (status == WorkflowConstants.STATUS_ANY) { articles = JournalArticleUtil.findByG_A(groupId, articleId, 0, 1); } else { articles = JournalArticleUtil.findByG_A_ST( groupId, articleId, status, 0, 1); } if (articles.isEmpty()) { return null; } return articles.get(0); } protected boolean isdatabaseContentKeywordSearchEnabled(long companyId) { JournalServiceConfiguration journalServiceConfiguration = null; try { journalServiceConfiguration = ConfigurationProviderUtil.getCompanyConfiguration( JournalServiceConfiguration.class, companyId); } catch (Exception e) { _log.error(e, e); } if (journalServiceConfiguration == null) { return false; } return journalServiceConfiguration.databaseContentKeywordSearchEnabled(); } protected boolean isNullArray(Object[] array) { if (ArrayUtil.isEmpty(array)) { return true; } for (Object obj : array) { if (Validator.isNotNull(obj)) { return false; } } return true; } protected String replaceStatusJoin( String sql, QueryDefinition<JournalArticle> queryDefinition) { if (queryDefinition.getStatus() == WorkflowConstants.STATUS_ANY) { return StringUtil.replace( sql, "[$STATUS_JOIN$] AND", StringPool.BLANK); } if (queryDefinition.isExcludeStatus()) { StringBundler sb = new StringBundler(5); sb.append("(JournalArticle.status != "); sb.append(queryDefinition.getStatus()); sb.append(") AND (tempJournalArticle.status != "); sb.append(queryDefinition.getStatus()); sb.append(")"); sql = StringUtil.replace(sql, "[$STATUS_JOIN$]", sb.toString()); } else { StringBundler sb = new StringBundler(5); sb.append("(JournalArticle.status = "); sb.append(queryDefinition.getStatus()); sb.append(") AND (tempJournalArticle.status = "); sb.append(queryDefinition.getStatus()); sb.append(")"); sql = StringUtil.replace(sql, "[$STATUS_JOIN$]", sb.toString()); } return sql; } protected String replaceStructureTemplate( String sql, String[] ddmStructureKeys, String[] ddmTemplateKeys) { if (isNullArray(ddmStructureKeys) && isNullArray(ddmTemplateKeys)) { return StringUtil.replace( sql, "([$STRUCTURE_TEMPLATE$]) AND", StringPool.BLANK); } StringBundler sb = new StringBundler(3); if (!isNullArray(ddmStructureKeys)) { sb.append(_DDM_STRUCTURE_KEY_SQL); } if (!isNullArray(ddmTemplateKeys)) { if (!isNullArray(ddmStructureKeys)) { sb.append(_AND_OR_CONNECTOR); } sb.append(_DDM_TEMPLATE_KEY_SQL); } return StringUtil.replace(sql, "[$STRUCTURE_TEMPLATE$]", sb.toString()); } private static final String _AND_OR_CONNECTOR = "[$AND_OR_CONNECTOR$] "; private static final String _DDM_STRUCTURE_KEY_SQL = "(JournalArticle.DDMStructureKey LIKE ? [$AND_OR_NULL_CHECK$]) "; private static final String _DDM_TEMPLATE_KEY_SQL = "(JournalArticle.DDMTemplateKey LIKE ? [$AND_OR_NULL_CHECK$]) "; private static final Log _log = LogFactoryUtil.getLog( JournalArticleFinderImpl.class); }