/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.extensionservice.marketplace.automation.internal;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.Locale;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.eclipse.smarthome.automation.parser.Parser;
import org.eclipse.smarthome.automation.parser.ParsingException;
import org.eclipse.smarthome.automation.template.RuleTemplate;
import org.eclipse.smarthome.automation.template.RuleTemplateProvider;
import org.eclipse.smarthome.core.common.registry.DefaultAbstractManagedProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This is a {@link RuleTemplateProvider}, which gets its content from the marketplace extension service
* and stores it through the ESH storage service.
*
* @author Kai Kreuzer - Initial contribution and API
*
*/
public class MarketplaceRuleTemplateProvider extends DefaultAbstractManagedProvider<RuleTemplate, String>
implements RuleTemplateProvider {
private final Logger logger = LoggerFactory.getLogger(MarketplaceRuleTemplateProvider.class);
private Parser<RuleTemplate> parser;
@Override
public RuleTemplate getTemplate(String uid, Locale locale) {
return get(uid);
}
@Override
public Collection<RuleTemplate> getTemplates(Locale locale) {
return getAll();
}
@Override
protected String getKey(RuleTemplate element) {
return element.getUID();
}
@Override
protected String getStorageName() {
return "org.eclipse.smarthome.extensionservice.marketplace.RuleTemplates";
}
@Override
protected String keyToString(String key) {
return key;
}
protected void setParser(Parser<RuleTemplate> parser) {
this.parser = parser;
}
protected void unsetParser(Parser<RuleTemplate> parser) {
this.parser = null;
}
/**
* This adds a new rule template to the persistent storage.
*
* @param uid the UID to be used for the template
* @param json the template content as a json string
*
* @throws ParsingException if the content cannot be parsed correctly
*/
public void addTemplateAsJSON(String uid, String json) throws ParsingException {
try (InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(json))) {
Set<RuleTemplate> templates = parser.parse(isr);
if (templates.size() != 1) {
throw new IllegalArgumentException("JSON must contain exactly one template!");
} else {
RuleTemplate entry = templates.iterator().next();
RuleTemplate template = new RuleTemplate(uid, entry.getLabel(), entry.getDescription(), entry.getTags(),
entry.getTriggers(), entry.getConditions(), entry.getActions(),
entry.getConfigurationDescriptions(), entry.getVisibility());
add(template);
}
} catch (IOException e) {
logger.error("Cannot close input stream.", e);
}
}
}