Author: bpoussin Date: 2012-01-03 17:10:28 +0100 (Tue, 03 Jan 2012) New Revision: 1277 Url: http://nuiton.org/repositories/revision/wikitty/1277 Log: documentation de l'API query fini relecture de toute la documentation quelques modifs de code suite a la relecture de la doc - parser de query ignore la case des OR, AND, NOT, TO, IN, SELECT, WHERE Added: trunk/src/site/rst/devel/ trunk/src/site/rst/devel/Spec.rst Removed: trunk/src/site/en/rst/changes.rst trunk/src/site/rst/Spec.rst trunk/src/site/rst/changes.rst trunk/src/site/rst/todo.rst Modified: trunk/src/site/rst/features.rst trunk/src/site/rst/fonctionnement.rst trunk/src/site/rst/index.rst trunk/src/site/rst/user/faq.rst trunk/src/site/rst/user/generation.rst.vm trunk/src/site/rst/user/hessian.rst trunk/src/site/rst/user/migration.rst trunk/src/site/rst/user/query.rst trunk/src/site/rst/user/security.rst trunk/src/site/site_en.xml trunk/src/site/site_fr.xml trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java Deleted: trunk/src/site/en/rst/changes.rst =================================================================== --- trunk/src/site/en/rst/changes.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/en/rst/changes.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -1,38 +0,0 @@ -.. - -.. * #%L -.. * Wikitty -.. * -.. * $Id$ -.. * $HeadURL$ -.. * %% -.. * Copyright (C) 2009 - 2010 CodeLutin -.. * %% -.. * This program is free software: you can redistribute it and/or modify -.. * it under the terms of the GNU Lesser General Public License as -.. * published by the Free Software Foundation, either version 3 of the -.. * License, or (at your option) any later version. -.. * -.. * This program is distributed in the hope that it will be useful, -.. * but WITHOUT ANY WARRANTY; without even the implied warranty of -.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.. * GNU General Lesser Public License for more details. -.. * -.. * You should have received a copy of the GNU General Lesser Public -.. * License along with this program. If not, see -.. * <http://www.gnu.org/licenses/lgpl-3.0.html>. -.. * #L% -.. - -Changes -======= - -TreeNode --------- - -Since 2.2, attribute "children" in tree node has been renamed to "attachment" -du to confusion between attached wikitty and sub node children. - -TreeNode extension version has been increased to ``2.0``. - -You will need to migrate_ your wikitties. - -.. _migrate: migration.html \ No newline at end of file Deleted: trunk/src/site/rst/Spec.rst =================================================================== --- trunk/src/site/rst/Spec.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/Spec.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -1,167 +0,0 @@ -.. - -.. * #%L -.. * Wikitty -.. * -.. * $Id$ -.. * $HeadURL$ -.. * %% -.. * Copyright (C) 2009 - 2010 CodeLutin -.. * %% -.. * This program is free software: you can redistribute it and/or modify -.. * it under the terms of the GNU Lesser General Public License as -.. * published by the Free Software Foundation, either version 3 of the -.. * License, or (at your option) any later version. -.. * -.. * This program is distributed in the hope that it will be useful, -.. * but WITHOUT ANY WARRANTY; without even the implied warranty of -.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.. * GNU General Lesser Public License for more details. -.. * -.. * You should have received a copy of the GNU General Lesser Public -.. * License along with this program. If not, see -.. * <http://www.gnu.org/licenses/lgpl-3.0.html>. -.. * #L% -.. - - -Ce document est fait pour contenir toutes les normalisations autour de Wikitty - -Identifiant des wikitties -========================= - -Les identifiants sont de la forme UUID[_<specifique extension>]. Donc tous les -identifiants commencent par un UUID et peuvent être séparé d'une extension -spécifique pour certains besoins par un '_' (underscore). - -C'est le mécanisme de base de génération des wikitty-id. Il y a toutefois -des exceptions : -* Pour les méta-extensions : chacun des wikitties aura pour -identifiant par exemple « WikittySecurity:MonExtension ». -Cela permet de court-cuircuiter la recherche solR, et un passage par -le réseau à chaque store/restore. - -Un wikitty en base a toujours un identifiant, dès instanciation. - -WikittyServiceNotifier -====================== - -Tous les évènements passant par le WikittyServiceNotifier sont envoyé au -RemoteNotifier s'il est indiqué, dans la configuratio,n qu'il faut propager les -évènements (wikitty.service.event.propagateEvent). Il faut alors dans ce cas -définir le transporter à utiliser (wikitty.notifier.transporter.class). - -Le transporter sert à envoyer(serveur) et recevoir(client) les évènements. Le -même transporter doit être utilisé pour le client et le serveur. - -Il existe aujourd'hui deux types de transporter différents (jgroups, xmpp). -L'implantation jgroups pose quelque soucis (ne fonctionne pas toujours). Il -est donc préférable d'utiliser le transporter xmpp. - -Il est bien sûr possible d'empiler deux couches de WikittyServiceNotifier -avec des transporters différents coté serveur pour permettre à différents -types de client de fonctionner en même temps (FIXME poussin 20101115 il n'est -pas actuellement possible de configurer ce fonctionnement) - -Pour utiliser le transporter xmpp il faut que vous ayez un serveur xmpp avec -une room acceptant le login anonyme. Pour cette fonctionnalité, il n'y a pas -besoin que la room soit archivée. - -Synchronisation de serveur -========================== - -On peut avoir besoin d'avoir deux serveurs qui soit synchronisé. -Actuellement il n'existe que du maitre/esclave. - -Pour mettre en place la synchronisation il faut que le serveur maitre -utilise la couche de notification avec le transporter xmpp. Il faut que la -room xmpp soit archivée. - -Pour que la synchornisation fonctionne il faut: -- garantir que tous les events soient bien envoyés -- garantir que tous les events soitent bien reçus - -et ceci même si le serveur xmpp s'arrête ou que le client s'arrête. Si le -serveur s'arrête plus aucun event ne sera produit. Il faut seulement -garantir que lorsqu'un event à été enregistrer sur le serveur il sera bien -envoyé aux clients. - -Lorsque le serveur envoie un event, il lui fixe un numero d'ordre qu'il -stocke et qu'il incrémentera et réutilisera pour l'envoi suivant. - -Lorsque le client réceptionne l'event, il vérifie qu'il n'y a pas de rupture -dans la séquence des numeros d'envois. Si c'est le cas, il doit récupérer -les numeros manquants. (il redemande l'historique des messages pour les N -messages qui lui manque) - -A intervale régulier il enregistre un fichier de synchro contenant, la date du serveur -(il lui demande via le protocole xmpp) et le numero (+id?) du dernier event -reçu. Ce fichier n'est enregistré que si on est bien à jour dans les données -reçu (pas de rupture détectée dans la sequence des events). - -Lorsque le client démarera pour la 1ère fois, il faut que la base de données -ait été remplie manuellement, son indexe recréer, et le fichier de synchro -créé convenablement. - -Lorsque le client redémarre après un arrêt, il redemande l'historique depuis -la date du fichier de synchro. - -Le numéro unique d'event est généré par la couche de persistance et stocké -sur le serveur en même temps que les données. - - -Deux types de client: -- volatile: ceux intéressé pour récupérer les events lorsqu'ils sont présent -- persistant: ceux intéressé pour récupérer tous les events même lorsqu'ils sont non dispo (coupure réseau) - -Le client ouvre un socket et le serveur laisse la connexion ouverte pour pouvoir -envoyer régulièrement les infos de notification. -Si un client volatile disparait (impossible de lui envoyer l'info), on -l'enleve de la liste des clients a prevenir -Si un client persistant disparait, on met dans une file toutes les -notifications qu'on a pas pu lui envoyer et on lui renvera tout ce qu'il a -manqué lorsqu'il sera de retour. (utile pour la synchro serveur) - -Localisation -============ - -Il s'agit de traduire les noms de champs et pas les valeurs.On rajoute une méta-extension WikittyI18n aux extensions du wikitty. - -Cette pseudo-extension a deux champs : -* language String -* translation String - -personne:wikittyI18n.language=fr,en,es -personne:wikittyI18n.translation=[fr:name=prénom,surname=nom],[en:name=name,surname=surname] -personne.name=value - -ton extension : security des champs de sécurité -ton extension : i18n des champs i18n -ton extension.champs=valeur dans la langue - -un wikitty ne peut exister que dans une langue à la fois, si tu veux plusieurs langues, -tu charges plusieurs fois le wikitty. - -du coup ton wikitty a une version et une langue. -On stocke dans la définition de l'extension chargée la langue dans laquelle elle a été chargée. -si pas de i18n, du coup c'est la langue par défaut à chaque fois. - -Au moins les writers peuvent créer une nouvelle langue. - -pas de sécurité par langue, trop le bordel ! - -il serait agréable que seules les extensions demandées soient chargées. - -dans les restore il faut ajouter (extensions, id, + préchargement d'extensions) - -attention au moment de la migration -au moment du chargement - - - - -On ajoute WikittyService#allowTranslation(token, extension, boolean) - - -Pseudo extension -================ - -migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null. Deleted: trunk/src/site/rst/changes.rst =================================================================== --- trunk/src/site/rst/changes.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/changes.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -1,37 +0,0 @@ -.. - -.. * #%L -.. * Wikitty -.. * -.. * $Id$ -.. * $HeadURL$ -.. * %% -.. * Copyright (C) 2009 - 2010 CodeLutin -.. * %% -.. * This program is free software: you can redistribute it and/or modify -.. * it under the terms of the GNU Lesser General Public License as -.. * published by the Free Software Foundation, either version 3 of the -.. * License, or (at your option) any later version. -.. * -.. * This program is distributed in the hope that it will be useful, -.. * but WITHOUT ANY WARRANTY; without even the implied warranty of -.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.. * GNU General Lesser Public License for more details. -.. * -.. * You should have received a copy of the GNU General Lesser Public -.. * License along with this program. If not, see -.. * <http://www.gnu.org/licenses/lgpl-3.0.html>. -.. * #L% -.. - -Changements -=========== - -TreeNode --------- - -Depuis la version 2.2, l'attribut "children" des TreeNode a été renommé en -"attachment" pour éviter la confusion entre les wikitty attachés à un noeud et -les noeuds fils. - -Vous aurez besoin de migrer_ vos Wikitty. - -.. _migrer: migration.html \ No newline at end of file Added: trunk/src/site/rst/devel/Spec.rst =================================================================== --- trunk/src/site/rst/devel/Spec.rst (rev 0) +++ trunk/src/site/rst/devel/Spec.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -0,0 +1,167 @@ +.. - +.. * #%L +.. * Wikitty +.. * +.. * $Id: Spec.rst 1136 2011-08-12 14:24:03Z tchemit $ +.. * $HeadURL: http://svn.nuiton.org/svn/wikitty/trunk/src/site/rst/Spec.rst $ +.. * %% +.. * Copyright (C) 2009 - 2010 CodeLutin +.. * %% +.. * This program is free software: you can redistribute it and/or modify +.. * it under the terms of the GNU Lesser General Public License as +.. * published by the Free Software Foundation, either version 3 of the +.. * License, or (at your option) any later version. +.. * +.. * This program is distributed in the hope that it will be useful, +.. * but WITHOUT ANY WARRANTY; without even the implied warranty of +.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.. * GNU General Lesser Public License for more details. +.. * +.. * You should have received a copy of the GNU General Lesser Public +.. * License along with this program. If not, see +.. * <http://www.gnu.org/licenses/lgpl-3.0.html>. +.. * #L% +.. - + +Ce document est fait pour contenir toutes les normalisations autour de Wikitty + +Identifiant des wikitties +========================= + +Les identifiants sont de la forme UUID[_<specifique extension>]. Donc tous les +identifiants commencent par un UUID et peuvent être séparé d'une extension +spécifique pour certains besoins par un '_' (underscore). + +C'est le mécanisme de base de génération des wikitty-id. Il y a toutefois +des exceptions : +* Pour les méta-extensions : chacun des wikitties aura pour +identifiant par exemple « WikittySecurity:MonExtension ». +Cela permet de court-cuircuiter la recherche solR, et un passage par +le réseau à chaque store/restore. + +Un wikitty en base a toujours un identifiant, dès instanciation. + +WikittyServiceNotifier +====================== + +Tous les évènements passant par le WikittyServiceNotifier sont envoyé au +RemoteNotifier s'il est indiqué dans la configuration, qu'il faut propager les +évènements (wikitty.service.event.propagateEvent). Il faut alors dans ce cas +définir le transporter à utiliser (wikitty.notifier.transporter.class). + +Le transporter sert à envoyer(serveur) et recevoir(client) les évènements. Le +même transporter doit être utilisé pour le client et le serveur. + +Il existe aujourd'hui deux types de transporter différents (jgroups, xmpp). +L'implantation jgroups pose quelque soucis (ne fonctionne pas toujours). Il +est donc préférable d'utiliser le transporter xmpp. + +Il est bien sûr possible d'empiler deux couches de WikittyServiceNotifier +avec des transporters différents coté serveur pour permettre à différents +types de client de fonctionner en même temps (FIXME poussin 20101115 il n'est +pas actuellement possible de configurer ce fonctionnement) + +Pour utiliser le transporter xmpp il faut que vous ayez un serveur xmpp avec +une room acceptant le login anonyme. Pour cette fonctionnalité, il n'y a pas +besoin que la room soit archivée. + +Synchronisation de serveur +========================== + +On peut avoir besoin d'avoir deux serveurs qui soit synchronisé. +Actuellement il n'existe que du maitre/esclave. + +Pour mettre en place la synchronisation il faut que le serveur maitre +utilise la couche de notification avec le transporter xmpp. Il faut que la +room xmpp soit archivée. + +Pour que la synchornisation fonctionne il faut: +- garantir que tous les events soient bien envoyés +- garantir que tous les events soitent bien reçus + +et ceci même si le serveur xmpp s'arrête ou que le client s'arrête. Si le +serveur s'arrête plus aucun event ne sera produit. Il faut seulement +garantir que lorsqu'un event à été enregistrer sur le serveur il sera bien +envoyé aux clients. + +Lorsque le serveur envoie un event, il lui fixe un numero d'ordre qu'il +stocke et qu'il incrémentera et réutilisera pour l'envoi suivant. + +Lorsque le client réceptionne l'event, il vérifie qu'il n'y a pas de rupture +dans la séquence des numeros d'envois. Si c'est le cas, il doit récupérer +les numeros manquants. (il redemande l'historique des messages pour les N +messages qui lui manque) + +A intervale régulier il enregistre un fichier de synchro contenant, la date du serveur +(il lui demande via le protocole xmpp) et le numero (+id?) du dernier event +reçu. Ce fichier n'est enregistré que si on est bien à jour dans les données +reçu (pas de rupture détectée dans la sequence des events). + +Lorsque le client démarera pour la 1ère fois, il faut que la base de données +ait été remplie manuellement, son indexe recréer, et le fichier de synchro +créé convenablement. + +Lorsque le client redémarre après un arrêt, il redemande l'historique depuis +la date du fichier de synchro. + +Le numéro unique d'event est généré par la couche de persistance et stocké +sur le serveur en même temps que les données. + + +Deux types de client: +- volatile: ceux intéressé pour récupérer les events lorsqu'ils sont présent +- persistant: ceux intéressé pour récupérer tous les events même lorsqu'ils sont non dispo (coupure réseau) + +Le client ouvre un socket et le serveur laisse la connexion ouverte pour pouvoir +envoyer régulièrement les infos de notification. +Si un client volatile disparait (impossible de lui envoyer l'info), on +l'enleve de la liste des clients a prevenir +Si un client persistant disparait, on met dans une file toutes les +notifications qu'on a pas pu lui envoyer et on lui renvera tout ce qu'il a +manqué lorsqu'il sera de retour. (utile pour la synchro serveur) + +Localisation +============ + +Il s'agit de traduire les noms de champs et pas les valeurs.On rajoute une méta-extension WikittyI18n aux extensions du wikitty. + +Cette pseudo-extension a deux champs : +* language String +* translation String + +personne:wikittyI18n.language=fr,en,es +personne:wikittyI18n.translation=[fr:name=prénom,surname=nom],[en:name=name,surname=surname] +personne.name=value + +ton extension : security des champs de sécurité +ton extension : i18n des champs i18n +ton extension.champs=valeur dans la langue + +un wikitty ne peut exister que dans une langue à la fois, si tu veux plusieurs langues, +tu charges plusieurs fois le wikitty. + +du coup ton wikitty a une version et une langue. +On stocke dans la définition de l'extension chargée la langue dans laquelle elle a été chargée. +si pas de i18n, du coup c'est la langue par défaut à chaque fois. + +Au moins les writers peuvent créer une nouvelle langue. + +pas de sécurité par langue, trop le bordel ! + +il serait agréable que seules les extensions demandées soient chargées. + +dans les restore il faut ajouter (extensions, id, + préchargement d'extensions) + +attention au moment de la migration +au moment du chargement + + + + +On ajoute WikittyService#allowTranslation(token, extension, boolean) + + +Pseudo extension +================ + +migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null. Modified: trunk/src/site/rst/features.rst =================================================================== --- trunk/src/site/rst/features.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/features.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -43,25 +43,24 @@ Wikitty fournit un système de gestion des droits en lecture et en écriture pour les entitées. Vous pouvez aller jusqu'à limiter l'accès à certains objet d'un type à certains utilisateurs. Vous pouvez également accorder des droits -différents à certains champs des objets. +différents à certains groupes de champs des objets (sécurité au niveau des extensions). Prenons par example un objet Employe. Cet objet peut avoir des champs de type salaire,... qui ne sont modifiables que -par les memebres du service RH, mais visibles par l'employé, alors que les +par les membres du service RH, mais visibles par l'employé, alors que les champs adresse par example sont modifiables par l'employé et les membres du service RH. Transactions ~~~~~~~~~~~~ -Wikitty fournit un système de transactions qui embarque une base locale H2 et un -index SolR. A la lecture des données, il recherche dans la base locale puis dans -la base de donnée s'il ne trouve pas la donnée. Lorsqu'il écrit une donnée, il -l'écrit dans la base locale. Au commit de la transaction, toutes les opérations -sont envoyées à la base de donnée Wikitty, si un problème survient (mauvais -droits, ...), la transaction n'est pas enregistrée. Pour les recherches, une -fusion est opérée entre les résultats sur la base locale et ceux sur la -base Wikitty. +Wikitty fournit un système de transactions. A la lecture des données, il +recherche dans la transaction puis dans la base de donnée s'il ne trouve pas la +donnée. Lorsqu'il écrit une donnée, il l'écrit dans la transaction. Au commit de +la transaction, toutes les opérations sont envoyées à la base de donnée Wikitty, +si un problème survient (mauvais droits, ...), la transaction n'est pas +enregistrée. Pour les recherches, une fusion est opérée entre les résultats sur +la transaction et ceux sur la base Wikitty. Notifications ~~~~~~~~~~~~~ Modified: trunk/src/site/rst/fonctionnement.rst =================================================================== --- trunk/src/site/rst/fonctionnement.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/fonctionnement.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -64,8 +64,8 @@ Le coeur de Wikitty apporte les services de base: - génération de Bean métier pour une utilisation simple par le développeur -- une classe WikittyProxy qui masque les objets Wikitty et manipule les Bean - métier généré +- une classe WikittyClient qui masque les objets Wikitty et manipule les Bean + métier généré et offre tout un ensemble de service complémentaire. - Création, sauvegarde, restoration des Entités - Recherche des entités (fulltext, facette, ...) - notion d'arbre @@ -98,22 +98,22 @@ Les nouveaux services (cache, securité, notification, ...) s'intercale en couche au dessus du coeur pour founir les services. -Le coeur delegue le travail à trois services qui peuvent être implanté avec +Le coeur délègue le travail à trois services qui peuvent être implanté avec des techologies différentes: -- stockage des extensions (memoire, jdbc, hbase, jpa, ...) -- stockage des données (memoire, jdbc, hbase, jpa, ...) -- indexation et recherche (memoire, SolR, ...) +- stockage des extensions (mémoire, jdbc, hbase, jpa, ...) +- stockage des données (mémoire, jdbc, hbase, jpa, ...) +- indexation et recherche (mémoire, SolR, ...) Il est donc possible d'ajouter de nouveau service de haut niveau, ou d'ajouter de nouvelle façon de stocker l'information. -Pour certain besoin il n'y a pas besoin d'implanter une nouvelle +Pour certain besoin il n'y a pas d'obligation d'implanter une nouvelle chouche (WikittyService). On parle alors de AddOn. C'est addon travail directement grace à l'API WikittyService, c'est le cas par exemple de l'import/export. -La partie cliente des applications ne travail qu'avec le WikittyProxy qui +La partie cliente des applications ne travail qu'avec le WikittyClient qui masque la notion d'objet Wikitty pour retourner des beans metiers facilement manipulable par le développeur. Modified: trunk/src/site/rst/index.rst =================================================================== --- trunk/src/site/rst/index.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/index.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -96,7 +96,7 @@ - Migration - Import/Export - Réplication -- Label +- Label/Groupe Pour plus d'informations sur les différentes fonctionnalités, référez-vous à la `page correspondante`_ @@ -154,5 +154,3 @@ .. image:: schemes/multiServerDeployment.png - - Deleted: trunk/src/site/rst/todo.rst =================================================================== --- trunk/src/site/rst/todo.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/todo.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -1,31 +0,0 @@ -.. - -.. * #%L -.. * Wikitty -.. * -.. * $Id$ -.. * $HeadURL$ -.. * %% -.. * Copyright (C) 2009 - 2010 CodeLutin -.. * %% -.. * This program is free software: you can redistribute it and/or modify -.. * it under the terms of the GNU Lesser General Public License as -.. * published by the Free Software Foundation, either version 3 of the -.. * License, or (at your option) any later version. -.. * -.. * This program is distributed in the hope that it will be useful, -.. * but WITHOUT ANY WARRANTY; without even the implied warranty of -.. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.. * GNU General Lesser Public License for more details. -.. * -.. * You should have received a copy of the GNU General Lesser Public -.. * License along with this program. If not, see -.. * <http://www.gnu.org/licenses/lgpl-3.0.html>. -.. * #L% -.. - -TODO -==== - -Code ----- - -- Voir pour changer la WikittyExtension en non-RuntimeException Modified: trunk/src/site/rst/user/faq.rst =================================================================== --- trunk/src/site/rst/user/faq.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/user/faq.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -47,7 +47,7 @@ WikittyGroup privateGroup = getPrivateGroup(); // Récupère l'utilisateur authentifié -WikittyUser user = getLoggedInUser(); +WikittyUser user = wikittyClient.getUser(); // Récupère les membres du privateGroup Set<String> members = privateGroup.getMembers(); Modified: trunk/src/site/rst/user/generation.rst.vm =================================================================== --- trunk/src/site/rst/user/generation.rst.vm 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/user/generation.rst.vm 2012-01-03 16:10:28 UTC (rev 1277) @@ -93,8 +93,8 @@ chaîne de caractère. En fait, dans vos entité Wikitty, un lien vers un autre Wikitty estreprésenté par son identifiant qui est une chaîne de caractères. Ainsi, un getXXXXX vous retournera l'identifiant d'un Wikitty qu'il faudra -récupérer en passant par le proxy. Vous pouvez alors utiliser le cache pour -limiter les appels côté serveur. +récupérer en passant par le WikittyClient. Vous pouvez alors utiliser le cache +pour limiter les appels côté serveur. Subtilités de modélisation ========================== @@ -104,7 +104,7 @@ Il est possible de rajouter une dépendance vers un objet de l'API Wikitty (par example WikittyUser) en rajoutant simplement la classe dans votre modèle dans le -package* org.nuiton.wikitty.api*. Elle ne sera pas générée mais interviendra +package *org.nuiton.wikitty.entities*. Elle ne sera pas générée mais interviendra comme une autre classe de votre modèle (héritage,...). .. image:: wikittyDependency.png Modified: trunk/src/site/rst/user/hessian.rst =================================================================== --- trunk/src/site/rst/user/hessian.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/user/hessian.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -32,7 +32,7 @@ * d'une application war qui, en lisant une configuration, est capable de fournir un service sur n'importe quel type de stockage wikitty - * d'une factory revoyant un proxy sur un service distant + * d'une factory revoyant un proxy hessian sur un service distant Serveur ------- @@ -69,7 +69,7 @@ wikitty.service.cache.listenevents=true # solr configuration - solr.data.dir=/var/lib/myapp/solr + solr.data.dir=/var/local/myapp/solr L'application est ensuite accessible sur l'uri "/wikitty" suivant le contexte de déploiement. Modified: trunk/src/site/rst/user/migration.rst =================================================================== --- trunk/src/site/rst/user/migration.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/user/migration.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -48,11 +48,11 @@ enregistrer toutes les extensions dont votre application a besoin dans leur dernière version:: - store(myExtension); + wikittyClient.storeExtension(myExtension); ou:: - store(myEntityImpl.extensionMyEntity) + wikittyClient.storeExtension(myEntityImpl.extensionMyEntity) Si vous avez des migrations spécifiques à effectuer, ajoutez au registre toutes les migrations spécifiques des extensions:: @@ -62,17 +62,29 @@ Vous pouvez maintenant utiliser vos données simplement, elles seront migrées au chargement. -Si vous voulez migrer vos objets avant de les utiliser (pour des histoires de -requêtes par exemple), pour chaque version, recherchez vos objets, restaurez -les puis enregistrez-les:: +Si vous voulez migrer vos objets avant de les utiliser (pour quelle soit +convenablement indexée par exemple), pour chaque version, recherchez vos objets, +restaurez les puis enregistrez-les:: - search(Client) - restore(Client) - store(Client) + WikittyQueryResult<Client> all = wikittyClient.findAllByExample(new Client()); + wikittyClient.store(all.getAll()); Attention au coût d'une indexation au vu du volume de données, il n'est pas -toujours judicieux de réindexer toutes les données. +toujours judicieux de réindexer toutes les données. Si vous avez beaucoup +d'objet, il est potentiellement judicieux d'utiliser la pagination pour restaurer +les objets par paquet de 1000 par exemple. + int LIMIT = 1000; + int first = 0; + Client example = new Client(); + WikittyQueryResult<Client> all = wikittyClient.findAllByExample(example, first, LIMIT);; + while (all.size() >= LIMIT) { + wikittyClient.store(all.getAll()); + first += LIMIT; + all = wikittyClient.findAllByExample(example, first, LIMIT); + } + wikittyClient.store(all.getAll()); + Migrations spécifiques ====================== Modified: trunk/src/site/rst/user/query.rst =================================================================== --- trunk/src/site/rst/user/query.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/user/query.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -258,7 +258,6 @@ * False : rFalse - retourne toujours faux:: - WikittyQuery q = new WikittyQueryMaker() .rFalse().end(); @@ -277,18 +276,108 @@ * Les noeuds à sous requêtes permettent de faire des requêtes complexes. -* Non : not - Résultat inverse de la sous-requête. +* Non : not - Résultat inverse de la sous-requête. Permet de faire la négation + d'une condition. On ne peut ajouter qu'un condition dans un not, il faut + donc ajouter en premier un or ou un and pour mettre plusieurs condition:: -* Ou : or - Ou entre les différentes sous-requêtes. + WikittyQuery q = new WikittyQueryMaker() + .not().rFalse().end(); // condition toujours vrai -* Et : and - Et entre les différentes sous-requêtes. + WikittyQuery q = WikittyQueryParser.parse("NOT(FALSE)"); -* Requête associée : in - Permet d'effectuer des jointures. + WikittyQuery q = new WikittyQueryMaker() + .not().or().rFalse().rFalse().rTrue().end(); // condition toujours fausse + WikittyQuery q = WikittyQueryParser.parse("NOT(FALSE OR FALSE OR TRUE)"); + +* Ou : or - Ou entre les différentes sous-requêtes. On peut ajouter autant + d'élément dans le or que l'on souhaite, en fait les éléments lui sont ajouté + tant qu'il n'est pas fermé (close). + + WikittyQuery q = new WikittyQueryMaker() + .or().rFalse().rTrue().rFalse().end(); // condition toujours vrai + + WikittyQuery q = WikittyQueryParser.parse("FALSE OR TRUE OR FALSE"); + +* Et : and - Et entre les différentes sous-requêtes. On peut ajouter autant + d'élément dans le and que l'on souhaite, en fait les éléments lui sont ajouté + tant qu'il n'est pas fermé (close). + + WikittyQuery q = new WikittyQueryMaker() + .and().rFalse().rTrue().rTrue().end(); // condition toujours fausse + + WikittyQuery q = WikittyQueryParser.parse("FALSE AND TRUE AND TRUE"); + WikittyQuery q = WikittyQueryParser.parse("FALSE TRUE TRUE"); + +* Requête associée : in - Permet d'effectuer des jointures. Cette opérateur lie + deux requêtes entres elle. Le résultat d'un requête est utilisé comme un + containsOne dans l'autre. La requête suivante recherche tous les employers + en CDI, mais seulement ceux dont le nom de leur entreprise contient 'lutin'.:: + + WikittyQuery q = new WikittyQueryMaker() + and() + .eq("Employee.contract", "CDI") + .in("Employee.company").like("Company.name", "*Lutin*").end(); + + WikittyQuery q = WikittyQueryParser.parse( + "Employee.contract=CDI AND Employee.company in (Company.name LIKE *Lutin*)"); + * Selection : select - Ajout d'un select pour définir le champs à retourner au - lieu de l'id + lieu de l'id. Le select doit toujours être le premier élément de la condition + ou du in. Dans l'exemple suivant au lieu de retourner l'id des employés + en CDI, on retourne leur nom. Si deux personnes avait le même nom, ce nom + ne serait retourné qu'une seul fois.:: + WikittyQuery q = new WikittyQueryMaker() + select("Employee.name").eq("Employee.contract", "CDI").end(); + WikittyQuery q = WikittyQueryParser.parse( + "SELECT Employee.name WHERE Employee.contract=CDI"); + + Il est possible de coupler le select et le in, par exemple pour recherche + toutes les personnes nés le même jour qu'un évênement qui a eu lieu en france:: + + WikittyQuery q = new WikittyQueryMaker() + .in("Person.birthday") + .select("Event.date").like("Event.country", "france").end(); + + WikittyQuery q = WikittyQueryParser.parse( + "Person.birthday IN (SELECT Event.date WHERE Event.country LIKE france)"); + +Spécificité de WikittyQueryMaker +-------------------------------- + +* Fermeture d'un noeud: close. Lorsqu'on ouvre un element a sous noeud comme + or, and, not, in, select, il faut pouvoir le fermer pour continuer la + construction de la condition. Pour cela on utilise close(), qui ferme la + derniere condition non terminal.:: + + WikittyQuery q = new WikittyQueryMaker() + .and().or()....close(/*fermeture du or*/).close(/*fermeture du or*/) + .not().and().....end(/*fermeture de tous les elements non ferme (and, not)*/); + +* conversion de type: Il est possible de passer en argument des méthodes des + objets qui seront directement converti en leur representation String. Les + types supportés sont BusinessEntity, Wikitty, Date, Calendar, Number, Boolean. + Pour un objet Wikitty ou un BusinessEntity on utilise l'id. + +* wikitty: Normalement si l'on passe un wikitty en parametre de méthode + de WikittyQueryMaker, la condition se fait sur l'id, mais on peut vouloir + que le Wikitty soit pris comme exemple de condition (query by exemple) + Dans ce cas, on peut utiliser:: + + WikittyQuery q = new WikittyQueryMaker() + .wikitty(monWikitty).end(); + +* Condition: Il est aussi possible d'ajouter toutes une condition déjà + construite pour l'intégrer à une nouvelle. Dans ce cas cette condition est + prise comme une boîte noir, c'est dire comme une condition terminal.:: + + WikittyQuery qold = ... + + WikittyQuery q = new WikittyQueryMaker() + .and().condition(qold).eq(...).end(); + Recherche avancée ----------------- @@ -332,23 +421,31 @@ * Nom : name - Nommage de la requêtes. -* Les requêtes permettent d'ajouter un ordre ou des facettes : +* Premier index : first - Permet de définir le premier index à retourner. + Principalement utilisé pour la pagination. -* Premier index : first - Permet de définir le premier index à retourner. Principalement utilisé pour la pagination. +* Nombre : limit - Permet de définir le nombre de résultat à retourner. + Principalement utilisé pour la pagination. -* Nombre : limit - Permet de définir le dernier index à retourner. Principalement utilisé pour la pagination. +* facetMinCount: les topics des facettes ayant moins d'occurence que cette valeur + ne sont pas retournés -* [TODO] facetMinCount +* facetLimit: les facettes ramenent au plus se nombre de topics -* [TODO] facetLimit +* facetSort: determine l'ordre de tri des topics, il est possible de trier sur + le nombre d'occurence du topic ou le nom du topic -* [TODO] facetSort +* facetExtension indique de créer une facette sur les extensions des wikitties -* [TODO] facetExtension +* facetField indique de créer une facette sur un champs -* [TODO] facetField +* facetQuery indique de créer une facette grace a une condition. Par exemple au + lieu de creer une facette sur Product.price qui retournerait trop de topics + il est préférable de créer plusieur facetQuery pour regrouper des prix:: -* [TODO] facetQuery + query.addFacetQuery("0-5", new WikittyQueryMaker().bw("Product.price", 0, 5)); + query.addFacetQuery("5-10", new WikittyQueryMaker().bw("Product.price", 5, 10)); + query.addFacetQuery("10-+", new WikittyQueryMaker().gt("Product.price", 10)); * Tri : sortAscending - Ajout d'un ou plusieurs champs pour le tri ascendant du résultat. Modified: trunk/src/site/rst/user/security.rst =================================================================== --- trunk/src/site/rst/user/security.rst 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/rst/user/security.rst 2012-01-03 16:10:28 UTC (rev 1277) @@ -44,6 +44,30 @@ Cela rajoute la couche de sécurité à Wikitty. Vous pouvez maintenant rajouter des droits à certaines entitées pour en limiter l'accès. +Si vous souhaitez utiliser le module de cache en même temps que le module +de sécurité, cela implique une bonne utilisation et de faire attention à certaine +chose. Il faut faire attention qu'un utilisateur qui a récupéré un objet ne le +rende pas disponible à un autre utilisateur au travers du cache. +Il faut donc que la couche de sécurité soit toujours au dessus de la couche de +cache. + +De la même façon, si l'on a mis du cache côté client dans certain cas, il faudra +aussi remettre la couche de sécurité. Cela arrive si le côté client est +multi-utilisateur. Si ce n'est pas le cas, il n'est pas nécessaire de le faire. + +:: + + +--------------+ +--------------+ + WClient ----->| sécurité |<----+ | sécurité |<------ WClient + +--------------+ | +--------------+ + | cache | | | cache | + +--------------+ | +--------------+ + | notification | | | notification | + +--------------+ | +--------------+ + | WS Impl | +----| WS Hessian | + +--------------+ +--------------+ + serveur client + Utilisateurs et groupes ----------------------- Modified: trunk/src/site/site_en.xml =================================================================== --- trunk/src/site/site_en.xml 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/site_en.xml 2012-01-03 16:10:28 UTC (rev 1277) @@ -48,7 +48,8 @@ <menu name="Overview"> <item name="Home" href="index.html"/> - <item name="Changes" href="changes.html"/> + <item name="Changes" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[]=2&tracker_ids[]=4&completed=1"/> + <item name="Download" href="http://nuiton.org/projects/wikitty/files"/> </menu> <menu name="User"> @@ -57,12 +58,8 @@ </menu> <menu name="Developer"> - <item name="Todo" href="todo.html"/> - </menu> - - <menu name="Community"> + <item name="Todo" href="http://www.nuiton.org/projects/wikitty/roadmap"/> <item name="Bug tracker" href="http://nuiton.org/projects/wikitty/issues"/> - <item name="Download" href="http://nuiton.org/projects/wikitty/files"/> <item name="SVN Repository" href="http://svn.nuiton.org/svn/wikitty/"/> <item name="Continuous Integration" href="http://hudson.nuiton.org/hudson/job/wikitty/"/> <item name="Sonar analysis" href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/> Modified: trunk/src/site/site_fr.xml =================================================================== --- trunk/src/site/site_fr.xml 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/src/site/site_fr.xml 2012-01-03 16:10:28 UTC (rev 1277) @@ -48,10 +48,10 @@ <menu name="Overview"> <item name="Accueil" href="index.html"/> - <item name="Fonctionnement" href="fonctionnement.html"/> <item name="Fonctionnalités" href="features.html"/> - <item name="Changements" href="changes.html"/> - <item name="Spécifications" href="Spec.html"/> + <item name="Fonctionnement" href="fonctionnement.html"/> + <item name="Changements" href="http://www.nuiton.org/projects/wikitty/roadmap?tracker_ids[]=1&tracker_ids[]=2&tracker_ids[]=4&completed=1"/> + <item name="Téléchargement" href="http://nuiton.org/projects/wikitty/files"/> </menu> <menu name="Utilisateur"> @@ -59,27 +59,19 @@ <item name="Migration" href="user/migration.html"/> <item name="Hessian" href="user/hessian.html"/> <item name="Sécurité" href="user/security.html"/> - <item name="Recherche" href="user/search.html"/> + <item name="Recherche" href="user/query.html"/> <item name="FAQ" href="user/faq.html"/> </menu> <menu name="Developpeur"> - <item name="Todo" href="todo.html"/> + <item name="Spécifications" href="devel/Spec.html"/> + <item name="Todo" href="http://www.nuiton.org/projects/wikitty/roadmap"/> + <item name="Bug tracker" href="http://nuiton.org/projects/wikitty/issues"/> + <item name="Dépot SVN" href="http://svn.nuiton.org/svn/wikitty/"/> + <item name="Intégration continue" href="http://hudson.nuiton.org/hudson/job/wikitty/"/> + <item name="Analyse Sonar" href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/> </menu> - <menu name="Communauté"> - <item name="Bug tracker" - href="http://nuiton.org/projects/wikitty/issues"/> - <item name="Téléchargement" - href="http://nuiton.org/projects/wikitty/files"/> - <item name="Dépot SVN" - href="http://svn.nuiton.org/svn/wikitty/"/> - <item name="Intégration continue" - href="http://hudson.nuiton.org/hudson/job/wikitty/"/> - <item name="Analyse Sonar" - href="http://sonar.nuiton.org/sonar/project/index/org.nuiton:wikitty"/> - </menu> - <menu ref="modules"/> <menu ref="reports"/> Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-03 16:10:28 UTC (rev 1277) @@ -83,9 +83,9 @@ public WikittyClient(ApplicationConfig config) { if (config != null) { long timeToLogInfo = config.getOptionAsInt(WikittyConfigOption. - WIKITTY_PROXY_TIME_TO_LOG_INFO.getKey()); + WIKITTY_CLIENT_TIME_TO_LOG_INFO.getKey()); long timeToLogWarn = config.getOptionAsInt(WikittyConfigOption. - WIKITTY_PROXY_TIME_TO_LOG_WARN.getKey()); + WIKITTY_CLIENT_TIME_TO_LOG_WARN.getKey()); timeLog.setTimeToLogInfo(timeToLogInfo); timeLog.setTimeToLogWarn(timeToLogWarn); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-01-03 16:10:28 UTC (rev 1277) @@ -283,16 +283,28 @@ + " this room must have history activated"), "test@conference.im.codelutin.com", String.class, false, false), + @Deprecated WIKITTY_PROXY_TIME_TO_LOG_INFO( "wikitty.proxy.timeToLog.info", n_("maximum time before send log info with time consumed"), "1000", Integer.class, false, false), + @Deprecated WIKITTY_PROXY_TIME_TO_LOG_WARN( "wikitty.proxy.timeToLog.warn", n_("maximum time before send log warn with time consumed"), "3000", Integer.class, false, false), + WIKITTY_CLIENT_TIME_TO_LOG_INFO( + "wikitty.client.timeToLog.info", + n_("maximum time before send log info with time consumed"), + "1000", + Integer.class, false, false), + WIKITTY_CLIENT_TIME_TO_LOG_WARN( + "wikitty.client.timeToLog.warn", + n_("maximum time before send log warn with time consumed"), + "3000", + Integer.class, false, false), WIKITTY_SECURITY_TIME_TO_LOG_INFO( "wikitty.security.timeToLog.info", n_("maximum time before send log info with time consumed"), Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-02 18:45:36 UTC (rev 1276) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQueryParser.java 2012-01-03 16:10:28 UTC (rev 1277) @@ -93,6 +93,21 @@ public static final String SQUARE_BRACKET_CLOSE = "]"; public static final String SQUARE_BRACKET_OPEN = "["; + public Rule icEXTENSION = IgnoreCase(EXTENSION); + public Rule icID = IgnoreCase(ID); + public Rule icNOT = IgnoreCase(NOT); + public Rule icAND = IgnoreCase(AND); + public Rule icOR = IgnoreCase(OR); + public Rule icSELECT = IgnoreCase(SELECT); + public Rule icWHERE = IgnoreCase(WHERE); + public Rule icIN = IgnoreCase(IN); + public Rule icTO = IgnoreCase(TO); + public Rule icFALSE = IgnoreCase(FALSE); + public Rule icTRUE = IgnoreCase(TRUE); + public Rule icLIKE = IgnoreCase(LIKE); + public Rule icUNLIKE = IgnoreCase(UNLIKE); + public Rule icNULL = IgnoreCase(NULL); + /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(WikittyQueryParser.class); @@ -165,7 +180,7 @@ } Rule or() { - return Sequence(and(), ZeroOrMore(space(), OR, space(), and(), + return Sequence(and(), ZeroOrMore(space(), icOR, space(), and(), push(new Or((Condition)pop(1), (Condition)pop())))); } @@ -173,7 +188,7 @@ return Sequence(term(), ZeroOrMore( // when no AND or OR is used, AND is default // don't change order of FirstOf, this order is important - FirstOf(Sequence(space(), AND, space()), Sequence(space(), TestNot(OR))), + FirstOf(Sequence(space(), icAND, space()), Sequence(space(), TestNot(icOR))), term(), push(new And((Condition)pop(1), (Condition)pop())))); } @@ -196,7 +211,7 @@ } Rule not() { - return Sequence(space(), NOT, space(), term(), + return Sequence(space(), icNOT, space(), term(), push(new Not((Condition)pop()))); } @@ -205,7 +220,7 @@ * @return */ Rule isNull() { - return Sequence(field(), push(match()), space(), EQUALS, space(), IgnoreCase(NULL), + return Sequence(field(), push(match()), space(), EQUALS, space(), icNULL, push(new Null(toElement(pop().toString())))); } @@ -214,7 +229,7 @@ * @return */ Rule isNotNull() { - return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), IgnoreCase(NULL), + return Sequence(field(), push(match()), space(), NOT_EQUALS, space(), icNULL, push(new NotNull(toElement(pop().toString())))); } @@ -253,16 +268,16 @@ push(new GreaterOrEquals(toElement(pop().toString()), removeQuote(match())))); } Rule like() { - return Sequence(field(), push(match()), space(), LIKE, space(), value(), + return Sequence(field(), push(match()), space(), icLIKE, space(), value(), push(new Like(toElement(pop().toString()), removeQuote(match())))); } Rule notlike() { - return Sequence(field(), push(match()), space(), UNLIKE, space(), value(), + return Sequence(field(), push(match()), space(), icUNLIKE, space(), value(), push(new Unlike(toElement(pop().toString()), removeQuote(match())))); } Rule between() { return Sequence(field(), push(match()), space(), EQUALS, space(), SQUARE_BRACKET_OPEN, space(), - value(), push(removeQuote(match())), space(), TO, space(), + value(), push(removeQuote(match())), space(), icTO, space(), value(), push(removeQuote(match())), space(), SQUARE_BRACKET_CLOSE, push(new Between(toElement(pop(2).toString()), pop(1).toString(), pop().toString()))); } @@ -281,11 +296,11 @@ push(new ContainsOne(toElement(pop().toString()), elems.get()))); } Rule in() { - return Sequence(field(), push(match()), space(), IN, space(), term(), + return Sequence(field(), push(match()), space(), icIN, space(), term(), push(new In(toElement(pop(1).toString()), (Condition)pop()))); } Rule select() { - return Sequence(SELECT, space(), field(), push(match()), space(), WHERE, space(), term(), + return Sequence(icSELECT, space(), field(), push(match()), space(), icWHERE, space(), term(), push(new Select(new ElementField(pop(1).toString()), (Condition)pop()))); } Rule keyword() { @@ -297,15 +312,15 @@ } Rule rTrue() { - return Sequence(IgnoreCase(TRUE), push(new True())); + return Sequence(icTRUE, push(new True())); } Rule rFalse() { - return Sequence(IgnoreCase(FALSE), push(new False())); + return Sequence(icFALSE, push(new False())); } Rule value() { - return FirstOf(IgnoreCase(TRUE), IgnoreCase(FALSE), IgnoreCase(NULL), field(), StringLiteral()); + return FirstOf(field(), StringLiteral()); } Rule StringLiteral() {