/**
* 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.LinkedList;
import org.openhab.binding.lcn.connection.Connection;
import org.openhab.binding.lcn.input.Input;
import org.openhab.core.items.Item;
import org.openhab.core.types.Command;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Parent class for all targets.
* Targets are bound to openHAB item mappings ({@link LcnBindingConfig.Mapping}) and
* represent LCN related actions and/or visualizations.
*
* @author Tobias J�ttner
*/
public abstract class Target implements Input.VisualizationVisitor {
/** Logger for this class. */
protected static final Logger logger = LoggerFactory.getLogger(Target.class);
/** Interface for parsers. */
private interface Parser {
/**
* Tries to parse the given input.
*
* @param input the configuration input to parse from
* @return the parsed {@link Target} (never null)
*/
Target tryParseTarget(String input);
}
/** Registered parsers to create targets from text input. */
private static final LinkedList<Parser> targetParsers = new LinkedList<Parser>();
/** Initializes static data once this class is first used. */
static {
// Register parsers
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return OutputVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return OutputDimAbs.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return OutputDimRel.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return OutputToggle.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return RelayVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return Relays.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return BinSensorVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return VarVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return VarAbs.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return VarRel.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return VarReset.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LedVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return Led.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LogicOpVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return SendKeys.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return SendKeysHitDeferred.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LockedKeyVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LockKeys.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LockKeysTemporary.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LockedRegulatorVisualize.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return LockRegulator.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return DynText.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return PlainPck.tryParseTarget(input);
}
});
targetParsers.add(new Parser() {
@Override
public Target tryParseTarget(String input) {
return new Unknown(input);
} // Will "catch" everything
});
}
/**
* Parses the given input into a target.
* Always returns an object.
*
* @param input the target's text representation
* @return the parsed {@link Target} (never null)
*/
public static Target parse(String input) {
for (Parser p : targetParsers) {
Target command = p.tryParseTarget(input);
if (command != null) {
return command;
}
}
throw new Error();
}
/**
* Sends the PCK command(s) to the given connection.
*
* @param conn the target connection
* @param item the source item sending this command
* @param cmd the openHAB command to send
*/
public abstract void send(Connection conn, Item item, Command cmd);
/**
* Registers required status values with the given connection.
*
* @param conn the connection
*/
public abstract void register(Connection conn);
}