[JSF/Ajax] Le chiamate Ajax in situazioni di session timeout

Faces-2.0-JSF-AjaxChi lavora con JSF (Java Server Faces)  e sfrutta i meccanismi di AJAX, sicuramente si è imbattuto nel problema delle richieste asincrone “parziali” (partial ajax) effettuate quando la sessione utente è andata in timeout. Come è ovvio in tale situazione, le richieste non vanno a buon fine, ma poiché non vi è un “refresh” di tutta la pagina (ma solo di sue porzioni precise), le risposte non vengono propriamente trattate come tali lato client e non “ci si accorge” del session timeout, rimanendo “piantati” sulla stessa pagina senza veder accadere nulla (nemmeno sui log applicativi viene stampato nulla)  

Si potrebbe pensare di effettuare una redirect ad una pagina di login, chiedendo all’utente di riloggarsi. A tale scopo, tra i tanti metodi che si trovano online (WebFilter, Interceptorecc.), propongo qui quello che utilizza un PhaseListener, che si interpone tra tutte le richieste HTTP effettuate (siano essere normali request o, appunto, partial ajax request), in modo da controllare se la sessione è valida e, in caso negativo, rimandare l’utente su una pagina definita.

Ecco la classe che occorre inserire nel vostro progetto JSF:

/* Classe SessionExpirationPhaseListener */

import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;

/**
 * 
 * listener per il controllo della session timeout per le chiamate AJAX
 *
 */
public class SessionExpirationPhaseListener implements PhaseListener {

    /**
	 * 
	 */
	private static final long serialVersionUID = 257760346127143382L;

	@Override

    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

    @Override
    public void beforePhase(PhaseEvent event) {

    }

    @Override
    public void afterPhase(PhaseEvent event) {

        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest httpRequest = (HttpServletRequest) context.getExternalContext().getRequest();

        if (httpRequest.getRequestedSessionId() != null && !httpRequest.isRequestedSessionIdValid()) {
            String facesRequestHeader = httpRequest.getHeader("Faces-Request");
            boolean isAjaxRequest = facesRequestHeader != null && facesRequestHeader.equals("partial/ajax");

            if (isAjaxRequest) {
                ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
                handler.performNavigation("session-expired");
            }
        }
    }
}

 

Occorre poi inserire il seguente mapping nel file faces-config.xml :

<lifecycle>
    <phase-listener>it.francescoficetola.web.filter.SessionExpirationPhaseListener</phase-listener>
</lifecycle>

Così facendo tutte le richieste HTTP, comprese quelle di tipo partial/ajax, verranno intercettate dal listener.

Istituto Italiano di Project Management – ISIPM

ISIPMConsiglio agli specialisti del settore di iscriversi all’Istituto Italiano di Project Management (ISIPM). 

 

Ecco cos’è l’ISIPM:

  • associazione per la diffusione della cultura del Project Management in Italia e per la valorizzazione della professione dei Responsabili di Progetto o di Programma (Project e Program Manager).
  • non ha scopi di lucro ed è aperta a tutti coloro che possiedono i requisiti professionali previsti (Art. 2 del regolamento ISIPM), senza alcuna discriminazione;
  • promuove varie iniziative con particolare riferimento ai progetti ICT, al mondo Universitario, alla Pubblica Amministrazione ed ai nuovi approcci “Agili” di PM;
  • costituisce il primo “centro di competenza” a livello nazionale per tutti coloro che intendono certificare la propria professionalità quali Responsabili di Progetto o di Programma.

L’ISIPM svolge attività di formazione e certificazione, analisi, ricerca e networking.

Interessante è il programma di certificazione di base di Project Management.

Informazioni sui servizi offerti per gli iscritti le trovate sul sito ufficiale: http://www.isipm.org

[iOs] Come importare la libreria Google Data Library in un progetto xCode – Esempio con YouTube Service

Il presente articolo costituisce un “upgrade” di quello già scritto su questo blog qualche tempo fa: “[iOS] Un video player nelle nostre app con il MediaPlayer framework e Google Data Library“. A quella data, la Google Data Library (o semplicemente “GData“) in Objective-C era disponibile ed importabile nei nostri progetti xCode come libreria compressa in estensione “.a”.

