rss
twitter
  • Showcase
  • Carrières
  • Support
  • GitLab
  • Espace client
  • Contact

Interroger une API Java à travers PHP/JavaBridge

7

INDEX

Interroger l’API de PSNext éditée par Sciforma

PHP/JavaBridge est une interface permettant de faire communiquer PHP avec une machine virtuelle Java.

Pré-requis

PHP5 et une version récente de Java :

italic:webapps italic$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-10M3527)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)

Installation de Tomcat 7

La procédure pour OS X est décrite par Wolf Paulus sur son blog. Le but étant de pouvoir accéder au manager de Tomcat :

img1

 

Enregistrement du brige

Il suffit de placer JavaBridge.war dans la liste des webapps du manager. On peut ensuite y accéder par https://localhost:8080/JavaBridge/

img2

 

Incorporation de l’API PSNext

PSNext est un logiciel de gestion de projet dont l’éditeur Sciforma a eu la bonne idée de proposer une API.

Cette manipulation est sensée fonctionner quelle que soit votre appli, temps que vous possédez un .jar

La solution que j’ai trouvée consiste à reconstruire le .war et à l’utiliser comme application.
– Se rendre dans le dossier des webapps de Tomcat. Dans notre install il s’agit de/usr/local/apache-tomcat-7.0.16/webapps
– L’appli JavaBridge est visible sous forme de .war (celui que l’on a uploadé tout à l’heure dans le manager) mais pendant son exécution le dossier est également décompressé cd JavaBridge/
– On place les librairies de l’API PSNext dans le sous-dossier WEB-INF/lib

  • PSClient.jar
  • PSClient_en.jar
  • utilities.jar
    – Et on recréer le .war (avec un autre nom pour ne pas confondre) :
italic:JavaBridgeTemplate621 italic$ sudo jar -cvf PSNext.war *
Password:
manifest ajout?
ajout : WEB-INF/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/cgi/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/cgi/x86_64-mac/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/cgi/x86_64-mac/conf.d/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/cgi/x86_64-mac/ext/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/cgi/x86_64-mac/launcher.sh (entr?e = 109) (sortie = 94) (13% compress?s)
ajout : WEB-INF/cgi/x86_64-mac/php-cgi.MISSING.README.txt (entr?e = 76) (sortie = 69) (9% compress?s)
ajout : WEB-INF/lib/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/lib/JavaBridge.jar (entr?e = 436954) (sortie = 414520) (5% compress?s)
ajout : WEB-INF/lib/php-script.jar (entr?e = 58673) (sortie = 52504) (10% compress?s)
ajout : WEB-INF/lib/php-servlet.jar (entr?e = 58252) (sortie = 54164) (7% compress?s)
ajout : WEB-INF/lib/PSClient.jar (entr?e = 16954308) (sortie = 14660791) (13% compress?s)
ajout : WEB-INF/lib/PSClient_en.jar (entr?e = 943325) (sortie = 789581) (16% compress?s)
ajout : WEB-INF/lib/utilities.jar (entr?e = 3157382) (sortie = 2824147) (10% compress?s)
ajout : WEB-INF/pear/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : WEB-INF/web.xml (entr?e = 1779) (sortie = 623) (64% compress?s)
ajout : WEB-INF/weblogic.xml (entr?e = 239) (sortie = 150) (37% compress?s)
ajout : index.php (entr?e = 3871) (sortie = 1450) (62% compress?s)
ajout : java/ (entr?e = 0) (sortie = 0) (0% stock?)
ajout : java/Java.inc (entr?e = 62439) (sortie = 13636) (78% compress?s)
ajout : java/JavaProxy.php (entr?e = 613) (sortie = 354) (42% compress?s)
ajout : test.php (entr?e = 19) (sortie = 19) (0% compress?s)
italic:JavaBridgeTemplate621 italic$ ls
italic:JavaBridgeTemplate621 italic$ cd ../
italic:webapps italic$ ls
PSNext          PSNext.war      ROOT            docs            examples        host-manager    manager

À l’arrivée, un .war à placer dans le manager de Tomcat et à l’utiliser en lieu de place de JavaBridge.war.

La connexion avec PHP

Il vous faudra créer un vhost.
Dans un fichier .php, essayez :

require_once("https://localhost:8080/PSNext/java/Java.inc");
$System = java("java.lang.System");
print_r($System->getProperties());

Si tout va bien, pas d’erreur et un beau et long var dump à lire.

Les services de l’API PSNext

Impossible de passer en revue tous les services de l’API.
Cependant voici un exemple fonctionnel permettant de s’identifier puis de boucler sur la liste des projets pour en récupérer les champs personnalisés :

<?php

