/**
* C-Nery - A home automation web application for C-Bus.
* Copyright (C) 2008,2009,2012 Dave Oxley <dave@daveoxley.co.uk>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.daveoxley.cnery.pages;
import com.daveoxley.cnery.actions.SceneActionConditionHome;
import com.daveoxley.cnery.dao.SceneActionConditionDAO;
import com.daveoxley.cnery.entities.AbstractCondition;
import com.daveoxley.cnery.entities.AbstractCondition.Logic;
import com.daveoxley.cnery.entities.BaseEntity;
import com.daveoxley.cnery.entities.SceneAction;
import com.daveoxley.cnery.entities.SceneActionCondition;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.jboss.seam.Component;
import org.jboss.seam.core.Interpolator;
/**
*
* @author dave
*/
public class SceneActionConditionNode extends TreeNode<SceneActionCondition> implements Serializable {
public enum Type {
LOGIC,
CONDITION;
};
private Type type;
private SceneActionCondition condition;
private SceneAction sceneAction;
private Map<Long,TreeNode> logicNodes;
private Map<Long,TreeNode> conditionNodes;
public SceneActionConditionNode(SceneAction sceneAction, Type type) {
this.condition = null;
this.sceneAction = sceneAction;
this.type = type;
}
private SceneActionConditionDAO getSceneActionConditionDAO() {
return (SceneActionConditionDAO)Component.getInstance(SceneActionConditionDAO.class);
}
public SceneActionConditionNode(SceneActionCondition condition) {
this.condition = condition;
this.sceneAction = condition.getSceneAction();
if (condition.getActionType() == SceneActionCondition.ActionType.LOGIC)
type = Type.LOGIC;
else
type = Type.CONDITION;
}
public List<SceneActionConditionNode> getLogicNodes() {
if (logicNodes == null)
logicNodes = new TreeMap<Long,TreeNode>();
mergeNodes(logicNodes, getSceneActionConditionDAO().findLogicSceneActionConditions(sceneAction, condition));
return new ArrayList(logicNodes.values());
}
public List<SceneActionConditionNode> getConditionNodes() {
if (conditionNodes == null)
conditionNodes = new TreeMap<Long,TreeNode>();
mergeNodes(conditionNodes, getSceneActionConditionDAO().findNonLogicSceneActionConditions(sceneAction, condition));
return new ArrayList(conditionNodes.values());
}
@Override
protected SceneActionCondition getEntity() {
return condition;
}
@Override
protected TreeNode getNewTreeNode(SceneActionCondition sac) {
return new SceneActionConditionNode(sac);
}
public String getDescription() {
if (condition != null) {
SceneActionConditionHome home = (SceneActionConditionHome)Component.getInstance(SceneActionConditionHome.class, true);
home.setId(condition.getId());
condition = home.getInstance();
}
if (type == Type.LOGIC) {
if (condition == null)
return "And";
else if (condition.getLogic() == Logic.AND)
return "And";
else if (condition.getLogic() == Logic.OR)
return "Or";
else
throw new IllegalStateException();
}
String conditionDesc = getEnumDesc(condition.getSceneState().getDescription()) + " " +
getEnumDesc(condition.getAction().getDescription()) + " scene action ";
if (condition.getActionType() == AbstractCondition.ActionType.TIME) {
conditionDesc = conditionDesc + "if time is " + getEnumDesc(condition.getTimeAfterBefore().getDescription()) + " " +
getEnumDesc(condition.getTimeWhen().getDescription()) + " " + getEnumDesc(condition.getTimePlusMinus().getDescription()) + " " +
condition.getTimeMinutes() + " minutes";
}
else {
if (condition.getActionType() == AbstractCondition.ActionType.GROUP) {
conditionDesc = conditionDesc + "if group " + condition.getDependGroupName();
}
else if (condition.getActionType() == AbstractCondition.ActionType.SCENE) {
conditionDesc = conditionDesc + "if scene " + condition.getDependSceneName();
}
conditionDesc = conditionDesc + " is " + getEnumDesc(condition.getGroupOnOff().getDescription());
}
return conditionDesc;
}
private String getEnumDesc(String value) {
return Interpolator.instance().interpolate("#{messages['" + value + "']}");
}
}