/******************************************************************************* * Copyright (c) 2009 Paul VanderLei, Simon Archer, Jeff McAffer and others. All * rights reserved. This program and the accompanying materials are made available * under the terms of the Eclipse Public License v1.0 and Eclipse Distribution License * v1.0 which accompanies this distribution. The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution License * is available at http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Paul VanderLei, Simon Archer, Jeff McAffer - initial API and implementation *******************************************************************************/ package org.eclipse.examples.toast.devsim.fw; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.examples.toast.devsim.IDeviceSimulator; import org.eclipse.examples.toast.devsim.IDeviceSimulatorListener; public class DeviceSimulatorServlet extends HttpServlet implements IDeviceSimulator { private static final String DEVICE_PARAMETER = "device"; //$NON-NLS-1$ private static final String UNKNOWN_DEVICE = "Unknown device: "; //$NON-NLS-1$ private static final String CONTENT_TYPE_HTML = "text/html"; //$NON-NLS-1$ private Map devices; private String id; private boolean evenOdd; private HtmlGenerator gen; private IDeviceSimulatorListener listener; public DeviceSimulatorServlet(String id) { super(); devices = new HashMap(7); this.id = id; } // IDeviceSimulator implementation public void registerDevice(String name, String label) { SimulatedDevice device = new SimulatedDevice(name, label); devices.put(name, device); } public void registerDevice(String name, String label, IDeviceSimulatorListener listener) { registerDevice(name, label); this.listener = listener; } public void unregisterDevice(String name) { devices.remove(name); listener = null; } public void addIntegerSensor(String deviceName, String sensorName, String label, int minValue, int maxValue, int defaultValue, int smallInc, int largeInc, String units) { IntegerSensor parameter = new IntegerSensor(sensorName, label, minValue, maxValue, defaultValue, smallInc, largeInc, units, listener); addParameter(parameter, deviceName); } public void addIntegerSensor(String deviceName, String sensorName, String label, int scaleFactor, int minValue, int maxValue, int defaultValue, int smallInc, int largeInc, String units) { IntegerSensor parameter = new IntegerSensor(sensorName, label, scaleFactor, minValue, maxValue, defaultValue, smallInc, largeInc, units, listener); addParameter(parameter, deviceName); } public void addIntegerActuator(String deviceName, String actuatorName, String label, int scaleFactor, String units) { IntegerActuator parameter = new IntegerActuator(actuatorName, label, scaleFactor, units); addParameter(parameter, deviceName); } public void addIntegerActuator(String deviceName, String actuatorName, String label, String units) { IntegerActuator parameter = new IntegerActuator(actuatorName, label, units); addParameter(parameter, deviceName); } public void addBooleanSensor(String deviceName, String sensorName, String label, boolean defaultValue) { BooleanSensor parameter = new BooleanSensor(sensorName, label, defaultValue, listener); addParameter(parameter, deviceName); } public void addRepeatableActionSensor(String deviceName, String sensorName, String label, String actionName) { RepeatableActionSensor parameter = new RepeatableActionSensor(sensorName, label, actionName, listener); addParameter(parameter, deviceName); } public void addNonRepeatableActionSensor(String deviceName, String sensorName, String label, String actionName) { NonRepeatableActionSensor parameter = new NonRepeatableActionSensor(sensorName, label, actionName, listener); addParameter(parameter, deviceName); } public void addParameter(SimulatedParameter parameter, String deviceName) { SimulatedDevice device = getDevice(deviceName); device.addParameter(parameter); } public void addBooleanActuator(String deviceName, String actuatorName, String label) { BooleanActuator parameter = new BooleanActuator(actuatorName, label); addParameter(parameter, deviceName); } public boolean getBooleanValue(String deviceName, String parameterName) { SimulatedDevice device = getDevice(deviceName); return device.getBooleanValue(parameterName); } public void setBooleanValue(String deviceName, String parameterName, boolean value) { SimulatedDevice device = getDevice(deviceName); device.setBooleanValue(parameterName, value); } public void setIntegerValue(String deviceName, String parameterName, int value) { SimulatedDevice device = getDevice(deviceName); device.setIntegerValue(parameterName, value); } public int getIntegerValue(String deviceName, String parameterName) { SimulatedDevice device = getDevice(deviceName); return device.getIntegerValue(parameterName); } // Overridden protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE_HTML); String deviceName = request.getParameter(DEVICE_PARAMETER); if (deviceName == null || deviceName.length() == 0) { processNullCommand(request, response); } else { SimulatedDevice device = (SimulatedDevice) devices.get(deviceName); if (device == null) response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, UNKNOWN_DEVICE + deviceName); else { device.generate(request, response, id); } } } // Private private SimulatedDevice getDevice(String deviceName) { SimulatedDevice device = (SimulatedDevice) devices.get(deviceName); if (device == null) throw new RuntimeException(UNKNOWN_DEVICE + deviceName); return device; } private void processNullCommand(HttpServletRequest request, HttpServletResponse response) throws IOException { gen = new HtmlGenerator(response.getWriter()); gen.replace("id", id); gen.write("/templates/DevicesPageTop.template", getClass()); generateDevices(); gen.write("/templates/DevicesPageBottom.template", getClass()); } private void generateDevices() { resetEvenOdd(); if (devices.isEmpty()) { gen.replace("evenOdd", nextEvenOdd()); gen.write("/templates/DevicesPageEmptyEntry.template", getClass()); } else { Object[] devicesArray = devices.keySet().toArray(); Arrays.sort(devicesArray); for (int i = 0; i < devicesArray.length; i++) { String name = (String) devicesArray[i]; SimulatedDevice device = getDevice(name); gen.replace("evenOdd", nextEvenOdd()); gen.replace("deviceName", name); gen.replace("deviceLabel", device.getLabel()); gen.write("/templates/DevicesPageDeviceEntry.template", getClass()); } } } private void resetEvenOdd() { evenOdd = true; } private String nextEvenOdd() { evenOdd = !evenOdd; return evenOdd ? "even" : "odd"; } }