public function import() {

	// buffers pour affichage temporisé
	Kohana::close_buffers();
	ob_start();
	$this->auto_render = false;

	// envoi en-tete html
	echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
</head>
<body>';
	echo "<pre>";

	// connexion au pont
	// ****************************************************************
	echo "<h1>".Kohana::lang('psnext.import1')."</h1>";
	require_once(Kohana::config('psnext.phpjavabridge')); // $config['phpjavabridge'] = 'https://localhost:8080/PSNext/java/Java.inc';
	$System = java("java.lang.System");
	echo '<font color=green>OK</font>';
	echo "<hr>";

	// chargement utils
	// ****************************************************************
	echo "<h1>".Kohana::lang('psnext.import2')."</h1>";
	$Util = java("php.java.bridge.Util");
	$ctx = java_context();
	ob_flush();
	flush();

	// chargement session
	// ****************************************************************
	$bridge = $ctx->getAttribute(  "php.java.bridge.JavaBridge",      100);
	$config = $ctx->getAttribute ( "php.java.servlet.ServletConfig",  100);
	$context = $ctx->getAttribute( "php.java.servlet.ServletContext", 100);
	$servlet = $ctx->getAttribute( "php.java.servlet.Servlet", 100);

	$session = new java('com.sciforma.psnext.api.Session', Kohana::config('psnext.server'));
	echo '<font color=green>OK</font>';
	echo "<hr>";
	ob_flush();
	flush();

	// ça connecte ?
	// ****************************************************************
	echo "<h1>".Kohana::lang('psnext.import3', Kohana::config('psnext.login'))."</h1>";
	try {
	  	$session->login(Kohana::config('psnext.login'), str_split(Kohana::config('psnext.pwd'), 1));
	  	echo java_values($session) . "\n";

	    $user = new java('com.sciforma.psnext.api.User');
	    $ressource = $user->getLoggedInUser($session);

	    echo java_values($ressource->getStringField("ID")) . "\n";
	    echo java_values($ressource->getStringField("First Name").' '.$ressource->getStringField("Last Name"));

	} catch (JavaException $ex) {
	  	$cause = $ex->getCause();
	  	echo "Exception 1. <br>\n";
	  	echo "$cause <br>\nin file: {$ex->getFile()}<br>\nline:{$ex->getLine()}\n";
		exit('1');
	}
	echo '<br><font color=green>OK</font>';
	echo "<hr>";		
	ob_flush();
	flush();

	// boucler la liste des projets PSNext
	// ****************************************************************
	echo "<h1>".Kohana::lang('psnext.import4')."</h1>";
	try {

		$list_projects = java_values($session->getProjectList(1,2));

		$i = 1;
		foreach ($list_projects as $key => $project) {

			$fields = array();

			$fields['pID'] = java_values($project->getStringField("ID"));
			$fields['name'] = java_values($project->getStringField("name"));

			// récupération des champs personnalisés d'après leurs intitulés dans PSNext
			java_values($project->open(true));
			$fields['approved']         = java_values($project->getBooleanField("approved"));
			$fields['ok_facture']       = java_values($project->getBooleanField("Validation facturation"));
			$fields['date_facture']     = date('Y-m-d', strtotime(java_values($project->getDateField("Réalisation de la facture"))));

			$fields['budget']           = java_values($project->getDoubleField("Budget du projet"));
			$fields['frais']            = java_values($project->getDoubleField("Frais du projet"));
			$fields['total']            = java_values($project->getDoubleField("Montant total"));

			$fields['pays']             = java_values($project->getStringField("Pays emplacement"));
			$fields['classification']   = java_values($project->getStringField("Classification"));
			$fields['surface']          = java_values($project->getIntField("Surface (m²)"));
			$fields['type']             = java_values($project->getStringField("Type de projet"));
			$fields['client']           = java_values($project->getStringField("Client"));
			$fields['description']      = java_values($project->getStringField("Description"));

			$fields['realisation_fact'] = date('Y-m-d', strtotime(java_values($project->getDateField("Réalisation de la facture"))));
			$fields['reglement_fact']   = date('Y-m-d', strtotime(java_values($project->getDateField("Réglé le"))));
			$fields['envoi_fact']       = date('Y-m-d', strtotime(java_values($project->getDateField("Envoi de la facture"))));

			$fields['status']           = java_values($project->getStringField("etats"));
			$fields['project_type']     = java_values($project->getStringField("Type de projet"));

			$fields['design_date']      = date('Y-m-d', strtotime(java_values($project->getDateField("Design date"))));
			$fields['drawings_date']    = date('Y-m-d', strtotime(java_values($project->getDateField("Drawings date"))));

			$psnext_project = ORM::factory('Psnext_project')->where('pID', $fields['pID'])->find_all();
			if (!count($psnext_project)) {
				$psnext_project = ORM::factory('Psnext_project');
				$psnext_project->pID = $fields['pID'];
				$psnext_project->save();
				$project_id = $psnext_project->id;
				$new_project = true;
			} else {
				$new_project = false;
				foreach($psnext_project as $psn) {
					$project_id = $psn->id;
				}
			}

			echo "<br>**** ID = ".$project_id." ****<br>";				

			echo "\n";
			$i++;

			ob_flush();
			flush();
		}

	} catch (JavaException $ex) {
	  	$cause = $ex->getCause();
	  	echo "Exception 2. <br>\n";
	  	echo "$cause <br>\nin file: {$ex->getFile()}<br>\nline:{$ex->getLine()}\n";
		ob_flush();
		flush();
	  	exit ('2');
	}

	ob_flush();
	flush();

	java_values($session->logout());

	echo "</pre>";
	echo "</body></html>";

	ob_flush();
	flush();
}

