001
014
015 package com.liferay.portal.mobile.device.rulegroup;
016
017 import com.liferay.portal.kernel.bean.BeanReference;
018 import com.liferay.portal.kernel.dao.orm.QueryUtil;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.kernel.mobile.device.rulegroup.RuleGroupProcessor;
023 import com.liferay.portal.kernel.mobile.device.rulegroup.rule.RuleHandler;
024 import com.liferay.portal.model.Layout;
025 import com.liferay.portal.model.LayoutSet;
026 import com.liferay.portal.theme.ThemeDisplay;
027 import com.liferay.portlet.mobiledevicerules.model.MDRRule;
028 import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroup;
029 import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroupInstance;
030 import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceLocalService;
031 import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupLocalService;
032 import com.liferay.portlet.mobiledevicerules.util.RuleGroupInstancePriorityComparator;
033
034 import java.util.Collection;
035 import java.util.Collections;
036 import java.util.HashMap;
037 import java.util.List;
038 import java.util.Map;
039
040
043 public class DefaultRuleGroupProcessorImpl implements RuleGroupProcessor {
044
045 public MDRRuleGroupInstance evaluateRuleGroups(ThemeDisplay themeDisplay)
046 throws SystemException {
047
048 Layout layout = themeDisplay.getLayout();
049
050 MDRRuleGroupInstance mdrRuleGroupInstance = evaluateRuleGroupInstances(
051 Layout.class.getName(), layout.getPlid(), themeDisplay);
052
053 if (mdrRuleGroupInstance != null) {
054 return mdrRuleGroupInstance;
055 }
056
057 LayoutSet layoutSet = themeDisplay.getLayoutSet();
058
059 mdrRuleGroupInstance = evaluateRuleGroupInstances(
060 LayoutSet.class.getName(), layoutSet.getLayoutSetId(),
061 themeDisplay);
062
063 return mdrRuleGroupInstance;
064 }
065
066 public RuleHandler getRuleHandler(String ruleType) {
067 return _ruleHandlers.get(ruleType);
068 }
069
070 public Collection<RuleHandler> getRuleHandlers() {
071 return Collections.unmodifiableCollection(_ruleHandlers.values());
072 }
073
074 public Collection<String> getRuleHandlerTypes() {
075 return _ruleHandlers.keySet();
076 }
077
078 public void registerRuleHandler(RuleHandler ruleHandler) {
079 RuleHandler oldRuleHandler = _ruleHandlers.put(
080 ruleHandler.getType(), ruleHandler);
081
082 if ((oldRuleHandler != null) && _log.isWarnEnabled()) {
083 _log.warn(
084 "Replacing existing rule handler type " +
085 ruleHandler.getType());
086 }
087 }
088
089 public void setMDRRuleGroupInstanceLocalService(
090 MDRRuleGroupInstanceLocalService mdrRuleGroupInstanceLocalService) {
091
092 _mdrRuleGroupInstanceLocalService = mdrRuleGroupInstanceLocalService;
093 }
094
095 public void setMDRRuleGroupLocalService(
096 MDRRuleGroupLocalService mdrRuleGroupLocalService) {
097
098 _mdrRuleGroupLocalService = mdrRuleGroupLocalService;
099 }
100
101 public void setRuleHandlers(Collection<RuleHandler> ruleHandlers) {
102 for (RuleHandler ruleHandler : ruleHandlers) {
103 registerRuleHandler(ruleHandler);
104 }
105 }
106
107 public RuleHandler unregisterRuleHandler(String ruleType) {
108 return _ruleHandlers.remove(ruleType);
109 }
110
111 protected boolean evaluateRule(MDRRule rule, ThemeDisplay themeDisplay) {
112 RuleHandler ruleHandler = _ruleHandlers.get(rule.getType());
113
114 if (ruleHandler != null) {
115 return ruleHandler.evaluateRule(rule, themeDisplay);
116 }
117 else if (_log.isWarnEnabled()) {
118 _log.warn(
119 "No rule handler registered for type " + rule.getType());
120 }
121
122 return false;
123 }
124
125 protected MDRRuleGroupInstance evaluateRuleGroupInstances(
126 String className, long classPK, ThemeDisplay themeDisplay)
127 throws SystemException {
128
129 List<MDRRuleGroupInstance> mdrRuleGroupInstances =
130 _mdrRuleGroupInstanceLocalService.getRuleGroupInstances(
131 className, classPK, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
132 new RuleGroupInstancePriorityComparator());
133
134 for (MDRRuleGroupInstance mdrRuleGroupInstance :
135 mdrRuleGroupInstances) {
136
137 MDRRuleGroup mdrRuleGroup =
138 _mdrRuleGroupLocalService.fetchRuleGroup(
139 mdrRuleGroupInstance.getRuleGroupId());
140
141 if (mdrRuleGroup == null) {
142 if (_log.isWarnEnabled()) {
143 _log.warn(
144 "Rule group instance " +
145 mdrRuleGroupInstance.getRuleGroupInstanceId() +
146 " has invalid rule group");
147 }
148
149 continue;
150 }
151
152 Collection<MDRRule> mdrRules = mdrRuleGroup.getRules();
153
154 for (MDRRule mdrRule : mdrRules) {
155 if (evaluateRule(mdrRule, themeDisplay)) {
156 return mdrRuleGroupInstance;
157 }
158 }
159 }
160
161 return null;
162 }
163
164 private static Log _log = LogFactoryUtil.getLog(
165 DefaultRuleGroupProcessorImpl.class);
166
167 @BeanReference(type = MDRRuleGroupInstanceLocalService.class)
168 private MDRRuleGroupInstanceLocalService _mdrRuleGroupInstanceLocalService;
169 @BeanReference(type = MDRRuleGroupLocalService.class)
170 private MDRRuleGroupLocalService _mdrRuleGroupLocalService;
171 private Map<String, RuleHandler> _ruleHandlers =
172 new HashMap<String, RuleHandler>();
173
174 }