IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à intégrer ONLYOFFICE Docs à l’outil de travail collaboratif Confluence

Pour réagir au contenu de cet article, un espace de dialogue vous est proposé sur le forum. Commentez Donner une note  l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Nous continuons la série de tutoriels qui apprennent à intégrer la suite bureautique en ligne ONLYOFFICE Docs avec des services web tiers dont par exemple Nextcloud ou une application GED en Python. Parmi les intégrations disponibles figurent notamment ownCloud, SharePoint, Seafile, Liferay, Plone, Nuxeo, Chamilo, Jalios, eXo Platform, GoFast et bien d’autres applications web reliées avec ONLYOFFICE Docs via les connecteurs prêts à l’emploi fournis par ONLYOFFICE ou résultant de partenariats technologiques.

Quel est l’objectif principal de ces intégrations ? Le but est de compléter l’éventail de leurs outils existants avec des éditeurs en ligne assurant la mise en forme des documents texte, des classeurs et des présentations (DOCX, XLSX, PPTX) de toute complexité et leur rédaction collaborative en temps réel directement dans l’interface de ces plateformes. Pour en savoir davantage sur les capacités fonctionnelles de ONLYOFFICE Docs, consultez cet article.

Dans ce tutoriel, nous allons vous montrer comment créer une application d’intégration qui va servir de pont reliant les instances ONLYOFFICE Docs et Confluence, la solution de travail collaboratif se focalisant sur la gestion et le partage des contenus.

Image non disponible

II. Prérequis

Avant tout, il est indispensable d’installer des éléments nécessaires à l’intégration.

  • ONLYOFFICE Docs

Vous pouvez déployer ONLYOFFICE Document Server en utilisant les paquets DEB ou RPM, l’image Docker, le paquet Snap, la machine virtuelle Univention, Amazon, l’environnement Cloudron, les conteneurs Kubernets qui sont disponibles sur le site officiel.

  • Environnement Confluence

Avant tout, vous avez besoin d’installer le SDK Atlassian qui encapsule le binaire Maven permettant de créer les extensions et les tester au sein d’une application Atlassian lancée.

Pour l’installer, suivez ces consignes pour Windows, Linux ou Mac.

Ensuite, créez le fichier de base pour l’extension Confluence. Ouvrez la ligne de commande et lancez la commande suivante : atlas-create-confluence-plugin. L’outil va vous demander quelques détails pour la création d’une extension simple.

Vous pouvez paramétrer l’ouverture de l’extension dans votre environnement de développement intégré. Pour cela, il vous faudra définir quelques paramètres supplémentaires.

Il n’y a pas de consignes spéciales sur la configuration de l’éditeur VSCode, vous pouvez le paramétrer en utilisant Maven qui vient ensemble avec le SDK. Créez le fichier de configuration settings.json dans le dossier .vscode en y plaçant ce code :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
{


    "maven.executable.path": "C:\\Applications\\Atlassian\\atlassian-plugin-sdk-8.0.16\\apache-maven-3.5.4\\bin\\mvn",
    "java.configuration.maven.userSettings": "C:\\Applications\\Atlassian\\atlassian-plugin-sdk-8.0.16\\apache-maven-3.5.4\\conf\\settings.xml"

}

Veuillez noter que le chemin peut varier selon l’emplacement de l’installation du SDK.

III. Ajouter les boutons à l’interface

Nous avons besoin d’ajouter le bouton « Éditer » à l’interface et la page avec les éditeurs.

Pour l’ajout du bouton, vous n’avez même pas à développer le code. Les applications Atlassian utilisent le fichier XML qui sert à spécifier les composants que l’extension comprend. Ce fichier est disponible à : src\main\resources\atlassian-plugin.xml. Il permet également de définir les classes Java que l’application va instancier.

(Veuillez noter qu’il vous faudra supprimer toutes les lignes import de votre code pour gagner de la place.)

Pour créer le bouton, il vous suffit d’ajouter les lignes suivantes :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<web-item key="onlyoffice-doceditor" name="Link for the attachment editing" section="system.attachment" weight="9">

    <condition class="onlyoffice.IsOfficeFileAttachment">

        <param name="forEdit">true</param>

    </condition>

    <description>The link and the text for it to open the document which is available for editing.</description>

    <label key="onlyoffice.connector.editlink"/>

    <link><![CDATA[/plugins/servlet/onlyoffice/doceditor?attachmentId=$attachment.id]]></link>

    <styleClass>onlyoffice-doceditor</styleClass>

