mercredi 7 octobre 2009

Struts2 interceptor to remove empty parameters

Everything is in the title (or maybe I should say in the code). This simple interceptor removes empty parameters from the request so that, in the actions, the objects and objects properties will be kept at null in case of empty parameters. Put this interceptor before the "params" provided one.

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

/**
 */
public class RemoveEmptyParametersInterceptor implements Interceptor {

    /**
     */
    public RemoveEmptyParametersInterceptor() {
        super();
    }

    /**
     * @see com.opensymphony.xwork2.interceptor.Interceptor#destroy()
     */
    public void destroy() {
        // Nothing to do.
    }

    /**
     * @see com.opensymphony.xwork2.interceptor.Interceptor#init()
     */
    public void init() {
        // Nothing to do.
    }

    /**
     * @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
     */
    public String intercept(final ActionInvocation invocation) throws Exception {
        final String result;

        final ActionContext actionContext = invocation.getInvocationContext();
        final Map parameters = actionContext.getParameters();

        if (parameters == null) {
            // Nothing to do.
        } else {
            final Collection parametersToRemove =
                new ArrayList();

            for (final Map.Entry entry : parameters.entrySet()) {
                final Object object = entry.getValue();
                if (object instanceof String) {
                    final String value = (String) object;

                    if (StringUtils.isEmpty(value)) {
                        parametersToRemove.add(entry.getKey());
                    }
                } else if (object instanceof String[]) {
                    final String[] values = (String[]) object;

                    final Object[] objects =
                        ArrayUtils.removeElement(values, "");

                    if (objects.length == 0) {
                        parametersToRemove.add(entry.getKey());
                    }
                } else {
                    throw new IllegalArgumentException();
                }
            }

            for (final String parameterToRemove : parametersToRemove) {
                parameters.remove(parameterToRemove);
            }
        }

        result = invocation.invoke();

        return result;
    }
}

lundi 28 septembre 2009

Unit testing Struts2 actions with Spring

For one of the projects on which I am working, I as looking for a solution to test the Struts2 actions while using the Spring plugin for Struts2.

There is a good article here "http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/", but this solution has one major problem, it tests the action alone, not the action inside the whole Struts2 request process.

So I extended the proposed solution to have a full solution to test the actions inside the Struts2 request process, including the interceptors stack, and here is the result :

/**
 */
public class AbstractActionTest extends TestCase {

    /**
     */
    private final ActionProxyFactory actionProxyFactory;

    /**
     */
    private MockHttpSession session;

    /**
     * @param configLocations
     */
    public AbstractActionTest(final String configLocations) {
        final MockServletContext servletContext = new MockServletContext();
        servletContext.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,
            configLocations);

        final ContextLoader contextLoader = new ContextLoader();
        contextLoader.initWebApplicationContext(servletContext);

        final Map initParams = new Hashtable();
        final Dispatcher dispatcher =
            new Dispatcher(servletContext, initParams);
        dispatcher.init();
        Dispatcher.setInstance(dispatcher);

        final Container container = dispatcher.getContainer();
        this.actionProxyFactory =
            container.getInstance(ActionProxyFactory.class);

        this.session = new MockHttpSession();

        /*
         * When testing with mock services, reinitialize the data between each
         * test.
         */
        // MockData.clear();
        // MockData.load();
    }

    /**
     * @param namespace
     * @param name
     * @param parameters
     * @return a string representing the logical result of the execution.
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    protected String executeAction(final String namespace, final String name,
    final Map parameters) throws Exception {
        final ActionProxy actionProxy =
            this.actionProxyFactory.createActionProxy(namespace, name, null,
                null, true, false);
        final ActionInvocation actionInvocation = actionProxy.getInvocation();

        final ActionContext actionContext =
            actionInvocation.getInvocationContext();

        actionContext.setParameters(parameters);

        ActionContext.setContext(actionContext);

        final MockHttpServletRequest request = new MockHttpServletRequest();
        request.setSession(this.session);
        final MockHttpServletResponse response = new MockHttpServletResponse();

        ServletActionContext.setRequest(request);
        ServletActionContext.setResponse(response);

        final String result = actionProxy.execute();

        // In case the session has been inactivated, we need to reassociate it.
        this.session = (MockHttpSession) request.getSession(true);

        return result;
    }

    /**
     * Find a value by evaluating the given expression against the stack in the
     * default search order.
     * 
     * @param expr
     * @return the result of evaluating the expression
     */
    protected Object findValueStackValue(final String expr) {
        final ActionContext actionContext = ActionContext.getContext();
        final ValueStack valueStack = actionContext.getValueStack();
        return valueStack.findValue(expr);
    }

    /**
     * Returns the object bound with the specified name in this session, or null
     * if no object is bound under the name.
     * 
     * @param name
     * @return the object with the specified name
     */
    protected Object getSessionValue(final String name) {
        return this.session.getAttribute(name);
    }

    /**
     * @param name
     * @param value
     */
    protected void setSessionValue(final String name, final Object value) {
        this.session.setAttribute(name, value);
    }
}

