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 :
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/
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(); } ?>
Bonjour,
Avez-vous pu utiliser l’API et les services disponibles ?
Est-il posible de partager cette liste de services ?
Merci
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 ?
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
Désolé pour la question un peu rapide, c’est la connexion fonctionne.
Merci bcp
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 !
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+
Merci pour ces infos précieuses 🙂