</web-item>

Pour de plus amples informations sur les paramètres qui figurent dans les lignes au-dessus, lisez cet article.

La plupart des paramètres sont évidents. L’attribut section sert à définir l’emplacement des liens. L’élément <condition> spécifie la classe Java qui va être utilisée pour filtrer les pièces jointes sur lesquelles nos liens seront affichés. Parmi les conditions figurent notamment l’accès des utilisateurs, la taille du fichier, l’extension du fichier. Pour mieux comprendre comment cela fonctionne, consultez le code sur GitHub.

En ce qui concerne d’autres boutons pour afficher et convertir les documents, leur création est similaire à celle du bouton « Éditer ».

Voyons de plus près l’élément <link>. Vous le reliez directement avec la servlet contenant le paramètre ID de la pièce jointe (le lien va se composer comme suit confluence/servlet/attachment_Id). La servlet elle-même va traiter les demandes des utilisateurs et ouvrir la page pour charger l’interface des éditeurs.

La servlet est la classe Java qui étend javax.servlet.http.HttpServlet et surcharge sa méthode doGet.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class OnlyOfficeEditorServlet extends HttpServlet {


    private static final Logger log = LogManager.getLogger("onlyoffice.OnlyOfficeEditorServlet");


    @Override

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        return VelocityUtils.getRenderedTemplate("templates/editor.vm", defaults);

    }

}

Vous pouvez aussi ajouter le Velocity Template : src\main\resources\templates\editor.vm.

Image non disponible

À l’intérieur de ce template, il y a le code JavaScript qui va charger la page avec les éditeurs. Pour rendre la servlet opérationnelle, il est indispensable de faire quelques ajustements dans l’application Atlassian en modifiant le fichier atlassian-plugin.xml.

Image non disponible

IV. Configuration des servlets et de l’extension

À cette étape, nous sommes presque prêts à ouvrir le document pour la lecture. Nous avons besoin de fournir les variables à notre page template. L’une des variables inclut l’URL qui mène vers notre Document Server, et nous ne souhaitons pas le code en dur. Heureusement, nous sommes en mesure de travailler sur les paramètres de l’extension directement dans l’interface, y compris la conception UI.

Maintenant il nous est indispensable de créer une autre servlet pour notre configuration (n’oubliez pas de l’ajouter au fichier atlassian-plugin.xml).

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
public class OnlyOfficeConfServlet extends HttpServlet {

  

    @ComponentImport

    private final UserManager userManager;


    @ComponentImport

    private final PluginSettingsFactory pluginSettingsFactory;


    @Inject

    public OnlyOfficeConfServlet(UserManager userManager, PluginSettingsFactory pluginSettingsFactory) {

        this.userManager = userManager;

        this.pluginSettingsFactory = pluginSettingsFactory;

    }


    private static final Logger log = LogManager.getLogger("onlyoffice.OnlyOfficeConfServlet");


    private static final long serialVersionUID = 1L;


    private String AppendSlash(String str) {

        if (str == null || str.isEmpty() || str.endsWith("/"))

            return str;

        return str + "/";

    }


    private String getBody(InputStream stream) {

        Scanner scanner = null;

        Scanner scannerUseDelimiter = null;

      

        try {

            scanner = new Scanner(stream);

            scannerUseDelimiter = scanner.useDelimiter("\\A");

            return scanner.hasNext() ? scanner.next() : "";

        } finally {

            scannerUseDelimiter.close();

            scanner.close();

        }

    }

}

Il y a deux méthodes utilitaires qui sont explicites. Nous avons besoin d’en ajouter encore deux.

La première est doGet. Nous prenons nos paramètres existants et les ajoutons à notre template.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
@Override

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    String username = userManager.getRemoteUsername(request);


    if (username == null || !userManager.isSystemAdmin(username)) {

        SettingsManager settingsManager = (SettingsManager) ContainerManager.getComponent("settingsManager");

        String baseUrl = settingsManager.getGlobalSettings().getBaseUrl();

        response.sendRedirect(baseUrl);

        return;

    }


    PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();

    String apiUrl = (String) pluginSettings.get("onlyoffice.apiUrl");


    response.setContentType("text/html;charset=UTF-8");

    PrintWriter writer = response.getWriter();


    Map<String, Object> contextMap = MacroUtils.defaultVelocityContext();


    contextMap.put("docserviceApiUrl", apiUrl);

    writer.write(getTemplate(contextMap));

}


