package org.openhab.domain.rule;
import org.openhab.domain.INotificationSender;
import org.openhab.domain.IOpenHABWidgetControl;
import org.openhab.domain.user.AccessModifier;
import org.openhab.domain.util.StringHandler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
/**
* Created by Tony Alpskog in 2014.
*/
public class RuleProvider implements IRuleProvider {
private final INotificationSender mINotificationSender;
private final IOpenHABWidgetControl mWidgetControl;
private final Map<String, List<Rule>> mUserRules;
private final Map<AccessModifier, List<Rule>> mRulesAccessMap;
@Inject
public RuleProvider(INotificationSender INotificationSender,
IOpenHABWidgetControl widgetControl) {
mINotificationSender = INotificationSender;
mWidgetControl = widgetControl;
mUserRules = new HashMap<String,List<Rule>>();
mRulesAccessMap = new HashMap<AccessModifier, List<Rule>>();
}
@Override
public List<Rule> getUserRules(String userId) {
if(!mUserRules.containsKey(userId))
return new ArrayList<Rule>();
return mUserRules.get(userId);
}
@Override
public Rule getUserRule(String userId, String ruleId) {
if(ruleId == null || userId == null)
return null;
List<Rule> ruleList = getUserRules(userId);
for(Rule rule : ruleList) {
if(ruleId.equalsIgnoreCase(rule.getRuleId().toString()))
return rule;
}
return null;
}
@Override
public List<Rule> getPublicRules() {
List<Rule> result = new ArrayList<Rule>();
result.addAll(mRulesAccessMap.get(AccessModifier.ReadOnly));
result.addAll(mRulesAccessMap.get(AccessModifier.Writable));
return result;
}
@Override
public void saveRule(Rule rule, String userId) {
if(mUserRules.get(userId) == null)
mUserRules.put(userId, new ArrayList<Rule>());
if(mRulesAccessMap.get(rule.getAccess()) == null)
mRulesAccessMap.put(rule.getAccess(), new ArrayList<Rule>());
for(AccessModifier accessModifier : AccessModifier.values()) {
if (mUserRules.get(userId) != null && mUserRules.get(userId).contains(rule))
mUserRules.get(userId).remove(rule);
if(mRulesAccessMap.get(accessModifier) != null && mRulesAccessMap.get(accessModifier).contains(rule))
mRulesAccessMap.get(accessModifier).remove(rule);
break;
}
mUserRules.get(userId).add(rule);
mRulesAccessMap.get(rule.getAccess()).add(rule);
}
@Override
public Rule createNewRule(String userId, AccessModifier accessModifier, String ruleName) {
if(StringHandler.isNullOrEmpty(userId))
throw new IllegalArgumentException("userId is null or empty");
String name = StringHandler.isNullOrEmpty(ruleName)? "New rule" : ruleName;
Rule rule = new Rule(ruleName, mWidgetControl, mINotificationSender);
if(accessModifier != null)
rule.setAccess(accessModifier);
saveRule(rule, userId);
return rule;
}
}