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("No rule handler registered for type " + rule.getType());
119 }
120
121 return false;
122 }
123
124 protected MDRRuleGroupInstance evaluateRuleGroupInstances(
125 String className, long classPK, ThemeDisplay themeDisplay)
126 throws SystemException {
127
128 List<MDRRuleGroupInstance> mdrRuleGroupInstances =
129 _mdrRuleGroupInstanceLocalService.getRuleGroupInstances(
130 className, classPK, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
131 new RuleGroupInstancePriorityComparator());
132
133 for (MDRRuleGroupInstance mdrRuleGroupInstance :
134 mdrRuleGroupInstances) {
135
136 MDRRuleGroup mdrRuleGroup =
137 _mdrRuleGroupLocalService.fetchRuleGroup(
138 mdrRuleGroupInstance.getRuleGroupId());
139
140 if (mdrRuleGroup == null) {
141 if (_log.isWarnEnabled()) {
142 _log.warn(
143 "Rule group instance " +
144 mdrRuleGroupInstance.getRuleGroupInstanceId() +
145 " has invalid rule group");
146 }
147
148 continue;
149 }
150
151 Collection<MDRRule> mdrRules = mdrRuleGroup.getRules();
152
153 for (MDRRule mdrRule : mdrRules) {
154 if (evaluateRule(mdrRule, themeDisplay)) {
155 return mdrRuleGroupInstance;
156 }
157 }
158 }
159
160 return null;
161 }
162
163 private static Log _log = LogFactoryUtil.getLog(
164 DefaultRuleGroupProcessorImpl.class);
165
166 @BeanReference(type = MDRRuleGroupInstanceLocalService.class)
167 private MDRRuleGroupInstanceLocalService _mdrRuleGroupInstanceLocalService;
168 @BeanReference(type = MDRRuleGroupLocalService.class)
169 private MDRRuleGroupLocalService _mdrRuleGroupLocalService;
170 private Map<String, RuleHandler> _ruleHandlers =
171 new HashMap<String, RuleHandler>();
172
173 }