mardi 28 octobre 2008

Generators in Hibernate Annotations

Identity generator in hibernate

@Id 
@GeneratedValue (strategy=GenerationType.IDENTITY)
@Column(name = "REJ_CDN")
int id;



* Tested with Sybase

Increment generator in hibernate

@Id
@GeneratedValue(generator = "autoincrement")
@GenericGenerator(strategy = "increment", name = "autoincrement")
@Column(name = "MYID")
Integer id;


* Tested with Sybase

vendredi 24 octobre 2008

AJP13 avec apache

Pour router votre serveur apache vers le serveur tomcat, il faut utiliser un proxy, apache délègue sa requête au serveur tomcat. Ce mode de fonctionnement permet surtout de faire du load balancing et, lorsqu'il s'agit de servir des fichiers, utiliser la code natif plus performant de apache.

Après avoir installé et déclarés le module proxy_ajp_module dans le fichiers httpd.conf :

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so



Ajouter dans le fichier httpd.conf les lignes suivantes

Include conf/vhosts.d/*.conf
<Location /wiki >
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/apachepasswd
Require user wiki
ProxyPass ajp://localhost:8009/JSPWiki
ProxyPassReverse ajp://localhost:8009/JSPWiki
allow from all
</Location>
<Location /gestion >
ProxyPass ajp://localhost:8009/gestion
ProxyPassReverse ajp://localhost:8009/
allow from all
</Location>



Autrement, il est aussi possible de créer un fichier worker.properties
# worker "worker1" will talk to Tomcat listening on machine www.x.com at port 8007 using 2 lb factor
worker.list=worker1
worker.worker1.host=myhost
worker.worker1.port=9009
worker.worker1.lbfactor=2





# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/httpd/conf/worker.properties
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /var/log/httpd/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /ft-jobs/* worker1


Changer l'URL


Pour configurer de manière centralisée les applications, il est possible d'utiliser un apache frontal et de repartir les adresses vers des serveurs mandatataires, apache agit donc comme un proxy et il suffit d'ajouter la ligne suivante dans le fichier httpd.conf
Par exemple si la machine vm04 est le frontal et que le serveur hudson est sur la vm04, il suffit d'ajouter la ligne suivante au fichier httpd.conf


ProxyPass /hudson/ http://vm04:8080/hudson/


On accedera à hudson par l'url http://vm01/hudson/



Faire du load balancing


Solution n°1


<Location /jonas>
ProxyPass balancer://mycluster/
ProxyPassReverse balancer://mycluster/
Allow From All
</Location>


<Proxy balancer://mycluster>
BalancerMember ajp://localhost:9009/myapp
BalancerMember ajp://localhost:8009/myapp
</Proxy>


Solution n°2




ProxyPass http://localhost/myapp/
ProxyPassReverse /myapp/
Allow From All


JkWorkersFile /etc/httpd/conf/worker.properties
JkShmFile /var/log/httpd/mod_jk.shm
access_log)
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkMount /myapp/* worker1

mardi 21 octobre 2008

No Dialect mapping for JDBC type: -1

org.hibernate.MappingException: No Dialect mapping for JDBC type: -1

Was provoked by :

String query = "SELECT * FROM MYTABLE WHERE MYID=? "
+ "AND MYCRITERIA >= ?";
SQLQuery sqlQuery;
sqlQuery = session.createSQLQuery(query);
sqlQuery.setString(0, code);
sqlQuery.setDate(1, date);
List<string> ports = sqlQuery.list();


The cause was I could not to use the *, I had to specify each field instead.

How to copy a file on webdav using common-httpclient ?

Webdav technology allow sharing files with internet. WebDav is a filesytem interface relying on http protocol, a non transactionnal. Webdav manages files whithout locking and work using a versionning system in order to continue working for multiple users. A tricky mecanism for holding concurrent versions lay behind the scene, but if you plan to use WebDav like you'd use a samba filesytem, you may not care understanding of the hidden processes.

If your on a local network, you'd still prefer more standard file system for convenience.

In java, you can use the generic http client commons-httpclient to put your files on a webdav server. I give you a sample code that let you create a file on the server and then DELETE it. Somme more sophisticated operations can be performed with the jackrabbit-webdav library, it will provide you with more operations.

HostConfiguration hostConfig = new HostConfiguration();
hostConfig.setHost("targetserver");
HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
int maxHostConnections = 20;
params.setMaxConnectionsPerHost(hostConfig, maxHostConnections);
connectionManager.setParams(params);
HttpClient client = new HttpClient(connectionManager);
Credentials creds = new UsernamePasswordCredentials("username","password");
client.getState().setCredentials(AuthScope.ANY, creds);
client.setHostConfiguration(hostConfig);
PutMethod putMethod = new PutMethod(
"http://targetserver:8080/webdav/targetfilename");
FileInputStream is = new FileInputStream("myfile.pdf");
InputStreamRequestEntity requestEntity = new InputStreamRequestEntity(is);
putMethod.setRequestEntity(requestEntity);
client.executeMethod(putMethod);
System.out.println(putMethod.getStatusCode() + " "
+ putMethod.getStatusText());


You could have to sort of status code :
201 Created (A file has been created)
204 No data(The http response has no data, but the operation has performed correctly)

And to delete a file :



DeleteMethod deleteMethod = new DeleteMethod(
"http://targetserver:8080/webdav/targetfilename");
client.executeMethod(deleteMethod);
System.out.println(putMethod.getStatusCode() + " "
+ putMethod.getStatusText());

mardi 14 octobre 2008

Démarrage des programmes au boot

Le fichier /etc/initab définit le niveau désiré.

3: Sans écran, multiutilisateur, cela permet un demarrage plus rapide et économise les ressources nécessaire pour le X. Utile pour un serveur.
5: Avec le démarrage du mode graphique, c'est le mode par défaut.

Pour démarrer un programme automatiquement :

Créer le fichier de démarrage dans /etc/rc.d/rcX.d/ ou X est le niveau du démarrage.

Pour le démarrage, il faut préfixer le nom du fichier de S et donner un numéro de séquence.

Pour l'extinction, il faut préfixer le nom du fichier de K et donner un numéro de séquence.

Ne pas oublier si le fichier .depend.start de renseigner les dépendances.

mercredi 8 octobre 2008

Créer la metrologie à l'aide de maven

Le pluggin javancss de paven permet de calculer les métriques pour un projet. Notamment, cela permet de voir quel ration de code a été commenté.

mvn javancss:report
NCSS est le nombre d'instructions, ces dernières sont spécifié par une norme, grossièrement cela correspond au nombre de ';' et de '{'

2766 est le nombre d'instruction du projet

Programm NCSS : le nombre d'instruction total
NCSS average : le nombre d'instruction moyen par classes
CCN : la complexité cyclomatique
Javadocs average : Le nombre de ligen de commentaire par classe.

Program NCSSNCSS averageCCN averageJavadocs average
2,766.003.862.020.46










vendredi 3 octobre 2008

Astuces de backup sur Ubuntu et autres LINUX

Pour nettoyer automatiquement des répertoire de backup des fichiers top anciens

Mettez en cron la commande :

find  /var/backupreposvn/ -atime +60 -type f|xargs rm -f


Pour créer un backup de votre NAS sur votre ordinateur en ayant une gestion des backups trop ancien :


export BACKUPDIR=$HOME/backup/
mkdir $BACKUPDIR
export SRCFILE=$HOME/backup/`date +%Y%m%d`.tgz
tar -cvzf $SRCFILE $HOME/.gvfs/documents\ sur\ ls-wsglbc3/
export COMBIEN=`ls $BACKUPDIR|wc -l`
if [[ $COMBIEN>3 ]]
then
find $HOME/backup/ -mtime +30 -exec rm -f {} \;
else
echo "Pas de fichier à supprimer"
fi



My Sql

mysqldump -uroot -pjt ft_jobs_val|gzip >/var/backup/ft_jobs_val_`date +%Y%m%d`.dump.gz
mysqldump -uroot -pjt ft_jobs_val_int|gzip >/var/backup/ft_jobs_val_int_`date +%Y%m%d`.dump.gz
mysqldump -uroot -pjt jira1|gzip >/var/backup/ft_jobs_jira1_`date +%Y%m%d`.dump.gz
mysqldump -uroot -pjt jira2|gzip >/var/backup/ft_jobs_jira2_`date +%Y%m%d`.dump.gz
find /var/backup/ -mtime +30 -exec rm -f {} \;



Ce script doit être lancé à chaque démarrage de votre session.

jeudi 2 octobre 2008

Compiler subversion à partir des sources

Sous linux :
Telecharger et installer openSSL
http://www.openssl.org/source/

./config --prefix=/usr/

Downloader les sources sur http://subversion.tigris.org

Dezipper

Downloader neon sur http://www.webdav.org
Downloader apr sur http://apr.apache.org
Downloader apr-util sur http://apr.apache.org

Dezipper ces trois projet et deplacez les dans dans le projet subversion


mv /home/myhome/apr-util-XXX/ /home/myhome/subversion-XXX/apr-util/
mv /home/myhome/apr-XXX/ /home/myhome/subversion-XXX/apr/
mv /home/myhome/neon-XXX/ /home/myhome/subversion-XXX/neon/

./configure --prefix=/usr

make install

Effectuer une requête simple à l'aide d'Hibernate

Hibernate, même s'il est particulièrement à l'aise sur les problème d'informatique de gestion (Lecture/Modification d'enregistrements), ne peut se substituer à toutes les utilisations qui sont faite lors de SQL.

C'est particulièrement vrai lorsqu'on se sert de fonctions statistique, telle que SUM( ) ou COUNT(*) Dans ces cas une requête simple est préférable. Hibernate offre la possibilité de faire des requêtes simples par la fonction createSQLQuery("SELECT SUM(MACOL) FROM MATABLE").

Dans ce cas, inutile de "voler" la connexion hibernate pour s'en servir à sa place pour se servir des APIS fournies par JAVA, mieux vaut se servir des APIS hibernate.

Voici un exemple :

SQLQuery query = session
.createSQLQuery(
"SELECT count(*) FROM MATABLE WHERE MACOL1=? AND MACOL2=?");
query.addScalar("NOMBRE", Hibernate.FLOAT);
query.setDate(0, dateFinMois);
query.setInteger(1, commande.getId());
Float consommeEnFinDeMois = (Float) query.list().get(0);



L'utilisation de la fonction query.setScalar permet de typer la réponse.
query.setInteger(0,x) permet de fournir des paramètres à la requête.