001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
040     * @author Edward Han
041     */
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    }