?>
DATE 20 Déc 2011
by : Germain
Author / Auteur

Social Share / Partager

    7 Comments
    1. Grégory 4 juin 2014 at 14 h 49 min Répondre

      Bonjour,

      Avez-vous pu utiliser l’API et les services disponibles ?
      Est-il posible de partager cette liste de services ?

      Merci

      • Germain 4 juin 2014 at 15 h 15 min Répondre

        Salut, oui, ça a fonctionné.
        J’avais totalement oublié de mettre à jour cet article…

        Je colle immédiatement un exemple d’utilisation du service qui permet de se connecter, et d’itérer sur la liste des projets pour en récupérer les champs définis dans PSNext.

        Est-ce utile pour vous ?

    2. Grégory 7 juin 2014 at 17 h 04 min Répondre

      Merci beaucoup. Cela m’est très utile.

      J’ai cependant une (dernière) question, l’URL de PSNext pour la connexion est de quelle forme?
      Car moi je vois que mon appli client standard (hors API), celle que tout le monde utilise fait des appels réseaux vers BASE_URL/psnext/PSServlet. Est-ce que c’est ça l’URL à renseigner? Et comment le password doit être passé en paramètre (sans cryptage) ?

      Merci d’avance

    3. Grégory 7 juin 2014 at 17 h 19 min Répondre

      Désolé pour la question un peu rapide, c’est la connexion fonctionne.

      Merci bcp

    4. Grégory 7 juin 2014 at 21 h 41 min Répondre

      Re-bonjour,

      J’ai quand même une question, comme connaitre la structure des objets PSNext.
      Par exemple comment savoir que le champs pour le nom est « name » ?

      Merci !

    5. Guigui 1 octobre 2014 at 17 h 03 min Répondre

      Bonjour,

      Pour connaitre le structures des objets PS Next (sciforma), il faut ce connecter à l’application.
      Pour les champs Natifs, il faut les interrogés avec leurs noms en anglais (Autrement, cela risque de ne pas fonctionner). Pour les champs personnalisés, l’interrogation ce fait avec le nom que vous avez défini.

      A+

      • Germain 1 octobre 2014 at 20 h 15 min Répondre

        Merci pour ces infos précieuses 🙂

    Leave a Reply / Répondre Annuler la réponse

    *
    *

    More in Back-end : PHP, CMS

    • Quel php.ini (MAMP ou Linux), quelle valeur de phpinfo() ?
    • Trucs utiles pour WordPress
    • Les bons headers PHP pour envoyer du CSV compatible Excel en UTF8
    • Imagemanager(tiny Mce) et kohana
    • Récupérer, vérifier et exploiter une date

    Search the blog

    Blog categories

    • Front-end : HTML, CSS (13)
    • Workflow (1)
    • Front-end : javascript, jQuery (33)
    • Back-end : PHP, CMS (42)
    • Back-end : SQL, MySQL (20)
    • Sysadmin : Linux, Apache, GIT (75)
    • Designers : tools, advice (2)
    • Desktop : OS X (37)
    • Desktop : Microsoft (12)
    • Uncategorized (8)

    ITALIC™ Resources

    • Paramètres de connexion au serveur mail
    • Graphistes : séduire un développeur web
    • Dév front : nos bonnes pratiques
    • Mailing : nos (bonnes ?) pratiques
    • Environnement de travail Mac

    Recent posts

    • Autoriser le chargement de contenus mixtes non-https dans Chrome (Mac)
    • Afficher les logs MySQL
    • Recevoir un mail lors de la connexion root à un serveur
    • Changer l’interclassement de plusieurs tables MySQL à la fois (ou presque
    • Maildev : tester l’envoi de mails durant ses développements
    © 2008-2017 ITALIC™ • 8 bis rue Abel • 75012 PARIS • Tel +33 (0)1 48 44 46 35 • RCS PARIS 508 228 772 • Powered by WordPress & GoodLayers
    Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site web.
    Cookie settingsACCEPTER
    Manage consent

    Privacy Overview

    This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
    Necessary
    Toujours activé
    Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
    Non-necessary
    Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
    Enregistrer & appliquer