001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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(
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    }