/** * 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.pilight.internal; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.openhab.binding.pilight.PilightBindingProvider; import org.openhab.core.binding.BindingConfig; import org.openhab.core.items.Item; import org.openhab.core.library.items.ContactItem; import org.openhab.core.library.items.DimmerItem; 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; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class is responsible for parsing the binding configuration. * * @author Jeroen Idserda * @since 1.0 */ public class PilightGenericBindingProvider extends AbstractGenericBindingProvider implements PilightBindingProvider { /* * Matches: instance#device,property=optional */ private static final Pattern CONFIG_PATTERN = Pattern .compile("^(?<instance>(\\w)+)+#(?<device>(\\w)+)+(,(?<properties>(\\w)+=(\\w)+)+)*$"); private static final Logger logger = LoggerFactory.getLogger(PilightGenericBindingProvider.class); /** * {@inheritDoc} */ @Override public String getBindingType() { return "pilight"; } /** * @{inheritDoc} */ @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { if (!(item instanceof SwitchItem || item instanceof DimmerItem || item instanceof ContactItem || item instanceof StringItem || item instanceof NumberItem)) { throw new BindingConfigParseException("item '" + item.getName() + "' is of type '" + item.getClass().getSimpleName() + "', only Switch, Dimmer, Contact, String and Number are supported for now- please check your *.items configuration"); } } /** * {@inheritDoc} */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); PilightBindingConfig config = parseBindingConfig(item, bindingConfig); if (config != null) { addBindingConfig(item, config); } } protected PilightBindingConfig parseBindingConfig(Item item, String bindingConfig) { bindingConfig = bindingConfig.replace(" ", ""); Matcher matcher = CONFIG_PATTERN.matcher(bindingConfig); if (matcher.matches()) { PilightBindingConfig config = new PilightBindingConfig(); String instance = matcher.group("instance"); String device = matcher.group("device"); config.setItemName(item.getName()); config.setItemType(item.getClass()); config.setInstance(instance); config.setDevice(device); String values = matcher.group("properties"); if (!StringUtils.isEmpty(values)) { String[] pairs = values.split(","); for (String pair : pairs) { String[] kv = pair.split("="); String key = kv[0]; String value = kv[1]; if (key.equals("property")) { config.setProperty(value); } } } boolean isValueItem = item.getClass().equals(NumberItem.class) || item.getClass().equals(StringItem.class); if (isValueItem && StringUtils.isEmpty(config.getProperty())) { logger.error("No property specified for item {}", config.getItemName()); } else { logger.info("pilight:{} item {} bound to device {}{}", config.getInstance(), config.getItemName(), config.getDevice(), config.getProperty() != null ? ", property " + config.getProperty() : ""); return config; } } else { logger.error("Item config {} does not match instance#location:device,property=optional pattern", bindingConfig); } return null; } @Override public PilightBindingConfig getBindingConfig(String itemName) { return (PilightBindingConfig) bindingConfigs.get(itemName); } @Override public List<PilightBindingConfig> getBindingConfigs(String instance, String device) { List<PilightBindingConfig> configs = new ArrayList<PilightBindingConfig>(); for (Entry<String, BindingConfig> entry : bindingConfigs.entrySet()) { PilightBindingConfig config = (PilightBindingConfig) entry.getValue(); if (config.getInstance().equals(instance) && config.getDevice().equals(device)) { configs.add(config); } } return configs; } }