/**
* Copyright (c) 2010-2016 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.openhab.binding.xbmc.internal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openhab.binding.xbmc.XbmcBindingProvider;
import org.openhab.core.binding.BindingConfig;
import org.openhab.core.items.Item;
import org.openhab.core.library.items.DimmerItem;
import org.openhab.core.library.items.StringItem;
import org.openhab.core.library.items.SwitchItem;
import org.openhab.model.item.binding.AbstractGenericBindingProvider;
import org.openhab.model.item.binding.BindingConfigParseException;
/**
* This class is responsible for parsing the binding configuration.
*
* @author tlan, Ben Jones
* @since 1.5.0
*/
public class XbmcGenericBindingProvider extends AbstractGenericBindingProvider implements XbmcBindingProvider {
private static final Pattern CONFIG_PATTERN = Pattern.compile(".\\[(.*)\\|(.*)\\]");
@Override
public String getBindingType() {
return "xbmc";
}
@Override
public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException {
if (!(item instanceof StringItem) && !(item instanceof SwitchItem) && !(item instanceof DimmerItem)) {
throw new BindingConfigParseException("item '" + item.getName() + "' is of type '"
+ item.getClass().getSimpleName() + "', but only String, Switch or Dimmer items are allowed.");
}
}
/**
* {@inheritDoc}
*/
@Override
public void processBindingConfiguration(String context, Item item, String bindingConfig)
throws BindingConfigParseException {
super.processBindingConfiguration(context, item, bindingConfig);
if (bindingConfig.startsWith("<")) {
XbmcBindingConfig config = parseIncomingBindingConfig(item, bindingConfig);
addBindingConfig(item, config);
} else if (bindingConfig.startsWith(">")) {
XbmcBindingConfig config = parseOutgoingBindingConfig(item, bindingConfig);
addBindingConfig(item, config);
} else if (bindingConfig.startsWith("=")) {
XbmcBindingConfig config = parseBidirectionalBindingConfig(item, bindingConfig);
addBindingConfig(item, config);
} else {
throw new BindingConfigParseException("Item '" + item.getName() + "' does not start with <, > or =.");
}
}
private XbmcBindingConfig parseBidirectionalBindingConfig(Item item, String bindingConfig)
throws BindingConfigParseException {
Matcher matcher = CONFIG_PATTERN.matcher(bindingConfig);
if (!matcher.matches()) {
throw new BindingConfigParseException("Config for item '" + item.getName() + "' could not be parsed.");
}
String xbmcInstance = matcher.group(1);
String property = matcher.group(2);
return new XbmcBindingConfig(xbmcInstance, property, true, true);
}
private XbmcBindingConfig parseIncomingBindingConfig(Item item, String bindingConfig)
throws BindingConfigParseException {
Matcher matcher = CONFIG_PATTERN.matcher(bindingConfig);
if (!matcher.matches()) {
throw new BindingConfigParseException("Config for item '" + item.getName() + "' could not be parsed.");
}
String xbmcInstance = matcher.group(1);
String property = matcher.group(2);
return new XbmcBindingConfig(xbmcInstance, property, true, false);
}
private XbmcBindingConfig parseOutgoingBindingConfig(Item item, String bindingConfig)
throws BindingConfigParseException {
Matcher matcher = CONFIG_PATTERN.matcher(bindingConfig);
if (!matcher.matches()) {
throw new BindingConfigParseException("Config for item '" + item.getName() + "' could not be parsed.");
}
String xbmcInstance = matcher.group(1);
String property = matcher.group(2);
return new XbmcBindingConfig(xbmcInstance, property, false, true);
}
@Override
public String getXbmcInstance(String itemname) {
XbmcBindingConfig bindingConfig = (XbmcBindingConfig) bindingConfigs.get(itemname);
return bindingConfig.getXbmcInstance();
}
@Override
public String getProperty(String itemname) {
XbmcBindingConfig bindingConfig = (XbmcBindingConfig) bindingConfigs.get(itemname);
return bindingConfig.getProperty();
}
@Override
public boolean isInBound(String itemname) {
XbmcBindingConfig bindingConfig = (XbmcBindingConfig) bindingConfigs.get(itemname);
return bindingConfig != null ? bindingConfig.isInBound() : false;
}
@Override
public boolean isOutBound(String itemname) {
XbmcBindingConfig bindingConfig = (XbmcBindingConfig) bindingConfigs.get(itemname);
return bindingConfig != null ? bindingConfig.isOutBound() : false;
}
class XbmcBindingConfig implements BindingConfig {
private String xbmcInstance;
private String property;
private boolean inBound = false;
private boolean outBound = false;
public XbmcBindingConfig(String xbmcInstance, String property, boolean inBound) {
this.xbmcInstance = xbmcInstance;
this.property = property;
this.inBound = inBound;
}
public XbmcBindingConfig(String xbmcInstance, String property, boolean inBound, boolean outBound) {
this.xbmcInstance = xbmcInstance;
this.property = property;
this.inBound = inBound;
this.outBound = outBound;
}
public String getXbmcInstance() {
return xbmcInstance;
}
public String getProperty() {
return property;
}
public boolean isInBound() {
return inBound;
}
public boolean isOutBound() {
return outBound;
}
}
}