/**
* 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.zwave.internal.converter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.openhab.binding.zwave.internal.converter.command.ZWaveCommandConverter;
import org.openhab.binding.zwave.internal.converter.state.StateComparator;
import org.openhab.binding.zwave.internal.converter.state.ZWaveStateConverter;
import org.openhab.binding.zwave.internal.protocol.ZWaveController;
import org.openhab.binding.zwave.internal.protocol.commandclass.ZWaveCommandClass.CommandClass;
import org.openhab.core.events.EventPublisher;
import org.openhab.core.items.Item;
import org.openhab.core.types.Command;
import org.openhab.core.types.State;
/**
* ZWaveConverterBase class. Base class for all converters
* that convert between the Z-Wave API and openHAB
* items.
*
* @author Jan-Willem Spuij
* @since 1.4.0
*/
public abstract class ZWaveConverterBase {
private final ZWaveController controller;
private final EventPublisher eventPublisher;
private final Map<Class<? extends State>, ZWaveStateConverter<?, ?>> stateConverters = new HashMap<Class<? extends State>, ZWaveStateConverter<?, ?>>();
private final Map<Class<? extends Command>, ZWaveCommandConverter<?, ?>> commandConverters = new HashMap<Class<? extends Command>, ZWaveCommandConverter<?, ?>>();
/**
* Constructor. Creates a new instance of the {@link ZWaveConverterBase}
* class.
*
* @param controller the {@link ZWaveController} to use to send messages.
* @param eventPublisher the {@link EventPublisher} that can be used to send updates.
*/
public ZWaveConverterBase(ZWaveController controller, EventPublisher eventPublisher) {
this.controller = controller;
this.eventPublisher = eventPublisher;
}
/**
* Returns the {@link EventPublisher} that can be used
* inside the converter to publish event updates.
*
* @return the eventPublisher
*/
protected EventPublisher getEventPublisher() {
return this.eventPublisher;
}
/**
* Returns the {@link ZWaveController} that is used to send messages.
*
* @return the controller to use to send messages.
*/
protected ZWaveController getController() {
return this.controller;
}
/**
* Add a {@link ZWaveStateConverter} to the map of converters for fast lookup.
*
* @param converter the {@link ZWaveStateConverter} to add.
*/
protected void addStateConverter(ZWaveStateConverter<?, ?> converter) {
this.stateConverters.put(converter.getState(), converter);
}
/**
* Add a {@link ZWaveStateConverter} to the map of converters for fast lookup.
*
* @param converter the {@link ZWaveStateConverter} to add.
*/
protected void addCommandConverter(ZWaveCommandConverter<?, ?> converter) {
this.commandConverters.put(converter.getCommand(), converter);
}
/**
* Returns the default Refresh interval for the converter to use.
* 0 (zero) indicates that the converter does not refresh by default or does not support it.
*
* @return the refresh interval for this converter.
*/
abstract int getRefreshInterval();
/**
* Gets a {@link ZWaveStateConverter} that is suitable for this {@link CommandClass} and the data types supported by
* the {@link Item}
*
* @param commandClass the {@link CommandClass} that sent the value.
* @param item the {@link Item} that has to receive the State;
* @return a converter object that converts between the value and the state;
*/
protected ZWaveStateConverter<?, ?> getStateConverter(Item item, Object value) {
if (item == null) {
return null;
}
List<Class<? extends State>> list = new ArrayList<Class<? extends State>>(item.getAcceptedDataTypes());
Collections.sort(list, new StateComparator());
for (Class<? extends State> stateClass : list) {
ZWaveStateConverter<?, ?> result = stateConverters.get(stateClass);
if (result == null || !result.getType().isInstance(value)) {
continue;
}
return result;
}
return null;
}
/**
* Gets a {@link ZWaveCommandConverter} that is suitable for this {@link CommandClass}
*
* @param commandClass the {@link CommandClass} that sent the value.
* @return a converter object that converts between the value and the state;
*/
protected ZWaveCommandConverter<?, ?> getCommandConverter(Class<? extends Command> commandClass) {
return this.commandConverters.get(commandClass);
}
}