/*******************************************************************************
* 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.plans;
import java.io.File;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.richfaces.event.FileUploadEvent;
import org.richfaces.model.UploadedFile;
import org.slf4j.Logger;
import eu.scape_project.planning.manager.PlanManager;
import eu.scape_project.planning.manager.PlanManager.PlanQuery;
import eu.scape_project.planning.manager.PlanManager.WhichProjects;
import eu.scape_project.planning.model.PlanProperties;
import eu.scape_project.planning.model.PlatoException;
import eu.scape_project.planning.utils.FacesMessages;
import eu.scape_project.planning.utils.FileUtils;
import eu.scape_project.planning.xml.ProjectImporter;
/**
* Controller for listing plans.
*
* @author cb
* @see {@link PlanManager}
*/
@SessionScoped
@Named("planLister")
public class PlanListerView implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private Logger log;
@Inject
private PlanManager planManager;
@Inject
private ProjectImporter projectImporter;
@Inject
private FacesMessages facesMessages;
private List<String> transformations;
/**
* Variable determining the plan selection which should be shown to the
* user.
*/
private WhichProjects projectSelection = WhichProjects.ALLPROJECTS;
private List<PlanProperties> list;
private PlanQuery planQuery;
/**
* Lists all available projects for the current user.
*
* @return the navigation target
*/
public String listAll() {
resetTransformations();
projectSelection = WhichProjects.ALLPROJECTS;
createPlanQuery();
list = planManager.list(planQuery);
log.debug("listing " + list.size() + " plans");
return "/plans.jsf";
}
/**
* Lists full plans of the current user.
*
* @return the navigation target
*/
public String listMyProjects() {
resetTransformations();
projectSelection = WhichProjects.MYPROJECTS;
createPlanQuery();
list = planManager.list(planQuery);
log.debug("listing " + list.size() + " plans");
return "/plans.jsf";
}
/**
* Lists public projects.
*
* @return the navigation target
*/
public String listPublicProjects() {
resetTransformations();
projectSelection = WhichProjects.PUBLICPROJECTS;
createPlanQuery();
list = planManager.list(planQuery);
log.debug("listing " + list.size() + " plans");
return "/plans.jsf";
}
/**
* Reads plans according to the plan selection.
*/
private void createPlanQuery() {
planQuery = planManager.createQuery();
planQuery.addVisibility(projectSelection);
}
/**
* Unlocks the plan with the provided plan id.
*
* @param pid
* the plan id
* @return the navigation target
*/
public String unlock(final int pid) {
resetTransformations();
planManager.unlockPlan(pid);
list = planManager.list(planQuery);
return null;
}
/**
* File upload listener to import plans.
*
* @param event
* event of the uploaded file
* @throws Exception
*/
public void listener(final FileUploadEvent event) throws Exception {
UploadedFile item = event.getUploadedFile();
File tmp = File.createTempFile(item.getName(), "xml");
tmp.deleteOnExit();
FileUtils.writeToFile(item.getInputStream(), new FileOutputStream(tmp));
try {
resetTransformations();
projectImporter.importPlans(tmp);
tmp.delete();
List<String> appliedTransformations = projectImporter.getAppliedTransformations();
transformations = appliedTransformations;
if (!appliedTransformations.isEmpty()) {
facesMessages.addInfo(null,
"Your XML file was outdated, therefore it had to be migrated to the current Plato Schema.");
}
list = planManager.list(planQuery);
} catch (PlatoException e) {
log.error("Failed to upload plan: " + item.getName(), e);
facesMessages.addError("Failed to upload plan: " + item.getName());
}
}
private void resetTransformations() {
transformations = null;
}
// --------------- getter/setter ---------------
public WhichProjects getProjectSelection() {
return projectSelection;
}
public List<PlanProperties> getList() {
return list;
}
public List<String> getTransformations() {
return transformations;
}
}