jeudi 25 juin 2009

Websense et la sécurité sur internet

Websense considère Le Figaro comme un site porno :


Websense serait-il de gauche ?!

jeudi 18 juin 2009

vendredi 22 mai 2009

mardi 7 avril 2009

Agression dans un bus de la RATP

Il fait bon vivre en France : lien !

samedi 4 avril 2009

Culipandeo

Definition : Culipandeo is Puerto Rican slang for a dance move... either to shake your hips sexually or to step foward and then step back twice.

Video :



Origine : Perreo

jeudi 2 avril 2009

lundi 23 mars 2009

Seco con Flejores a la Paola

Siempre Bicicleteando

Les dernières photos de mes sorties vélo :





samedi 7 mars 2009

Carnaval de Cajamarca

Février, c'est le mois des carnavals, et Cajamarca possède le sien !

durant plusieurs semaines, les jeunes s'amusent à arroser les passants dans la ville, d'autant que l'école ne reprend que fin février. La grande fête a lieu le week-end du 21 au 23 février, avec le lundi férié pour l'occasion. Et pour forcer les gens à sortir, ils coupent le courant de 9h à 18h !

Le samedi, c'est arrosage à l'eau et la peinture. Les cibles sont les gens, les voitures, et parfois les bâtiments en dommage collatéraux. Nous avons évité de sortir en pleine journée, nous sommes allés à la Plaza de Armas en fin d'après midi, les munitions se faisaient plus rares et l'ambiance tournait plus vers la musique (ou plutôt faire du bruit) et la cerveza. Nous sommes allés passer la soirée à l'hôtel Costa del Sol, le plus chic de la ville, qui proposait une fête avec orchestre pour teufeurs qui souhaitaient éviter la boue et le contact rapproché avec les saoulés à la cerveza... On a fini la nuit à la discothèque El Diablo.

Le dimanche, on s'est reposé, comme à peu près la plupart de la population de Cajamarca en fait, l'autre partie terminant les préparations pour le défilé du lundi.

Et le lundi, nous somme donc allés au défilé, de 12h à 17h environ, assis sur un banc an bois, au premier rang, avec nos k-ways et un parapluie pour éviter de revenir tremper. Globalement, les ballons d'eau sont surtout pour ceux qui paradent, mais en attendant la prochaine troupe, chaque côté de la rue se fait la guerre... En tout cas les costumes sont plutôt bien faits, les photos ici. Chaque char possède sa "reina", nous avions fait leur connaissance au Costa del Sol, sans le savoir...

En tout cas, une chose est sûre, l'année prochaine j'y vais avec mes ballons d'eau !

Mas bicicleta

Deux autres sorties en vélo, le mercredi :


Et le jeudi :


Mais je parle de la semaine dernière, car toute cette semaine je n'ai pu sortir à cause de la pluie.

Mes mesures se précisent, je grimpe durant 30-35 minutes pour faire entre 4 et 5 kms, et je redescends en 5-7 minutes.

vendredi 27 février 2009

Voler légalement est plus efficace que travailler (toujours plus fort)

Article : http://www.lexpansion.com/economie/actualite-entreprise/l-ancien-patron-d-air-lib-ecope-en-appel-de-18-mois-de-prison-ferme_175874.html

Messieurs Jean-Charles Corbet et Yves Leonzi ont volé 15 000 000 d'euros ! Ce monsieur va faire 4 ans de prison grand maximum (18 mois fermes) et devra rembourser environ 4-5 millions d'euros.

Donc, au final il gardera 10 000 000 d'euros pour 1460 jours de prison, soit un peu moins de 7 000 euros par jour. J'ai du mal à comprendre comment les ex salariés d'Air Lib peuvent avaler la pilule, eux qui devaient gagner environ 20 000 euros par an... Trois jours de prison pour un an de salaire, le jeu en vaut la chandelle !

samedi 21 février 2009

Bicicleteando

Sortie du dimanche, 4 km, environ 35 mn :


Sortie du mardi, 5 km, environ 40 mn :


Sortie du jeudi, 5 km, environ 40 mn :


J'augmente la distance, mais pas le temps. Conclusion, je vais de plus en plus vite.

samedi 14 février 2009

Practicando bicicleta

L'air de la montagne m'a remotivé pour faire du vélo. Nous avons abordé le sujet avec la propriétaire et celle-ci nous a gentillement proposé de nous prêter son VTT qu'elle n'utilise pas. Paola n'est pas très intéressée de son côté, donc pour l'instant un vélo nous suffit.

Mon parcours est simple, je sors de la maison, je prends la route côté ascendant, je grimpe, je grimpe, je grimpe jusqu'à perdre mon souffle, là je m'arrête 5 minutes, puis je fais demi tour et je me laisse descendre jusqu'à la maison.

La première fois, lundi dernier, j'ai grimpé 20 minutes avant de cracher mes poumons. J'ai pris une petite photo du lieu de pause :


