/**
* 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.harmonyhub.internal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openhab.binding.harmonyhub.HarmonyHubBindingProvider;
import org.openhab.core.items.Item;
import org.openhab.core.library.items.NumberItem;
import org.openhab.core.library.items.StringItem;
import org.openhab.model.item.binding.AbstractGenericBindingProvider;
import org.openhab.model.item.binding.BindingConfigParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This class is responsible for parsing the binding configuration.
*
* @author Dan Cunningham
* @since 1.7.0
*/
public class HarmonyHubGenericBindingProvider extends AbstractGenericBindingProvider
implements HarmonyHubBindingProvider {
private static final Logger logger = LoggerFactory.getLogger(HarmonyHubGenericBindingProvider.class);
/**
* this matches <, * or >, optional qualifier, the type, optional param1 and optional param2
*/
private Pattern bindingPattern = Pattern
.compile("^(<|\\*|>)\\[((.+):)?(" + HarmonyHubBindingType.PatternString() + ")(:(.+))?\\]");
/**
* {@inheritDoc}
*/
@Override
public String getBindingType() {
return "harmonyhub";
}
/**
* @{inheritDoc}
*/
@Override
public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException {
if (!(item instanceof StringItem || item instanceof NumberItem)) {
throw new BindingConfigParseException(
"item '" + item.getName() + "' is of type '" + item.getClass().getSimpleName()
+ "', only String and Number items are allowed - please check your *.items configuration");
}
}
/**
* {@inheritDoc}
*/
@Override
public void processBindingConfiguration(String context, Item item, String bindingConfig)
throws BindingConfigParseException {
Matcher m = bindingPattern.matcher(bindingConfig);
logger.debug("matching {} against {}", bindingConfig, bindingPattern);
if (m.find()) {
HarmonyHubBindingDirection direction = HarmonyHubBindingDirection.getHarmonyHubBindingDirection(m.group(1));
String qualifier = m.group(3);
HarmonyHubBindingType type = HarmonyHubBindingType.getHarmonyHubBindingType(m.group(4));
String param1 = null;
String param2 = null;
if (m.group(6) != null) {
String[] params = m.group(6).split(":");
if (params.length > 0) {
param1 = params[0];
}
if (params.length > 1) {
param2 = params[1];
}
}
logger.debug("processBindingConfiguration parsed result q:{} t:{} p1:{} p2:{}", qualifier, type, param1,
param2);
if (direction == null) {
throw new BindingConfigParseException("Unknown direction " + m.group(1));
}
if (type == null) {
throw new BindingConfigParseException("Unknown action " + m.group(3));
}
if (!direction.equals(type.getDirection()) && type.getDirection() != HarmonyHubBindingDirection.BOTH) {
throw new BindingConfigParseException("wrong direction for action");
}
HarmonyHubBindingConfig config = new HarmonyHubBindingConfig(type, qualifier, type.getLabel(), param1,
param2, item.getClass());
addBindingConfig(item, config);
super.processBindingConfiguration(context, item, bindingConfig);
} else {
throw new BindingConfigParseException(
"Config string did not match pattern { harmonyhub=\"<binding>[ (qualifier:)<binding> ...]\" }");
}
}
@Override
public HarmonyHubBindingConfig getHarmonyHubBindingConfig(String itemName) {
return ((HarmonyHubBindingConfig) this.bindingConfigs.get(itemName));
}
}