/**
* Copyright (c) 2010-2016, openHAB.org and others.
*
* 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.neohub.internal;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.openhab.binding.neohub.NeoHubBindingProvider;
import org.openhab.core.binding.BindingConfig;
import org.openhab.core.items.Item;
import org.openhab.core.library.items.NumberItem;
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 Sebastian Prehn
* @since 1.5.0
*/
public class NeoHubGenericBindingProvider extends AbstractGenericBindingProvider implements NeoHubBindingProvider {
/**
* {@inheritDoc}
*/
@Override
public String getBindingType() {
return "neohub";
}
/**
* {@inheritDoc}
*/
@Override
public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException {
if (!(item instanceof NumberItem || item instanceof StringItem || item instanceof SwitchItem)) {
throw new BindingConfigParseException("item '" + item.getName() + "' is of type '"
+ item.getClass().getSimpleName()
+ "', only Number- and String- or SwitchItems are allowed - please check your *.items configuration");
}
}
/**
* {@inheritDoc}
*/
@Override
public void processBindingConfiguration(final String context, final Item item, String bindingConfig)
throws BindingConfigParseException {
super.processBindingConfiguration(context, item, bindingConfig);
final String[] configParts = bindingConfig.trim().split(":");
if (configParts.length != 2) {
throw new BindingConfigParseException(
"neohub binding configuration must contain exactly two parts seperated by a colon. Device:Property.");
}
final String device = configParts[0];
final String property = configParts[1];
if (StringUtils.isEmpty(device)) {
throw new BindingConfigParseException("item '" + item.getName()
+ "' has to define a device name - please check your *.items configuration");
}
final List<String> bindings = NeoStatProperty.getBindings();
if (StringUtils.isEmpty(property)) {
throw new BindingConfigParseException("item '" + item.getName() + "' has to define a property ("
+ StringUtils.join(bindings, ", ") + ") value - please check your *.items configuration");
}
final NeoHubBindingConfig config = new NeoHubBindingConfig();
config.device = device;
config.property = NeoStatProperty.fromBinding(property);
if (config.property == null) {
throw new BindingConfigParseException(
"item '" + item.getName() + "' has to define an property (" + StringUtils.join(bindings, ", ")
+ ") value. unknown value: " + property + " - please check your *.items configuration");
}
addBindingConfig(item, config);
}
@Override
public NeoStatProperty getNeoStatProperty(final String itemName) {
return getNeoHubBindingConfig(itemName).property;
}
@Override
public String getNeoStatDevice(final String itemName) {
return getNeoHubBindingConfig(itemName).device;
}
private NeoHubBindingConfig getNeoHubBindingConfig(final String itemName) {
final NeoHubBindingConfig config = (NeoHubBindingConfig) this.bindingConfigs.get(itemName);
if (config == null) {
throw new IllegalStateException(String.format("No binding configured for item %s", itemName));
}
return config;
}
/**
* Small data structure to store device and property pair.
*
*/
private class NeoHubBindingConfig implements BindingConfig {
/**
* Value of device parameter in items configuration file. Must not be
* <code>null</code>.
*/
public String device;
/**
* Value of property parameter in items configuration file. Must not be
* <code>null</code>.
*/
public NeoStatProperty property;
}
}