1. Présentation
L'objectif du bureau virtuel est de proposer aux utilisateurs un portail personnalisé ou ils peuvent choisir et assembler à leur guise les services qu'ils souhaitent utiliser.
Le webmaster est libre de proposer les services qu'il souhaite :
- des informations internes : les nouveautés, les projets en cours, les utilisateurs connectés, ...
- des informations externes : des flux RSS préconfigurés, des flux RSS libres (l'utilisateur peut saisir l'URL des flux RSS qu'il souhaite lire)
- des outils personnalisés : agenda, favoris, workflow, gestion des documents, ...
- des portlets métiers
- des widgets : via la Portlet Widget il est possible d'utiliser la plupart des widgets proposés par Google (cours de la bourse, météo, cartes et plans, trafic routier, ...). Il est aussi possible de laisser l'utilisateur choisir les widgets qu'il souhaite utiliser
L'ergonomie du bureau virtuel est très proche de celle des outils tels que Netvibes ou iGoogle.
Les utilisateurs peuvent personnaliser leur bureau en plaçant les services dans des onglets, en choisissant le nombre et la taille des colonnes pour chaque onglet et en sélectionnant un habillage pour leur bureau.
Fig. 1. Exemple de bureau virtuel
Chaque service peut être déplacé par un simple glisser/déposer. Un utilisateur peut choisir le titre et la couleur de la boîte du service. Certains services proposent plus d'options (p. ex. le service RSS permet de choisir le nombre d'articles à afficher).
Fig. 2. Edition de service
2. Principes
Le bureau virtuel s'intègre dans un portail en utilisant une Portlet Bureau Virtuel.
Les services : Les services proposés à l'utilisateur sont des portlets dont le paramétrage est stocké dans le bureau virtuel. Toute Portlet Skinnable peut être proposée comme service grâce à l'aptitude Bureau Virtuel > Service.
Les flux RSS : Une Portlet RSS avec l'aptitude Bureau Virtuel > Service est automatiquement créée lors de l'installation du module. Ce service n'est pas visible par les utilisateurs, mais c'est lui qui est utilisé lors de l'ajout de flux RSS dans le bureau virtuel. Il est possible de positionner des droits de consultation sur cette portlet pour restreindre l'ajout de flux RSS dans le bureau. Il est également possible de créer d'autre Portlet RSS pour proposer des services RSS déjà paramétrés.
Les widgets : Des Gadgets Google peuvent être proposés en tant que service grâce à la Portlet Widget.
Les bureaux par défaut :
Lorsqu'un utilisateur accède à son bureau virtuel pour la première fois, son bureau est automatiquement créé à partir d'un "bureau par défaut".
Il existe systématiquement un bureau par défaut global qui est configurable depuis l'interface d'administration du site. Il est également possible de configurer d'autres bureaux par défaut par espaces de travail.
Lors de sa première connexion, s'il existe plusieurs bureaux par défaut disponibles pour l'utilisateur, il pourra choisir son bureau initial parmi ceux-ci.
Le stockage : Le paramétrage du bureau virtuel d'un utilisateur est stocké dans la base de données JcmsDB, via une ExtraDBData du membre, sous un format XML. Le paramétrage comprend les options du bureau virtuel (thème), les services présents et leur agencement (onglet, colonne, etc.) et la personnalisation des services (couleurs, champs personnalisés, etc.)
3. Installation et Configuration
3.1 Configuration initiale
- Ajoutez le module Bureau Virtuel et redémarrez JCMS.
- Activez le type Portlet Bureau Virtuel dans votre espace de travail,
-
Créez une Catégorie de navigation dédiée, p. ex.
"Mon bureau",
- Créez un Portail rattaché à cette catégorie,
- Créez une Portlet Sélection dans ce portail,
- Créez une Portlet Bureau Virtuel dans la Portlet Sélection,
- Editez la Portlet Bureau Virtuel et cochez la catégorie de navigation
(ceci est nécessaire pour l'édition des bureaux virtuels par défaut des espaces de travail)
Si vous souhaitez restreindre l'accès au bureau virtuel, ajoutez des droits de consultation sur la Portlet Bureau Virtuel et sur la catégorie.
3.2 Configurer une portlet en tant que Service
Les services sont des portlets standards qui peuvent être personnalisées par l'utilisateur dans leur bureau virtuel.
Editez la portlet que vous souhaitez voir figurer dans la liste des Services des Bureaux Virtuels :
-
Activation de l'aptitude Service (requis)
Dans l'onglet Personnalisation
des paramètres de la portlet, sélectionnez l'aptitude
Bureau Virtuel > Service
-
Saisi du titre du service (recommandé)
Dans l'onglet Apparence
, saisissez le titre du service qui sera présenté à l'utilisateur (à
différencier du titre de la portlet principalement utilisé dans les
interface de JCMS).
-
Sélection d'une image de prévisualisation (recommandé)
Dans l'onglet Description
, sélectionnez/déposez une image pour l'aperçu du
service (dimensions : 200x150).
En l'absence d'image de portlet, c'est la prévisualisation du gabarit de la portlet qui sera utilisée.
Exemple : Ajout d'un service Météo via la Portlet Widget
- Récupération du code du widget
- Accédez au site des Google Gadgets
- Sélectionnez le gadget météo de votre choix.
- Cliquez sur le bouton "Ajouter à votre page Web", une interface de configuration du gadget s'affiche.
Si vous n'obtenez pas d'interface de configuration vous avez probablement cliqué sur l'aperçu du gadget au lieu du bouton. - Saisissez les paramètres du widget, puis cliquez sur le bouton "Obtenir le code".
Fig. 3. Configuration du Google Gadget
- Configuration de la Portlet Widget
- Créez une nouvelle Portlet Widget
- Code du widget : Coller le code du gadget dans le champ "Code" du formulaire d'édition de la Portlet Widget
Fig. 4. Code de la Portlet Widget
- Titre du service : Dans l'onglet Apparence, saisissez le titre du Service qui sera présenté à l'utilisateur (à différencier du titre de la portlet principalement utilisé dans les interfaces de JCMS)
Fig. 5. Edition du titre du service
- Aptitude : Dans l'onglet Personnalisation, sélectionnez l'aptitude Service
Fig. 6. Sélection de l'aptitude Bureau Virtuel > Service
- Image de Prévisualisation : Dans l'onglet Description, sélectionnez une image pour l'aperçu du Service Météo (par exemple une capture d'écran de la portlet)
Fig. 7. Sélection de l'image de prévisualisation du service
Votre service est maintenant disponible dans l'interface du bureau virtuel, prêt à être ajouté par les utilisateurs.
Fig. 8. Service Météo dans le bureau virtuel
3.3 Configurer les bureaux par défaut
3.3.1 Bureau par défaut global
Le bureau par défaut global est configurable par l'administrateur technique depuis la zone d'administration du site, via le lien "Edition du bureau virtuel par défaut".
Le bureau par défaut global ne peut pas être supprimé.
Note technique : ce bureau par défaut global est créer initialement à
partir d'un fichier interne au plugin,
WEB-INF/plugins/VirtualDesktopPlugin/default-desktop.xml,
puis il est rattaché à la catégorie racine du site via l'ExtraDBData
jcmsplugin.virtualdesktop.desktop.
3.3.2 Bureau par défaut d'un espace de travail
Ouvrez la zone d'administration de l'espace de travail et cliquez sur le lien "Edition du bureau virtuel par défaut".
Pour ne plus proposer le bureau d'un espace de travail aux utilisateurs de cet espace, éditez le et supprimez le.
4. Configuration avancée
4.1 Ajout de thèmes (styles de bureau virtuel)
Il est possible d'ajouter des thèmes de bureau virtuel, à la fois pour permettre à l'utilisateur de choisir parmi de nouveaux styles graphiques mais également pour pouvoir utiliser un autre thème dans le bureau par défaut si vous le personnalisez.
Les thèmes sont gérés sous forme de fichiers CSS qui viennent surcharger les styles par défaut. Pour ajouter un thème, on le déclare dans les propriétés du plugin puis on modifie les styles standards dans le fichier CSS du thème.
4.1.1 Déclaration des propriétés
Déclarez les propriétés ci-dessous.
{theme-name} est un nom unique de votre choix (qui sera
repris dans l'attribut css de la balise desktop
dans le XML du bureau virtuel)
Déclaration du thème dans le fichier
plugin.prop de votre module
2 propriétés :
- la première pointant vers le chemin du fichier css contenant vos styles de bureau virtuel,
- la seconde pointant vers le chemin de l'image de prévisualisation (jpeg de 200x150).
jcmsplugin.virtualdesktop.themes.{theme-name}.css-path: path/to/theme.css
jcmsplugin.virtualdesktop.themes.{theme-name}.preview-path: path/to/theme.jpg
Propriétés de traduction dans en.prop et
fr.prop de votre module
# en.prop
jcmsplugin.virtualdesktop.i18n.themes.{theme-name}: My theme
# fr.prop
jcmsplugin.virtualdesktop.i18n.themes.{theme-name}: Mon theme
4.1.2 Déclaration des CSS
Dans votre fichier CSS surchargez les styles du bureau virtuel à
votre guise en utilisant le style .dsk-{theme-name}.
Principaux sélecteur CSS :
.desktop |
bureau (div comprenant tout le bureau) |
.dsk-header |
entête (div comprenant les onglets et les actions) |
.dsk-tabs |
conteneur des onglets (ul) |
.dsk-tabs li |
onglet |
.dsk-tabs li.selected |
onglet sélectionné |
.dsk-content |
conteneur des colonnes (div) |
.dsk-service |
service (div) |
.dsk-service-header |
entête de service (div) |
Fig. 9. Sélecteurs CSS
Voici le contenu du fichier CSS utilisé pour afficher
une bordure sur les différents éléments du bureau dans la capture ci-dessus
(à déclarer avec un thème debug).
.desktop.dsk-debug { border: 3px solid #F76541; }
.dsk-debug .dsk-header { border: 3px solid orange; margin : 3px;}
.dsk-debug .dsk-tabs { border: 3px solid green; }
.dsk-debug .dsk-tabs li { border: 3px solid red; }
.dsk-debug .dsk-tabs li.selected { border: 3px solid gold; }
.dsk-debug .dsk-content { border: 3px solid purple; margin : 3px; }
.dsk-debug .dsk-service { border: 3px solid #C25283; }
.dsk-debug .dsk-service-header { border: 3px solid darkblue; }
4.1.3 Exemple
Voici l'exemple d'un thème "Noël" (identifiant christmas) pour afficher
dans l'entête une image de paysage enneigé en fond :
WEB-INF/plugins/MyPlugin/properties/plugin.prop
jcmsplugin.virtualdesktop.themes.christmas.css-path: plugins/MyPlugin/img/desktop-themes/christmas/christmas.css
jcmsplugin.virtualdesktop.themes.christmas.preview-path: plugins/MyPlugin/img/desktop-themes/christmas/christmas.jpg
WEB-INF/plugins/MyPlugin/properties/languages/en.prop
jcmsplugin.virtualdesktop.i18n.themes.christmas: Christmas
WEB-INF/plugins/MyPlugin/properties/languages/fr.prop
jcmsplugin.virtualdesktop.i18n.themes.christmas: Noël
plugins/MyPlugin/css/desktop-themes/christmas/christmas.css
.dsk-christmas .dsk-header {
padding-top:80px;
background: white url("../../img/desktop-themes/christmas/snow.gif") top left no-repeat;
}
Après redémarrage du site, le thème est proposé dans la liste des thèmes de bureau virtuel.
4.2 Ajout d'icônes pour les onglets
Chaque onglet dispose d'une icône que l'utilisateur peut choisir parmi une liste prédéfinie d'icônes afin de différencier visuellement les onglets les uns des autres.
Les icônes sont gérées en utilisant des classes CSS qui viennent
s'appliquer sur une balise <img> existante
(utilisation du background-image). Pour ajouter une icône, on la déclare dans les propriétés du plugin et
si besoin on déclare les styles CSS correspondant.
4.2.1 Déclaration des propriétés
Ajoutez une propriété
jcmsplugin.virtualdesktop.icons.{icon-name}.
{icon-name} est un identifiant unique de votre choix (qui sera
repris dans l'attribut icon de la balise
service dans le xml du bureau virtuel). La valeur de cette propriété est la liste des styles css qui seront
positionnés sur l'image. Il faut également déclarer les propriétés de traduction correspondante
pour les labels des icônes.
4.2.2 Déclaration des CSS
JCMS 6 fourni en standard l'ensemble des icônes
Famfamfam silk sous
forme de Sprites CSS.
Vous pouvez utiliser ces icônes dans le bureau virtuel en utilisant les
classes CSS adéquats. Pour connaitre les classes à utiliser, installez le
module Dev Tools et
accédez à la page Liste des icônes dans l'espace d'administration.
Il est également possible de déclarer des icônes en ajoutant des classes dans le fichier CSS de votre portail de bureau virtuel.
plugins/MyPlugin/css/portal/mydesktopportal.css
IMG.my_tab_icon {
height:18px; width:18px;
background-repeat: no-repeat;
background-image:url("../../images/mytabicon.png");
}
4.2.3 Exemple
On souhaite ajouter une icone "Soleil" en utilisant les icônes Famfamfam silk.
Voici les propriétés à mettre dans le fichier plugin.prop de
votre module de site
jcmsplugin.virtualdesktop.icons.fff-weather_sun: ss_sprite ss_weather_sun
Ainsi que les propriétés de traduction dans en.prop et
fr.prop de votre module.
# en.prop
jcmsplugin.virtualdesktop.i18n.icons.fff-weather_sun: Sun
# fr.prop
jcmsplugin.virtualdesktop.i18n.icons.fff-weather_sun: Soleil
Après redémarrage du site l'icône est proposée dans la liste des icônes d'onglet.
4.3 Liste des styles de couleurs de services
Les couleurs qui peuvent être choisies par l'utilisateur pour chacun des
services sont configurables dans les propriétés.
On les configure en modifiant une propriété qui contient la liste des classes
CSS qui peuvent être utilisés dans l'habillage du service.
4.3.1 Déclaration des propriétés
Modifiez la propriété jcmsplugin.virtualdesktop.services.colors.
Exemple pour ajouter le style dark :
jcmsplugin.virtualdesktop.services.colors: default red orange yellow green blue dark
4.3.2 Déclaration des CSS
Ajoutez les styles correspondants dans les feuilles de style
de vos themes:
Pour cela il faut définir le style
dsk-service-{color-theme-name} dans 2 usages :
Le style pour la prévisualisation lors de l'édition d'un service :
.dsk-service-color-field .dsk-service-dark { background: #FFC177; }
Le style pour l'habillage du service (la skin) :
.dsk-service-dark.dsk-service-header {
background: #CCCCCC url('custom/service-header-dark.png') repeat-x scroll
center;
}
5. Développement de Service
Pour créer un nouveau service, il faut développer une portlet standard avec son gabarit de présentation. Il faut cependant respecter quelques recommandations afin de garantir le bon fonctionnement de cette portlet dans le bureau virtuel.
Il est également possible de fournir un gabarit d'édition pour permettre aux utilisateurs de personnaliser certains champs de la portlet.
5.1 Recommandations
5.1.1 Identifiant HTML unique
Un service peut être inséré en
plusieurs exemplaire dans un bureau virtuel, mais il s'agit toujours de la
même portlet, il ne faut donc plus utiliser l'identifiant de la portlet
comme id d'élément HTML.
A la place, utilisez un autre identifiant unique, par
exemple la PorletRSS utilise la source, le module Gestion de Tâches
l'identifiant du service (cf. section API ci-dessous).
5.1.2 Inclusion de fichiers CSS ou JS
Depuis vos JSP, utilisez les
méthodes addJavaScript() et addCSSHeader() de la classe JcmsJspContext,
elles garantissent le chargement des CSS et des JS même lors d'une requête
AJAX.
jcmsContext.addJavaScript("plugins/MyPlugin/css/styles.css");
jcmsContext.addCSSHeader("plugins/MyPlugin/js/script.js");
5.1.3 Initialisation du code javacript
Pour être compatible avec le chargement AJAX, invoquez vos méthodes d'initialisation et de nettoyage comme ceci :
Event.observe(window, "load", JCMS.plugin.MyPlugin.init);
Event.observe(document, "refresh:after", JCMS.plugin.MyPlugin.init);
Event.observe(document, "refresh:before", JCMS.plugin.MyPlugin._dispose);
5.2 Créer un gabarit d'édition spécifique
Cette étape est optionnelle. Par défaut l'édition d'un service (pour les
champs titre et couleur) est prise en charge par
plugins/VirtualDesktopPlugin/jsp/serviceEdit.jsp
Développez un gabarit d'édition uniquement si vous devez fournir une édition de champ(s)
spécifique(s).
Pour cela, créez un gabarit d'édition inline
edit{PortletType}Service.jsp en respectant les étapes
suivantes :
5.2.1 Développement du gabarit d'édition
1.1 Inclusion du jsp d'initialisation :
<%@ include file='/plugins/VirtualDesktopPlugin/jsp/doServiceEditInit.jspf' %>
1.2. Déclaration du JavaBean + appel à la méthode validate()
%><jsp:useBean id='formHandler' scope='page' class='generated.EditPortletRSSHandler'><%
%><jsp:setProperty name='formHandler' property='request' value='<%= request %>'/><%
%><jsp:setProperty name='formHandler' property='response' value='<%= response %>'/><%
%><jsp:setProperty name='formHandler' property='*' /><%
%><jsp:setProperty name='formHandler' property='id' value='<%= portlet.getId() %>' /><%
%><jsp:setProperty name='formHandler' property='loggedMember' value='<%= serviceEditMember %>' /><%
%></jsp:useBean><%
!! IMPORTANT : Forcer les propriétés id
et loggedMember (utilisés par la mécanique interne du bureau virtuel)
1.3. Inclusion du jsp d'en-tête d'édition de service
<%@ include file='/plugins/VirtualDesktopPlugin/jsp/doServiceEditHeader.jspf' %>
1.4. Liste des champs à éditer
Pour chaque champ :
-
1 balise
<input>avec l'attributnamecontenant la chaînevirtualdesktop.serviceFieldset l'attributvaluecontenant le nom du champ personnalisé de la portlet (e.g :fieldName) -
1 balise
<input>avec l'attributnamecontenant le nom du champ personnalisé (e.g :fieldName) et l'attributvaluecontenant la valeur actuelle du champ (récupérez cette valeur en faisant appel àportlet.getFieldValue(jcmsContext, "fieldName"})
Exemple pour le champ pageSize
<input value="pageSize" name="virtualdesktop.serviceFields" type="hidden"/>
<input id="<%= service.getId() %>pageSize"
name="pageSize" type="text"
value="<%= portlet.getIntFieldValue(jcmsContext, "pageSize") %>"
maxlength="4" size="4"/>
1.5. Inclusion du jsp de pied de page d'édition de service
<%@ include file='/plugins/VirtualDesktopPlugin/jsp/doServiceEditFooter.jspf' %>
5.2.2 Déclaration du fichier dans plugin.xml
Exemple avec la Portlet RSS :
<templates type="PortletRSS">
<template name="default" file="editPortletRSSService.jsp" usage="jcmsplugin.virtualdesktop.editInline">
<label xml:lang="en">Template used in Virtual Desktop when editing a RSS service.</label>
<label xml:lang="fr">Gabarit utilisé dans le bureau virtuel pour l'édition d'un service RSS</label>
</template>
</templates>
5.2.3 Utilisation des champs personnalisés dans le gabarit de présentation
Pour que les champs personnalisés par l'utilisateur soient utilisés
dans le gabarit de présentation de la portlet, remplacez les appels
portlet.getMonChamp() par
portlet.getFieldValue(jcmsContext, "monChamp");
ou pour les int
portlet.getIntFieldValue(jcmsContext, "monChampInt");
Consultez le gabartit de la PortletRSS
(doPortletRSSFullDisplay.jsp) pour un exemple d'utilisation
de ces méthodes.
5.2.4 Exemple
Cet exemple illustre l'édition du champ pageSize de la
PortletDirectory
<%--
@Summary : Inline edition of Portlet Directory service
@Requires : Virtual Desktop plugin
--%><%
%><%@ include file='/plugins/VirtualDesktopPlugin/jsp/doServiceEditInit.jspf' %><%
%><jsp:useBean id='formHandler' scope='page' class='generated.EditPortletDirectoryHandler'><%
%><jsp:setProperty name='formHandler' property='request' value='<%= request %>'/><%
%><jsp:setProperty name='formHandler' property='response' value='<%= response %>'/><%
%><jsp:setProperty name='formHandler' property='*' /><%
%><jsp:setProperty name='formHandler' property='id' value='<%= portlet.getId() %>' /><%
%><jsp:setProperty name='formHandler' property='loggedMember' value='<%= serviceEditMember %>' /><%
%></jsp:useBean><%
if (formHandler.validate()) {
return;
}
%><%@ include file='/plugins/VirtualDesktopPlugin/jsp/doServiceEditHeader.jspf' %>
<%-- allow source edition only when using the default portlet --%>
<li class="dsk-service-field">
<% String maxItemsLabel = channel.getTypeFieldEntry(PortletDirectory.class, "pageSize", true).getLabel(userLang); %>
<label for="<%= service.getId() %>pageSize"><%= maxItemsLabel %></label>
<input value="pageSize" name="virtualdesktop.serviceFields" type="hidden"/>
<input id="<%= service.getId() %>pageSize"
name="pageSize" type="text"
value="<%= portlet.getIntFieldValue(jcmsContext, "pageSize") %>"
maxlength="4" size="4"/>
</li>
<%@ include file='/plugins/VirtualDesktopPlugin/jsp/doServiceEditFooter.jspf' %>
6. Développements avancés
6.1 Les principales classes de l'API
Important : Consultez la JavaDoc fourni dans le Module Bureau Virtuel
(répertoire plugins/VirtualDesktopPlugin/docs/javadoc/)
pour plus d'informations sur les classes et méthodes évoquées ci-dessous
6.1.1 Desktop
C'est l'objet principal du bureau virtuel, c'est lui qui permet d'accéder à la liste des onglets, au thème choisi par l'utilisateur ainsi qu'à d'autres informations annexes automatiquement remplis par l'API (date de dernier accès, version du bureau, ...)
- Thème :
Desktop#getCss() - Liste des onglets :
Desktop#getTabList()
C'est également depuis cette classe que l'on peut récupérer ou enregistrer le bureau virtuel d'un membre (ou de tout autre donnée telle que les Workspace pour gérer les bureaux par défaut).
- Récupérer un bureau :
Desktop.getDesktop(Data) - Enregistrer un bureau :
Desktop#save(Data)
6.1.2 Tab et Column
Ces 2 objets permettent d'agencer les services dans le bureau virtuel.
L'objet Tab (onglet) contient la liste des colonnes et des
informations supplémentaires comme le titre ou l'icône de l'onglet.
L'objet Column contient la liste des services, la largeur de la colonne.
- Titre de l'onglet :
Tab#getTitle() - Icône de l'onglet (classes CSS):
Tab#getIcon() -
Manipulation des colonnes :
Tab#getColumnList(),Tab#addColumn(Column), ... -
Manipulation de services :
Column#getServiceList(),Column#addService(Service), ...
6.1.3 Service
C'est l'objet qui stocke la personnalisation d'une Portlet et les informations du service.
- La portlet utilisé par ce service :
Service#getPortlet() - Le titre :
Service#getTitle() - La couleur :
Service#getColor() -
Valeurs personnalisées des champs de la portlet :
Service#getFieldValue(String),Service#setFieldValue(String,String)
6.1.4 DesktopUtil
Cet objet regroupe une série de méthodes statiques utilitaires pour travailler avec les objets du bureau virtuel.
-
Récupérer une nouvelle instance de bureau (avec un onglet vide, sans colonne ni service) :
DesktopUtil.getNewEmptyDesktop(String) -
Récupérer une nouvelle instance d'onglet (sans colonne ni service) :
DesktopUtil.getNewEmptyTab(String)
6.2 DesktopPolicyFilter
6.2.1 Principe
Le développement d'une classe DesktopPolicyFilter permet de
modifier le comportement nominal du bureau virtuel, notamment sur :
- la gestion des bureaux par défaut proposés à l'utilisateur lors de sa première connexion
- la gestion des droits d'accès aux bureaux (consultation et édition)
6.2.2 Développement
Implémentez l'interface com.jalios.jcmsplugin.virtualdesktop.DesktopPolicyFilter
dans une classe de votre module,
Dans custom.prop (ou programmatiquement avant le chargement
du plugin VirtualDesktop) ajoutez la propriété jcmsplugin.virtualdesktop.desktop-policy-filter-class
pour référencer le nom de votre classe.
6.2.3 Exemple
Dans l'exemple suivant :
- le(s) bureau(x) par défaut proposé(s) à l'utilisateur recoivent un onglet supplémentaire au nom de l'utilisateur,
- les droits de consultation ne sont pas modifiés,
- les droits d'édition sont restreints aux administrateurs techniques (par défaut les administrateurs fonctionnels peuvent également éditer les bureaux des membres).
Dans les propriétés (plugin.prop) :
jcmsplugin.virtualdesktop.desktop-policy-filter-class: com.company.jcmsplugin.myplugin.MyDesktopPolicyFilter
Dans le code Java :
package com.company.jcmsplugin.myplugin;
import java.util.List;
import com.jalios.jcms.Data;
import com.jalios.jcms.Member;
import com.jalios.jcms.context.JcmsContext;
import com.jalios.jcmsplugin.virtualdesktop.*;
public class MyDesktopPolicyFilter implements DesktopPolicyFilter {
// Default Desktop --------------------------------------------------------
public List<Desktop> getDefaultDesktopList(JcmsContext context, List<Desktop> desktopList) {
DesktopManager dskMgr = DesktopManager.getDesktopManager();
if (context == null || dskMgr == null) {
return desktopList;
}
// Add new empty tab at end with user friendlyname as the title
for (Desktop desktop : desktopList) {
Tab tab = new Tab();
tab.setTitle(context.getLoggedMember().getFriendlyName() + "'tab");
desktop.addTab(tab);
}
return desktopList;
}
// Read Rights ------------------------------------------------------------
public boolean canReadDesktop(Member mbr, Data dataOwner, boolean canRead) {
return canRead; // Do not change read right
}
// Edit Rights ------------------------------------------------------------
public boolean canEditDesktop(Member mbr, Data dataOwner, boolean canEdit) {
// Do not allow workspace administrator to edit other Member's Desktop
boolean isWorkspaceAdminOnly = (mbr != null && mbr.isWorkAdmin() && !mbr.isAdmin());
boolean isMemberDesktop = (dataOwner instanceof Member);
boolean isOwnDesktop = (dataOwner == mbr);
if (isWorkspaceAdminOnly && isMemberDesktop && !isOwnDesktop) {
return false;
}
return canEdit;
}
}
6.3 DesktopListener
6.3.1 Principe
Le développement d'un DesktopListener permet d'écouter les opérations effectuées sur les bureaux virtuels.
Par exemple, ceci peut s'avérer utile pour supprimer des données suite
à la suppression d'un Service. On peut également imaginer le
développement d'un DesktopListener pour des usages statistiques.
6.3.2 Développement
- Créez une classe dérivant de
com.jalios.jcmsplugin.virtualdesktop.DesktopListener - Déclarez cette classe via une propriété
jcmsplugin.virtualdesktop.desktop-listener.{identifiant-unique}
6.3.3 Exemple
Dans l'exemple ci-dessous on affiche un message d'information dès
qu'une opération a lieu sur un bureau (ses onglets et ses services).
On affiche un message spécial dans le cas de la création d'un nouveau bureau.
Dans les propriétés (plugin.prop) :
jcmsplugin.virtualdesktop.desktop-listener.myplugin: com.company.jcmsplugin.myplugin.MyDesktopListener
Dans le code Java :
package com.company.jcmsplugin.myplugin;
import org.apache.log4j.Logger;
import com.jalios.jcmsplugin.virtualdesktop.Desktop;
import com.jalios.jcmsplugin.virtualdesktop.DesktopListener;
import com.jalios.jcmsplugin.virtualdesktop.Service;
import com.jalios.jcmsplugin.virtualdesktop.Tab;
public class MyDesktopListener extends DesktopListener {
private static final Logger logger = Logger.getLogger(MyDesktopListener.class);
@Override
public void desktopChange(Desktop desktop, DesktopOperation op) {
switch (op) {
case CREATE:
logger.info("New desktop '" + desktop + "'created for " + desktop.getDataOwner());
break;
default:
logger.info(op + " performed on Desktop " + desktop);
break;
}
}
@Override
public void tabChange(Tab tab, TabOperation op) {
logger.info(op + " performed on Tab " + tab);
}
@Override
public void serviceChange(Service service, ServiceOperation op) {
logger.info(op + " performed on Service " + service);
}
}






