lundi 28 mars 2011

Java / J2EE avec Spring (rappel)

Comme tu avais l’air intéressé par Spring , je te fais rapidement une synthèse des possibilités de Spring :

Spring est un container léger. Ceci signifie que tu n’as besoin que d’un Tomcat et des jars « Spring », et qu’il t’apporte des fonctionnalités d’un serveur d’application J2EE (jonas, jboss, etc … ), sans en utiliser un (ex : les transactions, JMS, gestion des objets, sécurité) .

Après si tu as besoin de toutes les fonctionnalités d’un serveur J2EE, il vaut peut-être mieux en utiliser un directement. De plus, J2EE 6 a largement simplifier son modèle de développement suite au critique de la communauté Spring (ejb 3.0, JSF 2.0,etc … ).

Ce dernier est composé de nombreux modules que tu peux intégrer ou non selon tes besoins.

• La grande force de Spring est qu’il est basé sur le POJOs, et de ce fait, il ne contraint pas ton implémentation ( on ne doit pas hériter d’une classe particulière ou implémenter une interface) et peut-être mis en place après coup. La mise en place est simple sur une nouvelle application, et le ticket d’entrée faible.

• Il favorise l’intégration de technologie existante, et ne réinvente pas la roue. C'est-à-dire que qu’il n’essaye pas de concurrencer des Framework reconnus (comme hibernate, activeMQ, etc … ), mais propose des « ponts » pour les intègrer (ex : pour la persistance, il y a un pont vers hibernate, TopLink , JMS, etc …).

• Il fournit un plugin Eclipse qui facilite l’écriture des fichiers XML (Spring IDE).

• Spring adresse l’ensemble des problématiques du développement WEB.
En détails :
1. Gestion du cycle de vie des objets et injection de dépendances (via Spring Core)
a. Ceci permet de substituer facilement une implémentation par une autre (ex : pour les tests, ou pour faire évoluer ton application).
2. Les couches WEB sur une modèle MVC et la création de endpoint REST / JSON (via Spring MVC)
a. Création simple de contrôleur MVC et de vue JSP, two-way binding, validation , et production simple de endpoint REST délivrant du XML/JSON, ou basé sur REST.
3. la sécurité de l’application par JDBC,SSO, LDAP (via Spring Security)
a. Sécuriser simplement une application par un filtre HTTP
4. la couche d’accès à la persistance et gestion des transactions (Spring ORM)
a. Permet de gérer les transactions simplement par annotation, foun
5. exposition des services (via JMX, RMI, JMS, etc …)
a. permet simplement de transformer une « classe normale » en classe appelable via RMI, JMX, Web-Service, etc …)
6. les tests unitaires (via Spring-test)
7. la programmation par aspect (Spring-AOP)
8. plein d’autres modules (Spring batch, etc …)

unix / linux : shell find avec xargs

Voici une astuce lorsque le grep n'est plus possible ... et que grep vous dit :

arg list too long

find . -name "*ClientSession*" | xargs grep 888413

mercredi 16 mars 2011

Seleinium : petit exemple avec du XPATH

Voici un exemple de script qui s'utilise sur Mantis :


