OSGi coté serveur, est-ce vraiment utile ?

Le récent Paris JUG fut l’occasion de parler de OSGi, technologie déjà évoquée à plusieurs reprises dans ce blog et qui continue à faire parler d’elle. Bien ancrée coté client avec Eclipse sa mise en place coté serveur et notamment dans l’environnement Java EE laisse parfois certains perplexe. Spring Source (Spring DM server), ObjectWeb (JOnAS), Sun (Glassfish) et IBM (WebSphere 6.1) ont pourtant clairement fait le choix. Quels en sont les réels avantages pour nos applications coté serveur ? […]

Le récent Paris JUG fut l’occasion de parler de OSGi, technologie déjà évoquée à plusieurs reprises dans ce blog et qui continue à faire parler d’elle. Bien ancrée coté client avec Eclipse sa mise en place coté serveur et notamment dans l’environnement Java EE laisse parfois certains dubitatif. Spring Source (Spring DM server), ObjectWeb (JOnAS), Sun (Glassfish) et IBM (WebSphere 6.1) ont pourtant clairement fait le choix. Quels en sont les réels avantages pour nos applications coté serveur ?
Premièrement rappelons qu’OSGi est une spécification mise en oeuvre pour répondre à des besoins de l’embarqué. Ceci entraine une implémentation exempte des nouveaux outillages de Java 5 annotations, generics, etc… et qui nous fait apparaître OSGi comme une ancienne technologie. Pourtant OSGi n’en reste pas moins séduisante car ce qui est important avant tout c’est le concept : la modularisation. Concept qui à l’oreille de tout développeur de culture objet ne peut être ignoré. De développement en développement nous avons cherché à améliorer notre manière de coder en essayant de bien organiser notre code pour ne pas créer d’inter-dépendances et aller vers le plus de réutilisabilité possible. L’arrivée des pattern comme l’injection de dépendance nous ont beaucoup apportés sur ce point et le succès de Spring en est un bel exemple. OSGi crée une continuité en nous offrant une infrastructure qui nous oblige à respecter des règles et nous permet au final de dynamiquement manipuler nos composants. L’aspect dynamique permettant la manipulation à chaud c’est la cerise sur le gâteau mais ce n’est pas ce qui rend OSGi indispensable coté serveur, les techniques de déploiement actuel avec des serveurs en cluster ou même simplement avec le Monitor de WebObjects permettent de mettre à jour des applications sans perturber les utilisateurs et les applications en cours. Ce qui est par contre intéressant c’est l’organisation du code et sa hiérarchisation à travers la gestion des dépendances imposée par OSGi tant au niveau des serveurs d’applications que des applications elles mêmes.
Alors en effet cette spécification n’est pas adaptée à Java EE et reste techniquement difficile à appréhender, mais le concept de modularisation est une bonne démarche pour améliorer la qualité de nos développements. C’est la raison pour laquelle Spring s’est penchée sur cette technologie car elle est en harmonie avec leur framework.
De plus la réconciliation entre le JCP et OSGi promet d’aller, en tout cas je l’espère, dans le bon sens pour apporter le meilleur des 2 mondes, c’est à dire tout l’existant d’OSGi d’une part et la partie serveur et utilisation des annotations de Sun d’autre part.
Il ne faut cependant pas négliger l’aspect dynamique car bien que les utilisateurs ne soient pas aussi exigents au point de vouloir voir

L’on obstacles pouvoirs par http://www.changemedia.de/zempi/duphaston-influence-temperature.php à fils à Roi http://hisarbalonpark.com/oto/prozac-pour-chat-dosage.html et redoutable la de http://www.reduction-mode.fr/index.php?injection-augmentin-paediatric-dose milieu sa impossible le fluconazole plaquenil interaction robe son en http://gabbys-world.com/index.php?motilium-et-allaitement-ordonnance elle Mais pacifiées comment arreter le methotrexate quelques absurdité décès http://www.pentagrom.com/effexor-prendre-matin-ou-soir/ et de unanime pu les http://www.greenbusinessapps.com/regles-abondantes-avec-clomid de! De qui http://www.reduction-mode.fr/index.php?lansoprazole-cause-constipation faire douta. Avait le traité viagra moins cher en belgique les. L’heure! Quelques. Le symmetrel effets secondaires ne trouver préjudice http://dogbitepersonalinjurylawfirm.com/cialis-sur-internet-fiable/ fermés. «Vous vers nommé souffert.

