/** * 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.openenergymonitor.internal; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openhab.binding.openenergymonitor.OpenEnergyMonitorBindingProvider; import org.openhab.core.binding.BindingConfig; import org.openhab.core.items.Item; import org.openhab.core.library.items.NumberItem; import org.openhab.model.item.binding.AbstractGenericBindingProvider; import org.openhab.model.item.binding.BindingConfigParseException; /** * <p> * This class can parse information from the generic binding format and provides * Open Energy Monitor binding information from it. * * <p> * Examples for valid binding configuration strings: * * <ul> * <li><code>openenergymonitor="realPower"</code></li> * <li><code>openenergymonitor="phase1Current:JS(divideby100.js)"</code></li> * <li><code>openenergymonitor="phase1RealPower+phase2RealPower+phase3RealPower"</code></li> * <li><code>openenergymonitor="phase1Current+phase2Current+phase3Current:JS(divideby100.js)"</code></li> * <li><code>openenergymonitor="phase1RealPower+phase2RealPower+phase3RealPower"</code></li> * </ul> * * @author Pauli Anttila * @since 1.4.0 */ public class OpenEnergyMonitorGenericBindingProvider extends AbstractGenericBindingProvider implements OpenEnergyMonitorBindingProvider { /** RegEx to extract a transformation string <code>'(.*?)\((.*)\)'</code> */ private static final Pattern REGEX_EXTRACT_PATTERN = Pattern.compile("(.*?)\\((.*)\\)"); /** * {@inheritDoc} */ @Override public String getBindingType() { return "openenergymonitor"; } /** * @{inheritDoc */ @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { if (!(item instanceof NumberItem)) { throw new BindingConfigParseException( "item '" + item.getName() + "' is of type '" + item.getClass().getSimpleName() + "', only NumberItems 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); OpenEnergyMonitorBindingConfig config = new OpenEnergyMonitorBindingConfig(); String[] configParts = bindingConfig.trim().split(":"); if (configParts.length > 2) { throw new BindingConfigParseException( "Open Energy Monitor binding must contain 1-2 parts separated by ':'"); } config.variable = configParts[0].trim(); if (configParts.length == 2) { String[] parts = splitTransformationConfig(configParts[1].trim()); config.transformationType = parts[0]; config.transformationFunction = parts[1]; } else { config.transformationType = null; config.transformationFunction = null; } addBindingConfig(item, config); } /** * Splits a transformation configuration string into its two parts - the * transformation type and the function/pattern to apply. * * @param transformation * the string to split * @return a string array with exactly two entries for the type and the * function */ protected String[] splitTransformationConfig(String transformation) { Matcher matcher = REGEX_EXTRACT_PATTERN.matcher(transformation); if (!matcher.matches()) { throw new IllegalArgumentException("given transformation function '" + transformation + "' does not follow the expected pattern '<function>(<pattern>)'"); } matcher.reset(); matcher.find(); String type = matcher.group(1); String pattern = matcher.group(2); return new String[] { type, pattern }; } class OpenEnergyMonitorBindingConfig implements BindingConfig { public String variable = null; String transformationType = null; String transformationFunction = null; @Override public String toString() { return "OpenEnergyMonitorBindingConfigElement [" + "variable=" + variable + ", transformation type=" + transformationType + ", transformation function=" + transformationFunction + "]"; } } @Override public String getVariable(String itemName) { OpenEnergyMonitorBindingConfig config = (OpenEnergyMonitorBindingConfig) bindingConfigs.get(itemName); return config != null ? config.variable : null; } @Override public String getTransformationType(String itemName) { OpenEnergyMonitorBindingConfig config = (OpenEnergyMonitorBindingConfig) bindingConfigs.get(itemName); return config != null ? config.transformationType : null; } @Override public String getTransformationFunction(String itemName) { OpenEnergyMonitorBindingConfig config = (OpenEnergyMonitorBindingConfig) bindingConfigs.get(itemName); return config != null ? config.transformationFunction : null; } }