package com.example.tests;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class MantisSearch {

/**
* @param args
*/
public static void main(String[] args) {
String chaineARechercher = "";
if (args.length == 1 && !"".equals(args[0])) {
chaineARechercher = args[0];
} else {
System.err.println("Usage : \n");
System.err.println(MantisSearch.class.getSimpleName()
+ " chaineAChercher \n");
System.err.println("Example : \n");
System.err
.println(MantisSearch.class.getSimpleName()
+ " \"at net.mm.ccm.server.DefaultServer.systemFailure (line 1019)\" \n");
System.exit(-1);
}

Selenium selenium = new DefaultSelenium("localhost", 4444, "*chrome",
"http://tracker.com/");
selenium.start();
selenium.open("/login_page.php");
selenium.type("username", "guest");
selenium.type("password", "guest");
selenium.click("//input[@value='Ouvrir la session']");
selenium.waitForPageToLoad("30000");
selenium.click("link=Afficher les bogues");
selenium.waitForPageToLoad("30000");
selenium.type("search", chaineARechercher);
selenium.click("filter");
selenium.waitForPageToLoad("30000");

// si au moins une reponse
StringBuilder builder = new StringBuilder();
int index = 4;
while (selenium.isElementPresent("//table[@id='buglist']/tbody/tr["
+ index + "]")) {
if (selenium.isElementPresent("//table[@id='buglist']/tbody/tr["
+ index + "]/td[4]")) {
String link = selenium
.getText("//table[@id='buglist']/tbody/tr[" + index
+ "]/td[4]");
// System.err.println("click sur le lien " + link);

if (selenium.isElementPresent("link=" + link)) {
selenium.click("link=" + link);
selenium.waitForPageToLoad("5000");
index++;
String resultat = selenium.getBodyText();
if (resultat.indexOf(chaineARechercher) != -1) {
builder.append("######################################################"+"\n");
builder.append("Mantis possible : " + link +"\n");
builder.append(resultat+"\n");
builder.append("######################################################"+"\n");
}
selenium.click("link=Afficher les bogues");
selenium.waitForPageToLoad("5000");
} else {
System.err.println("element non trouve link=" + link);
}
}
else
{
// il n'y plus de resultat
// on sort
break;
}
}

try {
FileWriter file = new FileWriter("mantisTrouvees.txt");
file.write(builder.toString());
file.flush();
file.close();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println(builder.toString());

selenium.click("link=Fermer la session");
selenium.waitForPageToLoad("30000");
selenium.stop();

}

}

javascript : ajax exemple

Un très bon site traitant du sujet

Voici un petit exemple Ajax :

Tout d'abord un exemple synchrone :


var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("GET", location.href, false);
xhr_object.send(null);
if(xhr_object.readyState == 4) alert("Requête effectuée !");



Puis , un exemple asynchrone :


var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("GET", "uneJsp.jsp", true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) alert(xhr_object.responseText);
}

xhr_object.send(null);



Un exemple complet avec un POST :


var l1 = f.elements["list1"];
var l2 = f.elements["list2"];
var index = l1.selectedIndex;
if(index < 1)
l2.options.length = 0;
else {
var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("POST", "species.php", true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4)
eval(xhr_object.responseText);
}

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data = "family="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
xhr_object.send(data);
}




Une troisième façon de faire, mais qui ne me semble pas être de l'ajax car elle rafraichi tout la page :

Voici la page complète :


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript">
function updateData()
{
var dt = new Date();
window.status = dt.getSeconds();
}

function timer()
{
var value = 1000;
if(value > 0)
{
//window.setTimeout(function() {var dt = new Date();window.status = dt.getSeconds();},2000);
var date = new Date();
var e = window.document.getElementById("date");
e.innerHTML = date.getSeconds();
window.setTimeout('document.location=document.location',2000);
}
else
{
alert("erreur de saisie");
}

}

</script>
<title>test refresh</title>
</head>
<body onload="timer()">
<h1 id="date">pas de date</h1>
</body >
</html>

vendredi 11 mars 2011

jeudi 10 mars 2011

unix /linux : la commande diff et la commande patch

un très bon site ici

Voici les 2 commandes à connaitre pour appliquer automatiquement les différences détectées par la commande diff:

Supposons que nous ayons 2 fichiers nommés version1 et version2 en 2 versions différentes :

Tout d'abord, effectuons, un diff que nous redirigeons vers un fichier de patch nommé pdate1to2.patch :
$ diff -u version1 version2 > update1to2.patch

Ensuite, il faut appliquer la commande patch
patch -p0 < update1to2.patch

