/** * 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.configadmin.internal; import java.util.ArrayList; import java.util.Collection; import org.apache.commons.lang.StringUtils; import org.openhab.binding.configadmin.ConfigAdminBindingProvider; 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; /** * <p> * This class can parse information from the generic binding format and * provides ConfigAdmin binding information from it. It registers as a * {@link ConfigAdminBindingProvider} service as well. * </p> * * <p> * Here are some examples for valid binding configuration strings: * <ul> * <li><code>{ configAdmin="dropbox:syncmode" }</code> - takes a String to * reconfigure the sync mode of the optional dropbox binding</li> * <li><code>{ configAdmin="gcal:refresh" }</code> - takes a number to * reconfigure the refresh interval of the GCal binding</li> * </ul> * * @author Thomas.Eichstaedt-Engelen * @since 1.0.0 */ public class ConfigAdminGenericBindingProvider extends AbstractGenericBindingProvider implements ConfigAdminBindingProvider { /** * {@inheritDoc} */ @Override public String getBindingType() { return "configadmin"; } /** * @{inheritDoc} */ @Override public void validateItemType(Item item, String bindingConfig) throws BindingConfigParseException { // we will see what a sensible default will be ... } /** * {@inheritDoc} */ @Override public void processBindingConfiguration(String context, Item item, String bindingConfig) throws BindingConfigParseException { super.processBindingConfiguration(context, item, bindingConfig); if (StringUtils.isNotBlank(bindingConfig)) { String[] elements = bindingConfig.split(":"); if (elements.length == 2) { ConfigAdminBindingConfig config = new ConfigAdminBindingConfig(item, normalizePid(elements[0]), elements[1]); addBindingConfig(item, config); } else { throw new BindingConfigParseException( "BindingConfig string must contain two elements separated by ':'"); } } } /** * {@inheritDoc} */ @Override public ConfigAdminBindingConfig getBindingConfig(String itemName) { ConfigAdminBindingConfig config = (ConfigAdminBindingConfig) bindingConfigs.get(itemName); return config; } /** * {@inheritDoc} */ @Override public Collection<ConfigAdminBindingConfig> getBindingConfigByPid(String pid) { Collection<ConfigAdminBindingConfig> result = new ArrayList<ConfigAdminGenericBindingProvider.ConfigAdminBindingConfig>(); for (BindingConfig bindingConfig : bindingConfigs.values()) { if (bindingConfig instanceof ConfigAdminBindingConfig) { ConfigAdminBindingConfig bc = (ConfigAdminBindingConfig) bindingConfig; if (bc.normalizedPid.equals(pid)) { result.add(bc); } } } return result; } private static String normalizePid(String pid) { String normalizedPid = pid; if (!normalizedPid.contains(".")) { normalizedPid = "org.openhab." + pid; } return normalizedPid; } /** * Holds the configuration details of one binding. * * @author Thomas.Eichstaedt-Engelen * @since 1.0.0 */ public static class ConfigAdminBindingConfig implements BindingConfig { Item item; String normalizedPid; String configParameter; public ConfigAdminBindingConfig(Item item, String normalizedPid, String configParameter) { this.item = item; this.normalizedPid = normalizedPid; this.configParameter = configParameter; } } }