private String getTemplate(Map<String, Object> map) throws UnsupportedEncodingException {

    return VelocityUtils.getRenderedTemplate("templates/configure.vm", map);

}

La seconde méthode est doPost. Celle-l va prendre l’objet JSON, l’analyser et annuler les paramètres existants.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
@Override

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    String username = userManager.getRemoteUsername(request);

    if (username == null || !userManager.isSystemAdmin(username)) {

        response.setStatus(HttpServletResponse.SC_FORBIDDEN);

        return;

    }


    String body = getBody(request.getInputStream());

    if (body.isEmpty()) {

        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

        return;

    }


    String apiUrl;

    try {

        JSONObject jsonObj = new JSONObject(body);

        apiUrl = AppendSlash(jsonObj.getString("apiUrl"));

    } catch (Exception ex) {

        StringWriter sw = new StringWriter();

        PrintWriter pw = new PrintWriter(sw);

        ex.printStackTrace(pw);

        String error = ex.toString() + "\n" + sw.toString();

        log.error(error);


        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

        response.getWriter().write("{\"success\": false, \"message\": \"jsonparse\"}");

        return;

    }


    PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();

    pluginSettings.put("onlyoffice.apiUrl", apiUrl);


    response.getWriter().write("{\"success\": true}");

}

Dans les deux cas, nous allons vérifier si l’utilisateur possède un accès à ces paramètres. En réalité, nous allons aussi vérifier la connexion au Document Server et dans le sens inverse pour que nous puissions identifier les problèmes qui peuvent se produire à cette étape. Le code complet est disponible ici.

Nous pouvons également ajouter les boutons « Configurer » sur la page de gestion du plugin Atlassian. Pour le faire, il suffit d’ajouter cette ligne à l’élément <plugin-info> dans le fichier atlassian-plugin.xml.

 
Sélectionnez
1.
<param name="configure.url">/plugins/servlet/onlyoffice/configure</param>

N’oubliez surtout pas le Velocity template.

Image non disponible

Revenons à la servlet de l’éditeur pour la modifier.

 
Cacher/Afficher le codeSélectionnez

Cela créera un objet JSON qui est indispensable pour ouvrir la page des éditeurs. Veuillez noter que nous plaçons notre objet JSON dans la variable qui se termine par AsHtml. De cette manière, le codage HTML automatique sera désactivé pour que nous le mettions dans le tag <script> au sein de notre template :

 
Sélectionnez
1.
var json = '${jsonAsHtml}';

Juste pour votre information, nous avons utilisé trois classes utilitaires dont AttachmentUtil, UrlManager et DocumentManager.

Enfin et surtout, il nous reste à paramétrer la livraison des documents vers Document Server.

À cet effet, il nous faut créer encore une servlet. La seule méthode ici va assurer la disponibilité du fichier.

 
Cacher/Afficher le codeSélectionnez

V. Lancement et tests

Cette étape consiste à nous assurer que tout fonctionne correctement et nous sommes capables d’ouvrir les documents pour la lecture.

Lancez la commande atlas-run pour créer l’extension et lancer Confluence.

Un autre moyen consiste à lancer atlas-package pour créer .jar.

Quelle que soit l’option que vous choisissiez, passez aux Paramètres -> Gérer les apps, ensuite chargez l’extension et cliquez « Configurer ». Veillez à spécifier l’adresse URL du Document Server et testez l’extension.

VI. Édition et coédition

Pour pouvoir ouvrir le document pour l’édition, il faut apporter quelques modifications supplémentaires.

Le paramètre callbackUrl doit s’adresser à la servlet qui va obtenir les données décrivant le statut de l’édition du document de la part du Document Server. Quand l’utilisateur ferme le document, le serveur enverra la notification que l’édition a été terminée, aussi bien que l’URL vers le document mis à jour que nous allons télécharger.

Si vous vous questionnez comment la rédaction collaborative fonctionne, suivez les consignes ci-dessous.

Les utilisateurs vont éditer le seul document tant que le paramètre clé est le même. Il y a deux aspects importants à prendre en considération lors de la génération de la clé pour un fichier :

  1. La clé doit être unique pour chaque document ;
  2. La clé doit être modifiée lorsque le document est modifié.