A noter : L'argument -p{nb} indique de tronquer x répertoires dans les noms de fichiers affectés par le patch. Cela peut-être pratique quand un patch s'applique à une aborescence qui n'est pas la même que la votre.

A noter diff -r pour 2 répertoires
diff -r repertoire1 repertoire1

mysql : se connecter au shell SQL

Voici, un rappel des commande à lancer pour se connecter à un shell mysql :

mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"
Server version: 5.0.56_AWL-Enterprise-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>connect maBDD
select * from Client;


Comment demarrer une transaction (BEGIN pourt mysql <= 4.1 ou sinon START TRANSACTION)
mysql>START TRANSACTION;
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 1000;
...
mysql>ROOLBACK;
...
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 3000;
...
mysql>commit;


la transaction est svalidé par le mot clé COMMIT ou invalidé par ROLLBACK

A noter : lors d'une commande insert, update ou delete, il est possible de connaître le nombre de colonne impactées avec la requête suivante :
select ROW_COUNT();

Voici une commande pour lancer un script SQL :
mysql>source monFichier.sql

Ou une seconde commande (qui correspond à la commande source mais en mode "court")
mysql>\. monFichier.sql


Lancer une commande directement (dasn un sh par exemple) :
mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"

mysql : lancer des commandes SQL via un script ksh

Voici un exemple simple de script ksh, qui se connecte a une BDD et lance des commandes :

Tout d'abord, il suffit de lancer un shell myqsl via la commande suivante :

A noter que les argument sont "collés" au options, et l'option -e pour lancer une commande sql.


$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt


Voici; l'exemple complet ...

#!/bin/ksh
set -x
echo "Debut de ${0}"

#------------------------------------------------------------
# VALIDATION ET RECUPERATION DES PARAMETRES
#------------------------------------------------------------
NB_PARAM=5

if [ $# -ne $NB_PARAM ]
then
echo "Nombre de paramètre incorrect"
echo
echo "USAGE : "
echo "${0} NomBase User PWD nomFileARenommer nomNouvelleFile"
exit 0
fi

# ------------------------------------------------------------------
# Chargement du profile
# ------------------------------------------------------------------

echo "Chargement du profile"

. /etc/conf/ini_trt_mysql.ksh

BASE=$1
USER=$2
PWD=$3
NOM_ORIGINE=$4
NOM_NOUVEAU=$5

REQUETE_NEW="use $BASE;SELECT * FROM client WHERE name='${NOM_NOUVEAU}'"
REQUETE_SAV="use $BASE;SELECT * FROM client WHERE name='${NOM_ORIGINE}'"
REQUETE_UPDATE="use $BASE;UPDATE client SET NAME='${NOM_NOUVEAU}' WHERE NAME='${NOM_ORIGINE}'"
echo "BASE = " $1
echo "USER = " $2
echo "PWD = " $3

# ------------------------------------------------------------------
# Lancement de la requête
# ------------------------------------------------------------------
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_UPDATE"
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_NEW" > nouvelleDonnees.txt
diff sauvegardeDonnees.txt nouvelleDonnees.txt

# ------------------------------------------------------------------
# Fin du traitement
# ------------------------------------------------------------------

echo "Fin de ${0}"

lundi 7 mars 2011

unix / linux : charger simplement des variables d'environnements

Une syntaxe simple permet de charger des variables ou d'exécuter un script de "contexte", il s'agit de :


echo "chargement du contexte"
. /home/enwoo/monScriptDeContexte.sh
echo "démarrage du script"


Cette simple commande lancera le premier script et permettra par exemple de positionner des variables d'environnements nécessaires aux commandes suivantes ...

unix / linux : find multiple commande exec

Voici, comment exécuter plusieurs commande dans le même find ... C'est tout simple et parfois très pratique ...


find . \( -name "*.*" \) -type f -exec grep -i 'style=' {} \; -exec grep -i '<STYLE>' {} \; -print > allStyle.txt


A noter, qu'il existe une syntaxe alternative avec des + pour la séparation