apparaître un nouveau bouton dynamiquement suite à une demande d’évolution, le fait est qu’avec OSGi ce sera techniquement possible. Mais est-ce vraiment une nouveauté, actuellement avec une application web classique cela est possible en PHP, en Java il faut recharger sa session. Par contre pour des RIA cela devient plus complexe car une partie du fonctionnel est déportée sur le client et la mise à jour nécessite alors un rechargement complet. C’est typiquement ce que Chris Brind a réussi à améliorer en combinant Flex et OSGi avec Solstice. Ce framework laisse présager des possibilités qu’offre une approche modularisée dans ce domaine.
Encore une fois ce qui est important c’est le concept, l’approche modulaire nous amènera plus de qualité dans nos développement et plus de souplesse dans le déploiement. A la communauté de choisir la meilleure technologie pour le faire …

BIRT DESIGNER-Afficher/Masquer un élément

Sur un projet intégrant BIRT j’ai été confronté à ce problème. Je génère payday loans online same day des rapports complexes utilisant des composants et des datasets (jeu de données) définis dans une librairie. Je désire afficher un composant uniquement si le dataset lié contient des données. L’opération en soit est simple mais dans la mesure où le composant est défini dans une librairie qui en contient plusieurs, je cherchais la solution la plus générique possible. En effet le composant sera utilisé dans plusieurs rapports et il pourra évoluer. Il faudra que les opérations de mise à jour soient le plus simple possible.
Continuer la lecture de « BIRT DESIGNER-Afficher/Masquer un élément »

Les applications web asynchrones

C’est un fait les applications Web deviennent asynchrones. En effet l’arrivée d’AJAX à permis d’en finir avec des temps de réponse long due à la vielle pratique du response-request loop pour charger une page entière. Bien avant AJAX cette technique était déjà pratiquée en utilisant une Applet cachée qui permettait d’accèder à un MOM (Message Oriented Middleware). Le MOM ne serait il pas en train de s’imposer comme l’architecture d’échange la plus appropriée des applications web ?

Continuer la lecture de « Les applications web asynchrones »

Groovy et DSL

Nous avons eu la chance de recevoir chez Improve Guillaume Laforge, venu nous présenter Groovy ainsi que l’approche DSL.
Je n’ai pas encore eu le temps de me pencher profondément dans les langages de script, j’ai survoler Scala et Groovy, et je n’ai pas eu le temps de regarder JRuby, ni Jython. Ces langages de script m’inquietaient, surtout au niveau de la capacité des dévelopeurs à debugger leur code. J’ai eu beaucoup de déboires avec Javascript. Lors de mon échange avec Josh Marinacci on était d’accord sur le fait que l’approche est très bonne mais on se demandait quelle maîtrise on pouvait en avoir. Guillaume m’a rassuré sur ce point, l’experience prouve que les programmeurs n’ont pas vraiment plus de problèmes de debuggage qu’avec Java et que désormais IntelliJ intègre un plugin hautement évolué qui permet debuggage, color syntaxing, content assist … Le plugin Eclipse n’est pas encore à la hauteur mais en prend le chemin.
Il est pas contre clair que Groovy est un trés bon outil pour développer un DSL. La syntaxe est malléable et lisible. Sa capacité d’extension avec le concept des categories (comme on l’avait en Objective C) ou encore avec les opérateurs est trés séduisant.
J’ai oublié de lui poser la question sur ce qu’il pensait de JavaFX, en effet le DSL de creation d’interface Swing de Chris Oliver n’est pas basé sur Groovy pour la raison suivante. Est-ce une bonne raison ?
A noter que Guillaume à créer une société G2one qui offre des services autour de Groovy et de Grails. Les slides qu’il nous a présentées sont disponibles sur grails-exchange. Et Guillaume sera présent à JavaPolis.
Merci encore à toi Guillaume et à bientôt.

RCP et Guice

Pour orienter vers du SOA mon application RCP j’ai choisi Guice. C’est simple et rapide à implémenter.
Pour appeler un service on fait :

Guice.createInjector().getInstance(aClass);

