/** * 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.report.campaign.tracking.action.service.impl; import com.liferay.content.targeting.analytics.service.AnalyticsEventLocalService; import com.liferay.content.targeting.model.Campaign; import com.liferay.content.targeting.model.ReportInstance; import com.liferay.content.targeting.model.TrackingActionInstance; import com.liferay.content.targeting.report.campaign.tracking.action.CTActionReport; import com.liferay.content.targeting.report.campaign.tracking.action.model.CTActionTotal; import com.liferay.content.targeting.report.campaign.tracking.action.service.base.CTActionTotalLocalServiceBaseImpl; import com.liferay.content.targeting.service.CampaignLocalService; import com.liferay.content.targeting.service.ReportInstanceLocalService; import com.liferay.content.targeting.service.TrackingActionInstanceLocalService; import com.liferay.counter.service.CounterLocalServiceUtil; import com.liferay.osgi.util.service.ServiceTrackerUtil; import com.liferay.portal.kernel.dao.orm.QueryUtil; 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.OrderByComparator; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.service.ServiceContext; import java.util.Date; import java.util.List; import org.osgi.framework.Bundle; import org.osgi.framework.FrameworkUtil; /** * The implementation of the campaign tracking action total local service. * * <p> * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link com.liferay.content.targeting.report.campaign.tracking.action.service.CTActionTotalLocalService} interface. * * <p> * This is a local service. Methods of this service will not have security checks based on the propagated JAAS credentials because this service can only be accessed from within the same VM. * </p> * * @author Brian Wing Shun Chan * @see com.liferay.content.targeting.report.campaign.tracking.action.service.base.CTActionTotalLocalServiceBaseImpl * @see com.liferay.content.targeting.report.campaign.tracking.action.service.CTActionTotalLocalServiceUtil */ public class CTActionTotalLocalServiceImpl extends CTActionTotalLocalServiceBaseImpl { public CTActionTotalLocalServiceImpl() { _initServices(); } @Override public CTActionTotal addCTActionTotal( long campaignId, String alias, String referrerClassName, long referrerClassPK, String eventType, int count) throws PortalException, SystemException { return addCTActionTotal( campaignId, alias, referrerClassName, referrerClassPK, StringPool.BLANK, eventType, count); } @Override public CTActionTotal addCTActionTotal( long campaignId, String alias, String referrerClassName, long referrerClassPK, String elementId, String eventType, int count) throws PortalException, SystemException { CTActionTotal ctActionTotal = getCTActionTotal( campaignId, referrerClassName, referrerClassPK, elementId, eventType); if (ctActionTotal == null) { long ctActionTotalId = CounterLocalServiceUtil.increment(); ctActionTotal = ctActionTotalPersistence.create(ctActionTotalId); ctActionTotal.setCampaignId(campaignId); ctActionTotal.setAlias(alias); ctActionTotal.setReferrerClassName(referrerClassName); ctActionTotal.setReferrerClassPK(referrerClassPK); ctActionTotal.setElementId(elementId); ctActionTotal.setEventType(eventType); } ctActionTotal.setCount(ctActionTotal.getCount() + count); ctActionTotal.setModifiedDate(new Date()); ctActionTotalPersistence.update(ctActionTotal); return ctActionTotal; } @Override public CTActionTotal addCTActionTotal( long campaignId, String alias, String elementId, String eventType, int count) throws PortalException, SystemException { return addCTActionTotal( campaignId, alias, StringPool.BLANK, -1, elementId, eventType, count); } @Override public void checkCTActionTotalEvents() throws PortalException, SystemException { try { List<Campaign> campaigns = _campaignLocalService.getCampaigns( QueryUtil.ALL_POS, QueryUtil.ALL_POS); ServiceContext serviceContext = new ServiceContext(); for (Campaign campaign : campaigns) { checkCTActionTotalEvents(campaign.getCampaignId()); serviceContext.setScopeGroupId(campaign.getGroupId()); _reportInstanceLocalService.addReportInstance( campaign.getUserId(), CTActionReport.class.getSimpleName(), Campaign.class.getName(), campaign.getCampaignId(), StringPool.BLANK, serviceContext); } } catch (NullPointerException npe) { if (_log.isWarnEnabled()) { _log.warn("Content Targeting API Services are not available"); } } } @Override public void checkCTActionTotalEvents(long campaignId) throws PortalException, SystemException { Date modifiedDate = null; ReportInstance reportInstance = _reportInstanceLocalService.fetchReportInstance( CTActionReport.class.getSimpleName(), Campaign.class.getName(), campaignId); if (reportInstance != null) { modifiedDate = reportInstance.getModifiedDate(); } List<CTActionTotal> ctActionTotals = ctActionTotalPersistence.findByCampaignId(campaignId); for (CTActionTotal ctActionTotal : ctActionTotals) { if (_trackingActionInstaceLocalService.fetchTrackingActionInstance( campaignId, ctActionTotal.getAlias()) == null) { ctActionTotalPersistence.remove( ctActionTotal.getCTActionTotalId()); } } addCTActionsTotalFromAnalyticsWithElementId(campaignId, modifiedDate); addCTActionsTotalFromAnalyticsWithClassName(campaignId, modifiedDate); } @Override public List<CTActionTotal> getCTActionsTotal(long campaignId) throws PortalException, SystemException { return ctActionTotalPersistence.findByCampaignId(campaignId); } @Override public List<CTActionTotal> getCTActionsTotal( long campaignId, Date modifiedDate) throws PortalException, SystemException { return ctActionTotalPersistence.findByC_GtD(campaignId, modifiedDate); } @Override public List<CTActionTotal> getCTActionsTotal( long campaignId, int start, int end, OrderByComparator orderByComparator) throws PortalException, SystemException { return ctActionTotalPersistence.findByCampaignId( campaignId, start, end, orderByComparator); } @Override public int getCTActionsTotalCount(long campaignId) throws PortalException, SystemException { return ctActionTotalPersistence.countByCampaignId(campaignId); } @Override public CTActionTotal getCTActionTotal( long campaignId, String referrerClassName, long referrerClassPK, String elementId, String eventType) throws PortalException, SystemException { return ctActionTotalPersistence.fetchByC_R_R_E_E( campaignId, referrerClassName, referrerClassPK, elementId, eventType); } protected void addCTActionsTotalFromAnalyticsWithClassName( long campaignId, Date date) throws PortalException, SystemException { List<Object[]> ctActionTotalAnalyticsList = ctActionTotalFinder.findByAnalyticsWithClassName(date); for (Object[] ctActionTotalAnalytics : ctActionTotalAnalyticsList) { String className = (String)ctActionTotalAnalytics[0]; long classPK = (Long)ctActionTotalAnalytics[1]; String eventType = (String)ctActionTotalAnalytics[2]; int count = (Integer)ctActionTotalAnalytics[3]; List<TrackingActionInstance> trackingActionInstances = _trackingActionInstaceLocalService.getTrackingActionInstances( campaignId, className, classPK, eventType); if (trackingActionInstances.isEmpty()) { continue; } TrackingActionInstance trackingActionInstance = trackingActionInstances.get(0); addCTActionTotal( campaignId, trackingActionInstance.getAlias(), className, classPK, eventType, count); } } protected void addCTActionsTotalFromAnalyticsWithElementId( long campaignId, Date date) throws PortalException, SystemException { if (date == null) { date = _analyticsEventLocalService.getMaxAge(); } List<Object[]> ctActionTotalAnalyticsList = ctActionTotalFinder.findByAnalyticsWithElementId(date); for (Object[] ctActionTotalAnalytics : ctActionTotalAnalyticsList) { String elementId = (String)ctActionTotalAnalytics[0]; String eventType = (String)ctActionTotalAnalytics[1]; int count = (Integer)ctActionTotalAnalytics[2]; List<TrackingActionInstance> trackingActionInstances = _trackingActionInstaceLocalService.getTrackingActionInstances( campaignId, elementId, eventType); if (trackingActionInstances.isEmpty()) { continue; } TrackingActionInstance trackingActionInstance = trackingActionInstances.get(0); addCTActionTotal( campaignId, trackingActionInstance.getAlias(), elementId, eventType, count); } } private void _initServices() { Bundle bundle = FrameworkUtil.getBundle(getClass()); _analyticsEventLocalService = ServiceTrackerUtil.getService( AnalyticsEventLocalService.class, bundle.getBundleContext()); _campaignLocalService = ServiceTrackerUtil.getService( CampaignLocalService.class, bundle.getBundleContext()); _reportInstanceLocalService = ServiceTrackerUtil.getService( ReportInstanceLocalService.class, bundle.getBundleContext()); _trackingActionInstaceLocalService = ServiceTrackerUtil.getService( TrackingActionInstanceLocalService.class, bundle.getBundleContext()); } private static Log _log = LogFactoryUtil.getLog( CTActionTotalLocalServiceImpl.class); private AnalyticsEventLocalService _analyticsEventLocalService; private CampaignLocalService _campaignLocalService; private ReportInstanceLocalService _reportInstanceLocalService; private TrackingActionInstanceLocalService _trackingActionInstaceLocalService; }