Java tutorial
/** * * ESUP-Portail MONDOSSIERWEB - Copyright (c) 2016 ESUP-Portail consortium * * * 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 fr.univlorraine.mondossierweb; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import lombok.Getter; import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.bridge.SLF4JBridgeHandler; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Scope; import org.springframework.core.env.Environment; import org.springframework.mobile.device.Device; import org.springframework.mobile.device.DeviceUtils; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Component; import com.vaadin.addon.touchkit.annotations.OfflineModeEnabled; import com.vaadin.addon.touchkit.ui.NavigationManager; import com.vaadin.addon.touchkit.ui.TabBarView; import com.vaadin.addon.touchkit.ui.TabBarView.SelectedTabChangeEvent; import com.vaadin.addon.touchkit.ui.TabBarView.SelectedTabChangeListener; import com.vaadin.annotations.StyleSheet; import com.vaadin.annotations.Theme; import com.vaadin.navigator.Navigator; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.navigator.ViewProvider; import com.vaadin.server.FontAwesome; import com.vaadin.server.Page.UriFragmentChangedEvent; import com.vaadin.server.Page.UriFragmentChangedListener; import com.vaadin.server.Page; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinSession; import com.vaadin.shared.Position; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.spring.annotation.SpringUI; import com.vaadin.spring.navigator.SpringViewProvider; import com.vaadin.ui.CssLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.TabSheet.Tab; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.ui.UI; import fr.univlorraine.mondossierweb.beans.Etape; import fr.univlorraine.mondossierweb.beans.Etudiant; import fr.univlorraine.mondossierweb.controllers.ConfigController; import fr.univlorraine.mondossierweb.controllers.EtudiantController; import fr.univlorraine.mondossierweb.controllers.FavorisController; import fr.univlorraine.mondossierweb.controllers.ListeInscritsController; import fr.univlorraine.mondossierweb.controllers.RechercheArborescenteController; import fr.univlorraine.mondossierweb.controllers.UiController; import fr.univlorraine.mondossierweb.controllers.UserController; import fr.univlorraine.mondossierweb.utils.PropertyUtils; import fr.univlorraine.mondossierweb.utils.Utils; import fr.univlorraine.mondossierweb.views.AccesBloqueView; import fr.univlorraine.mondossierweb.views.AccesRefuseView; import fr.univlorraine.mondossierweb.views.CalendrierMobileView; import fr.univlorraine.mondossierweb.views.ErreurView; import fr.univlorraine.mondossierweb.views.FavorisMobileView; import fr.univlorraine.mondossierweb.views.InformationsAnnuellesMobileView; import fr.univlorraine.mondossierweb.views.ListeInscritsMobileView; import fr.univlorraine.mondossierweb.views.NotesDetailMobileView; import fr.univlorraine.mondossierweb.views.NotesMobileView; import fr.univlorraine.mondossierweb.views.RechercheMobileView; import fr.univlorraine.mondossierweb.views.windows.LoadingIndicatorWindow; import fr.univlorraine.tools.vaadin.GoogleAnalyticsTracker; import fr.univlorraine.tools.vaadin.LogAnalyticsTracker; import fr.univlorraine.tools.vaadin.PiwikAnalyticsTracker; import gouv.education.apogee.commun.transverse.exception.WebBaseException; @Scope("prototype") @Component @Theme("valo-ul") @StyleSheet("mobileView.css") @SuppressWarnings("serial") @OfflineModeEnabled(false) public class MdwTouchkitUI extends GenericUI { private Logger LOG = LoggerFactory.getLogger(MdwTouchkitUI.class); /** * Nombre maximum de tentatives de reconnexion lors d'une dconnexion. */ private static final int TENTATIVES_RECO = 3; /* Redirige java.util.logging vers SLF4j */ static { SLF4JBridgeHandler.install(); } /* Injections */ @Resource private transient ApplicationContext applicationContext; @Resource private transient Environment environment; @Resource private transient UserController userController; @Resource private transient UiController uiController; @Resource private transient RechercheArborescenteController rechercheArborescenteController; @Resource private transient EtudiantController etudiantController; @Resource private transient ListeInscritsController listeInscritsController; @Resource private transient FavorisController favorisController; @Resource private transient ConfigController configController; @Resource private InformationsAnnuellesMobileView informationsAnnuellesMobileView; @Resource private CalendrierMobileView calendrierMobileView; @Resource private NotesMobileView notesMobileView; @Resource private NotesDetailMobileView notesDetailMobileView; //Indicateur de chargement private LoadingIndicatorWindow loadingIndicatorWindow = new LoadingIndicatorWindow(); //La vue par laquelle on est arriv au trombinoscope @Getter private String trombinoscopeFromView; //La vue par laquelle on est arriv la recherche @Getter @Setter private String rechercheFromView; //La vue par laquelle on est arriv au dossier tudiant @Getter private String dossierEtuFromView; //le NavigationManager pour l'affichage des notes et du dtail des notes private NavigationManager noteNavigationManager; //La barre de menu affiche dans le dossier tudiant private TabBarView menuEtudiant; //Onglet infoAnnuelles du dossier tudiant private Tab tabInfoAnnuelles; //Onglet Calendrier du dossier tudiant private Tab tabCalendrier; //Onglet notes du dossier tudiant private Tab tabNotes; //Etape concernes par le dtail des notes @Setter @Getter private Etape etapeDetailNotes; //vrai si on consulte les notes en vue enseignant @Setter @Getter private boolean vueEnseignantNotesEtResultats; //Le contenu principal de la page private CssLayout contentLayout = new CssLayout(); /** The view provider. */ @Resource private SpringViewProvider viewProvider; /** Gestionnaire de vues tudiant*/ @Getter private final Navigator navigator = new Navigator(this, contentLayout); /** * @see com.vaadin.ui.UI#getCurrent() */ public static MdwTouchkitUI getCurrent() { return (MdwTouchkitUI) UI.getCurrent(); } @Override protected void init(VaadinRequest request) { VaadinSession.getCurrent().setErrorHandler(e -> { Throwable cause = e.getThrowable(); while (cause instanceof Throwable) { /* Gre les accs non autoriss */ if (cause instanceof AccessDeniedException) { Notification.show(cause.getMessage(), Type.ERROR_MESSAGE); afficherMessageAccesRefuse(); return; } if (cause != null && cause.getClass() != null) { String simpleName = cause.getClass().getSimpleName(); if (PropertyUtils.getListeErreursAIgnorer().contains(simpleName)) { Notification.show(cause.getMessage(), Type.ERROR_MESSAGE); navigator.navigateTo(ErreurView.NAME); return; } } cause = cause.getCause(); } /* Traite les autres erreurs normalement */ LOG.error(e.getThrowable().toString(), e.getThrowable()); // Affiche de la vue d'erreur navigator.navigateTo(ErreurView.NAME); }); //Le contenu principal n'est pas scrollable. Par contre les lment l'intrieur pourront l'tre setStyleName("v-noscrollableelement"); //Le contentLayout prend toute la place disponible contentLayout.setSizeFull(); /* Affiche le nom de l'application dans l'onglet du navigateur */ getPage().setTitle(environment.getRequiredProperty("app.name")); /* Gestion de l'acces a un dossier prcis via url deepLinking (ne peut pas tre fait dans navigator car le fragment ne correspond pas une vue existante) */ getPage().addUriFragmentChangedListener(new UriFragmentChangedListener() { public void uriFragmentChanged(UriFragmentChangedEvent source) { //On bloque l'accs aux vues desktop /* if(!Utils.isViewMobile(source.getUriFragment())){ afficherMessageAccesRefuse(); }*/ //Si l'application est en maintenance on bloque l'accs if (!applicationActive() && !source.getUriFragment().contains(AccesBloqueView.NAME)) { afficherMessageMaintenance(); } } }); /* Ex de Device Detection */ Device currentDevice = DeviceUtils.getCurrentDevice((HttpServletRequest) request); if (currentDevice.isMobile()) LOG.debug("device : mobile"); if (currentDevice.isTablet()) LOG.debug("device : tablet"); if (currentDevice.isNormal()) LOG.debug("device : normal"); //Paramtrage du comportement en cas de perte de connexion configReconnectDialog(); /* Construit le gestionnaire de vues */ navigator.addProvider(viewProvider); navigator.setErrorProvider(new ViewProvider() { @Override public String getViewName(final String viewAndParameters) { return ErreurView.NAME; } @Override public View getView(final String viewName) { return viewProvider.getView(ErreurView.NAME); } }); navigator.addViewChangeListener(new ViewChangeListener() { private static final long serialVersionUID = 9183991275107545154L; @Override public boolean beforeViewChange(ViewChangeEvent event) { //On bloque l'accs aux vues desktop if (!Utils.isViewMobile(event.getViewName())) { return false; } //Si l'application est en maintenance on bloque l'accs if (!applicationActive() && !event.getViewName().equals(AccesBloqueView.NAME)) { afficherMessageMaintenance(); return false; } return true; } @Override public void afterViewChange(ViewChangeEvent event) { // TODO Auto-generated method stub } }); //init du tracker initAnalyticsTracker(); //contentLayout est le contenu principal de la page setContent(contentLayout); // Si l'utilisateur est enseignant ou tudiant if (userController.isEnseignant() || userController.isEtudiant()) { if (!applicationActive()) { afficherMessageMaintenance(); } else { //On rcupre l'IP du client GenericUI.getCurrent().getIpClient(); // Si l'utilisateur est enseignant if (userController.isEnseignant()) { //On consultera les notes en vue enseignant vueEnseignantNotesEtResultats = true; //On se rend par dfaut la vue des favoris navigator.navigateTo(FavorisMobileView.NAME); //On affiche le message d'intro afficherMessageIntroEnseignants(); } else { // Si l'utilisateur est tudiant //On consultera les notes en vue etudiant vueEnseignantNotesEtResultats = false; //On rcupre le codetu de l'tudiant String codetu = daoCodeLoginEtudiant.getCodEtuFromLogin(userController.getCurrentUserName()); etudiant = new Etudiant(codetu); try { //On rcupre l'tat-civil et les adresses de l'tudiant etudiantController.recupererEtatCivil(); //Si on a eu une erreur la rcupration de l'tat-civil if (GenericUI.getCurrent().getEtudiant() == null) { navigator.navigateTo(ErreurView.NAME); } else { //On rcupre le calendrier de l'tudiant etudiantController.recupererCalendrierExamens(); //On rcupre les notes de l'tudiant etudiantController.recupererNotesEtResultats(etudiant); //On affiche le dossier navigateToDossierEtudiant(); } } catch (WebBaseException ex) { LOG.error( "Probleme avec le WS lors de la recherche de l'tat-civil pour etudiant dont codetu est : " + codetu, ex); navigator.navigateTo(ErreurView.NAME); } catch (Exception ex) { LOG.error("Probleme lors de la recherche de l'tat-civil pour etudiant dont codetu est : " + codetu, ex); navigator.navigateTo(ErreurView.NAME); } } } } else { //Utilisateur ni enseignant, ni tudiant, on le redirige vers la vue accs refus afficherMessageAccesRefuse(); } } private void afficherMessageMaintenance() { setContent(contentLayout); navigator.navigateTo(AccesBloqueView.NAME); } private void afficherMessageAccesRefuse() { setContent(contentLayout); navigator.navigateTo(AccesRefuseView.NAME); } /** * Affiche du message d'intro pour les enseignants */ private void afficherMessageIntroEnseignants() { afficherMessageIntro(applicationContext.getMessage("helpWindowMobile.text.enseignant", null, getLocale())); } /** * Affiche du message d'intro */ private void afficherMessageIntro(String text) { Notification note = new Notification(text, "", Notification.TYPE_TRAY_NOTIFICATION, true); note.setPosition(Position.MIDDLE_CENTER); note.setDelayMsec(6000); note.show(this.getPage()); /** * ANCIENNE VERSION AVEC POPUP WINDOW */ /* //Recuperer dans la base si l'utilisateur a une prfrence pour l'affichage le message String val = userController.getPreference(Utils.SHOW_MESSAGE_INTRO_MOBILE_PREFERENCE); //Par dfaut on affiche le message boolean afficherMessage = true; //Si on a une prfrence pour l'utilisateur en ce qui concerne l'affichage du message d'accueil mobile if(StringUtils.hasText(val)){ //On rcupre ce choix dans afficherMessage afficherMessage = Boolean.valueOf(val); } //Si on doit afficher le message if(afficherMessage){ //Cration de la pop-pup contenant le message HelpMobileWindow hbw = new HelpMobileWindow(text,applicationContext.getMessage("helpWindow.defaultTitle", null, getLocale()),true); //Sur la fermeture de la fentre hbw.addCloseListener(g->{ //On va enregistrer en base que l'utilisateur ne souhaite plus afficher le message si la checkbox propose par la pop-up a t coche boolean choix = hbw.getCheckBox().getValue(); //Test si l'utilisateur a coch la case pour ne plus afficher le message if(choix){ //mettre a jour dans la base de donnes userController.updatePreference(Utils.SHOW_MESSAGE_INTRO_MOBILE_PREFERENCE, "false"); } }); //Affichage de la pop_up UI.getCurrent().addWindow(hbw); } */ } /** * Affichage de la vue Liste Inscrits depuis la vue Search * @param parameterMap */ public void navigateToListeInscritsFromSearch(Map<String, String> parameterMap) { trombinoscopeFromView = RechercheMobileView.NAME; navigateToListeInscrits(parameterMap); } /** * Affichage de la vue Liste Inscrits depuis la vue Favoris * @param parameterMap */ public void navigateToListeInscritsFromFavoris(Map<String, String> parameterMap) { trombinoscopeFromView = FavorisMobileView.NAME; navigateToListeInscrits(parameterMap); } /** * Affichage du dossier d'un tudiant depuis la vue listeInscrits */ public void navigateToDossierEtudiantFromListeInscrits() { dossierEtuFromView = ListeInscritsMobileView.NAME; navigateToDossierEtudiant(); } /** * Affichage du dossier d'un tudiant depuis la vue Search */ public void navigateToDossierEtudiantFromSearch() { dossierEtuFromView = RechercheMobileView.NAME; navigateToDossierEtudiant(); } /** * Affichage du dossier d'un tudiant */ public void navigateToDossierEtudiant() { //On indique au navigator qu'on va aller sur la vue InformationsAnnuellesMobileView pour informer Piwik navigator.navigateTo(InformationsAnnuellesMobileView.NAME); //Refresh des vues du dossier tudiant avec les donnes de l'tudiant informationsAnnuellesMobileView.refresh(); calendrierMobileView.refresh(); notesMobileView.refresh(); //Si le menu tudiant n'a jamais t initialis if (menuEtudiant == null) { //cration du menu tudiant initMenuEtudiant(); } //On affiche la vue infoAnnuelles par dfaut menuEtudiant.setSelectedTab(tabInfoAnnuelles); //Le contenu principal de la page devient le tabBarView reprsentant le dossier tudiant setContent(menuEtudiant); } /** * Cration du menu tudiant */ private void initMenuEtudiant() { //Si le menuEtudiant n'a jamais t initialis if (menuEtudiant == null) { //On cr le menuEtudiant menuEtudiant = new TabBarView(); } //Cration de l'onglet Informations tabInfoAnnuelles = menuEtudiant.addTab(informationsAnnuellesMobileView, applicationContext.getMessage("mobileUI.infoannuelles.title", null, getLocale()), FontAwesome.INFO); tabInfoAnnuelles.setId("tabInfoAnnuelles"); //Cration de l'onglet Calendrier tabCalendrier = menuEtudiant.addTab(calendrierMobileView, applicationContext.getMessage("mobileUI.calendrier.title", null, getLocale()), FontAwesome.CALENDAR); tabCalendrier.setId("tabCalendrier"); //Si le navigationManager des notes est null if (noteNavigationManager == null) { //On cr le navigationManager noteNavigationManager = new NavigationManager(); } //le composant affich dans le navigationManager est la vue des notes noteNavigationManager.setCurrentComponent(notesMobileView); //le composant suivant afficher dans le navigationManager est la vue du dtail des notes noteNavigationManager.setNextComponent(notesDetailMobileView); //Cration de l'onglet Rsultats tabNotes = menuEtudiant.addTab(noteNavigationManager, applicationContext.getMessage("mobileUI.resultats.title", null, getLocale()), FontAwesome.LIST); tabNotes.setId("tabNotes"); //Dtection du retour sur la vue du dtail des notes pour mettre jour le JS menuEtudiant.addListener(new SelectedTabChangeListener() { @Override public void selectedTabChange(SelectedTabChangeEvent event) { //test si on se rend sur la vue des notes if (menuEtudiant.getSelelectedTab().equals(tabNotes)) { //test si on se rend sur le dtail des notes if (noteNavigationManager.getCurrentComponent().equals(notesDetailMobileView)) { //On met jour le JS (qui est normalement perdu, sans explication) notesDetailMobileView.refreshJavascript(); } } //test si on se rend sur la vue calendrier if (menuEtudiant.getSelelectedTab().equals(tabCalendrier)) { /* Message d'info */ if (applicationContext.getMessage(CalendrierMobileView.NAME + ".message.info", null, getLocale()) != null) { Notification note = new Notification(applicationContext .getMessage(CalendrierMobileView.NAME + ".message.info", null, getLocale()), "", Notification.TYPE_TRAY_NOTIFICATION, true); note.setPosition(Position.MIDDLE_CENTER); note.setDelayMsec(6000); note.show(Page.getCurrent()); //Notification.show("", applicationContext.getMessage(CalendrierMobileView.NAME+".message.info", null, getLocale()), Notification.TYPE_TRAY_NOTIFICATION); } } } }); } /** * Affichage de la liste des inscrits partir des infos en paramtre * @param parameterMap */ public void navigateToListeInscrits(Map<String, String> parameterMap) { //Si on a des paramtres renseigns if (parameterMap != null) { //On rcupre a liste des inscrits listeInscritsController.recupererLaListeDesInscrits(parameterMap, null, this); } //On affiche la vue ListeInscrits navigator.navigateTo(ListeInscritsMobileView.NAME); } /** * Affichage de la vue Favoris */ public void navigateTofavoris() { navigator.navigateTo(FavorisMobileView.NAME); } /** * Affichage de la vue par laquelle on est arrive la recherche */ public void backFromSearch() { if (rechercheFromView == null || rechercheFromView.equals(FavorisMobileView.NAME)) { navigator.navigateTo(FavorisMobileView.NAME); } else { if (rechercheFromView.equals(InformationsAnnuellesMobileView.NAME)) { navigateToDossierEtudiant(); } } } /** * Affichage de la vue Search */ public void navigateToRecherche(String fromView) { if (fromView != null) { rechercheFromView = fromView; } setContent(contentLayout); navigator.navigateTo(RechercheMobileView.NAME); } /** * Affichage de la vue listeInscrits */ public void navigateToListeInscrits() { setContent(contentLayout); navigator.navigateTo(ListeInscritsMobileView.NAME); } /** * Affichage de la vue contenant le rsum des notes (cad on vient du dtail des notes) */ public void navigateToResumeNotes() { //Si le navigationManager n'est pas null if (noteNavigationManager != null) { //On raffiche la vue prcdente du navigationManager noteNavigationManager.navigateBack(); } } /** * Affichage de la vue contenant le dtail des notes partir de l'tape en paramtre * @param etape */ public void navigateToDetailNotes(Etape etape) { //Si le navigationManager n'est pas null if (noteNavigationManager != null) { //On refresh la vue du dtail des notes notesDetailMobileView.refresh(etape, etudiant.getCod_etu()); //On navigue sur la vue du dtail des notes noteNavigationManager.navigateTo(notesDetailMobileView); } } private boolean applicationActive() { return configController.isApplicationMobileActive() && ((userController.isEtudiant() && configController.isPartieEtudiantActive()) || (userController.isEnseignant() && configController.isPartieEnseignantActive())); } public void startBusyIndicator() { addWindow(loadingIndicatorWindow); } public void stopBusyIndicator() { loadingIndicatorWindow.close(); } /** * Initialise le tracker d'activit. */ private void initAnalyticsTracker() { if (environment.getProperty("piwik.tracker.url") instanceof String && environment.getProperty("piwik.site.id") instanceof String) { analyticsTracker = new PiwikAnalyticsTracker(this, environment.getProperty("piwik.tracker.url"), environment.getProperty("piwik.site.id")); } else if (environment.getProperty("google.analytics.account") instanceof String) { analyticsTracker = new GoogleAnalyticsTracker(this, environment.getProperty("google.analytics.account")); } else { analyticsTracker = new LogAnalyticsTracker(); } analyticsTracker.trackNavigator(navigator); } /** * Configure la reconnexion en cas de dconnexion. */ private void configReconnectDialog() { getReconnectDialogConfiguration().setDialogModal(true); getReconnectDialogConfiguration().setReconnectAttempts(TENTATIVES_RECO); getReconnectDialogConfiguration() .setDialogText(applicationContext.getMessage("vaadin.reconnectDialog.text", null, getLocale())); getReconnectDialogConfiguration().setDialogTextGaveUp( applicationContext.getMessage("vaadin.reconnectDialog.textGaveUp", null, getLocale())); } }