/*******************************************************************************
*
* Copyright (c) 2016 Bosch Software Innovations GmbH and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* The Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
*******************************************************************************/
package org.eclipse.smarthome.automation.core.internal.template;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.eclipse.smarthome.automation.Action;
import org.eclipse.smarthome.automation.Condition;
import org.eclipse.smarthome.automation.Trigger;
import org.eclipse.smarthome.automation.template.RuleTemplate;
import org.eclipse.smarthome.automation.template.RuleTemplateProvider;
import org.eclipse.smarthome.automation.template.TemplateProvider;
import org.eclipse.smarthome.automation.template.TemplateRegistry;
import org.eclipse.smarthome.config.core.ConfigDescriptionParameter;
import org.eclipse.smarthome.config.core.Configuration;
import org.eclipse.smarthome.core.common.registry.AbstractRegistry;
import org.eclipse.smarthome.core.common.registry.Provider;
/**
* The implementation of {@link TemplateRegistry} that is registered as a service.
*
* @author Yordan Mihaylov - Initial Contribution
* @author Ana Dimova - TemplateRegistry extends AbstractRegistry
*/
public class RuleTemplateRegistry extends AbstractRegistry<RuleTemplate, String, RuleTemplateProvider>
implements TemplateRegistry<RuleTemplate> {
public RuleTemplateRegistry() {
super(RuleTemplateProvider.class);
}
@Override
protected void addProvider(Provider<RuleTemplate> provider) {
if (provider instanceof TemplateProvider) {
super.addProvider(provider);
}
}
@Override
public RuleTemplate get(String templateUID) {
return get(templateUID, null);
}
@Override
public RuleTemplate get(String templateUID, Locale locale) {
RuleTemplate resultTemplate = null;
for (Provider<RuleTemplate> provider : elementMap.keySet()) {
resultTemplate = ((RuleTemplateProvider) provider).getTemplate(templateUID, locale);
if (resultTemplate != null) {
return createCopy(resultTemplate);
}
}
return null;
}
private RuleTemplate createCopy(RuleTemplate template) {
return new RuleTemplate(template.getUID(), template.getLabel(), template.getDescription(),
new HashSet<String>(template.getTags()), copyTriggers(template.getTriggers()),
copyConditions(template.getConditions()), copyActions(template.getActions()),
new LinkedList<ConfigDescriptionParameter>(template.getConfigurationDescriptions()),
template.getVisibility());
}
private List<Trigger> copyTriggers(List<Trigger> triggers) {
List<Trigger> res = new ArrayList<Trigger>(11);
if (triggers != null) {
for (Trigger t : triggers) {
Configuration c = new Configuration();
c.setProperties(t.getConfiguration().getProperties());
Trigger trigger = new Trigger(t.getId(), t.getTypeUID(), c);
trigger.setLabel(t.getLabel());
trigger.setDescription(t.getDescription());
res.add(trigger);
}
}
return res;
}
private List<Condition> copyConditions(List<Condition> conditions) {
List<Condition> res = new ArrayList<Condition>(11);
if (conditions != null) {
for (Condition c : conditions) {
Configuration conf = new Configuration();
conf.setProperties(c.getConfiguration().getProperties());
Condition condition = new Condition(c.getId(), c.getTypeUID(), conf,
new HashMap<String, String>(c.getInputs()));
condition.setLabel(c.getLabel());
condition.setDescription(c.getDescription());
res.add(condition);
}
}
return res;
}
private List<Action> copyActions(List<Action> actions) {
List<Action> res = new ArrayList<Action>();
if (actions != null) {
for (Action a : actions) {
Configuration c = new Configuration();
c.setProperties(a.getConfiguration().getProperties());
Action action = new Action(a.getId(), a.getTypeUID(), c, a.getInputs());
action.setLabel(a.getLabel());
action.setDescription(a.getDescription());
res.add(action);
}
}
return res;
}
@Override
public Collection<RuleTemplate> getByTag(String tag) {
return getByTag(tag, null);
}
@Override
public Collection<RuleTemplate> getByTag(String tag, Locale locale) {
Collection<RuleTemplate> result = new ArrayList<RuleTemplate>(20);
Collection<RuleTemplate> templates = null;
for (Provider<RuleTemplate> provider : elementMap.keySet()) {
templates = ((RuleTemplateProvider) provider).getTemplates(locale);
if (templates != null) {
for (Iterator< RuleTemplate>it = templates.iterator(); it.hasNext();) {
RuleTemplate t = it.next();
if (tag != null) {
Collection<String> tags = t.getTags();
if (tags != null && tags.contains(tag)) {
result.add(t);
}
} else {
result.add(t);
}
}
}
}
return result;
}
@Override
public Collection<RuleTemplate> getByTags(String... tags) {
return getByTags(null, tags);
}
@Override
public Collection<RuleTemplate> getByTags(Locale locale, String... tags) {
Set<String> tagSet = tags != null ? new HashSet<String>(Arrays.asList(tags)) : null;
Collection<RuleTemplate> result = new ArrayList<RuleTemplate>(20);
Collection<RuleTemplate> templates = null;
for (Provider<RuleTemplate> provider : elementMap.keySet()) {
templates = ((RuleTemplateProvider) provider).getTemplates(locale);
if (templates != null) {
for (Iterator< RuleTemplate>it = templates.iterator(); it.hasNext();) {
RuleTemplate t = it.next();
if (tagSet != null) {
Collection<String> tTags = t.getTags();
if (tTags != null) {
if (tTags.containsAll(tagSet)) {
result.add(t);
}
}
} else {
result.add(t);
}
}
}
}
return result;
}
@Override
public Collection<RuleTemplate> getAll(Locale locale) {
return getByTag(null, locale);
}
}