/** * 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.content.targeting.rule.visited; import com.liferay.content.targeting.InvalidRuleException; import com.liferay.content.targeting.analytics.service.AnalyticsEventLocalService; import com.liferay.content.targeting.analytics.util.AnalyticsUtil; import com.liferay.content.targeting.anonymous.users.model.AnonymousUser; import com.liferay.content.targeting.api.model.BaseRule; import com.liferay.content.targeting.api.model.Rule; import com.liferay.content.targeting.model.RuleInstance; import com.liferay.content.targeting.model.UserSegment; import com.liferay.content.targeting.rule.categories.BehaviorRuleCategory; import com.liferay.content.targeting.util.ContentTargetingContextUtil; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.lar.PortletDataContext; import com.liferay.portal.kernel.lar.PortletDataException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.model.Layout; import com.liferay.portal.service.LayoutLocalServiceUtil; import com.liferay.portal.theme.ThemeDisplay; import com.liferay.portal.util.PortalUtil; import java.util.Locale; import java.util.Map; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.servlet.http.HttpServletRequest; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; import org.osgi.service.component.annotations.Reference; /** * @author Eudaldo Alonso */ @Component(immediate = true, service = Rule.class) public class PageVisitedRule extends BaseRule { @Activate @Override public void activate() { super.activate(); } @Deactivate @Override public void deActivate() { super.deActivate(); } @Override public boolean evaluate( HttpServletRequest request, RuleInstance ruleInstance, AnonymousUser anonymousUser) throws Exception { long plid = GetterUtil.getLong(ruleInstance.getTypeSettings()); int count = _analyticsEventLocalService.getAnalyticsEventsCount( anonymousUser.getAnonymousUserId(), Layout.class.getName(), plid, "view"); return count > 0; } @Override public void exportData( PortletDataContext portletDataContext, Element userSegmentElement, UserSegment userSegment, Element ruleInstanceElement, RuleInstance ruleInstance) throws Exception { long plid = GetterUtil.getLong(ruleInstance.getTypeSettings()); Layout layout = LayoutLocalServiceUtil.fetchLayout(plid); if (layout != null ) { ruleInstance.setTypeSettings(layout.getUuid()); portletDataContext.addReferenceElement( ruleInstance, ruleInstanceElement, layout, PortletDataContext.REFERENCE_TYPE_WEAK, true); return; } throw new PortletDataException( getExportImportErrorMessage( userSegment, ruleInstance, Layout.class.getName(), String.valueOf(plid), Constants.EXPORT)); } @Override public String getIcon() { return "icon-file"; } @Override public String getRuleCategoryKey() { return BehaviorRuleCategory.KEY; } @Override public String getSummary(RuleInstance ruleInstance, Locale locale) { long plid = GetterUtil.getLong(ruleInstance.getTypeSettings()); Layout layout = null; try { layout = LayoutLocalServiceUtil.fetchLayout(plid); } catch (SystemException e) { } if (layout != null) { return layout.getTitle(locale); } return StringPool.BLANK; } @Override public void importData( PortletDataContext portletDataContext, UserSegment userSegment, RuleInstance ruleInstance) throws Exception { String layoutUuid = ruleInstance.getTypeSettings(); Layout layout = LayoutLocalServiceUtil.fetchLayoutByUuidAndCompanyId( layoutUuid, portletDataContext.getCompanyId()); if (layout != null ) { ruleInstance.setTypeSettings(String.valueOf(layout.getPlid())); return; } throw new PortletDataException( getExportImportErrorMessage( userSegment, ruleInstance, Layout.class.getName(), layoutUuid, Constants.IMPORT)); } @Override public String processRule( PortletRequest request, PortletResponse response, String id, Map<String, String> values) throws InvalidRuleException { ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute( WebKeys.THEME_DISPLAY); String friendlyURL = values.get("friendlyURL"); boolean privateLayout = GetterUtil.getBoolean( values.get("privateLayout"), false); try { long liveGroupId = themeDisplay.getSiteGroupIdOrLiveGroupId(); Layout layout = LayoutLocalServiceUtil.fetchLayoutByFriendlyURL( liveGroupId, privateLayout, friendlyURL); if (layout != null) { return String.valueOf(layout.getPlid()); } else { throw new InvalidRuleException( "a-page-with-this-friendly-url-could-not-be-found"); } } catch (Exception e) { throw new InvalidRuleException( "a-page-with-this-friendly-url-could-not-be-found"); } } @Reference public void setAnalyticsEventLocalService( AnalyticsEventLocalService analyticsEventLocalService) { _analyticsEventLocalService = analyticsEventLocalService; } protected String getFormTemplatePath() { return _FORM_TEMPLATE_PATH_PAGE; } @Override protected void populateContext( RuleInstance ruleInstance, Map<String, Object> context, Map<String, String> values) { ThemeDisplay themeDisplay = (ThemeDisplay)context.get("themeDisplay"); String friendlyURLPrivateBase = StringPool.BLANK; String friendlyURLPublicBase = StringPool.BLANK; try { friendlyURLPublicBase = PortalUtil.getGroupFriendlyURL( themeDisplay.getScopeGroup(), false, themeDisplay); friendlyURLPrivateBase = PortalUtil.getGroupFriendlyURL( themeDisplay.getScopeGroup(), true, themeDisplay); } catch (Exception e) { _log.error(e); } String friendlyURL = StringPool.BLANK; boolean privateLayout = false; if (!values.isEmpty()) { friendlyURL = values.get("friendlyURL"); privateLayout = GetterUtil.getBoolean( values.get("privateLayout"), false); } else if (ruleInstance != null) { long plid = GetterUtil.getLong(ruleInstance.getTypeSettings()); try { Layout layout = LayoutLocalServiceUtil.fetchLayout(plid); if (layout != null) { friendlyURL = layout.getFriendlyURL(); privateLayout = layout.isPrivateLayout(); } } catch (SystemException e) { } } context.put("friendlyURL", friendlyURL); context.put("privateLayout", privateLayout); if (privateLayout) { context.put("friendlyURLBase", friendlyURLPrivateBase); } else { context.put("friendlyURLBase", friendlyURLPublicBase); } context.put("friendlyURLPublicBase", friendlyURLPublicBase); context.put("friendlyURLPrivateBase", friendlyURLPrivateBase); long groupId = (Long)context.get("scopeGroupId"); boolean trackingPageEnabled = AnalyticsUtil.isAnalyticsPageEnabled( groupId); context.put("trackingPageEnabled", trackingPageEnabled); if (!trackingPageEnabled) { ContentTargetingContextUtil.populateContextAnalyticsSettingsURLs( context); } } private static final String _FORM_TEMPLATE_PATH_PAGE = "templates/ct_fields_page.ftl"; private static Log _log = LogFactoryUtil.getLog(PageVisitedRule.class); private AnalyticsEventLocalService _analyticsEventLocalService; }