D’habitude, la paire ID ModifiedDate fonctionne très bien. Cependant il y a un scénario qui n’est pas compatible avec cette combinaison. Si vous envisagez de mettre en place un enregistrement obligatoire, il vous est indispensable de générer la clé qui demeurera exactement la même durant toute la session d’édition.

La génération de la clé se fait dans AttachmentUtil et DocumentManager.

Ajoutez cette ligne dans la servlet de notre éditeur juste après la ligne

fileUrl = urlManager.GetFileUri(attachmentId); :

 
Sélectionnez
1.
2.
3.
4.
5.
if (AttachmentUtil.checkAccess(attachmentId, user, true)) {

    callbackUrl = urlManager.getCallbackUrl(attachmentId);

}

Passez-la à notre fonction getTemplate :

 
Sélectionnez
writer.write(getTemplate(apiUrl, callbackUrl, fileUrl, key, fileName, user, errorMessage));

Utilisez la clé ici :

 
Sélectionnez
permObject.put("edit", callbackUrl != null && !callbackUrl.isEmpty());

...

editorConfigObject.put("callbackUrl", callbackUrl);

Maintenant, il vous faut créer une fonction de rappel. Pour le faire, modifiez OnlyOfficeSaveFileServlet que nous avons utilisé pour livrer le document. Cela se fait facilement : nous analysons un objet JSON entrant, vérifions son statut et enregistrons le document si nécessaire. La documentation détaillée est disponible ici.

 
Cacher/Afficher le codeSélectionnez

Au stade final, recompilez le projet et testez-le.

VII. Configuration des services de sécurité

Comment vous assurer que JSON qui a été attribué à notre servlet via la méthode POST provient de notre Document Server ? La réponse est simple : le serveur des documents utilise la méthode JWT pour accomplir cette tâche.

Nous utilisons la classe JwtManager. JWT est une méthode JSON hachée basée sur la clé secrète.

Premièrement, ajoutez les nouveaux paramètres pour notre clé secrète. Vous trouverez le code ici : configure.vm template, configuration servlet.

Ensuite, ajoutez JwtManager à la servlet de l’éditeur et placez-le avant la ligne config.put("jsonAsHtml", responseJson.toString());  :

 
Sélectionnez
1.
2.
3.
4.
5.
if (jwtManager.jwtEnabled()) {

    responseJson.put("token", jwtManager.createToken(responseJson));

}

Dès maintenant Document Server va considérer le service comme fiable.

Pour vous assurer de la fiabilité du Document Server, veuillez utiliser JWT lors du traitement de la fonction de rappel.

En fonction de la configuration, Document Server possède deux moyens pour passer JWT: au sein de l’en-tête HTTP ou au sein de JSON. Nous allons les examiner tous les deux.

Modifiez la servlet de la fonction de rappel en ajoutant JwtManager et placez-la juste après la ligne JSONObject jsonObj = new JSONObject(body); :

 
Cacher/Afficher le codeSélectionnez

Vous avez dorénavant à votre disposition les outils de lecture et d’édition des documents protégés par la méthode JWT contre un accès indésirable et la configuration facile.

VIII. Utiliser ONLYOFFICE Docs au sein de l’environnement Confluence

Une fois installée et correctement paramétrée, l’application d’intégration va ajouter une nouvelle option « Éditer avec ONLYOFFICE » au menu du document pour tous les fichiers.

Image non disponible

Dès maintenant vos êtes en mesure de :

  • créer de nouveaux fichiers bureautiques ou modifier des documents DOCX, XLSX, PPTX existants ;
  • convertir les documents ODT, DOC, ODP, PPT, ODS, XLS aux formats Office Open XML correspondants ;
  • collaborer sur les documents en temps réel en activant le mode de coédition qui vous convient le mieux (affichage des modifications en temps réel ou verrouillage d’un extrait en cours d’édition), le suivi des modifications, les commentaires, la messagerie instantanée, la comparaison des documents et l’historique des versions.
Image non disponible

Si vous souhaitez aller encore plus loin en étendant les fonctionnalités de la suite ONLYOFFICE Docs, consultez cet article pour apprendre à installer et utiliser les modules complémentaires ONLYOFFICE.

IX. Remerciements Developpez.com

Nous tenons à remercier Malick pour la mise au gabarit et Claude Leloup pour la relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2020 ONLYOFFICE . Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.