Je suis en train de développer un plugin étendant net.bluemind.core.bluejob et j’ai quelques questions suite à ce développement. Du coup je préfère centraliser ces questions dans un thread comme ça tout le monde aura accès aux réponses.
Le but de mon plugin est d’ajouter des agendas de domaines et de les synchroniser sur des URL externes. En trois mots la tâche va s’exécuter toutes les X portions de temps, télécharger une liste d’URLs correspondant aux plannings qu’elle doit synchroniser, regarder si ces plannings existent déjà, si oui les mettre à jour, si non créer les nouveaux.
Pas de soucis majeurs pour implémenter le point d’extension et pour faire un test de “mise à jour du planning d’un utilisateur particulier” mais ça se corse quand on commence à parler d’Agendas de Domaine…
Voici donc mes premières questions :
Comment récupérer depuis l’API la liste des Agendas de Domaine pour un domaine particulier?
Comment faire une création d’Agenda de Domaine depuis un import ICS?
Pour les utilisateurs on peut faire ça depuis core.getCalendar().importICS(token, ics) en précisant le token d’accès à l’utilisateur voulu mais pour un domaine? Y a-t-il un concept de “token de domaine” caché?
Il faut d’abord récupérer le domaine, puis faire un core.getCalendar().findEntityCalendars(token, entityId); avec entityId = domaine.getEntityId()
Il faut créer l’agenda dans le domaine puis core.getCalendar().importICS(token, ics, calendarId); avec calendarId = l’id de l’agenda crée (agenda.getId())
C’est à dire? Le domaine (objet de type domaine) ne permet pas de créer un agenda et core.getCalendar() n’a pas l’air de vouloir créer un “agenda” de domaine
Il faudrait utiliser un agenda créé avec un utilisateur quelconque (admin par exemple) dans le domaine?
[quote=Jerome]Merci de cette réponse rapide!
C’est à dire? Le domaine (objet de type domaine) ne permet pas de créer un agenda et core.getCalendar() n’a pas l’air de vouloir créer un “agenda” de domaine
Il faudrait utiliser un agenda créé avec un utilisateur quelconque (admin par exemple) dans le domaine?[/quote]
La création d’agenda se fait avec l’objet CalendarInfo.
Par exemple:
Domain d = le domaine qui va bien.
CalendarInfo ci = new CalendarInfo();
ci.setLabel(“Mon agenda de domain”);
ci.setDefault(false);
ci.setLinkedEntity(d.getEntityId());
ci.setDomainId(d.getId());
Les premières erreurs arrivent… J’ai donc créé et importé mon planning, en lui donnant comme AccesToken “Admin0@global.virt”.
Suite à cet import marqué réussi (mais qui ne me donne pas d’entrées lors de la visualisation), j’ai une erreur lors du clic sur “Enregistrer” dans les paramètres du domaine avec le compte admin de ce domaine. Voici une trace
2013-07-03 16:15:41,790 n.b.c.h.h.SystemBindingImpl ERROR - Domain admin can’t update last update date
2013-07-03 16:15:41,797 n.b.c.s.SyncServlet ERROR - sending ServerFault: Domain admin can’t update last update date
net.bluemind.core.api.fault.ServerFault: Domain admin can’t update last update date
at net.bluemind.core.sanity.AbstractChecker.unchanged(AbstractChecker.java:137) ~[na:na]
at net.bluemind.system.ldap.importation.ui.LdapDomainSC.domainAdminChecks(LdapDomainSC.java:101) ~[na:na]
at net.bluemind.system.ldap.importation.ui.LdapDomainSC.preUpdateCheck(LdapDomainSC.java:76) ~[na:na]
at net.bluemind.core.handler.host.SystemSanityCheckHome.checkDomainCanBeUpdated(SystemSanityCheckHome.java:371) ~[na:na]
at net.bluemind.core.handler.host.SystemBindingImpl.update(SystemBindingImpl.java:441) ~[na:na]
at net.bluemind.core.handler.host.SystemHandler$18.execute(SystemHandler.java:349) ~[na:na]
at net.bluemind.core.server.SecureMethod.execute(SecureMethod.java:54) ~[na:na]
at net.bluemind.core.server.AbstractSyncHandler.handle(AbstractSyncHandler.java:94) ~[na:na]
at net.bluemind.core.server.SyncServlet.handleQuery(SyncServlet.java:139) ~[na:na]
at net.bluemind.core.server.SyncServlet.service(SyncServlet.java:98) ~[na:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [javax.servlet_2.5.0.v201103041518.jar:na]
at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180) [org.eclipse.equinox.http.registry_1.1.100.v20110502.jar:na]
at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61) [org.eclipse.equinox.http.servlet_1.1.200.v20110502.jar:na]
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126) [org.eclipse.equinox.http.servlet_1.1.200.v20110502.jar:na]
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:68) [org.eclipse.equinox.http.servlet_1.1.200.v20110502.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [javax.servlet_2.5.0.v201103041518.jar:na]
at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:317) [org.eclipse.equinox.http.jetty_2.0.100.v20110502.jar:na]
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.Server.handle(Server.java:326) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:939) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) [org.mortbay.jetty.server_6.1.23.v201012071420.jar:na]
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) [org.mortbay.jetty.util_6.1.23.v201012071420.jar:na]
2013-07-03 16:15:46,201 n.b.c.s.SyncServlet INFO - handler responded to calendar/getPendingEventCount in 8ms.
EDIT: Bonne nouvelle quand même, après import du planning avec le token admin@mondomaine, le planning est bien importé et partagé pour tous mes utilisateurs !
Toujours l’erreur lors de l’appui sur Enregistrer en admin@mondomaine lors de l’édition du domaine par contre
[quote=Jerome][quote=david][quote=Jerome]
Toujours l’erreur lors de l’appui sur Enregistrer en admin@mondomaine lors de l’édition du domaine par contre[/quote]
Vous avez activé l’import LDAP ?[/quote]
Oui, cela pourrait-il avoir une incidence?
Je suis en train d’essayer de me créer une CustomProperty pour le domaine en cours, de façon à pouvoir l’utiliser dans le Job.
J’ai donc créé une classe qui implémente ICustomPropertyRequirements avec cette fameuse CustomProperty dedans (même schéma que LDAPImportationPropertyRequirements) et j’essaye d’utiliser cette propriété dans ma tâche planifiée.
J’ai juste un soucis : quand je redémarre le core, la valeur cp.getDefaultValue() passe à “null” au lieu de me conserver la valeur précédente? Qu’ai-je oublié?
Le code pertinent :
Au passage, n’y a-t-il qu’un concept de “DefaultValue” ? J’ai cru lire quelque part qu’on pouvait assigner une “value” à une CustomProperty mais je n’ai pas trouvé comment faire.
Petite question rapide sur une ligne de la synchro ldap qui m’a fait réagir : est-ce utile une fois qu’on a ajouté des calendriers de domaines d’ajouter cette ligne ?
Après quelques tests elle ne semble pas changer grand chose…
Merci bien!
Non pas du tout. Cette ligne sert à mettre à jour le domaine et ses CustomProperty.
Dans le cadre de l’import LDAP, je pense qu’elle se situe à la fin, en cas de succès, pour enregistrer la nouvelle date de dernière synchronisation.
Je souhaiterai essayer de reproduire une des fonctions graphiques dans mon plugin : importer un calendrier de domaine qui ne soit accessible qu’à un utilisateur particulier.
Concrètement quand on est en graphique, cela revient à aller dans Domaine → Calendriers, cliquer sur “partage” pour un calendrier, décocher le partage public, ajouter le login de l’utilisateur dans le partage et mettre l’option : “Peut modifier mes rendez-vous en gérer mes partages”.
Maintenant en “plugin” ça devient plus compliqué L’objet “CalendarInfo” ne semble pas avoir de propriété sur les “share” ou le fait que le calendrier soit public.
Sauf s’il faut pour reproduire ces choses en graphique faire :
ci.setOwnetId(l’utilisateur)
puis ajouter les Manageable, Writable, Readable sur le CalendarInfo ?
Si c’est le cas, le partage public sera toujours activé, non?
Je souhaiterai essayer de reproduire une des fonctions graphiques dans mon plugin : importer un calendrier de domaine qui ne soit accessible qu’à un utilisateur particulier.
Concrètement quand on est en graphique, cela revient à aller dans Domaine → Calendriers, cliquer sur “partage” pour un calendrier, décocher le partage public, ajouter le login de l’utilisateur dans le partage et mettre l’option : “Peut modifier mes rendez-vous en gérer mes partages”.
Maintenant en “plugin” ça devient plus compliqué L’objet “CalendarInfo” ne semble pas avoir de propriété sur les “share” ou le fait que le calendrier soit public.
Sauf s’il faut pour reproduire ces choses en graphique faire :
ci.setOwnetId(l’utilisateur)
puis ajouter les Manageable, Writable, Readable sur le CalendarInfo ?
Si c’est le cas, le partage public sera toujours activé, non?
Merci de votre aide![/quote]
Bonjour,
Pour partager un calendrier, il faut jouer avec les ACLs.
AccessToken superman = … // admin0
CalendarInfo ci = … // Le calendrier
User u = … // L’utilisateur
Rights r = new Rights();
r.setAccess(1);
r.setRead(1);
r.setWrite(1);
r.setAdmin(1);
// ou Right r = new Rights(1, 1, 1, 1);
core.getAcl().setConsumerRights(superman, “user”, u.getId(), “calendar”, ci.getId(), r); // donne les droits d’admin à l’utilisateur u pour le calendrier ci
core.getAcl().setConsumerRights(superman, “public”, null, “calendar”, ci.getId(), r); // donne les droits d’admin à tout le monde pour le calendrier ci