001    /**
002     * Copyright (c) 2000-2012 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.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    /**
041     * @author Edward Han
042     */
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    }