/******************************************************************************* * Copyright 2006 - 2012 Vienna University of Technology, * Department of Software Technology and Interactive Systems, IFS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package eu.scape_project.planning.plato.wfview.full; import java.io.Serializable; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang.StringUtils; import eu.scape_project.planning.manager.PlanManager; import eu.scape_project.planning.model.Plan; import eu.scape_project.planning.model.PlanState; import eu.scape_project.planning.model.User; import eu.scape_project.planning.plato.wfview.ViewWorkflowManager; import eu.scape_project.planning.policies.OrganisationalPolicies; /** * Backing bean to create new plans following the full workflow. Note, that it * is not part of the workflow itself. * * @author Michael Kraxner * */ @Named("createPlan") @ConversationScoped public class CreatePlanView implements Serializable { private static final long serialVersionUID = -1177232137288031358L; /** * Used to store a created plan, before passing it on to the * {@link #viewWorkflowManager}. */ @Inject private PlanManager planManager; /** * Used to edit a created plan. */ @Inject private ViewWorkflowManager viewWorkflowManager; @Inject private Conversation conversation; @Inject private User user; @Inject private OrganisationalPolicies organisationalPolicies; private Plan plan; /** * This flag is used in views to prevent navigation per menu when there are * unsaved changes. This property preserves the changed-state during * requests like adding a node and can be used to reset the changed-state * i.e. after save and discard */ protected String changed; public CreatePlanView() { } /** * Creates a new plan and prepares it for the full workflow. * * @return the navigation target */ public String createPlan() { if (!conversation.isTransient()) { viewWorkflowManager.endWorkflow(); } conversation.begin(); plan = new Plan(); plan.getPlanProperties().setAuthor(user.getFullName()); plan.getPlanProperties().setPrivateProject(true); plan.getPlanProperties().setOwner(user.getUsername()); if (StringUtils.isNotEmpty(organisationalPolicies.getOrganisation())) { plan.getPlanProperties().setOrganization(organisationalPolicies.getOrganisation()); } else { plan.getPlanProperties().setOrganization(user.getUserGroup().getName()); } // We have to prevent the user from navigating to the step 'Load plan' // because the user wouldn't be able to leave this step: Going to // 'Define Basis' is not possible as the project hasn't been saved so // far. // // We 'activate' the changed flag so that the user is asked to either // save the project or discard changes. changed = "T"; return "/plan/createplan.jsf" + "?faces-redirect=true"; } /** * Stores the plan and starts the full workflow. * * @return the navigation target */ public String savePlan() { planManager.save(plan, PlanState.INITIALISED, plan); conversation.end(); return viewWorkflowManager.startWorkflow(plan.getPlanProperties().getId(), false); } /** * Discards the plan by simply reseting the changed flag and redirecting to * the index page. * * @return the navigation target */ public String discardPlan() { conversation.end(); changed = null; return "/index.jsf" + "?faces-redirect=true"; } public Plan getPlan() { return plan; } public void setPlan(Plan plan) { this.plan = plan; } public String getChanged() { return changed; } public void setChanged(String changed) { this.changed = changed; } }