private static String[] s_parseMsgConfigString(
      String itemName, String bindingConfig, HashMap<String, String> map)
      throws BindingConfigParseException {
    //
    String shouldBe = "should be MSGType:ADDRESS#feature,param=foo e.g. RFX:0923844#data,bit=5";
    String[] segments = bindingConfig.split("#");
    String[] dev = segments[0].split(":");

    if (dev.length != 2) {
      throw new BindingConfigParseException(
          "missing colon in item format: " + bindingConfig + ", " + shouldBe);
    }
    String type = dev[0];
    String addr = dev[1];
    ADMsgType mt = ADMsgType.s_fromString(type);
    if (!mt.isValid() || !s_isValidAddress(mt, addr)) {
      throw new BindingConfigParseException(
          "invalid device address for " + type + ": " + addr + " in items file.");
    }

    String[] params = segments[1].split(",");
    String feature = params[0];
    s_parseParameters(itemName, params, 1, map);

    String[] retval = {type, addr, feature};

    return retval;
  }
  /** {@inheritDoc} */
  @Override
  public void processBindingConfiguration(String context, Item item, String bindingConfig)
      throws BindingConfigParseException {
    super.processBindingConfiguration(context, item, bindingConfig);

    HashMap<String, String> params = new HashMap<String, String>();
    String[] parts = s_parseConfigString(item.getName(), bindingConfig, params);
    AlarmDecoderBindingConfig bc = null;
    if (parts[0].equals("SEND")) {
      // binding for sending commands
      if (!(parts.length == 2)) {
        throw new BindingConfigParseException("invalid SEND item config: " + bindingConfig);
      }
      bc = new AlarmDecoderBindingConfig(item, params);
    } else {
      // binding for receiving messages
      ADMsgType mt = ADMsgType.s_fromString(parts[0]);
      HashMap<String, ArrayList<AlarmDecoderBindingConfig>> addrToItemsMap =
          m_itemMap.get(mt.getValue());
      ArrayList<AlarmDecoderBindingConfig> bcl = addrToItemsMap.get(parts[1]);
      if (bcl == null) {
        // don't have this address mapped to anything yet, start a new item list
        bcl = new ArrayList<AlarmDecoderBindingConfig>();
        addrToItemsMap.put(parts[1], bcl);
      } else {
        // without this line a new binding configuration is entered whenever
        // the .items file is edited
        removeExisting(bcl, item);
      }
      bc = new AlarmDecoderBindingConfig(item, mt, parts[1], parts[2], params);
      bcl.add(bc);
    }
    addBindingConfig(item, bc);
    m_itemsToConfig.put(item.getName(), bc);
    logger.trace(
        "processing item \"{}\" read from .items file with cfg string {}",
        item.getName(),
        bindingConfig);
  }
 /**
  * Parses binding configuration string
  *
  * @param bindingConfig
  * @return array with ["SEND", "TEXT"], or [type, address, feature + parameters]
  * @throws BindingConfigParseException if invalid binding string is found
  */
 private static String[] s_parseConfigString(
     String itemName, String bindingConfig, HashMap<String, String> map)
     throws BindingConfigParseException {
   String shouldBe = "should be MSGType:ADDRESS#feature,param=foo or SEND#sendstring";
   String[] segments = bindingConfig.split("#");
   if (segments.length != 2)
     throw new BindingConfigParseException(
         "invalid item format: " + bindingConfig + ", " + shouldBe);
   if (segments[0].equals("SEND")) {
     String[] params = segments[1].split(",");
     s_parseParameters(itemName, params, 0, map);
     return (segments);
   } else if (ADMsgType.s_containsValidMsgType(segments[0])) {
     return s_parseMsgConfigString(itemName, bindingConfig, map);
   }
   throw new BindingConfigParseException(
       "invalid item format: " + bindingConfig + ", " + shouldBe);
 }
 @Override
 public ArrayList<AlarmDecoderBindingConfig> getConfigurations(
     ADMsgType mt, String addr, String feature) {
   HashMap<String, ArrayList<AlarmDecoderBindingConfig>> a2c = m_itemMap.get(mt.getValue());
   if (addr != null) {
     ArrayList<AlarmDecoderBindingConfig> al = a2c.get(addr);
     return (al == null ? new ArrayList<AlarmDecoderBindingConfig>() : al);
   } else {
     ArrayList<AlarmDecoderBindingConfig> al = new ArrayList<AlarmDecoderBindingConfig>();
     for (Entry<String, ArrayList<AlarmDecoderBindingConfig>> a : a2c.entrySet()) {
       if (feature == null) {
         al.addAll(a.getValue());
       } else {
         for (AlarmDecoderBindingConfig cf : a.getValue()) {
           al.add(cf);
         }
       }
     }
     return (al);
   }
 }