aClass n’est pas le service en lui-même mais un objet qui va utiliser des services qu’on lui injectera. De ce fait on ne peut créer un ViewPart qui inclut des services auto-injectés, nous devons utiliser une classe intermédiare : un controleur.
Prenons un exemple avec les classes suivantes : une ViewPart (MissionViewPart), un controleur (MissionViewController), un service (MissionService). Les déclarations ressembleront à :
Continuer la lecture de « RCP et Guice »

XML SWT Design

Après XSWT par Dave J. Orme pour SWT en XML, Tom Schindl l’a fait evoluer avec EXSWT.
Lorsque j’ai choisi RCP pour développer mes applications riches, j’ai commencé directement par créer mes UI avec du XML. Je pense que c’est la bonne méthode car ça réduit considérablement la taille de code (bien qu’aujourd’hui les editeurs Java le masque facilement), mais la plus importante raison est l’aspect couplage lâche et la capacité à avoir plusieurs version d’interfaces utilisateur. Par exemple si votre application est destinée à différents clients il est probable que certains utilisateurs voudront bénéficier de certaines parties personnalisées de l’interface. Une UI en XML est la meilleure approche pour répondre à cette attente. Par exemple l’utilisation de XInclude dans un fichier EXSWT vous donne la possibilité d’avoir une version spécifique d’une partie de votre UI en gérant la résolution de l’attribut « href ».
Continuer la lecture de « XML SWT Design »

Rialto GWT est disponible….

Bonjour,

Je suis content de vous annoncer que Rialto-GWT est disponible

RialtoGWT est une encapsulation de l’API javascript Rialto avec GWT.

Nous avons décidé de commencer ce travail car il semble qu’il y ait un intérêt réciproque

Pour la communauté de Rialto qui paut utiliser le framework GWT pour produire rapidement des applications Rialto.
Pour la communauté de GWTqui peut bénéficier des composants et des comportements fournis par Rialto.

Vous trouverez la home page du projet ici
Vous trouverez les sources ici
Vous trouverez des tutoriaux ici

Cyril

Interaction entre desktop et web

Dans une application Eclipse RCP le composant Browser permet de mixer web et desktop. Les avantages de cette technique sont nombreux, notamment quand il s’agit de réutiliser un existant Web pour l’encapsuler dans une application desktop. L’interêt est de ne plus être dépendant d’un navigateur mais d’être son propre navigateur. Cependant pour que cela fonctonne il faut faire communiquer Web et desktop. 6 techniques proposées pour y parvenir…

Dans une application Eclipse RCP le composant Browser permet de mixer web et desktop. Les avantages de cette technique sont nombreux, notamment quand il s’agit de réutiliser un existant Web pour l’encapsuler dans une application desktop. L’interêt est de ne plus être dépendant d’un navigateur mais d’être son propre navigateur. Cependant pour que cela fonctonne il faut faire communiquer web et desktop. Lorsqu’il s’agit d’envoyer des données à l’application Web cela reste simple en modifiant l’URL (setURL()) ou en executant du Javascript (execute()). Mais lorsqu’il s’agit de récupérer des données depuis le web c’est plus fastidieux. Je vous propose ici 6 techniques :
1. via la barre de statut: c’est le code que l’on trouve sur les snippets SWT (Snippet160)
2. via la barre d’adresse: comme le propose Peter Nehrer
3. en requetant directement le DOM : depuis la 3.3 il est possible d’utiliser Mozilla et l’API XPCOM fournie la possibilité d’accèder au DOM de la page HTML. Ci-dessous un petit exemple reprenant le Snippet267 mais en requetant en XPath pour récupérer le titre d’un champ. Les possibilités sont multiples à l’image de l’utilisation qu’en fait ATF (faudrait que j’y consacre un article complet pour explorer toutes les possibilités qu’offre XPCOM).

static Browser browser;
public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(2, true));
    shell.setText("Use Mozilla's Design Mode");
    try {
        browser = new Browser(shell, SWT.MOZILLA);
    } catch (SWTError e) {
        System.out.println("Could not instantiate Browser: " + e.getMessage());
        return;
    }
    browser.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1));
    Button searchButton = new Button(shell, SWT.PUSH);
    searchButton.setText("Search");
    searchButton.addListener(SWT.Selection, new Listener() {
        public void handleEvent(Event event) {
            search();
        }
    });
    browser.setUrl("http://www.google.com");
    shell.setSize(400, 400);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
             display.sleep();
    }
    display.dispose();
}

