Google Guice

Google Guice est un framework léger d’injection de dépendances distribué par Google sous la licenc open source Apache. Il utilise un type de classe particulier (module) définissant les relations entre des interfaces et les classes les implémentant. Pour se servir de cette classe, il faut instancier un injecteur, qui doit être un singleton, en lui passant en paramètre la classe correspondante au module.

Classe module
public class AppInjector extends AbstractModule {

    @Override
    protected void configure() {
        //bind the service to implementation class
        bind(IContactService.class).to(ContactService.class);

        //bind the repository to implementation class
        bind(IContactRepository.class).to(ContactRepository.class);
    }
}

En demandant ensuite dans le code à l’injecteur de fournir une instance de classe implémentant une interface indiquée dans le module, celui-ci fournira une instance de la classe indiquée dans le module comme implémentant cette interface.

Cette manière de faire permet de ne traiter l’injection de dépendance qu’en Java, sans avoir de fichiers de configuration à gérer comme en Spring. De plus, elle ne nécessite pas de déploiement sur un conteneur de servlet pour fonctionner. Très pratique pour faire une application totalement standalone sans déploiement sur un serveur.

Pour comprendre les concepts, j’ai créé un petit exemple qui met en oeuvre ce framework avec quelques notions de base. Il s’agit d’une application qui va lire des contacts dans un fichier au format JSON et qui va les retourner sous forme d’une liste de contacts.

Lien : google_guice_exemple

 

Plugin sonar

Dans cet article, nous allons voir comment installer, configurer et utiliser le plugin sonar sur intelliJ.

À l’heure actuelle, il existe deux plugins :

  • Le plugin officiel nommé « SonarQube »
  • Un second non officiel nommé « SonarQube Community Plugin »

Nous choisirons d’utiliser le plugin non officiel « SonarQube Community Plugin » plutôt que le plugin officiel. En effet, ce dernier dispose de plus d’options et permet notamment d’exécuter des scripts spécifiques.

Installation

Pour installer le plugin « non officiel » rendez-vous dans les plugins d’intelliJ File/Settings/Plugins puis cliquer sur le bouton Browse repositories… en bas de la fenêtre.

2015-08-10_144035

Une nouvelle fenêtre apparaît. Sur celle-ci, rechercher le plugin sonar cité ci-dessus et l’installer sans oublier de redémarrer intelliJ.

Une fois redémarré, nous allons pouvoir effectuer la configuration.

 Configuration

Avant de commencer, il faut s’assurer d’avoir une version de java supérieure à la 1.6 et Maven d’installé.

Si tout est OK, rendez-vous dans File/Settings/Other Settings/SonarQube et suivre les différentes étapes qui vont suivre :

2015-08-10_144035

  • Ajouter l’adresse de votre serveur sonar (identifiant et mot de passe ne sont pas obligatoires)
  • Ajouter les ressources sonar de votre projet.

    Remarque : Pour les projets multi modules, il est important de bien sélectionner toutes les ressources sonar du projet (un module = une ressource sonar).

  • Ajouter un script d’analyse locale en cliquant sur le bouton add prévu à cet effet
    1. Dans le champ script, ajouter la ligne suivante (sur windows, ne pas oublier d’ajouter .bat après mvn. Sur linux, pas besoin de .bat) : C:\Program Files\apache-maven\bin\mvn.bat sonar:sonar -DskipTests=true -Dsonar.language=java  -Dsonar.analysis.mode=incremental -Dsonar.host.url=http://….
    2. Dans le champ path to sonar-report.json, insérer la ligne suivante : $WORKING_DIR/target/sonar/sonar-report.json. Ce fichier désigne le rapport sonar. Cela permet à intelliJ de pouvoir afficher les issues relevées directement dans l’IDE plutôt que d’avoir à lire le fichier nous même.

Maintenant que tout est installé et configuré, nous allons voir comment lancer une analyse sur un projet.

Exécution

Pour exécuter une analyse sonar en local, deux solutions s’offrent à nous :

  • Cliquer doit sur le projet puis Analyse/Inspect code => Une inspection globale s’exécute avec affichage des anciennes issues et des nouvelles.
  • Cliquer droit sur le projet puis Analyse/Run inspection by name => Choisir ensuite sonarQube issues (new) par exemple pour n’avoir que les nouvelles issues qui s’affichent.

Exceptions

Exemple d'exceptions avec beans
<camel:onException>
			<camel:exception>fr.domain.ws.domain.api.ServiceException</camel:exception>
			<camel:handled><camel:constant>false</camel:constant></camel:handled>
			<camel:to uri="log:fr.domain.ws.domain?level=WARN&amp;showBody=false&amp;showException=true&amp;showCaughtException=true&amp;showStackTrace=false&amp;multiline=false"/>
		</camel:onException>
		<camel:onException>
			<camel:exception>org.springframework.beans.factory.BeanCreationNotAllowedException</camel:exception>
			<camel:exception>org.apache.http.conn.ConnectTimeoutException</camel:exception>
			<camel:exception>java.net.SocketException</camel:exception>
			<camel:exception>java.net.SocketTimeoutException</camel:exception> 
			<camel:exception>org.apache.cxf.interceptor.Fault</camel:exception>
			<camel:exception>org.apache.cxf.binding.soap.SoapFault</camel:exception>
			<camel:handled><camel:constant>false</camel:constant></camel:handled>
			<camel:to uri="log:fr.domain.ws.domain?level=ERROR&amp;showBody=false&amp;showException=true"/>
		</camel:onException>
		<camel:onException>
			<camel:exception>java.lang.Throwable</camel:exception>
			<camel:handled><camel:constant>false</camel:constant></camel:handled>
			<camel:to uri="log:fr.domain.ws.domain?level=ERROR&amp;showBody=false&amp;multiline=true"/>
		</camel:onException>

 

 

 

Connecteurs

Connecteur CXF
<cxfcamel:cxfEndpoint id="serviceCxfEndpoint"
		xmlns:air="http://ws.domain.fr/air" address="/domainService"
		endpointName="domain:servicePort" serviceName="domain:service"
		serviceClass="fr.domain.ws.air.api.ServicePortType" wsdlURL="service.wsdl">
		<cxfcamel:features>
			<wsa:addressing xmlns:wsa="http://cxf.apache.org/ws/addressing"/>
		</cxfcamel:features>
		<cxfcamel:properties>
			<entry key="schema-validation-enabled" value="true"/>
			<entry key="#{T(org.apache.cxf.ws.security.SecurityConstants).USERNAME_TOKEN_VALIDATOR}">
				<bean class="fr.amadeus.ws.framework.cxf.auth.UsernameTokenValidator" p:authenticationManager-ref="authenticationManager"/>
			</entry>
		</cxfcamel:properties>
		<cxfcamel:inInterceptors>
			<ref bean="wss4jInInterceptor"/>
			<ref bean="serviceLoggingInInterceptor"/>
		</cxfcamel:inInterceptors>
		<cxfcamel:inFaultInterceptors>
			<ref bean="serviceLoggingInInterceptor"/>
		</cxfcamel:inFaultInterceptors>
		<cxfcamel:outInterceptors>
			<ref bean="serviceLoggingOutInterceptor"/>
		</cxfcamel:outInterceptors>
		<cxfcamel:outFaultInterceptors>
			<ref bean="serviceLoggingOutInterceptor"/>
		</cxfcamel:outFaultInterceptors>
	</cxfcamel:cxfEndpoint>
Utilisation du connecteur
<route id="domainCxfEntryPoint">
			<from uri="cxf:bean:domainServiceCxfEndpoint"/>
</route>