/******************************************************************************* * 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.application; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Serializable; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; import javax.naming.directory.InvalidAttributesException; import javax.persistence.EntityManager; import javax.servlet.http.HttpServletResponse; import org.richfaces.event.FileUploadEvent; import org.slf4j.Logger; import at.tuwien.minimee.registry.ToolRegistry; import eu.scape_project.planning.efficiency.PlanStatisticsGenerator; import eu.scape_project.planning.efficiency.StateChangeLogGenerator; import eu.scape_project.planning.model.Notification; import eu.scape_project.planning.utils.FacesMessages; /** * Class used as backing-bean for the admin-utils view. * * @author Markus Hamm */ @Named("admin") @SessionScoped public class AdminActionsView implements Serializable { private static final long serialVersionUID = 7135700751688165420L; @Inject private Logger log; private Integer exportPlanRangeFromId; private Integer exportPlanRangeToId; private Integer planId; /** * Author of the news to add. */ private String recipient; /** * Text of the news to add. */ private String newsText; /** * Directory where to import xml-plans from. */ private String xmlImportDirectory; /** * Plans xml-string representation to import. */ private String xmlStringToImport; /** * Name of the file to import. */ private String importFileName; /** * Data of the file to import. */ private byte[] importFileData; @Inject private AdminActions adminActions; @Inject private Messages messages; @Inject private FacesMessages facesMessages; private List<Notification> notifications = new ArrayList<Notification>(); @Inject EntityManager em; @PostConstruct public void init() { refreshNotifications(); } public void downloadStatistics() { // convert project-name to a filename, add date: SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_kkmmss"); String filename = "statistics-" + formatter.format(new Date()); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext() .getResponse(); response.setContentType("application/x-download"); response.setHeader("Content-Disposition", "attachement; filename=\"" + filename + ".csv\""); // the length of the resulting XML file is unknown due to // formatting: response.setContentLength(xml.length()); try { Writer writer = new OutputStreamWriter(response.getOutputStream()); PlanStatisticsGenerator statstics = new PlanStatisticsGenerator(writer, em); statstics.writeCompleteStatistics(); } catch (IOException e) { facesMessages.addError("An error occured while generating statistics."); log.error("An error occured while generating statistics.", e); } FacesContext.getCurrentInstance().responseComplete(); } public void downloadStageStatistics() { // convert project-name to a filename, add date: SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd_kkmmss"); String filename = "stage-statistics-" + formatter.format(new Date()); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext() .getResponse(); response.setContentType("application/x-download"); response.setHeader("Content-Disposition", "attachement; filename=\"" + filename + ".csv\""); // the length of the resulting XML file is unknown due to // formatting: response.setContentLength(xml.length()); try { Writer writer = new OutputStreamWriter(response.getOutputStream()); StateChangeLogGenerator statstics = new StateChangeLogGenerator(writer, em); statstics.writeCompleteStatistics(); } catch (IOException e) { facesMessages.addError("An error occured while generating stage statistics."); log.error("An error occured while generating stage statistics.", e); } FacesContext.getCurrentInstance().responseComplete(); } /** * Method responsible for exporting all plans in zipped format. */ public void exportAllPlansToZip() { boolean success = adminActions.exportAllPlansToZip(); if (success) { facesMessages.addInfo("exportAllPlansToZip", "Exported successful to directory: " + adminActions.getLastProjectExportPath()); } else { facesMessages.addError("expornotificationstAllPlansToZip", "Export failed"); } } /** * Method responsible for exporting a range of plans in zipped format. */ public void exportSomePlansToZip() { boolean success = adminActions.exportSomePlansToZip(exportPlanRangeFromId, exportPlanRangeToId); if (success) { facesMessages.addInfo("exportSomePlansToZip", "Exported successful to directory: " + adminActions.getLastProjectExportPath()); } else { facesMessages.addError("exportSomePlansToZip", "Export failed"); } } public void deleteAllPlans() { if (adminActions.deleteAllPlans()) { facesMessages.addInfo("deleteAllPlans", "All plans deleted!"); } else { facesMessages.addInfo("deleteAllPlans", "Admin: Deletion of all plans failed, see log for more details."); } } public void cleanUpLoosePlanValues() { int nrOfValuesRemoved = adminActions.cleanUpLoosePlanValues(); log.info("Admin: Cleaned up " + nrOfValuesRemoved + " loose plan values"); facesMessages.addInfo("cleanUpLoosePlanValues", "Cleaned up " + nrOfValuesRemoved + " loose plan values"); } public void unlockAllPlans() { adminActions.unlockAllPlans(); facesMessages.addInfo("unlockAllPlans", "All plans are unlocked now."); } public void unlockPlan() { if (planId == 0) { facesMessages.addError("planId", "Please provide a valid value"); return; } boolean success = adminActions.unlockPlan(planId); if (success) { facesMessages.addInfo("unlockPlan", "Unlock successful"); } else { facesMessages.addError("unlockPlan", "Unlock failed"); } } public void clonePlan() { if (planId == 0) { facesMessages.addError("planId", "Please provide a valid value"); return; } boolean success = adminActions.clonePlan(planId, null); if (success) { facesMessages.addInfo("clonePlan", "Clone successful"); } else { facesMessages.addError("clonePlan", "Clone failed"); } } public void deletePlan() { if (planId == 0) { facesMessages.addError("planId", "Please provide a valid value"); return; } if (adminActions.deletePlan(planId)) { facesMessages.addInfo("deletePlan", "Plan deleted"); } else { facesMessages.addError("deletePlan", "Failed to delete plan. See log file for details."); } } public void fixAlternativeNames(){ if (planId == 0) { facesMessages.addError("planId", "Please provide a valid value"); return; } notifications.clear(); notifications.addAll(adminActions.getNotifications()); if (adminActions.fixAlternativeNames(planId)) { facesMessages.addInfo("fixAlt", "Alternative names fixed"); } else { facesMessages.addError("fixAlt", "Failed to fix alternative names. See log file for details."); } } /** * Method responsible for triggering a RuntimeException for tesing purposes. * * @throws InvalidAttributesException */ public void throwRuntimeException() { adminActions.throwRuntimeException(); } /** * Method responsible for clearing the list containing exception messages * occured during Plato runtime. */ public void clearErrors() { messages.clearErrors(); } public void refreshNotifications(){ notifications.clear(); notifications.addAll(adminActions.getNotifications()); } /** * Method responsible for adding a news entry. */ public void addNotification() { adminActions.addNotification(recipient, newsText); refreshNotifications(); newsText = ""; } /** * Method responsible for clearing all news messages. */ public void removeNotification(String uuid) { adminActions.removeNotification(uuid); refreshNotifications(); } /** * Method responsible for munching 500 MB of memory. */ public void munch500MBofMemory() { adminActions.munchMem(500); facesMessages.addInfo("memtestAdd", "Munched 500 MB of memory"); } /** * Method responsible for releasing memory. */ public void releaseMemory() { adminActions.releaseMem(); facesMessages.addInfo("memtestRelease", "Released memory"); } /** * Method responsible for importing plans from a directory. */ public void importPlansFromDirectory() { if (xmlImportDirectory == null || xmlImportDirectory.length() == 0) { facesMessages.addError("importDir", "You have to enter a valid import directory."); return; } int importedPlans = adminActions.importPlansFromDirectory(xmlImportDirectory); if (importedPlans == 0) { facesMessages.addError("directoryImport", "No Plans imported. Please check import directory."); } else { facesMessages.addInfo("directoryImport", "Imported " + importedPlans + " plans."); } } /** * Method responsible for importing plans via a given xml. */ public void importFromXml() { if (xmlStringToImport == null || xmlStringToImport.length() == 0) { facesMessages.addError("importXml", "You have to enter a valid xml."); return; } int importedPlans = adminActions.importPlansFromXml(xmlStringToImport); if (importedPlans == 0) { facesMessages.addError("xmlImport", "No Plans imported. Please check XML input."); } else { facesMessages.addInfo("xmlImport", "Imported " + importedPlans + " plans."); xmlStringToImport = ""; } } /** * Method responsible for importing Plans via a File. */ public void importFromFile() { if (importFileData == null || importFileData.length == 0) { facesMessages.addError("file", "Please select a File"); return; } int importedPlans = adminActions.importPlansFromFile(importFileData, false); if (importedPlans == 0) { facesMessages.addError("importFile", "No Plans imported. Please check your file selection."); } else { facesMessages.addInfo("importFile", "Imported " + importedPlans + " plans."); importFileData = null; importFileName = null; } } /** * Method responsible for importing Plans for the current logged in user, * via a File. */ public void importFromFileForMyself() { if (importFileData == null || importFileData.length == 0) { facesMessages.addError("file", "Please select a File"); return; } int importedPlans = adminActions.importPlansFromFile(importFileData, false); if (importedPlans == 0) { facesMessages.addError("importFileForMyself", "No Plans imported. Please check your file selection."); } else { facesMessages.addInfo("importFileForMyself", "Imported " + importedPlans + " plans."); importFileData = null; importFileName = null; } } /** * Method responsible for setting the file to upload. * * @param event * RichFaces FileUploadEvent containing file information. */ public void selectImportFile(FileUploadEvent event) { importFileName = event.getUploadedFile().getName(); importFileData = event.getUploadedFile().getData(); } public void reloadMinimee(){ ToolRegistry.getInstance().reload(); } // --------------- getter/setter --------------- public Integer getExportPlanRangeFromId() { return exportPlanRangeFromId; } public void setExportPlanRangeFromId(Integer exportPlanRangeFromId) { this.exportPlanRangeFromId = exportPlanRangeFromId; } public Integer getExportPlanRangeToId() { return exportPlanRangeToId; } public void setExportPlanRangeToId(Integer exportPlanRangeToId) { this.exportPlanRangeToId = exportPlanRangeToId; } public Integer getPlanId() { return planId; } public void setPlanId(Integer planId) { this.planId = planId; } public String getRecipient() { return recipient; } public void setRecipient(String recipient) { this.recipient = recipient; } public String getNewsText() { return newsText; } public void setNewsText(String newsText) { this.newsText = newsText; } public String getXmlImportDirectory() { return xmlImportDirectory; } public void setXmlImportDirectory(String xmlImportDirectory) { this.xmlImportDirectory = xmlImportDirectory; } public String getXmlStringToImport() { return xmlStringToImport; } public void setXmlStringToImport(String xmlStringToImport) { this.xmlStringToImport = xmlStringToImport; } public String getImportFileName() { return importFileName; } public void setImportFileName(String importFileName) { this.importFileName = importFileName; } public byte[] getImportFileData() { return importFileData; } public void setImportFileData(byte[] importFileData) { this.importFileData = importFileData; } public List<Notification> getNotifications() { return notifications; } }