@Override
 public List<Command> getAllCommands(String itemName) {
   List<Command> commands = new ArrayList<Command>();
   PlugwiseBindingConfig aConfig = (PlugwiseBindingConfig) bindingConfigs.get(itemName);
   for (Command aCommand : aConfig.keySet()) {
     commands.add(aCommand);
   }
   return commands;
 }
 @Override
 public List<Command> getCommandsByType(String itemName, Class<? extends Command> class1) {
   List<Command> commands = new ArrayList<Command>();
   PlugwiseBindingConfig aConfig = (PlugwiseBindingConfig) bindingConfigs.get(itemName);
   for (Command aCommand : aConfig.keySet()) {
     PlugwiseBindingConfigElement element = aConfig.get(aCommand);
     if (element.getCommandType().getTypeClass().equals(class1)) {
       commands.add(aCommand);
     }
   }
   return commands;
 }
 @Override
 public PlugwiseCommandType getPlugwiseCommandType(String itemName, Command someCommand) {
   if (itemName != null && someCommand != null) {
     PlugwiseBindingConfig aConfig = (PlugwiseBindingConfig) bindingConfigs.get(itemName);
     if (aConfig != null) {
       PlugwiseBindingConfigElement element = aConfig.get(someCommand);
       if (element != null) {
         return element.getCommandType();
       }
     }
   }
   return null;
 }
 @Override
 public List<String> getPlugwiseID(String itemName) {
   List<String> ids = new ArrayList<String>();
   for (String anItem : bindingConfigs.keySet()) {
     PlugwiseBindingConfig aConfig = (PlugwiseBindingConfig) bindingConfigs.get(anItem);
     for (Command aCommand : aConfig.keySet()) {
       PlugwiseBindingConfigElement element = aConfig.get(aCommand);
       if (element != null) {
         ids.add(element.getId());
       }
     }
   }
   return ids;
 }
  @Override
  public List<PlugwiseBindingConfigElement> getIntervalList() {

    List<PlugwiseBindingConfigElement> result = new ArrayList<PlugwiseBindingConfigElement>();

    Collection<String> items = getItemNames();

    Iterator<String> itemIterator = items.iterator();
    while (itemIterator.hasNext()) {
      String anItem = itemIterator.next();

      PlugwiseBindingConfig pbConfig = (PlugwiseBindingConfig) bindingConfigs.get(anItem);
      for (Command command : pbConfig.keySet()) {
        boolean found = false;
        PlugwiseBindingConfigElement element = pbConfig.get(command);

        // check if we already have a reference to this {ID,command}
        Iterator<PlugwiseBindingConfigElement> elementIterator = result.iterator();
        while (elementIterator.hasNext()) {
          PlugwiseBindingConfigElement resultElement = elementIterator.next();
          if (resultElement.getId().equals(element.getId())
              && resultElement
                  .getCommandType()
                  .getJobClass()
                  .equals(element.getCommandType().getJobClass())) {
            // bingo - now check if the interval is smaller
            found = true;
            if (resultElement.getInterval() > element.getInterval()) {
              result.remove(resultElement);
              result.add(element);
              break;
            }
          }
        }

        if (!found) {
          result.add(element);
        }
      }
    }
    return result;
  }
  @Override
  public Set<String> getItemNames(String PlugwiseID, PlugwiseCommandType type) {

    Set<String> result = new HashSet<String>();

    Collection<String> items = getItemNames();

    Iterator<String> itemIterator = items.iterator();
    while (itemIterator.hasNext()) {
      String anItem = itemIterator.next();

      PlugwiseBindingConfig pbConfig = (PlugwiseBindingConfig) bindingConfigs.get(anItem);
      for (Command command : pbConfig.keySet()) {
        PlugwiseBindingConfigElement element = pbConfig.get(command);

        if (element.getCommandType() == type && element.getId().equals(PlugwiseID)) {
          if (!result.contains(anItem)) {
            result.add(anItem);
          }
        }
      }
    }
    return result;
  }
  /**
   * Parses the configuration string and update the provided config
   *
   * @param config
   * @param item
   * @param bindingConfig
   * @throws BindingConfigParseException
   */
  private void parseBindingConfig(PlugwiseBindingConfig config, Item item, String bindingConfig)
      throws BindingConfigParseException {

    String commandAsString = null;
    String plugwiseID = null;
    String plugwiseCommand = null;
    int interval = 60;

    if (bindingConfig != null) {

      Matcher actionMatcher = ACTION_CONFIG_PATTERN.matcher(bindingConfig);
      Matcher statusMatcher = STATUS_CONFIG_PATTERN.matcher(bindingConfig);

      if (!actionMatcher.matches() && !statusMatcher.matches()) {
        throw new BindingConfigParseException(
            "Plugwise binding configuration must consist of either three [config="
                + statusMatcher
                + "] or four parts [config="
                + actionMatcher
                + "]");
      } else {
        if (actionMatcher.matches()) {
          commandAsString = actionMatcher.group(1);
          plugwiseID = actionMatcher.group(2);
          plugwiseCommand = actionMatcher.group(3);
          interval = Integer.valueOf(actionMatcher.group(4));
        } else if (statusMatcher.matches()) {
          commandAsString = null;
          plugwiseID = statusMatcher.group(1);
          plugwiseCommand = statusMatcher.group(2);
          interval = Integer.valueOf(statusMatcher.group(3));
        }

        PlugwiseCommandType type = PlugwiseCommandType.getCommandType(plugwiseCommand);

        if (PlugwiseCommandType.validateBinding(type, item)) {

          PlugwiseBindingConfigElement newElement =
              new PlugwiseBindingConfigElement(plugwiseID, type, interval);

          Command command = null;
          if (commandAsString == null) {
            // for those configuration strings that are not really linked to a openHAB command we
            // create a dummy Command to be able to store the configuration information
            // I have choosen to do that with NumberItems
            NumberItem dummy = new NumberItem(Integer.toString(counter));
            command = createCommandFromString(dummy, Integer.toString(counter));
            counter++;
            config.put(command, newElement);
          } else {
            command = createCommandFromString(item, commandAsString);
            config.put(command, newElement);
          }
        } else {
          String validItemType = PlugwiseCommandType.getValidItemTypes(plugwiseCommand);
          if (StringUtils.isEmpty(validItemType)) {
            throw new BindingConfigParseException(
                "'" + bindingConfig + "' is no valid binding type");
          } else {
            throw new BindingConfigParseException(
                "'"
                    + bindingConfig
                    + "' is not bound to a valid item type. Valid item type(s): "
                    + validItemType);
          }
        }
      }
    } else {
      return;
    }
  }