package com.ese.ils.beta.beans;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import com.ese.ils.beta.model.Favorite;
import com.ese.ils.beta.model.Module;
import com.ese.ils.beta.model.Question;
import com.ese.ils.beta.service.FavoriteLocalServiceUtil;
import com.ese.ils.beta.service.ModuleLocalServiceUtil;
import com.ese.ils.beta.service.QuestionLocalServiceUtil;
import com.ese.ils.beta.service.SlideLocalServiceUtil;
import com.ese.ils.beta.util.DeComposer;
import com.icesoft.faces.async.render.SessionRenderer;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
/**
* Zentrale Backing Bean fuer die "Erweiterte Vorlesung"
* Hat Zugriff auf diverse Model, Navigation und Backing Beans
* @author eduard walter
*
*/
@ManagedBean
@ViewScoped
public class ModuleBackingBean implements Serializable {
private static final long serialVersionUID = -4683364854542035247L;
List<SelectItem> moduleItems;
List<SelectItem> favoriteItems;
List<SelectItem> questionItems;
private String currentFav;
private String currentQuest;
private boolean disableFunctions=false;
@ManagedProperty(value="#{navigationBackingBean}")
private transient NavigationBackingBean navigationBackingBean;
@ManagedProperty(value="#{groupNavigationBean}")
private transient GroupNavigationBean groupNavigationBean;
@ManagedProperty(value="#{moduleModelBean}")
private transient ModuleModelBean moduleModelBean;
@ManagedProperty(value="#{questionModelBean}")
private transient QuestionModelBean questionModelBean;
@ManagedProperty(value="#{slideBackingBean}")
private transient SlideBackingBean slideBackingBean;
@ManagedProperty(value="#{countQuestionBean}")
private transient CountQuestionBean countQuestionBean;
@ManagedProperty(value = "#{voteNavigationBean}")
private transient VoteNavigationBean voteNavigationBean;
@ManagedProperty(value="#{slideModelBean}")
private transient SlideModelBean slideModelBean;
/**
* Navigationsmethode mit Ziel moduleSelection.xhtml
* Laedt verfuegbare Module als SelectItems fuer die spaetere Auswahl vor
* @param event
*/
public void moveToModuleSelection(ActionEvent event){
try {
moduleItems = new ArrayList<SelectItem>();
for (Module module : ModuleLocalServiceUtil.fetchItemsByUser(getCurrentUserId())) {
moduleItems.add(new SelectItem(module.getModuleId(),module.getModuleTitle()));
}
} catch (Exception e) {
e.printStackTrace();
}
navigationBackingBean.setHomeStatus(false);
navigationBackingBean.setModuleHomeStatus(false);
navigationBackingBean.setModuleSelectionStatus(true);
}
/**
* Navigationsmethode mit Ziel home.xhtml
* Der Button, der diese Methode ausloest, ist in jeder Sicht vertreten
* Alle verfuegbaren Sichten werden deaktiviert und nur der Startbildschirm angezeigt
* @param event
*/
public void moveToHome(ActionEvent event){
navigationBackingBean.setHomeStatus(true);
navigationBackingBean.setModuleSelectionStatus(false);
navigationBackingBean.setSlideViewerStatus(false);
navigationBackingBean.setModuleInfoStatus(false);
navigationBackingBean.setModuleHomeStatus(false);
navigationBackingBean.setFavoriteSelectionStatus(false);
navigationBackingBean.setQuestionSelectionStatus(false);
navigationBackingBean.setQuestionEditorStatus(false);
navigationBackingBean.setQuestionViewerStatus(false);
groupNavigationBean.setGroupModeSelectionStatus(false);
groupNavigationBean.setGroupLoginStatus(false);
groupNavigationBean.setGroupContentSelectionStatus(false);
groupNavigationBean.setGroupContentViewerStatus(false);
groupNavigationBean.setGroupCreateSessionStatus(false);
groupNavigationBean.setGroupSessionCreatedStatus(false);
voteNavigationBean.setVoteHomeStatus(false);
voteNavigationBean.setVoteShowStatus(false);
voteNavigationBean.setVoteCreateStatus(false);
voteNavigationBean.setVoteResultsStatus(false);
}
/**
* Navigationsmethode mit Ziel moduleHome.xhtml
* Laedt einzelnes Modul, um dessen Informationen und Titelfolie anzuzeigen
* @param event
*/
public void moveToModuleHome(ActionEvent event){
navigationBackingBean.setModuleSelectionStatus(false);
navigationBackingBean.setModuleHomeStatus(true);
navigationBackingBean.setSlideViewerStatus(false);
navigationBackingBean.setModuleInfoStatus(false);
navigationBackingBean.setFavoriteSelectionStatus(false);
navigationBackingBean.setQuestionSelectionStatus(false);
fetchModule(Long.valueOf(moduleModelBean.getModuleId()));
slideBackingBean.showSlides(Long.valueOf(moduleModelBean.getModuleId()),0);
}
/**
* Laedt ein einzelnes Modul aus der Datenbank und belegt die ModuleModelBean
* @param moduleId
*/
public void fetchModule(long moduleId){
try {
Module module = ModuleLocalServiceUtil.getModule(moduleId);
moduleModelBean.setLecturerUserId(module.getLecturerUserId());
moduleModelBean.setModuleTitle(module.getModuleTitle());
moduleModelBean.setDate(module.getCreateDate());
moduleModelBean.setAdditionalInfo(module.getAdditionalInfo());
} catch (NumberFormatException e) {
System.out.println("Beim fetchen eines Moduls " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
} catch (PortalException e) {
System.out.println("Beim fetchen eines Moduls " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
} catch (SystemException e) {
System.out.println("Beim fetchen eines Moduls " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
}
}
/**
* Navigationsmethode mit Ziel slideViewer.xhtml
* Zeigt die erste Folie eines Sets an
* @param event
*/
public void moveToSlideViewer(ActionEvent event){
navigationBackingBean.setModuleHomeStatus(false);
navigationBackingBean.setSlideViewerStatus(true);
slideBackingBean.showSlides(Long.valueOf(moduleModelBean.getModuleId()),0);
}
/**
* Navigationsmethode mit Ziel moduleInfo.xhtml
* @param event
*/
public void moveToModuleInfo(ActionEvent event){
navigationBackingBean.setModuleHomeStatus(false);
navigationBackingBean.setModuleInfoStatus(true);
}
/**
* Navigationsmethode mit Ziel favoriteSelection.xhtml
* Favorite werden aus DB geladen und als SelectItems angezeigt
* @param event
*/
public void moveToFavoriteSelection(ActionEvent event){
navigationBackingBean.setModuleHomeStatus(false);
navigationBackingBean.setFavoriteSelectionStatus(true);
favoriteItems = new ArrayList<SelectItem>();
for (Favorite favorite : FavoriteLocalServiceUtil.fetchModuleFavorites(getCurrentUserId(), Long.valueOf(moduleModelBean.getModuleId()))){
favoriteItems.add(new SelectItem(favorite.getFavoriteId(),"Folie Nr.: "+DeComposer.slideIdToSlideNr(""+favorite.getSlideId())));
}
}
/**
* Verfolgt Aenderungen in der Favoriten-Auswahl
* Fuer die aktuelle Auswahl wird eine Vorschau angezeigt
* @param vcEvent
*/
public void favoritePreviewListener(ValueChangeEvent vcEvent){
try {
slideBackingBean.showPreview(SlideLocalServiceUtil.getSlide(FavoriteLocalServiceUtil.getFavorite(Long.valueOf(vcEvent.getNewValue().toString())).getSlideId()).getIndex());
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (PortalException e) {
e.printStackTrace();
} catch (SystemException e) {
e.printStackTrace();
}
}
/**
* Zeigt den aktuellen Favoriten als Folie im slideViewer an
* @param event
*/
public void moveToFavorite(ActionEvent event){
navigationBackingBean.setFavoriteSelectionStatus(false);
navigationBackingBean.setSlideViewerStatus(true);
try {
slideBackingBean.showSlide(""+FavoriteLocalServiceUtil.getFavorite(Long.valueOf(currentFav)).getSlideId());
} catch (NumberFormatException e) {
System.out.println("Beim navigieren zu einem Favoriten " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
} catch (PortalException e) {
System.out.println("Beim navigieren zu einem Favoriten " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
} catch (SystemException e) {
System.out.println("Beim navigieren zu einem Favoriten " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
}
}
/**
* Entfernt einen Favoriten aus der DB
* @param event
*/
public void deleteFavorite(ActionEvent event){
try {
FavoriteLocalServiceUtil.deleteFavorite(Long.valueOf(currentFav));
} catch (NumberFormatException e) {
System.out.println("Beim l�schen eines Favoriten " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
} catch (PortalException e) {
System.out.println("Beim l�schen eines Favoriten " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
} catch (SystemException e) {
System.out.println("Beim l�schen eines Favoriten " +
"ist ein Fehler aufgetreten!");
e.printStackTrace();
}
moveToFavoriteSelection(event);
}
/**
* Navigationsmethode mit Ziel questionSelection.xhtml
* Aktuelle Fragen werden aus DB geladen und als SelectItems angezeigt
* @param event
*/
public void moveToQuestionSelection(ActionEvent event){
navigationBackingBean.setModuleHomeStatus(false);
navigationBackingBean.setQuestionEditorStatus(false);
navigationBackingBean.setQuestionViewerStatus(false);
navigationBackingBean.setQuestionSelectionStatus(true);
questionItems = new ArrayList<SelectItem>();
for (Question question : QuestionLocalServiceUtil.fetchQuestionItems(Long.valueOf(moduleModelBean.getModuleId()))){
questionItems.add(new SelectItem(question.getQuestionId(),question.getQuestionText()));
}
}
/**
* Navigationsmethode mit Ziel questionEditor.xhtml
* Parameter der questionModelBean werden zurueckgesetzt
* @param event
*/
public void moveToQuestionEditor(ActionEvent event){
navigationBackingBean.setQuestionSelectionStatus(false);
navigationBackingBean.setSlideViewerStatus(false);
navigationBackingBean.setQuestionEditorStatus(true);
questionModelBean.setQuestionText(" ");
questionModelBean.setSlideId(0);
}
/**
* Navigationsmethode mit Ziel questionEditor.xhtml
* aequialent zu moveToQuestionEditor, jedoch mit Angabe der aktuellen Folie
* @param event
*/
public void moveFromSlideToQuestionEditor(ActionEvent event){
navigationBackingBean.setQuestionSelectionStatus(false);
navigationBackingBean.setSlideViewerStatus(false);
navigationBackingBean.setQuestionEditorStatus(true);
questionModelBean.setQuestionText(" ");
}
/**
* Legt die aktuelle Frage in der DB an und loest ein Rendern der Dozentensicht aus
* @param event
*/
public void askQuestion(ActionEvent event){
QuestionLocalServiceUtil.askQuestion(getCurrentUserId(), Long.valueOf(moduleModelBean.getModuleId()),
questionModelBean.getQuestionText(),questionModelBean.getSlideId());
countQuestionBean.countQuestions(event);
SessionRenderer.render("question");
moveToQuestionSelection(event);
}
/**
* Navigationsmethode mit Ziel questionViewer.xhtml
* Zeigt die gewaehlte Frage und die dazugehoerige Antwort an
* @param event
*/
public void moveToQuestionViewer(ActionEvent event){
navigationBackingBean.setQuestionSelectionStatus(false);
navigationBackingBean.setQuestionViewerStatus(true);
try {
Question question = QuestionLocalServiceUtil.fetchQuestion(Long.valueOf(currentQuest));
questionModelBean.setAnswer(question.getAnswer());
if (questionModelBean.getAnswer() == null || questionModelBean.getAnswer() == "") {
questionModelBean.setAnswer("Diese Frage wurde leider noch nicht beantwortet!");
}
questionModelBean.setModuleId(question.getModuleId());
questionModelBean.setQuestionId(question.getQuestionId());
questionModelBean.setQuestionText(question.getQuestionText());
questionModelBean.setUserId(question.getUserId());
} catch (NumberFormatException e) {
e.printStackTrace();
System.out.println("Beim generieren des Question Modell " +
"Objektes ist ein Fehler aufgetreten!");
} catch (SystemException e) {
System.out.println("Beim generieren des Question Modell " +
"Objektes ist ein Fehler aufgetreten!");
e.printStackTrace();
}
}
/**
* Hilfsmethode zur Ermittlung der aktuellen User Id
* @return long id
* @throws NullPointerException
*/
private long getCurrentUserId() throws NullPointerException {
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext externalContext = fc.getExternalContext();
long id = Long.parseLong(externalContext.getUserPrincipal().getName());
return id;
}
public NavigationBackingBean getNavigationBackingBean() {
return navigationBackingBean;
}
public void setNavigationBackingBean(NavigationBackingBean navigationBackingBean) {
this.navigationBackingBean = navigationBackingBean;
}
public List<SelectItem> getModuleItems() {
return moduleItems;
}
public void setModuleItems(List<SelectItem> moduleItems) {
this.moduleItems = moduleItems;
}
public ModuleModelBean getModuleModelBean() {
return moduleModelBean;
}
public void setModuleModelBean(ModuleModelBean moduleModelBean) {
this.moduleModelBean = moduleModelBean;
}
public SlideBackingBean getSlideBackingBean() {
return slideBackingBean;
}
public void setSlideBackingBean(SlideBackingBean slideBackingBean) {
this.slideBackingBean = slideBackingBean;
}
public List<SelectItem> getFavoriteItems() {
return favoriteItems;
}
public void setFavoriteItems(List<SelectItem> favoriteItems) {
this.favoriteItems = favoriteItems;
}
public String getCurrentFav() {
return currentFav;
}
public void setCurrentFav(String currentFav) {
this.currentFav = currentFav;
}
public List<SelectItem> getQuestionItems() {
return questionItems;
}
public void setQuestionItems(List<SelectItem> questionItems) {
this.questionItems = questionItems;
}
public String getCurrentQuest() {
return currentQuest;
}
public void setCurrentQuest(String currentQuest) {
this.currentQuest = currentQuest;
}
public QuestionModelBean getQuestionModelBean() {
return questionModelBean;
}
public void setQuestionModelBean(QuestionModelBean questionModelBean) {
this.questionModelBean = questionModelBean;
}
public CountQuestionBean getCountQuestionBean() {
return countQuestionBean;
}
public void setCountQuestionBean(CountQuestionBean countQuestionBean) {
this.countQuestionBean = countQuestionBean;
}
public GroupNavigationBean getGroupNavigationBean() {
return groupNavigationBean;
}
public void setGroupNavigationBean(GroupNavigationBean groupNavigationBean) {
this.groupNavigationBean = groupNavigationBean;
}
public VoteNavigationBean getVoteNavigationBean() {
return voteNavigationBean;
}
public void setVoteNavigationBean(VoteNavigationBean voteNavigationBean) {
this.voteNavigationBean = voteNavigationBean;
}
public SlideModelBean getSlideModelBean() {
return slideModelBean;
}
public void setSlideModelBean(SlideModelBean slideModelBean) {
this.slideModelBean = slideModelBean;
}
public boolean isDisableFunctions() {
try{
getCurrentUserId();
} catch (NullPointerException ex){
return true;
}
return false;
}
public void setDisableFunctions(boolean disableFunctions) {
this.disableFunctions = disableFunctions;
}
}