/**
* 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.lcn.mappingtarget;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openhab.binding.lcn.common.LcnAddr;
import org.openhab.binding.lcn.common.LcnAddrGrp;
import org.openhab.binding.lcn.common.LcnAddrMod;
/**
* Parent class for all targets targeting an LCN address.
*
* @author Tobias J�ttner
*/
public abstract class TargetWithLcnAddr extends Target {
/** The target LCN address (module or group). */
protected final LcnAddr addr;
/**
* Constructor with target address.
*
* @param addr the target address (module or group)
*/
protected TargetWithLcnAddr(LcnAddr addr) {
this.addr = addr;
}
/**
* Gets the target LCN address (module or group).
*
* @return the address
*/
public LcnAddr getAddr() {
return this.addr;
}
/**
* Parsed (common) target header.
* Returned by {@link Target#commonParseCmdAndAddress(String, boolean)}.
*/
protected static class CmdAndAddressRet {
private static final Pattern PATTERN = Pattern.compile(
"(?<cmd>.*?)\\.S?(?<segId>\\d+)\\.(?<type>M|G)?(?<id>\\d+)\\.?(?<rest>.*)",
Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
/** Rest input to be parsed. */
private final String restInput;
/** The parsed LCN command identifier. */
private final String cmd;
/** The parsed LCN address. */
private final LcnAddr addr;
/**
* Constructor.
*
* @param restInput the rest input to be parsed
* @param cmd the parsed LCN command identifier
* @param addr the parsed {@link LcnAddr}
*/
private CmdAndAddressRet(String restInput, String cmd, LcnAddr addr) {
this.restInput = restInput;
this.cmd = cmd;
this.addr = addr;
}
/**
* Parses the given text for an LCN command definition followed by an LCN address definition.
* <p>
* Examples:
* <ul>
* <li>- "ON.11.23" => ON, segment 11, module 23
* <li>- "ON.S11.M23" => ON, segment 11, module 23
* <li>- "OFF.11.G3" => OFF, segment 11, group 3
* </ul>
*
* @param input the text to parse
* @param allowGroup false to disallow group addresses (will cause null to be returned)
* @return the parsed data or null
*/
static CmdAndAddressRet parse(String input, boolean allowGroup) {
Matcher matcher;
if ((matcher = PATTERN.matcher(input)).matches()) {
boolean isGroup = matcher.group("type") != null && matcher.group("type").equalsIgnoreCase("G");
if (isGroup && !allowGroup) {
logger.error(String.format("Binding does not allow LCN group addresses: %s", input));
return null;
}
return new CmdAndAddressRet(matcher.group("rest"), matcher.group("cmd"),
isGroup ? new LcnAddrGrp(Integer.parseInt(matcher.group("segId")),
Integer.parseInt(matcher.group("id")))
: new LcnAddrMod(Integer.parseInt(matcher.group("segId")),
Integer.parseInt(matcher.group("id"))));
}
return null;
}
/**
* Retrieves the rest input to be parsed.
*
* @return the rest input
*/
String getRestInput() {
return this.restInput;
}
/**
* Retrieves the parsed LCN command identifier.
*
* @return the LCN command identifier
*/
String getCmd() {
return this.cmd;
}
/**
* Retrieves the parsed LCN address.
*
* @return the parsed {@link LcnAddr}
*/
LcnAddr getAddr() {
return this.addr;
}
}
}