logo Alfresco
Version Enterprise 3.4.2

Le besoin est de pouvoir appeler facilement et de manière distante les fonctionnalités d’Alfresco avec des temps de réponse convenables.

Problème

Les WebServices qu’offrent Alfresco sont compliqués à manipuler et les temps de réponses sont vraiment longs.

Exemple: copier un noeud, créer un site…

Solution

La solution est d’utiliser les WebScripts d’Alfresco. Au début, il n’est pas évident d’appeler ces WebScripts depuis un code Java voila pourquoi je propose une ébauche d’une couche de Services qui interroge Alfresco.

Appeler un webscript

/**
* Appelle un WebScript Alfresco avec un objet JSON en paramètre.
* @param psURL Adresse du Webscript
* @param psRequestMethod Méthode de la demande (GET, POST, DELETE, PUT)
* @param poParameters Paramètre JSON
* @return Le message retourné par le WebScript
* @throws IOException
*/
public String callWebScript(String psURL, String psRequestMethod, JSONObject poParameters) throws IOException{
  
  String lsResponse;
  HttpURLConnection loConnection = null;
  String lsURL = WEBSCRIPTS_BASEURL.concat(psURL);
  
  // Si le ticket est null : on s'authentifie
  if(getTicket() == null){ loginWebScript(); }
  
  // Contruire l'URL (avec le ticket)
  if(lsURL.contains("?")){ 
	lsURL = lsURL.concat("&"); 
  } else { 
	lsURL = lsURL.concat("?");
  }
  lsURL = lsURL.concat(ALFTICKET);
  lsURL = lsURL.concat("=");
  lsURL = lsURL.concat(getTicket());
  System.out.println("-- Calling WebScript : " + lsURL);
  
  // Envoyer la requete
  URL loURL = new URL(lsURL);
  loConnection = (HttpURLConnection)loURL.openConnection();
  loConnection.setRequestMethod(psRequestMethod);
  loConnection.setDoOutput(true);
  loConnection.setRequestProperty("Content-Type", "application/json");
  
  // Paramètre JSON
  if(poParameters != null){
    OutputStreamWriter loWriter = new OutputStreamWriter(loConnection.getOutputStream());
    loWriter.write(poParameters.toString());
    loWriter.flush();
    loWriter.close();
  }
  
  // Transformer la réponse
  InputStream loInputStream = loConnection.getInputStream();
  lsResponse = isToString(loInputStream);
  return lsResponse;
}

Convertir un InputStream

/**
* Transforme un objet InputStream en une chaine de caractères.
* @param poInputStream Input Stream
* @return Chaine de caractères
* @throws IOException IOException
*/
private String isToString(InputStream poInputStream) throws IOException{
  StringBuilder loResult = new StringBuilder();
  BufferedReader loReader = new BufferedReader(new InputStreamReader(poInputStream));
  
  // Construire la chaine de caractère ligne par ligne
  if(loReader != null){
    String lsLine;
    while ((lsLine = loReader.readLine()) != null) {
      loResult.append(lsLine);
      loResult.append("\n");
    }
  }
  
  return loResult.toString();
}

S’authentifier

/**
* Enregistre un ticket d'authentification pour pour utiliser les WebScripts.
* @throws IOException
*/
private void loginWebScript() throws IOException{
  setTicket("authinprogress");
  String lsResult = callWebScript("api/login?u=" + LOGIN + "&pw=" + PASSWORD, REQUESTMETHOD_GET, null);
  Pattern loPattern = Pattern.compile("<ticket>(.*)</ticket>");
  Matcher loMatcher = loPattern.matcher(lsResult);
  if(loMatcher.find()){
    setTicket(loMatcher.group(1));
  }
}

Appel « final »

/**
* Supprime un site Alfresco
* @param psSiteShortName Clé du site Alfresco
* @throws IOException IOException
*/
public void removeSite(final String psSiteShortName) throws IOException{
  String lsURL = "api/sites/";
  lsURL = lsURL.concat(psSiteShortName);
  moConnectionBean.callWebScript(lsURL, ConnectionBean.REQUESTMETHOD_DELETE, null);
}

JSON

Dans les WebScripts il n’est pas rare d’échanger des objets JSON. Pour gérer ces objets j’utilise la très pratique librairie Simple JSON.

Télécharger le projet Eclispe : Demo WebScripts.zip

MàJ : aujourd’hui j’utiliserai plutôt restTemplate de Spring pour ce genre d’appels !

A vous de jouer!

Publicités