/** * Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT * All rights reserved. Use is subject to license terms. See LICENSE.TXT */ package org.diirt.datasource.sim; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.diirt.datasource.ChannelWriteCallback; import org.diirt.datasource.MultiplexedChannelHandler; import org.diirt.datasource.util.FunctionParser; import org.diirt.vtype.ValueFactory; /** * * @author carcassi */ class DelayedConnectionChannelHandler extends MultiplexedChannelHandler<Object, Object> { private final Object initialValue; private final double delayInSeconds; private final ScheduledExecutorService exec; DelayedConnectionChannelHandler(String channelName, ScheduledExecutorService exec) { super(channelName); String errorMessage = "Incorrect syntax. Must match delayedConnectionChannel(delayInSeconds, value)"; List<Object> tokens = FunctionParser.parseFunctionAnyParameter(channelName); if (tokens == null || tokens.size() <= 1) { throw new IllegalArgumentException(errorMessage); } if (tokens.size() == 2) { initialValue = "Initial value"; } else { Object value = FunctionParser.asScalarOrList(tokens.subList(2, tokens.size())); if (value == null) { throw new IllegalArgumentException(errorMessage); } initialValue = ValueFactory.toVTypeChecked(value); } delayInSeconds = (Double) tokens.get(1); this.exec = exec; } @Override public void connect() { exec.schedule(new Runnable() { @Override public void run() { synchronized(DelayedConnectionChannelHandler.this) { if (getUsageCounter() > 0) { processConnection(new Object()); processMessage(initialValue); } } } }, (long) delayInSeconds * 1000, TimeUnit.MILLISECONDS); } @Override public void disconnect() { processConnection(null); } @Override public Map<String, Object> getProperties() { Map<String, Object> result = new HashMap<>(); result.put("delayInSeconds", delayInSeconds); result.put("initialValue", initialValue); return result; } @Override public void write(Object newValue, ChannelWriteCallback callback) { throw new UnsupportedOperationException("Can't write to simulation channel."); } }