/**
* 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.hook.events;
import com.liferay.content.targeting.anonymous.users.model.AnonymousUser;
import com.liferay.content.targeting.anonymous.users.util.AnonymousUsersManager;
import com.liferay.content.targeting.api.model.RulesEngine;
import com.liferay.content.targeting.api.model.UserSegmentSimulator;
import com.liferay.content.targeting.model.UserSegment;
import com.liferay.content.targeting.service.UserSegmentLocalServiceUtil;
import com.liferay.content.targeting.util.ContentTargetingUtil;
import com.liferay.content.targeting.util.WebKeys;
import com.liferay.osgi.util.service.ServiceTrackerUtil;
import com.liferay.portal.kernel.events.Action;
import com.liferay.portal.kernel.exception.PortalException;
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.util.ArrayUtil;
import com.liferay.portal.theme.ThemeDisplay;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
/**
* @author Eudaldo Alonso
*/
public class UserSegmentPreAction extends Action {
public long[] getMatchesUserSegmentIds(
HttpServletRequest request, long[] groupIds,
AnonymousUser anonymousUser)
throws Exception {
if (ArrayUtil.isEmpty(groupIds)) {
return null;
}
List<Long> userSegmentIds = new ArrayList<Long>();
List<UserSegment> userSegments =
UserSegmentLocalServiceUtil.getUserSegments(groupIds);
for (UserSegment userSegment : userSegments) {
if (matches(request, anonymousUser, userSegment)) {
userSegmentIds.add(userSegment.getUserSegmentId());
}
}
return ArrayUtil.toLongArray(userSegmentIds);
}
public boolean matches(
HttpServletRequest request, AnonymousUser anonymousUser,
UserSegment userSegment)
throws Exception {
if (_rulesEngine == null) {
_intiRulesEngine();
}
return _rulesEngine.matches(
request, anonymousUser, userSegment.getRuleInstances());
}
@Override
public void run(HttpServletRequest request, HttpServletResponse response) {
_intiAnonymousUserManager();
_intiRulesEngine();
long[] userSegmentsIds = getUserSegmentIds(request, response);
if (ArrayUtil.isNotEmpty(userSegmentsIds)) {
request.setAttribute(WebKeys.USER_SEGMENT_IDS, userSegmentsIds);
}
}
protected long[] getGroupIds(HttpServletRequest request)
throws PortalException, SystemException {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
return ContentTargetingUtil.getAncestorsAndCurrentGroupIds(
themeDisplay.getScopeGroupId());
}
protected long[] getUserSegmentIds(
HttpServletRequest request, HttpServletResponse response) {
long[] userSegmentsIds = null;
if (_userSegmentSimulator == null) {
_initUserSegmentSimulator();
}
long[] simulatedUserSegmentsIds =
_userSegmentSimulator.getUserSegmentIds(request, response);
if (simulatedUserSegmentsIds != null) {
request.setAttribute(WebKeys.IS_SIMULATED_USER_SEGMENTS, true);
userSegmentsIds = simulatedUserSegmentsIds;
}
if (_anonymousUsersManager == null) {
_intiAnonymousUserManager();
}
try {
AnonymousUser anonymousUser =
_anonymousUsersManager.getAnonymousUser(request, response);
long[] groupIds = getGroupIds(request);
long[] originalUserSegmentIds = getMatchesUserSegmentIds(
request, groupIds, anonymousUser);
if (userSegmentsIds == null) {
userSegmentsIds = originalUserSegmentIds;
}
request.setAttribute(
WebKeys.ORIGINAL_USER_SEGMENT_IDS, originalUserSegmentIds);
}
catch (Exception e) {
_log.error(
"Some Audience Targeting services are not available. " +
"Please restart the server");
}
return userSegmentsIds;
}
private void _initUserSegmentSimulator() {
Bundle bundle = FrameworkUtil.getBundle(getClass());
_userSegmentSimulator = ServiceTrackerUtil.getService(
UserSegmentSimulator.class, bundle.getBundleContext());
}
private void _intiAnonymousUserManager() {
Bundle bundle = FrameworkUtil.getBundle(getClass());
_anonymousUsersManager = ServiceTrackerUtil.getService(
AnonymousUsersManager.class, bundle.getBundleContext());
}
private void _intiRulesEngine() {
Bundle bundle = FrameworkUtil.getBundle(getClass());
_rulesEngine = ServiceTrackerUtil.getService(
RulesEngine.class, bundle.getBundleContext());
}
private static Log _log = LogFactoryUtil.getLog(UserSegmentPreAction.class);
private AnonymousUsersManager _anonymousUsersManager;
private RulesEngine _rulesEngine;
private UserSegmentSimulator _userSegmentSimulator;
}