/** * 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.nikobus.internal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.openhab.binding.nikobus.NikobusBindingProvider; import org.openhab.binding.nikobus.internal.config.AbstractNikobusItemConfig; import org.openhab.binding.nikobus.internal.config.Button; import org.openhab.binding.nikobus.internal.config.ModuleChannelGroup; import org.openhab.binding.nikobus.internal.core.NikobusModule; import org.openhab.core.items.Item; import org.openhab.core.library.items.RollershutterItem; 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 nikobus item binding configuration. * * @author Davy Vanherbergen * @since 1.3.0 */ public class NikobusGenericBindingProvider extends AbstractGenericBindingProvider implements NikobusBindingProvider { private static final Logger log = LoggerFactory.getLogger(NikobusGenericBindingProvider.class); private static final String BUTTON_CONFIG_PATTERN = "^#N([A-Z0-9]){6}(:SHORT|:LONG)?" + "(\\[([A-Z0-9]){4}-[12](,[A-Z0-9]{4}-[12])*\\])?" + "$"; private static final String MODULE_CHANNEL_PATTERN = "^([A-Z0-9]){4}:([1-9]|1[0-2])$"; private List<NikobusModule> allModules = new ArrayList<NikobusModule>(); private Map<String, NikobusModule> modules = new HashMap<String, NikobusModule>(); @Override public String getBindingType() { return "nikobus"; } @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { if (!(item instanceof SwitchItem) && !(item instanceof RollershutterItem)) { throw new BindingConfigParseException("Item '" + item.getName() + "' is of type '" + item.getClass().getSimpleName() + "', which is not supported by the Nikobus Binding."); } } @Override public AbstractNikobusItemConfig getItemConfig(String itemName) { return (AbstractNikobusItemConfig) bindingConfigs.get(itemName); } @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); String config = (bindingConfig == null) ? "" : bindingConfig.replaceAll(" ", "").toUpperCase(); log.trace("Binding item: {} with configuration {}", item.getName(), config); final AbstractNikobusItemConfig itemBinding = parseItem(item, config); addBindingConfig(item, itemBinding); } /** * Parse an item from the provided configuration string. * * @param item.getName() * item name * @param config * string to parse * @return parsed item * @throws BindingConfigParseException * if no item could be created */ private AbstractNikobusItemConfig parseItem(Item item, String config) throws BindingConfigParseException { if (config == null || config.trim().length() == 0) { throw new BindingConfigParseException("Invalid config for item " + item.getName()); } if (config.matches(BUTTON_CONFIG_PATTERN)) { return new Button(item.getName(), config); } if (config.matches(MODULE_CHANNEL_PATTERN)) { String address = config.split(":")[0]; int channelNum = Integer.parseInt(config.split(":")[1]); int group = channelNum > 6 ? 2 : 1; String moduleKey = address + "-" + group; NikobusModule module = getModule(moduleKey); if (module == null) { log.trace("Creating channel group {}", moduleKey); module = new ModuleChannelGroup(address, group); allModules.add(module); modules.put(moduleKey, module); } return ((ModuleChannelGroup) module).addChannel(item.getName(), channelNum, item.getAcceptedCommandTypes()); } throw new BindingConfigParseException("Could not determine item type from config: " + config); } @Override public NikobusModule getModule(String name) { return modules.get(name); } @Override public List<NikobusModule> getAllModules() { return allModules; } }