/* ==================================================================
* InstructorController.java - Jul 10, 2013 4:00:40 PM
*
* Copyright 2007-2013 SolarNetwork.net Dev Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
* ==================================================================
*/
package net.solarnetwork.node.setup.web;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import net.solarnetwork.domain.NodeControlInfo;
import net.solarnetwork.node.NodeControlProvider;
import net.solarnetwork.node.reactor.InstructionHandler;
import net.solarnetwork.node.reactor.InstructionStatus;
import net.solarnetwork.node.reactor.support.BasicInstruction;
import net.solarnetwork.node.setup.web.support.ServiceAwareController;
/**
* Controller to act as a local Instructor to the local node.
*
* @author matt
* @version 1.0
*/
@ServiceAwareController
@RequestMapping("/a/controls")
public class InstructorController {
private static final String KEY_CONTROL_ID = "controlId";
private static final String KEY_CONTROL_INFO = "info";
private static final String KEY_CONTROL_IDS = "controlIds";
private final Logger log = LoggerFactory.getLogger(getClass());
@Resource(name = "nodeControlProviderList")
private Collection<NodeControlProvider> providers = Collections.emptyList();
@Resource(name = "instructionHandlerList")
private Collection<InstructionHandler> handlers = Collections.emptyList();
@RequestMapping(value = "", method = RequestMethod.GET)
public String settingsList(ModelMap model) {
List<String> providerIds = new ArrayList<String>();
for ( NodeControlProvider provider : providers ) {
providerIds.addAll(provider.getAvailableControlIds());
}
model.put(KEY_CONTROL_IDS, providerIds);
return "control/list";
}
@RequestMapping(value = "/manage", method = RequestMethod.GET)
public String manage(@RequestParam("id") String controlId, ModelMap model) {
NodeControlProvider provider = null;
for ( NodeControlProvider p : providers ) {
for ( String s : p.getAvailableControlIds() ) {
if ( s.equals(controlId) ) {
provider = p;
break;
}
}
if ( provider != null ) {
break;
}
}
if ( provider != null ) {
model.put(KEY_CONTROL_ID, controlId);
NodeControlInfo info = null;
try {
info = provider.getCurrentControlInfo(controlId);
} catch ( RuntimeException e ) {
log.warn("Error getting control {} info: {}", controlId, e.getMessage());
}
if ( info != null ) {
model.put(KEY_CONTROL_INFO, info);
}
}
return "control/manage";
}
@RequestMapping(value = "/setControlParameter", method = RequestMethod.POST)
public String setControlParameter(SetControlParameterInstruction instruction, ModelMap model,
HttpServletRequest request) {
BasicInstruction instr = new BasicInstruction(InstructionHandler.TOPIC_SET_CONTROL_PARAMETER,
new Date(), "LOCAL", "LOCAL", null);
instr.addParameter(instruction.getControlId(), instruction.getParameterValue());
InstructionStatus.InstructionState result = null;
try {
for ( InstructionHandler handler : handlers ) {
if ( handler.handlesTopic(instr.getTopic()) ) {
result = handler.processInstruction(instr);
}
if ( result != null ) {
break;
}
}
} catch ( RuntimeException e ) {
log.error("Exception setting control parameter {} to {}", instruction.getControlId(),
instruction.getParameterValue(), e);
}
if ( result == null ) {
// nobody handled it!
result = InstructionStatus.InstructionState.Declined;
}
String keyPrefix = (result == InstructionStatus.InstructionState.Completed ? "status" : "error");
HttpSession session = request.getSession();
session.setAttribute(keyPrefix + "MessageKey", "controls.manage.SetControlParameter.result");
session.setAttribute(keyPrefix + "MessageParam0", result);
return "redirect:/a/controls/manage?id=" + instruction.getControlId();
}
public void setProviders(Collection<NodeControlProvider> providers) {
this.providers = providers;
}
public void setHandlers(Collection<InstructionHandler> handlers) {
this.handlers = handlers;
}
}