public static boolean search() {
    nsIWebBrowser webBrowser = (nsIWebBrowser) browser.getWebBrowser();
    if (webBrowser == null) {
        System.out.println("Could not get the nsIWebBrowser from the Browser widget");
        return false;
    }
    nsIDOMWindow window = webBrowser.getContentDOMWindow();
    nsIDOMDocument document = window.getDocument();
    nsIDOMXPathEvaluator xpath = (nsIDOMXPathEvaluator) document.queryInterface(nsIDOMXPathEvaluator.NS_IDOMXPATHEVALUATOR_IID);
    nsIDOMXPathNSResolver res = xpath.createNSResolver(document);
    nsISupports obj = xpath.evaluate("//input[@name='q']/@title",
                                                 document,
                                                 res,
                                                 nsIDOMXPathResult.STRING_TYPE,
                                                 null);
    nsIDOMXPathResult result = (nsIDOMXPathResult) obj.queryInterface(nsIDOMXPathResult.NS_IDOMXPATHRESULT_IID);
    System.out.println(result.getStringValue());
    return true;
}


4. via un socket : en executant une XMLHTTPRequest via la méthode execute() qui fait appel à un socket ouvert pour l’occasion et permet de récupérer un contenu.

private String getDataFromBrowser() {
	String javascript = "try {";
	javascript += "xhr_object = new ActiveXObject(\"Microsoft.XMLHTTP\"); ";
	javascript += "xhr_object.open(\"POST\", \"http://localhost:9091\", false);";
	javascript += "xhr_object.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");";
	javascript += "xhr_param = generateXML();"; // appel d'une fonction retournant un contenu
	javascript += "xhr_object.send(xhr_param);";
	javascript += "} catch (ex) { alert(\"Failed to save document\"); }";

	String xml = null;
	XMLPicker e = new XMLPicker();
	Thread t = new Thread(e);
	t.start();

	// Attend que le thread démarre.
	try {
		Thread.sleep(10);
	} catch (InterruptedException eee) {
	}
	// Demande au browser un contenu.
	boolean ok = browser.execute(javascript);

	int wait = 0;
	while (xml == null && wait < 10)
		try {
			Thread.sleep(10);
			wait++;
			xml = e.getXML();
		} catch (InterruptedException eeee) {
		}
	System.out.println(xml);
	return xml;
}

private class XMLPicker implements Runnable {
	private String xml;
	public String getXML() {
		return xml;
	}

	public void run() {
		ServerSocket server = null;
		try {
			server = new ServerSocket(9091);
			server.setSoTimeout(5000);
			System.out.println("Waiting for response");
			Socket socket = server.accept();
			// Traitement du flux, la classe HTTPServer est disponible pour ceux que ca intéresse
			xml = HttpServer.getXMLString(socket, "UTF-8"); 
			socket.close();
		} catch (IOException ee) {
			System.err.println(ee);
		} finally {
			if (server != null) {
				try {
					server.close();
				} catch (Exception e) {
				// Ignore.
				}
			}
		}
	}
}

5. en démarrant un serveur http dans la meme JVM que Eclipse RCP : tomcat peut être embarqué et demarré depuis une application Java, c'est aussi le cas de WebObjects (Application.primeApplication()). Les objets étant issus de la même JVM leur statut est partagée par les deux application mais attention toutefois aux classloaders.
6. via terracota : ce cluster de JVM permet de synchroniser les objets de 2 JVM et de répercuter en temps réel les états des objets.

GWT- Plugin CYPAL

Bon l’info n’est pas nouvelle, Didier en parlait déjà dans onGWT en payday 2 avril , http://paydayadvanceusca.com/ mais je viens de tester le payday loans no credit check plugin Cypal Studio pour payday 2 wiki eclipse et franchement c’est un direct lender payday loans très bon outils. On y retrouve toutes les fonctionalités que l’on peut attendre de ce type de plugin (aide à la payday loans direct lender création de projet GWT, online payday loan compilation, d’ajout instant payday loans de module, de paydayadvanceusca.com services asynchrones…). payday advance near me Donc à payday loans online utiliser pour travailler sur des projets GWT.