La seconde fois, jeudi dernier, j'ai grimpé 40 minutes, et j'ai aussi pris une photo :


Objectif, atteindre 50 minutes de grimpette, 10 minutes de descente, 3 fois par semaine.

De la liberté d'expression

"Nicolas Sarkozy a confirmé à l'occasion de son discours aux acteurs du monde familiale que le gouvernement pourra bientôt dresser une liste noire de sites qui devront être immédiatement bloqués par les fournisseurs d'accès à Internet. La liste sera établie par les ministères de l'Intérieur, de la Famille, et de l'Economie numérique, sans l'oeil de l'autorité judiciaire. Au départ, il ne s'agira que de sites véhiculant des contenus pédophiles. Au départ..."

Article : Sarkozy confirme le projet de filtrage du net sans contrôle judiciaire

Voler légalement est plus efficace que travailler

Article à lire : Jean-Charles Marchiani sera remis en liberté lundi

Ce monsieur Marchiani a volé "plusieurs millions de francs", disons 6.5, soit 1 millions d'euros. Il a fait 6 mois de détention provisoire suivi de 15 mois de prison, soit 21 mois, soit 630 jours.

Pour monsieur Sarkozy, qui lui a donné sa grâce, 1 jour de prison est donc équivalent à enrivon 1600 euros.

Conclusion : en faisant un jour de prison par mois, tu peux gagner plus que ton revenu mensuel (pour tous les smicards, ouvriers et autres...).

mardi 27 janvier 2009

Emménagement à Cajamarca

Nous voilà installés à Cajamarca !

Nous sommes partis de Lima vendredi à 16h30, arrivés à Cajamarca le samedi à 9h30. 17h de bus avec Cruz del Sur ! Même en voyageant en "première" classe, c'est un voyage vraiment épuisant. La route est correcte tant qu'on longe la côte, à partir du moment où on commence à monter, c'est cahoteux. Et on peut rajouter à ça le bruit de la climatisation du bus qui donne l'impression d'avoir un moteur d'avion à côté de soi. Bref, pas mécontents d'être arrivés !
Tout de même une bonne nouvelle à l'arrivée, les cartons envoyés le mercredi avec la version "Cargo" de Cruz del Sur sont bien arrivés et en bon état. Petite information pratique : de Lima à Cajamarca, 150 soles (35 euros) les 100 kg de marchandises. Je comprends maintenant pourquoi les cajamarquiniens vont faire leurs courses à Lima : on y trouve beaucoup plus de choix et le transport ne coûte pas grand chose...

Arrivés à l'appartement, nous avons droit au premier problème spécifique à la vie en province : il n'y a pas d'eau... Depuis 2 jours... Et on ne sait pas jusqu'à quand ! Heureusement, toutes les maisons sont équipées d'une citerne de réserve qui permet normalement de survivre le temps que la réparation se fasse. En gros, on évite les douches et on économise l'eau pour les toilettes.

Côté bonnes nouvelles, les propriétaires, qui habitent le rez de chaussée de la maison, ont aménagé notre étage, et celui-ci nous parait plus attrayant que lors de notre précédente visite. Les propriétaires sont très accueillants (et globalement tous les gens à Cajamarca) et nous prêtent quelques affaires que nous envisagions d'acheter et qu'ils n'utilisent pas.

Autre bon point très important pour moi, internet fonctionne bien, avec un débit correct. Petit bémol, parfois nous avons des coupures de courant (c'est ça la province péruvienne !). Je vais donc devoir très vite m'acheter un UPS afin de ne pas piquer une crise lors de la prochaine coupure...

Côté climat, à Cajamarca, il pleut ! C'est fréquent, il faut faire avec. Généralement ça ne dure pas longtemps, donc il faut juste avoir de quoi se protéger quand une giboulée arrive. Mais à part ces giboulées, le climat est beaucoup plus sec qu'à Lima et la température est correct, je pense entre 15 et 20 degrés. On a juste un petit problème avec l'appartement, on n'arrive pas à y faire entrer la chaleur, et en pleine journée il fait plus chaud dehors que dedans !

Autre point important, ici c'est calme ! La nuit, on entend pas un bruit, et même en journée c'est très tranquille. Par contre les propriétaires ont fait une erreur lors de la construction de la maison, il y a plein de petites fenêtres sans rideaux et la nuit le peu de lumière extérieur illumine la chambre. Comme j'ai un sommeil plutôt fragile, je dors avec un masque pour les yeux.

Globalement, notre installation se passe donc plutôt bien. Paola commence son nouveau travail dans 10 jours et a donc un peu de temps pour se familiariser avec son nouvel environnement. Notre prochain objectif : découvrir les possibilités de promenades dans les alentours.

P.S. : au moment où je vous écris, l'eau est revenue ! ;-)

mardi 20 janvier 2009

Addiction à la Télévision

Pour ceux qui n'ont pas le temps de regarder tout le documentaire, visionnez juste 2 séquences, de la 12ème à la 14ème minute, et de la 73ème minute à la fin.