La GData compressa non dava nessun problema sui progetti compatibili con architettura armv6armv7, ma su armv7s non è più possibile compilarla (restituisce spesso errori del tipo “Symbols not found” su alcune sue classi).

E’ necessario, dunque, installare la libreria GData importando direttamente i suoi sorgenti e compilandoli per tutte le architetture supportate (da armv6 ad armv7s).

Ecco gli step da eseguire:

1. Download della libreria GData con SVN: basta clonare il codice sorgente della libreria dalla repo SVN di Google (http://code.google.com/p/gdata-objectivec-client/):

svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/ gdata-objectivec-client-read-only

dove gdata-objectivec-client-read-only è la cartella in cui volete clonare la lib.

2. Trascinare il progetto GData.xcodeproj nel progetto xCode: occorre trascinare il progetto GData.xcodeproj, presente nella cartella Sources della libreria GData scaricata al punto 1, direttamente nel vostro progetto (senza checkare l’opzione “Copy items into destination group’s folder (if needed)“):

GData Installazione in xCode - Step 2

3. Importazione delle librerie e delle dipendenze nel progetto xCode: spostatevi nella scheda Build Phases del target di progetto ed importate le seguenti librerie:

  • in Target Dependencies, aggiungete la libreria GDataTouchStaticLib
  • in Link Binary With Libraries, aggiungete la libreria libGDataTouchStaticLib.a
  • sempre in Link Binary With Libraries, aggiungete i framework: Security.frameworkSystemConfiguration.framework

 GData Installazione in xCode - Step 3 GData Installazione in xCode - Step 3GData Installazione in xCode - Step 3

4. Configurazione dei parametri e dell’header path: spostatevi nella scheda Build Settings del target di progetto e configurare i seguenti parametri e path:

  • sotto la voce “Other Linker Flags“, inserire i seguenti parametri: 
    • -ObjC
    • -lxml2
    • -all_load

GData Installazione xCode - Step 4

  •  Sotto la voce Header Search Paths, inserire il valore /usr/include/libxml2

GData Installazione xCode - Step 4

5. Rimozione delle API di GData non necessarie: se nel vostro progetto vi interessa utilizzare soltanto determinate funzionalità offerte dalla libreria GData (per esempio, CalendarYoutube), occorre effettuare anche la seguente configurazione:

  • cliccate sulla root del progetto GData importato in xCode e selezionate il target GDataTouchStaticLib. In “Build Setting“, sotto la voce “Other C Flags” (sia per Release che per Debug), inserite i seguenti parametri:
    • -DGDATA_REQUIRE_SERVICE_INCLUDES=1
    • -DGDATA_INCLUDE_CALENDAR_SERVICE=1 (se vi interessa utilizzare Google Calendar)
    • -DGDATA_INCLUDE_YOUTUBE_SERVICE=1 (se volete interfacciarvi con Youtube)
    • -DGDATA_INCLUDE_CONTACTS_SERVICE=1 (per utilizzare le Contact API)

GData Installazione xCode - Step 5

 

6. Compilazione e importazione degli header di GData nel progetto: dopo aver eseguito i precedenti step, compilate il vostro progetto e, se non vi sono errori, andate nell’Organizer di xCode, nella scheda Projects. Qui vi trovate un link per accedere alla cartella Derived Data con il codice compilato del vostro progetto. Nella directory Build/Products/Debug-iphonesimulator/Product troverete la cartella Header in cui sono presenti le interfacce di GData. Dovete trascinare tutta la cartella Header nel vostro progetto.

GData Installazione xCode - Step 6 GData Installazione xCode - Step 6

 

NOTA. Se all’atto del rilascio (distribuzione su Apple Store o “ad hoc”), vi ritrovate un file .xarchive, invece, di un .app/.ipa, eseguite i seguenti step:

  • Eliminate tutti i target di GData (click destro sul progetto GData.xcodeproj)
  • Settate la voce SKYP INSTALL a YES in “Build Settings” del target di GData.

 

7. Utilizzo della libreria GData: se i passi precedenti vengono eseguiti correttamente e senza errori, potete utilizzare le API di Google Data Library.

Come prova, importate la seguente riga in una vostra classe. Se non vi sono errori di compilazione, la configurazione di GData è stata eseguita correttamente.

#import "GData.h"

Vi allego un progettino di esempio in cui mi interfaccio con Youtube per scaricare la lista di video da un canale. La libreria GData qui è stata inserita in una cartella Submodules e potete importarla trascinandola da lì. NOTA. Occorre ripetere la procedura riportata sopra per far riconoscere al progetto la GData lib, altrimenti vi ritrovete un errore in compilazione: “ld: library not found for -lGDataTouchStaticLib“.

https://github.com/fficetola/GDataLibTest

——————

Riferimenti utili:

 

La differenza tra l’osservare e il guardare

Guardare è un’attività che fa parte dell’esperienza quotidiana di ciascuno di noi, è attraverso quest’operazione che avviene il nostro primo contatto con la realtà circostante. Guardare è il mezzo più immediato, spontaneo ed efficace per entrare in possesso di informazioni, cogliere particolari di ciò che “sta intorno”, registrare elementi facenti parte di un mondo che è altro da noi.

Proviamo ora a dare una definizione dell’osservazione: che cosa distingue quest’ultima da ciò che abbiamo considerato come semplice “guardare”? I due termini hanno la stessa valenza o possiamo cogliere delle specificità?

Considerando attentamente le differenze che intercorrono tra l’atto del guardare e l’azione dell’osservare ci si può rendere conto di come, tra i due concetti, esista un’infinità di sfumature tali da produrre risultati alquanto differenti. L’atto del vedere, del guardare è spontaneo, immediato, generico, non selettivo.

Diverso è invece osservare.

Elementi che connotano l’osservazione sono la finalità, l’intenzionalità: una persona che osserva ha un preciso obiettivo che consiste nella conoscenza e nella descrizione, il più possibile oggettiva, fedele e completa, di un determinato fenomeno, considerato rilevante e significativo rispetto a particolari interessi, motivazioni, curiosità; a tal proposito ci sembra interessante la definizione di Mantovani : «l’osservazione è una forma di rilevazione finalizzata all’esplorazione di un determinato fenomeno».

L’osservazione si configura quindi come un processo cognitivo, in quanto non solo è orientata alla lettura di un fenomeno/situazione ma soprattutto alla sua comprensione.

Osservare significa mettere in luce alcune caratteristiche relative ad una cosa, persona, situazione ponendole in relazione con altre cose, persone, situazioni, all’interno di un contesto, inserite in un ambiente, in altre parole “situate” in una dimensione spazio-temporale ben definita. Osservare significa anche registrare nel modo più oggettivo possibile le informazioni di cui abbiamo appena parlato. L’osservazione, per come l’abbiamo definita, è un elemento basilare ed ineliminabile nel processo di ricerca scientifica ed è anche alla base della professionalità di educatori ed insegnanti, come cardine fondante la progettualità educativa (progettare presuppone il conoscere, comprendere la situazione di partenza).

Il fatto di lavorare con materiale “umano” non esclude una scientificità di metodo, e tale metodo non è innato ma deve essere acquisito. Per lungo tempo si è pensato che fosse sufficiente raccogliere ordinatamente ed accuratamente una serie di informazioni ritenute significative per poter garantire scientificità ed oggettività alle rilevazioni effettuate (corrente empirista, che trovò la sua massima espressione nell’Ottocento con il Positivismo).

Questa prospettiva, ormai superata, non tiene conto del fatto che ciascuno, per quanto si sforzi di registrare nel modo più preciso e sistematico il “frutto” di un’osservazione, faccia confluire elementi di soggettività, legati al proprio modo di “leggere” la realtà, ai propri parametri culturali di riferimento, alle proprie credenze, valori, …

E se, come abbiamo detto, osservare significa comprendere, appare chiaro come, in assenza di specifiche competenze ed abilità nell’osservare, sia difficile una comprensione scientificamente fondata di situazioni complesse come quelle di natura educativa. Cerchiamo quindi di tracciare sommariamente il profilo di un “buon osservatore”.

Essere un buon osservatore

Continua la lettura

Per ricostruire Città della Scienza…

Per ricostruire insieme Città della Scienza a Bagnoli (Napoli), distrutta da un incendio il 4 Maggio scorso, per salvare occupazione, ricerca, cultura e sviluppo dell’Italia, e non solo del Mezzogiorno.

Ricostruiamo Città della Scienza

Creative Commons License
This work by Francesco Ficetola is licensed under a Creative Commons Attribution 4.0 International License.
Based on a work at www.francescoficetola.it.
Permissions beyond the scope of this license may be available at http://www.francescoficetola.it/2013/05/04/per-ricostruire-citta-della-scienza/.

[iOs] Apple dice addio al “compatibility mode” su iPhone 5

Apple dice addio al “compatibility mode” su iPhone 5 delle app che non hanno il layout ottimizzato su tali device.

Per chi non lo sapesse, gli sviluppatori potevano evitare di adattare la grafica delle app su iPhone 5, che è 176 px più lungo dei suoi precursori, permettendo alle app stesse di essere visualizzate in quella che viene definita “letterbox mode“, o appunto “compatibility mode“: iOs visualizza automaticamente delle bande nere sopra e sotto il layout delle app non ottimizzate, solo su iPhone 5.

iOs Letter Box Mode

Per predisporre l’app al “letterbox mode” bastava evitare di inserire la splash screen per i display da 4 pollici (Default-568h@2x.png), di 640×1136 px.

Ecco cosa si legge sulle iOs Human Interface Guidelines:

Note: If you don’t make any changes to your app, it runs in a compatibility mode on iPhone 5. When an app runs in compatibility mode, iOS automatically centers the app’s UI by adding slim black bars above and below it. For some developers, it might be reasonable to simply create a new launch image of the correct size and allow the unchanged app UI to be centered on the iPhone 5 display.

 

Tutte le app rilasciate sullo store prima dell’uscita sul mercato dell’iPhone 5 (seconda metà 2012) erano automaticamente adattate in “letterbox mode“. Tutte quelle, invece, rilasciate ed aggiornate dopo tale evento, dovevano esplicitamente “attestare” l’utilizzo della modalità di compatibilità, evitando di inserire nell’app la splash screen per display da 4″.

Oggi la triste notizia: Apple dal 1 Maggio 2013 impone agli sviluppatori iOs di rendere il layout delle app compatibile per il display dell’iPhone 5. Questo vuol dire che tutti i nuovi rilasci ed aggiornamenti, da tale data in poi, dovranno prevedere che la grafica sia ottimizzata.

Ecco la mail inviata da Apple agli sviluppatori che hanno sottomesso una app alla review, in cui dice “addio” al “letterbox mode” per le nuove app.

Dear developer,

We have discovered one or more issues with your recent delivery for “XXX_MyApp_XXX”. Your delivery was successful, but you may wish to correct the following issues in your next delivery:

iPhone 5 Optimization Requirement – Your binary is not optimized for iPhone 5. As of May 1, all new iPhone apps and app updates submitted must support the 4-inch display on iPhone 5. All apps must include a launch image of the appropriate size. Learn more about iPhone 5 support by reviewing the iOS Human Interface Guidelines.

If you would like to update your binary for this app, you can reject this binary from the Binary Details page in iTunes Connect. Note that rejecting your binary will remove your app from the review queue and the review process will start over from the beginning when you resubmit your binary.

Regards,

The App Store team

 

Pena la bocciatura dell’app all’atto della Apple Review. Ovviamente, le app già sullo store e non aggiornate dopo il 1 maggio continueranno a girare con la modalità di compatibilità.

A me la precedente mail è stata recapitata qualche giorno prima del 1 Maggio scorso, sottoponendo ad approvazione un aggiornamento dell’app LuBannApp. Questa non ha il layout ottimizzato per iPhone 5, ma me l’hanno approvata comunque e viene visualizzata ancora in “letterbox” mode, visto che la data di sottomissione ad Apple Review è antecedente al 1 Maggio.

Se a qualcuno di voi capita di scontrarsi, durante il processo di review, con questo famoso iPhone 5 Optimization Requirement (che oltretutto non vedo ancora sulle linea guida Apple), scrivetelo nei commenti. Grazie.