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