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); } }