/** * 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.actions; import com.daveoxley.cnery.entities.Scene; import com.daveoxley.cnery.entities.SceneAction; import com.daveoxley.cnery.scenes.SceneRunner; import com.daveoxley.seam.CNeryEntityHome; import com.workplacesystems.queuj.Process; import com.workplacesystems.queuj.Queue; import com.workplacesystems.queuj.occurrence.RunNever; import com.workplacesystems.queuj.process.seam.SeamProcessBuilder; import com.workplacesystems.queuj.resilience.RunOnlyOnce; import java.util.Locale; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.core.Events; import org.jboss.seam.international.StatusMessages; /** * * @author Dave Oxley <dave@daveoxley.co.uk> */ @Name("sceneHome") @Scope(ScopeType.CONVERSATION) public class SceneHome extends CNeryEntityHome<Scene> { @In private StatusMessages statusMessages; @In private Events events; @In private Queue<SeamProcessBuilder> DEFAULT_QUEUE; @In(required=false) private Scene selectedScene; @Override public void create() { super.create(); clearInstance(); if (selectedScene != null) setId(selectedScene.getId()); } @Override protected Scene createInstance() { Scene scene = super.createInstance(); scene.setStatePersistence(Scene.StatePersistence.TRIGGER); scene.setResetAction(Scene.ResetAction.RESET_UNLESS_CHANGED); scene.setGpsEnterAreaAction(Scene.GPSSceneAction.DO_NOTHING); scene.setGpsLeaveAreaAction(Scene.GPSSceneAction.DO_NOTHING); return scene; } @Factory("scene") public Scene getScene() { return getInstance(); } @Override protected void clearFactoryInstance() { create(); if (Contexts.isConversationContextActive()) Contexts.getConversationContext().remove("scene"); } public void createProcess() { Scene scene = getInstance(); SeamProcessBuilder spb = DEFAULT_QUEUE.newProcessBuilder(Locale.getDefault()); spb.setProcessOccurrence(new RunNever()); spb.setProcessPersistence(true); spb.setProcessKeepCompleted(true); spb.setProcessResilience(new RunOnlyOnce()); if (scene.getActivateProcess() == null) { spb.setParameter("scene", scene); spb.setProcessName("ActivateSceneRunner"); spb.setProcessDescription("Activate scene runner for scene " + scene.getName()); spb.setProcessDetails(SceneRunner.class, "activate", new Class[] {}, new Object[] {}); spb.addProcessSection(SceneRunner.class, "deactiveForTrigger", new Class[] {}, new Object[] {}); Process<Integer> activateProcess = spb.newProcess(); scene.setActivateProcessId(activateProcess.getProcessKey()); scene.setActive(false); } Process<Integer> deactivateProcess = scene.getDeactivateProcess(); if (scene.getStatePersistence() != Scene.StatePersistence.TRIGGER) { if (deactivateProcess == null) { spb.setParameter("scene", scene); spb.setProcessName("DeactivateSceneRunner"); spb.setProcessDescription("Deactivate scene runner for scene " + scene.getName()); spb.setProcessDetails(SceneRunner.class, "deactivate", new Class[] {}, new Object[] {}); deactivateProcess = spb.newProcess(); scene.setDeactivateProcessId(deactivateProcess.getProcessKey()); scene.setActive(false); } } else { if (deactivateProcess != null) deactivateProcess.delete(); } } private void clearFields() { Scene s = getInstance(); if (s.getStatePersistence() != Scene.StatePersistence.TIMED_ACTIVE) s.setMinutes(0); } @Override public String update() { clearFields(); createProcess(); String res = super.update(); if (res != null && res.equals("updated")) { statusMessages.clear(); updatedMessage(); events.raiseTransactionSuccessEvent("scenesUpdated", getInstance().getId()); } return res; } @Override public String persist() { clearFields(); createProcess(); String res = super.persist(); if (res != null && res.equals("persisted")) { statusMessages.clear(); createdMessage(); events.raiseTransactionSuccessEvent("scenesUpdated", getInstance().getId()); } return res; } @Override public String remove() { Scene scene = getInstance(); Process<Integer> activateProcess = scene.getActivateProcess(); if (activateProcess != null) activateProcess.delete(); Process<Integer> deactivateProcess = scene.getDeactivateProcess(); if (deactivateProcess != null) deactivateProcess.delete(); for (SceneAction sa : scene.getSceneActions()) { Process<Integer> actionProcess = sa.getProcess(); if (actionProcess != null) actionProcess.delete(); } String res = super.remove(); if (res != null && res.equals("removed")) { statusMessages.clear(); deletedMessage(); events.raiseTransactionSuccessEvent("clearSceneSelection"); } return res; } }