/** * 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.lightwaverf.internal; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openhab.binding.lightwaverf.LightwaveRfBindingProvider; import org.openhab.core.binding.BindingConfig; import org.openhab.core.items.Item; 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 Neil Renaud * @since 1.7.0 */ public class LightwaveRfGenericBindingProvider extends AbstractGenericBindingProvider implements LightwaveRfBindingProvider { private static Logger logger = LoggerFactory.getLogger(LightwaveRfGenericBindingProvider.class); private static Pattern ROOM_REG_EXP = Pattern.compile(".*room=([0-9]*).*"); private static Pattern DEVICE_REG_EXP = Pattern.compile(".*device=([0-9]*).*"); private static Pattern POLL_REG_EXP = Pattern.compile(".*poll=([0-9]*).*"); private static Pattern TYPE_REG_EXP = Pattern.compile(".*type=([^,]*).*"); private static Pattern SERIAL_REG_EXP = Pattern.compile(".*serial=([^,]*).*"); /** * {@inheritDoc} */ @Override public String getBindingType() { return "lightwaverf"; } /** * @{inheritDoc */ @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { // if (!(item instanceof SwitchItem || item instanceof DimmerItem)) { // throw new BindingConfigParseException("item '" + item.getName() // + "' is of type '" + item.getClass().getSimpleName() // + // "', only Switch- and DimmerItems are allowed - please check your *.items configuration"); // } } /** * {@inheritDoc} */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); try { String roomId = null; String deviceId = null; LightwaveRfType type = null; int poll = -1; String serialId = null; LightwaveRfItemDirection direction = LightwaveRfItemDirection.IN_AND_OUT; if (bindingConfig.startsWith("<")) { direction = LightwaveRfItemDirection.IN_ONLY; } else if (bindingConfig.startsWith(">")) { direction = LightwaveRfItemDirection.OUT_ONLY; } Matcher roomMatcher = ROOM_REG_EXP.matcher(bindingConfig); if (roomMatcher.matches()) { roomId = roomMatcher.group(1); } Matcher deviceMatcher = DEVICE_REG_EXP.matcher(bindingConfig); if (deviceMatcher.matches()) { deviceId = deviceMatcher.group(1); } Matcher serialMatcher = SERIAL_REG_EXP.matcher(bindingConfig); if (serialMatcher.matches()) { serialId = serialMatcher.group(1); } Matcher typeMatcher = TYPE_REG_EXP.matcher(bindingConfig); if (typeMatcher.matches()) { type = LightwaveRfType.valueOf(typeMatcher.group(1)); } Matcher pollMatcher = POLL_REG_EXP.matcher(bindingConfig); if (pollMatcher.matches()) { poll = Integer.valueOf(pollMatcher.group(1)); } LightwaveRfBindingConfig config = new LightwaveRfBindingConfig(roomId, deviceId, serialId, type, poll, direction); logger.info("ConfigString[{}] Room[{}] Device[{}] Serial[{}] Type[{}] Poll[{}]", new Object[] { bindingConfig, roomId, deviceId, serialId, type, poll }); addBindingConfig(item, config); } catch (Exception e) { throw new BindingConfigParseException("Error parsing binding for Context[" + context + "] Item[" + item + "] BindingConfig[" + bindingConfig + "] ErrorMessage: " + e.getMessage()); } } @Override public List<String> getBindingItemsForRoomDevice(String roomId, String deviceId) { List<String> bindings = new ArrayList<String>(); for (String itemName : bindingConfigs.keySet()) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); if (roomId != null && roomId.equals(itemConfig.getRoomId())) { if (deviceId != null && deviceId.equals(itemConfig.getDeviceId())) { bindings.add(itemName); } } } return bindings; } @Override public List<String> getBindingItemsForSerial(String serialId) { List<String> bindings = new ArrayList<String>(); for (String itemName : bindingConfigs.keySet()) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); if (serialId != null && serialId.equals(itemConfig.getSerialId())) { bindings.add(itemName); } } return bindings; } @Override public List<String> getBindingItemsForRoom(String roomId) { List<String> bindings = new ArrayList<String>(); for (String itemName : bindingConfigs.keySet()) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); if (roomId != null && roomId.equals(itemConfig.getRoomId())) { bindings.add(itemName); } } return bindings; } @Override public List<String> getBindingItemsForType(LightwaveRfType type) { List<String> bindings = new ArrayList<String>(); for (String itemName : bindingConfigs.keySet()) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); if (type.equals(itemConfig.getType())) { bindings.add(itemName); } } return bindings; } @Override public int getPollInterval(String itemName) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); return itemConfig != null ? itemConfig.getPollTime() : -1; } @Override public LightwaveRfItemDirection getDirection(String itemName) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); return itemConfig != null ? itemConfig.getDirection() : LightwaveRfItemDirection.IN_AND_OUT; } @Override public LightwaveRfType getTypeForItemName(String itemName) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemName); return itemConfig != null ? itemConfig.getType() : null; } @Override public String getRoomId(String itemString) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemString); return itemConfig != null ? itemConfig.getRoomId() : null; } @Override public String getDeviceId(String itemString) { LightwaveRfBindingConfig itemConfig = (LightwaveRfBindingConfig) bindingConfigs.get(itemString); return itemConfig != null ? itemConfig.getDeviceId() : null; } /** * This is a helper class holding binding specific configuration details * * @author Neil Renaud * @since 1.7.0 */ class LightwaveRfBindingConfig implements BindingConfig { // put member fields here which holds the parsed values private final String roomId; private final String deviceId; private final String serialId; private final LightwaveRfType type; private final int pollTime; private final LightwaveRfItemDirection direction; public LightwaveRfBindingConfig(String roomId, String deviceId, String serialId, LightwaveRfType type, int pollTime, LightwaveRfItemDirection direction) { this.roomId = roomId; this.deviceId = deviceId; this.serialId = serialId; this.type = type; this.pollTime = pollTime; this.direction = direction; } public String getDeviceId() { return deviceId; } public String getRoomId() { return roomId; } public String getSerialId() { return serialId; } public LightwaveRfType getType() { return type; } public int getPollTime() { return pollTime; } public LightwaveRfItemDirection getDirection() { return direction; } } }