package com.intuit.tank; /* * #%L * JSF Support Beans * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.Conversation; import javax.enterprise.event.Event; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.util.Messages; import org.picketlink.Identity; import org.picketlink.idm.IdentityManager; import org.picketlink.idm.model.basic.User; import com.intuit.tank.auth.Security; import com.intuit.tank.dao.ProjectDao; import com.intuit.tank.dao.WorkloadDao; import com.intuit.tank.project.AssociateDataFileBean; import com.intuit.tank.project.JobConfiguration; import com.intuit.tank.project.JobMaker; import com.intuit.tank.project.NotificationsEditor; import com.intuit.tank.project.Project; import com.intuit.tank.project.ProjectVariableEditor; import com.intuit.tank.project.UsersAndTimes; import com.intuit.tank.project.Workload; import com.intuit.tank.project.WorkloadScripts; import com.intuit.tank.qualifier.Modified; import com.intuit.tank.util.ExceptionHandler; import com.intuit.tank.vm.api.enumerated.IncrementStrategy; import com.intuit.tank.vm.settings.AccessRight; @Named @ConversationScoped public class ProjectBean implements Serializable { private static final Logger LOG = LogManager.getLogger(ProjectBean.class); private static final long serialVersionUID = 1L; private Project project; @Inject private UsersAndTimes usersAndTimes; @Inject private Identity identity; @Inject private IdentityManager identityManager; @Inject private Conversation conversation; @Inject private Security security; @Inject private JobMaker jobMaker; @Inject private AssociateDataFileBean dataFileBean; @Inject private WorkloadScripts workloadScripts; @Inject private NotificationsEditor notificationsEditor; @Inject private ProjectVariableEditor projectVariableEditor; @Inject private Messages messages; @Inject private ExceptionHandler exceptionHandler; @Inject @Modified private Event<ModifiedProjectMessage> projectEvent; private String saveAsName; /** * @return the saveAsName */ public String getSaveAsName() { return saveAsName; } /** * @param saveAsName * the saveAsName to set */ public void setSaveAsName(String saveAsName) { this.saveAsName = saveAsName; } /** * @return the Name */ public String getName() { return getProject().getName(); } /** * @param Name * the Name to set */ public void setName(String name) { getProject().setName(name); } /** * @return the Comment */ public String getComments() { return getProject().getComments(); } /** * @param Comment * the Comment to set */ public void setComments(String comment) { getProject().setComments(comment); } /** * Initializes all the data variables of the class. * * @param project */ public void openProject(Project prj) { conversation.begin(); doOpenProject(prj); } /** * @param prj */ private void doOpenProject(Project prj) { this.project = new ProjectDao().findById(prj.getId()); LOG.info("Opening Project " + prj + " workloads " + project.getWorkloads()); usersAndTimes.init(); notificationsEditor.init(); jobMaker.init(this); dataFileBean.init(); workloadScripts.init(); projectVariableEditor.init(); this.saveAsName = project.getName(); if (!canEditProject()) { messages.warn("You do not have permission to edit this project."); } } public String cancel() { conversation.end(); return "success"; } /** * @return the project */ public Project getProject() { return project; } /** * @return the workload */ public Workload getWorkload() { return project.getWorkloads().get(0); } /** * @return the configuration */ public JobConfiguration getJobConfiguration() { return getWorkload().getJobConfiguration(); } /** * @return the workload type of the job */ public String getWorkloadType() { return getWorkload().getJobConfiguration().getIncrementStrategy().toString(); } /** * Sets the workloadType to either increasing or standard * * @param workloadType */ public void setWorkloadType(String workloadType) { Workload workload = getWorkload(); if (workloadType.equals(IncrementStrategy.increasing)) { workload.getJobConfiguration().setIncrementStrategy(IncrementStrategy.increasing); } else { workload.getJobConfiguration().setIncrementStrategy(IncrementStrategy.standard); } } /** * Saves the Project object in the database. */ public void save() { doSave(); messages.info("Project " + project.getName() + " has been saved."); } public void saveAs() { if (StringUtils.isEmpty(saveAsName)) { messages.error("You must give the script a name."); return; } try { String originalName = project.getName(); if (originalName.equals(saveAsName)) { save(); } else { Project copied = copyProject(); copied.getWorkloads().get(0).getJobConfiguration().setVariables(new HashMap<String,String>()); copied = new ProjectDao().saveOrUpdateProject(copied); save(); // FIXME Hack for original project losing data. Do not know why this works projectVariableEditor.copyTo(copied.getWorkloads().get(0)); new WorkloadDao().saveOrUpdate(copied.getWorkloads().get(0)); doOpenProject(copied); projectEvent.fire(new ModifiedProjectMessage(project, this)); messages.info("Project " + originalName + " has been saved as " + project.getName() + "."); } } catch (Exception e) { LOG.error(e.getMessage()); messages.error(e.getMessage()); } } /** * @return */ private Project copyProject() { Project ret = new Project(); Workload workload = new Workload(); workload.setParent(ret); List<Workload> workloads = new ArrayList<Workload>(); workload.setName(saveAsName); workloads.add(workload); ret.setWorkloads(workloads); ret.setComments(project.getComments()); ret.setCreator(identityManager.lookupById(User.class, identity.getAccount().getId()).getLoginName()); ret.setName(saveAsName); ret.setProductName(project.getProductName()); ret.setScriptDriver(project.getScriptDriver()); usersAndTimes.copyTo(workload); workloadScripts.copyTo(workload); notificationsEditor.copyTo(workload); return ret; } /** * Saves the Project object in the database. */ public boolean doSave() { try { usersAndTimes.save(); dataFileBean.save(); notificationsEditor.save(); projectVariableEditor.save(); project = new ProjectDao().saveOrUpdateProject(project); workloadScripts.save(); // doOpenProject(project); projectEvent.fire(new ModifiedProjectMessage(project, this)); return true; } catch (Exception e) { LOG.error("Error saving: " + e, e); exceptionHandler.handle(e); } return false; } public boolean canEditProject() { return security.hasRight(AccessRight.EDIT_PROJECT) || security.isOwner(project); } }