Wikitty-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- 1653 discussions
r856 - trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication
by mfortun@users.nuiton.org 04 May '11
by mfortun@users.nuiton.org 04 May '11
04 May '11
Author: mfortun
Date: 2011-05-04 12:12:53 +0200 (Wed, 04 May 2011)
New Revision: 856
Url: http://nuiton.org/repositories/revision/wikitty/856
Log:
* String collection can be edited with edit page
Modified:
trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java
Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java
===================================================================
--- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java 2011-05-03 17:55:52 UTC (rev 855)
+++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/ActionEdit.java 2011-05-04 10:12:53 UTC (rev 856)
@@ -27,9 +27,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ApplicationConfig;
+import org.nuiton.util.CollectionUtil;
import org.nuiton.util.StringUtil;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.FieldType.TYPE;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyImpl;
@@ -38,24 +41,25 @@
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.operators.Element;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
- *
+ *
* @author poussin
* @version $Revision$
- *
- * Last update: $Date$
- * by : $Author$
+ *
+ * Last update: $Date$
+ * by : $Author$
*/
public class ActionEdit extends AbstractActionOnWikitty {
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(ActionError.class);
- static final protected String exampleUsage =
- "edit/WikittyPubText.name=Wiki\n"
+ static final protected String exampleUsage = "edit/WikittyPubText.name=Wiki\n"
+ "edit/Tuto\n"
+ "edit/WikittyPubText.name=Tuto\n"
+ "edit/Command.id=df\n";
@@ -70,7 +74,7 @@
public Object doAction(WikittyPublicationContext context) {
String result;
Wikitty w;
-
+
WikittyProxy proxy = context.getWikittyProxy();
if (context.getArguments().containsKey("delete")) {
@@ -78,10 +82,12 @@
// affichera un wikitty vide
String id = context.getArguments().get("id");
proxy.delete(id);
- // apres un effacement on reprend l'edition d'un tout nouveau wikitty
+ // apres un effacement on reprend l'edition d'un tout nouveau
+ // wikitty
w = new WikittyImpl();
} else {
- // recherche du Wikitty a editer ou creation d'un nouveau si necessaire
+ // recherche du Wikitty a editer ou creation d'un nouveau si
+ // necessaire
Criteria criteria = searchCriteria(context.getMandatoryArguments());
if (criteria == null) {
w = new WikittyImpl();
@@ -91,8 +97,10 @@
// si on ne retrouve pas le wikitty, mais qu'il vient d'etre cree
// pour l'edition, on recree un wikitty avec ce meme identifiant
- if (w == null && "0.0".equals(context.getArguments().get("version"))) {
- // c'est un nouvel objet, il n'a pas encore ete sauve, mais on veut le faire
+ if (w == null
+ && "0.0".equals(context.getArguments().get("version"))) {
+ // c'est un nouvel objet, il n'a pas encore ete sauve, mais on
+ // veut le faire
String id = context.getArguments().get("id");
w = new WikittyImpl(id);
}
@@ -109,10 +117,11 @@
// ajout des extensions deja existante si necessaire
String extensions = context.getArgument("extensions", null);
if (extensions != null) {
- String[] exts = StringUtil.split(
- extensions.replace("[", "").replace("]", ""), ",");
+ String[] exts = StringUtil.split(extensions
+ .replace("[", "").replace("]", ""), ",");
for (String extName : exts) {
- WikittyExtension ext = proxy.restoreExtensionLastVersion(extName);
+ WikittyExtension ext = proxy
+ .restoreExtensionLastVersion(extName);
if (ext != null) {
w.addExtension(ext);
}
@@ -122,14 +131,13 @@
// ajout de l'extension demande par l'utilisateur
String extName = context.getArgument("newExtension", null);
if (extName != null && !"".equals(extName)) {
- WikittyExtension ext = proxy.restoreExtensionLastVersion(extName);
+ WikittyExtension ext = proxy
+ .restoreExtensionLastVersion(extName);
if (ext != null) {
w.addExtension(ext);
}
}
-
-
Map<String, Object> args = new HashMap<String, Object>();
args.putAll(context.getArguments());
args.putAll(context.getArgumentFiles());
@@ -138,25 +146,57 @@
Object value = null;
if (key.contains(WikittyUtil.FQ_FIELD_NAME_SEPARATOR)) {
String ext = WikittyExtension.extractExtensionName(key);
- String fieldName = WikittyExtension.extractFieldName(key);
+ String fieldName = WikittyExtension
+ .extractFieldName(key);
if (w.hasField(ext, fieldName)) {
- if (!"true".equals(context.getArgument("isNull-" + key, "false"))) {
+ if (!"true".equals(context.getArgument("isNull-"
+ + key, "false"))) {
+
value = field.getValue();
}
- w.setField(ext, fieldName, value);
-
+
+ FieldType extFieldType = w.getExtension(ext)
+ .getFieldType(fieldName);
+ if (extFieldType.isCollection()
+ && extFieldType.getType() == TYPE.STRING
+ && value != null) {
+
+ String valueString = value.toString();
+
+ valueString = new String(valueString.substring(
+ 1, valueString.length() - 1));
+
+ Collection<String> list = new ArrayList<String>();
+
+ String[] valuesString = StringUtil.split(
+ valueString, ",");
+
+ for (String element : valuesString) {
+ list.add(element.trim());
+ }
+
+ w.setField(ext, fieldName, list);
+
+ } else {
+ w.setField(ext, fieldName, value);
+ }
// si w est un WikittyPubData on essai de mettre a
// jour si besoin les champs mimetype et name
if (ext.equals(WikittyPubData.EXT_WIKITTYPUBDATA)
- && fieldName.equals(WikittyPubData.FIELD_WIKITTYPUBDATA_CONTENT)) {
+ && fieldName
+ .equals(WikittyPubData.FIELD_WIKITTYPUBDATA_CONTENT)) {
if (null == WikittyPubDataHelper.getName(w)) {
- WikittyPubDataHelper.setName(w,
- String.valueOf(args.get(key + "-filename")));
+ WikittyPubDataHelper.setName(
+ w,
+ String.valueOf(args.get(key
+ + "-filename")));
}
if (null == WikittyPubDataHelper.getMimeType(w)) {
- WikittyPubDataHelper.setMimeType(w,
- String.valueOf(args.get(key + "-contentType")));
+ WikittyPubDataHelper.setMimeType(
+ w,
+ String.valueOf(args.get(key
+ + "-contentType")));
}
}
}
@@ -169,11 +209,10 @@
}
}
}
-
+
// forward l'affichage de la page vers la jsp d'edition
context.setContentType("forward/jsp");
- context.getRequest().setAttribute(
- ActionEval.CONTEXT_VAR, context);
+ context.getRequest().setAttribute(ActionEval.CONTEXT_VAR, context);
context.getRequest().setAttribute(ActionEval.WIKITTY_VAR, w);
result = "/WEB-INF/jsp/edit.jsp";
@@ -181,16 +220,16 @@
}
/**
- * create url to edit wikitty object, assume that edition already start
- * add context.getActionName() return edit action name.
+ * create url to edit wikitty object, assume that edition already start add
+ * context.getActionName() return edit action name.
*
* @param context
* @param w
* @return
*/
public String makeUrl(WikittyPublicationContext context, Wikitty w) {
- String url = getMapping() + "/"
- + Element.ELT_ID + SEARCH_SEPARATOR + w.getId();
+ String url = getMapping() + "/" + Element.ELT_ID + SEARCH_SEPARATOR
+ + w.getId();
url = context.makeUrl(url);
return url;
}
1
0
r855 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr wikitty-solr/src/main/resources
by sletellier@users.nuiton.org 03 May '11
by sletellier@users.nuiton.org 03 May '11
03 May '11
Author: sletellier
Date: 2011-05-03 19:55:52 +0200 (Tue, 03 May 2011)
New Revision: 855
Url: http://nuiton.org/repositories/revision/wikitty/855
Log:
- Creation of solr field #fulltext to search without type
- Refactor FieldModifier to allow to force type to use on search
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
trunk/wikitty-solr/src/main/resources/schema.xml
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2011-05-02 14:52:21 UTC (rev 854)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2011-05-03 17:55:52 UTC (rev 855)
@@ -55,7 +55,7 @@
*
* @author poussin
* @version $Revision$
- *
+ * extends ApplicationConfig
* Last update: $Date$
* by : $Author$
*/
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java 2011-05-02 14:52:21 UTC (rev 854)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/FieldModifier.java 2011-05-03 17:55:52 UTC (rev 855)
@@ -36,8 +36,10 @@
import org.nuiton.wikitty.storage.WikittyExtensionStorage;
import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SOLR_ALL_EXTENSIONS;
+import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SOLR_DEFAULT_FIELD;
import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SOLR_EXTENSIONS;
import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SOLR_ID;
+import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SOLR_WIKITTY_PREFIX;
import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SUFFIX_BINARY;
import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SUFFIX_BINARY_MULTIVALUED;
import static org.nuiton.wikitty.storage.solr.WikittySolrConstant.SUFFIX_BOOLEAN;
@@ -70,6 +72,17 @@
this.extensionStorage = extensionStorage;
}
+ /**
+ * Different cas d'entree
+ * <li> monext.monfield
+ * <li> *.monfield
+ * <li> monext.monfield.NUMERIC
+ * <li> *.monfield.NUMERIC
+ *
+ * @param transaction
+ * @param fqfieldname
+ * @return
+ */
public String convertToSolr(WikittyTransaction transaction, String fqfieldname) {
String result = fqfieldname;
String[] searchField = fqfieldname.split(WikittyUtil.FQ_FIELD_NAME_SEPARATOR_REGEX);
@@ -85,36 +98,44 @@
String fieldName = searchField[1];
if (Criteria.ALL_EXTENSIONS.equals(extName)) {
- fqfieldname = SOLR_ALL_EXTENSIONS
+ result = SOLR_ALL_EXTENSIONS
+ WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
- }
+ // en #all le seul moyen d'avoir le type est qu'il soit donne dans le champs, sinon on ne peut pas le
+ // trouver
+ if (searchField.length >= 3) {
+ // On passe ici, si on indique dans le champs son type (ex: *.monfield.NUMERIC)
+ // utile pour force la recherche sur les bons champs lorsqu'on demande une recherche sur * == #all
+ String fieldNameType = searchField[2];
+ TYPE type = FieldType.TYPE.valueOf(fieldNameType);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
+ result = SolrUtil.getSolrCollectionFieldName(result, type);
+ } else {
+ log.error("Search on multi extentions (*) without field type, fallback search in fulltext");
+ result = SOLR_DEFAULT_FIELD
+ + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
+ }
+ } else {
+ result = extName + WikittyUtil.FQ_FIELD_NAME_SEPARATOR + fieldName;
- if (searchField.length >= 3) {
- // TODO poussin 20101209 je ne vois pas dans quel cas on passe ici
- String fieldNameType = searchField[2];
- TYPE type = FieldType.TYPE.valueOf(fieldNameType);
- result = SolrUtil.getSolrFieldName(fqfieldname, type);
- return result;
- }
-
- // Search type of field in extension
- String version =
- extensionStorage.getLastVersion(transaction, extName);
- if (version != null) { // not valid extension if version == null
- WikittyExtension ext = extensionStorage.restore(
- transaction, extName, version);
- FieldType fieldType = ext.getFieldType(fieldName);
- if (log.isDebugEnabled()) {
- log.debug(ext.toDefinition() + " for " + fieldName);
- }
- if (fieldType != null) { // type can be null if extension version differ
- TYPE type = fieldType.getType();
- if (fieldType.isCollection()) {
- result = SolrUtil.getSolrCollectionFieldName(fqfieldname, type);
- } else {
- result = SolrUtil.getSolrFieldName(fqfieldname, type);
+ // Ajout du pattern solr pour discriminer le champs ex : _s, _sm, _wm ...
+ // Search type of field in extension
+ String version =
+ extensionStorage.getLastVersion(transaction, extName);
+ if (version != null) { // not valid extension if version == null
+ WikittyExtension ext = extensionStorage.restore(
+ transaction, extName, version);
+ FieldType fieldType = ext.getFieldType(fieldName);
+ if (log.isDebugEnabled()) {
+ log.debug(ext.toDefinition() + " for " + fieldName);
}
- return result;
+ if (fieldType != null) { // type can be null if extension version differ
+ TYPE type = fieldType.getType();
+ if (fieldType.isCollection()) {
+ result = SolrUtil.getSolrCollectionFieldName(result, type);
+ } else {
+ result = SolrUtil.getSolrFieldName(result, type);
+ }
+ }
}
}
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-05-02 14:52:21 UTC (rev 854)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2011-05-03 17:55:52 UTC (rev 855)
@@ -881,9 +881,11 @@
// #all.<fieldname>
// permet de faire des recherches inter extension sur un champs ayant
// le meme nom. ex:Person.name et User.name
+ // Quoi qu'il arrive pour le #all on utilise du multivalue
+ String solrAllFqFieldName = SolrUtil.getSolrCollectionFieldName(fqfieldName, type);
String solrAllFieldName = SOLR_ALL_EXTENSIONS
+ WikittyUtil.FQ_FIELD_NAME_SEPARATOR
- + WikittyUtil.getFieldNameFromFQFieldName(solrFqFieldName);
+ + WikittyUtil.getFieldNameFromFQFieldName(solrAllFqFieldName);
String solrNullFieldFqFieldName = SOLR_NULL_FIELD + fqfieldName;
Modified: trunk/wikitty-solr/src/main/resources/schema.xml
===================================================================
--- trunk/wikitty-solr/src/main/resources/schema.xml 2011-05-02 14:52:21 UTC (rev 854)
+++ trunk/wikitty-solr/src/main/resources/schema.xml 2011-05-03 17:55:52 UTC (rev 855)
@@ -176,9 +176,12 @@
<!-- copy all field (except binary) in '#fulltext' field for fulltext search -->
<field name="#fulltext" type="text" indexed="true" stored="false" multiValued="true"/>
- <!-- copied field not stored -->
- <dynamicField name="*_s_c" type="string_lc" indexed="true" stored="false" multiValued="true"/>
- <dynamicField name="*_s_t" type="text" indexed="true" stored="false" multiValued="true"/>
+ <dynamicField name="#fulltext.*" type="text" indexed="true" stored="false" multiValued="true"/>
+ <!-- copied field not stored -->
+ <dynamicField name="*_s_c" type="string_lc" indexed="true" stored="false" multiValued="false"/>
+ <dynamicField name="*_s_t" type="text" indexed="true" stored="false" multiValued="false"/>
+ <dynamicField name="*_s_cm" type="string_lc" indexed="true" stored="false" multiValued="true"/>
+ <dynamicField name="*_s_tm" type="text" indexed="true" stored="false" multiValued="true"/>
<!-- on indexe pas les binary field -->
<dynamicField name="*_bi" type="binary" indexed="false" stored="false" multiValued="false"/>
@@ -224,10 +227,25 @@
<copyField source="*_sm" dest="#fulltext"/>
<copyField source="*_wm" dest="#fulltext"/>
- <!-- copy String field for to lower case version -->
- <copyField source="*_s" dest="*_s_c"/>
- <!-- copy String field for text indexed format version -->
- <copyField source="*_s" dest="*_s_t"/>
+ <copyField source="*_b" dest="#fulltext.*"/>
+ <copyField source="*_d" dest="#fulltext.*"/>
+ <copyField source="*_dt" dest="#fulltext.*"/>
+ <copyField source="*_s" dest="#fulltext.*"/>
+ <copyField source="*_w" dest="#fulltext.*"/>
+ <copyField source="*_bm" dest="#fulltext.*"/>
+ <copyField source="*_dm" dest="#fulltext.*"/>
+ <copyField source="*_dtm" dest="#fulltext.*"/>
+ <copyField source="*_sm" dest="#fulltext.*"/>
+ <copyField source="*_wm" dest="#fulltext.*"/>
+ <!-- copy String field for to lower case version -->
+ <copyField source="*_s" dest="*_s_c"/>
+ <!-- copy String field for text indexed format version -->
+ <copyField source="*_s" dest="*_s_t"/>
+ <!-- copy String field for to lower case version -->
+ <copyField source="*_sm" dest="*_s_cm"/>
+ <!-- copy String field for text indexed format version -->
+ <copyField source="*_sm" dest="*_s_tm"/>
+
</schema>
1
0
Author: mfortun
Date: 2011-05-02 16:52:21 +0200 (Mon, 02 May 2011)
New Revision: 854
Url: http://nuiton.org/repositories/revision/wikitty/854
Log:
* correct analyse
* add specifications for the site publication part of wikitty publication
Added:
trunk/wikitty-publication/src/site/rst/site-publication.rst
Modified:
trunk/wikitty-publication/src/site/rst/wp-analyse.rst
Added: trunk/wikitty-publication/src/site/rst/site-publication.rst
===================================================================
--- trunk/wikitty-publication/src/site/rst/site-publication.rst (rev 0)
+++ trunk/wikitty-publication/src/site/rst/site-publication.rst 2011-05-02 14:52:21 UTC (rev 854)
@@ -0,0 +1,128 @@
+Spécifications wikitty publication site
+=======================================
+:Authors: Manoël Fortun
+
+
+Contexte, Intérêt
+*****************
+
+Wikitty publication permet de construire une application et de la stocker dans
+un wikitty, ensuite via l'interface web de wikitty publication l'application
+peut s'éxécuter. Actuellement cette partie de publication permet de "publier"
+des pages qui contiennent du javascript et wikitty publication permet
+leur affichage et exécution des javascript.
+
+Le travail sur cette partie de wikitty publication consiste donc à compléter
+les fonctionnalités existantes, corriger les bugs présents, et enrichir
+le nombre de langage supportés à l'interprétation.
+
+
+Fonctionnalités
+***************
+
+Login/logout
+------------
+
+L'interface web doit pouvoir gérer un système de login avec sauvegarde
+de cookie pour la navigation. Le token de sécurité sera contenu dans le
+cookie. En cas de succès si dans les arguments on retrouve les actions
+à faire on les faits sinon on affiche simplement le résultat.
+
+L'action à éxécuter en cas d'erreur du login ou du logout, ne doit pas
+se retrouver dans l'url. Ce doit être paramètrable dans un fichier de propriété.
+
+ /login?login=moi&password=xxxx&succes=/eval/Wiki/WikiHello
+
+Si on a l'argument logout de présent dans les paramètres alors un
+logout est forcé. Par défaut si on demande un login et que
+l'utilisateur était déjà loggué alors un logout est aussi fait avant
+la nouvelle authentification.
+
+ /login?logout&succes=/eval/Wiki/WikiHello
+
+Il faudra demander à l'utilisateur de se loguer si l'action qu'il essaye
+d'entreprendre à besoin de droits. On pourra alors se retrouver dans la
+situation ou l'action à éxécuter après le login se trouve dans l'url.
+
+
+
+Gestion des droits
+------------------
+
+En sus d'une gestion d'authentification, il faudrait mettre en place un système
+permettant de gérer des droits utilisateurs sur les différents wikitty
+stocker au sein de wikitty publication, ainsi que les actions qu'un utilisateur
+peut faire sur un wikitty.
+
+Une solution envisageable est la création d'un objet wikitty, qui autoriserait
+des actions nommés à sur des wikittys d'un certain label, cet objet wikitty
+posséderais aussi un label, permettant de définir les droits sur cet objet
+et donc qui pourrait modifier ces droits. Cet objet wikitty posséderait un
+wikittyGroup qui lui même posséderait des wikittyUsers ou directement des
+wikittyUser.
+
+* WikittyAuth
+ * users: WikittyGroup //groupe des users possédant les droits
+ * target: WikittyLabel //les labels concerné par les droit
+ * action: Collection // action autorisé par ce droit
+ * label:String // le label permettant de déterminer qui à les droit sur
+ // ce wikitty
+
+On pourrait même penser à la possibilité de sync de ces wikitty avec la partie
+synchronisation de wikitty publication, et donc les transmettrent à un autre
+wikitty service.
+
+La vérification de la légitimité d'une action d'un user se ferais en
+recherchant le wikittyAuth qui autorise l'action sur le lable concerné
+et vérifier si l'utilisateur appartiens au groupe concerné.
+
+Le fait de mettre un label sur le wikittyAuth permet de créer plusieurs
+classes de droit et d'utilisateur. On pourra avoir le "super" droit
+donc le label target serait "." le "père" de tout les labels, dont le label
+serait aussi ".".
+
+Celà permettra la gestion des droits par récursion sur les labels.
+
+Gestion multicontexte
+---------------------
+
+Les applications que wikitty publication va pouvoir éxécuter peuvent être
+amené à manipuler des donnés, il doit être possible de définir que les
+données manipulée soit stocker dans un autre wikitty service.
+
+La solution pourrait être un nouvel objet de type wikitty définissant
+que pour les applications possédant un certain label, les données
+devront être stocké sur un autre wikitty service.
+
+On pourrait avoir cette objet qui contiendrais un wikitty label, un attribut
+avec l'adresse du wikitty service pour les datas.
+
+Et les données de toutes les applications sous ces labels seront sur le wikitty
+service désigné.
+
+* WikittyContexteHandler
+ * wikittyServiceDataUrl: String // adresse du wikitty pour les données
+ * labels: WikittyLabel // label concernés
+
+Il est possible que se baser sur les labels soit une entreprise périlleuse,
+mais celà permettrais de donner une seconde utilité, en plus de celle permettant
+de déterminer le path d'un fichier.
+
+Il sera nécessaire qu'au plus un wikittyContexteHandler existe pour un label
+donné, sinon le problème de quels wikittyService utiliser pour les données
+sera indécidable. Par défaut si ce wikitty n'existe pas les données seront
+manipulé sur le même wikitty service que l'application.
+
+L'avantage de stocker la configuration pour le "multicontexte" dans un objet
+wikitty permet ensuite d'avoir l'information facilement et de exporter vers
+un autre wikitty service avec la partie sync de wikitty publication si besoin.
+
+
+Moteur de script
+----------------
+
+Ajouter plus de langage supporté à l'interprétation par wikitty publication,
+en rajouter le plus possible, en fonction de ce qui est disponible pour java
+en librairie libre.
+
+
Modified: trunk/wikitty-publication/src/site/rst/wp-analyse.rst
===================================================================
--- trunk/wikitty-publication/src/site/rst/wp-analyse.rst 2011-04-30 12:23:38 UTC (rev 853)
+++ trunk/wikitty-publication/src/site/rst/wp-analyse.rst 2011-05-02 14:52:21 UTC (rev 854)
@@ -94,12 +94,14 @@
* name: String unique=true notNull=true
* content: String multiline=true
* mimetype: String
+ * extension: String
* WikittyPubData: pour les contenues binaires
* name: String unique=true notNull=true
* content: Binary
* mimetype: String
+ * extension: String
Ensuite grâce à ces actions de bases on peut construire des
applications complètement contenu dans le WikittyService (code,
@@ -200,7 +202,7 @@
en même temps.
Développement d'application
-============================
+===========================
Le but est de pouvoir facilement développer des applications avec ces
outils abituels (editor, svn, ...). Pour cela on utilise
1
0
r853 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/services wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc
by bpoussin@users.nuiton.org 30 Apr '11
by bpoussin@users.nuiton.org 30 Apr '11
30 Apr '11
Author: bpoussin
Date: 2011-04-30 14:23:38 +0200 (Sat, 30 Apr 2011)
New Revision: 853
Url: http://nuiton.org/repositories/revision/wikitty/853
Log:
retour en arriere, apres relecture des spec JTA, on peut bien ferme les connexions des qu'on en a plus besoin (donc avant les commit/rollback) c'est le role du fournisseur de connexion de savoir si elle est dans une transaction ou non et de rellement la fermer ou non.
Donc pour chaque getConnection ou doit avoir un finally{ close }
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java 2011-04-29 18:22:17 UTC (rev 852)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java 2011-04-30 12:23:38 UTC (rev 853)
@@ -51,8 +51,6 @@
/** permet d'attacher n'importe quoi a une transaction */
protected Map<Object, Object> tagValues;
- /** les connections a ferme apres un commit ou rollback */
- protected LinkedList<Connection> enlistedConnections = new LinkedList<Connection>();
/** if true begin has been called for this transaction */
protected boolean started = false;
@@ -87,13 +85,6 @@
tagValues.put(tag, value);
}
- public void addEnlistedConnection(Connection enlistedConnection) {
- if (!isStarted()) {
- throw new WikittyException("You can't add connection in transaction when transaction is not begin");
- }
- this.enlistedConnections.add(enlistedConnection);
- }
-
public boolean isStarted() {
return started;
}
@@ -137,8 +128,6 @@
setStarted(false);
} catch (Exception eee) {
throw new WikittyException("Error on commit JTA transaction", eee);
- } finally {
- close();
}
}
@@ -155,43 +144,8 @@
setStarted(false);
} catch (Exception eee) {
throw new WikittyException("Error on roolback JTA transaction", eee);
- } finally {
- close();
}
}
- /**
- * Close all enlisted connection, this method is automaticaly call after
- * commit or rollback.
- *
- * A priori normalement cela devrait etre fait automatiquement par dbcp
- * avec le commit/rollback mais ce n'est pas le cas
- * {@link org.apache.commons.dbcp.managed.ManagedConnection#transactionComplete()}
- * ou bien qu'on puisse la fermer a la main comme on fait ici, mais on tombe
- * sur des NPE :(
- *
- * Et si on ne les closes pas on arrive tout de suite a 160 connexion
- * active rien que pour les tests :(
- */
- public void close() {
- Connection c;
- while ((c = enlistedConnections.poll()) != null) {
- try {
- if (!c.isClosed()) {
- c.close();
- }
- } catch (Exception eee) {
- if (log.isDebugEnabled()) {
- // Il y a des bugs dans dbcp, avec la delegation des
- // connections, il arrive que la connection sous jacente soit
- // null et dans ce cas si on fait des appels sur c
- // pour savoir s'il faut ou non ferme la connexion
- // on a un NPE.
- // Donc on met seulement en debug le log au lieu de warn.
- log.debug("Can't close connection", eee);
- }
- }
- }
- }
}
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java 2011-04-29 18:22:17 UTC (rev 852)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java 2011-04-30 12:23:38 UTC (rev 853)
@@ -137,7 +137,11 @@
statement.execute(jdbcQuery.getProperty(QUERY_CREATION_EXTENSION_DATA));
} catch (Exception eee) {
throw new WikittyException("Can't create table for extension storage", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connectionTest);
}
}
@@ -189,6 +193,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't store extension", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -228,6 +234,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't delete extension", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -246,6 +254,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't test extension existance",eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -267,6 +277,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't retrieve all extensions id", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -292,6 +304,8 @@
} catch (SQLException eee) {
throw new WikittyException(String.format(
"Can't retrieve all extensions required by %s", extensionName), eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -327,6 +341,8 @@
lastVersion = tmp;
} catch (SQLException eee) {
throw new WikittyException("Can't get last version of extensions", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
String result = lastVersion.get(extName);
@@ -385,6 +401,8 @@
} catch (SQLException eee) {
throw new WikittyException(String.format("Can't load extension %s", id), eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
return result;
@@ -401,6 +419,8 @@
return result;
} catch (Exception eee) {
throw new WikittyException("Can't clear all extension", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
}
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java 2011-04-29 18:22:17 UTC (rev 852)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java 2011-04-30 12:23:38 UTC (rev 853)
@@ -233,6 +233,8 @@
* This connection is not configured, returned connection is just create connection
* Don't use this method, use getConnection that change auto commit to false
*
+ * This connection must be close be the asker after used
+ *
* @param conf configuration
* @return a new Connection (db transaction)
*/
@@ -306,9 +308,7 @@
WikittyManagedDataSource dataSource = dataSources.get(jdbcUrl);
Connection connection = dataSource.getConnection();
- // ne surtout pas oublie d'ajouter la connection pour quelle soit
- // bien fermee apres un commit ou un rollback
- tx.addEnlistedConnection(connection);
+
return connection;
} catch(Exception eee) {
@@ -322,26 +322,26 @@
}
}
- // REMOVED because, we must used WikittyTransaction with jta management
-// /**
-// * Closes a connection.
-// *
-// * @param connection the connection to close
-// */
-// public static void closeQuietly(Connection connection) {
-// try {
-// if (connection != null) {
-// // delegate close can throw NPE
-// // so this is necessary to catch all Exceptions
-// connection.close();
-// }
-// } catch (Exception e) {
-// log.error("Exception while closing connection", e);
-// }
-// }
+ /**
+ * Closes a connection.
+ *
+ * @param connection the connection to close
+ */
+ public static void closeQuietly(Connection connection) {
+ try {
+ if (connection != null) {
+ // delegate close can throw NPE
+ // so this is necessary to catch all Exceptions
+ connection.close();
+ }
+ } catch (Exception e) {
+ log.error("Exception while closing connection", e);
+ }
+ }
/**
* Get a new connection instance (i.e. it opens a new transaction).
+ * This connection must be close be the asker after used
*
* @return a new Connection (db transaction)
* @throws SQLException if the connection fails
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2011-04-29 18:22:17 UTC (rev 852)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2011-04-30 12:23:38 UTC (rev 853)
@@ -166,7 +166,11 @@
statement.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_DATA));
} catch (Exception eee) {
throw new WikittyException("Can't create table for wikitty storage", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connectionTest);
}
}
@@ -194,8 +198,11 @@
// column but can't store binary. If binary is not used there is
// no probleme
log.fatal("Can add column to store binary field. You can't use binary", eee);
-// throw new WikittyException("Can't create table for wikitty storage", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connectionTest);
}
}
@@ -353,6 +360,8 @@
throw eee;
} catch (Exception eee) {
throw new WikittyException("Can't store wikitty", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -371,6 +380,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't test wikitty existance", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -394,6 +405,8 @@
}
} catch (SQLException eee) {
throw new WikittyException("Can't test if wikitty is already deleted", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -429,6 +442,8 @@
} catch (SQLException eee) {
throw new WikittyException(String.format(
"Can't restore wikitty '%s'", id), eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -451,6 +466,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't delete wikitty", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -473,6 +490,8 @@
}
} catch (SQLException eee) {
throw new WikittyException("Can't scan whole wikitty", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -625,6 +644,8 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't clear wikitty data", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -647,6 +668,8 @@
} catch (SQLException eee) {
result = new DataStatistic();
log.warn("Can't retrieve statisticn data", eee);
+ } finally {
+ WikittyJDBCUtil.closeQuietly(connection);
}
return result;
}
1
0
r852 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty wikitty-api/src/main/java/org/nuiton/wikitty/services wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc
by bpoussin@users.nuiton.org 29 Apr '11
by bpoussin@users.nuiton.org 29 Apr '11
29 Apr '11
Author: bpoussin
Date: 2011-04-29 20:22:17 +0200 (Fri, 29 Apr 2011)
New Revision: 852
Url: http://nuiton.org/repositories/revision/wikitty/852
Log:
Anomalie #1492: Refactor transaction management
Added:
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyManagedDataSource.java
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2011-04-29 18:16:47 UTC (rev 851)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -96,7 +96,7 @@
WIKITTY_STORAGE_JDBC_XADATASOURCE(
"wikitty.storage.jdbc.xadatasource",
n_("JDBC xadatasource driver"),
- "org.h2.jdbcx.JdbcDataSource",
+ null, // no default XA otherwize we must set it to empty in all config file
String.class, false, false),
WIKITTY_STORAGE_JDBC_XADATASOURCE_H2_URL(
"wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL",
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2011-04-29 18:16:47 UTC (rev 851)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -1178,7 +1178,7 @@
txBeginHere = true;
}
- boolean result = getWikittyStorage().exists(null, wikittyId);
+ boolean result = getWikittyStorage().exists(tx, wikittyId);
if (txBeginHere) {
tx.commit();
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java 2011-04-29 18:16:47 UTC (rev 851)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyTransaction.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -24,8 +24,14 @@
*/
package org.nuiton.wikitty.services;
+import java.sql.Connection;
+import java.sql.SQLException;
import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.transaction.Status;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
@@ -45,6 +51,8 @@
/** permet d'attacher n'importe quoi a une transaction */
protected Map<Object, Object> tagValues;
+ /** les connections a ferme apres un commit ou rollback */
+ protected LinkedList<Connection> enlistedConnections = new LinkedList<Connection>();
/** if true begin has been called for this transaction */
protected boolean started = false;
@@ -79,6 +87,13 @@
tagValues.put(tag, value);
}
+ public void addEnlistedConnection(Connection enlistedConnection) {
+ if (!isStarted()) {
+ throw new WikittyException("You can't add connection in transaction when transaction is not begin");
+ }
+ this.enlistedConnections.add(enlistedConnection);
+ }
+
public boolean isStarted() {
return started;
}
@@ -122,6 +137,8 @@
setStarted(false);
} catch (Exception eee) {
throw new WikittyException("Error on commit JTA transaction", eee);
+ } finally {
+ close();
}
}
@@ -138,7 +155,43 @@
setStarted(false);
} catch (Exception eee) {
throw new WikittyException("Error on roolback JTA transaction", eee);
+ } finally {
+ close();
}
}
+
+ /**
+ * Close all enlisted connection, this method is automaticaly call after
+ * commit or rollback.
+ *
+ * A priori normalement cela devrait etre fait automatiquement par dbcp
+ * avec le commit/rollback mais ce n'est pas le cas
+ * {@link org.apache.commons.dbcp.managed.ManagedConnection#transactionComplete()}
+ * ou bien qu'on puisse la fermer a la main comme on fait ici, mais on tombe
+ * sur des NPE :(
+ *
+ * Et si on ne les closes pas on arrive tout de suite a 160 connexion
+ * active rien que pour les tests :(
+ */
+ public void close() {
+ Connection c;
+ while ((c = enlistedConnections.poll()) != null) {
+ try {
+ if (!c.isClosed()) {
+ c.close();
+ }
+ } catch (Exception eee) {
+ if (log.isDebugEnabled()) {
+ // Il y a des bugs dans dbcp, avec la delegation des
+ // connections, il arrive que la connection sous jacente soit
+ // null et dans ce cas si on fait des appels sur c
+ // pour savoir s'il faut ou non ferme la connexion
+ // on a un NPE.
+ // Donc on met seulement en debug le log au lieu de warn.
+ log.debug("Can't close connection", eee);
+ }
+ }
+ }
+ }
}
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java 2011-04-29 18:16:47 UTC (rev 851)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyExtensionStorageJDBC.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -96,40 +96,57 @@
public WikittyExtensionStorageJDBC(ApplicationConfig config) {
this.config = config;
jdbcQuery = WikittyJDBCUtil.loadQuery(config);
- Connection connectionTest = WikittyJDBCUtil.getConnection(config);
+
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
+
+ createDatabase(tx);
+
+ if (txBeginHere) {
+ tx.commit();
+ }
+ } catch (WikittyException eee) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw eee;
+ }
+ }
+
+ protected void createDatabase(WikittyTransaction tx) {
+ Connection connectionTest = WikittyJDBCUtil.getConnection(tx, config);
+ try {
// If test of existance work, no exception and do nothing
// if exception try to create databse
Statement statementTest = connectionTest.createStatement();
statementTest.execute(jdbcQuery.getProperty(QUERY_CREATION_EXTENSION_ADMIN_TEST));
statementTest.execute(jdbcQuery.getProperty(QUERY_CREATION_EXTENSION_DATA_TEST));
- } catch(SQLException silentError) {
+ } catch(Exception silentError) {
if (log.isInfoEnabled()) {
log.info("try to create extension database");
}
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
Statement statement = connection.createStatement();
statement.execute(jdbcQuery.getProperty(QUERY_CREATION_EXTENSION_ADMIN));
- statement.execute(jdbcQuery.getProperty(QUERY_CREATION_EXTENSION_DATA));
- WikittyJDBCUtil.commitJDBCConnection(connection);
- } catch (SQLException eee) {
- WikittyJDBCUtil.rollbackJDBCConnection(connection);
+ statement.execute(jdbcQuery.getProperty(QUERY_CREATION_EXTENSION_DATA));
+ } catch (Exception eee) {
throw new WikittyException("Can't create table for extension storage", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
- } finally {
- WikittyJDBCUtil.closeQuietly(connectionTest);
}
}
-
+
@Override
- public WikittyEvent store(WikittyTransaction transaction,
+ public WikittyEvent store(WikittyTransaction tx,
Collection<WikittyExtension> extensions)
throws WikittyException {
WikittyEvent result = new WikittyEvent(this);
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
for (WikittyExtension ext : extensions) {
// extension id is extension name with version
@@ -172,14 +189,12 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't store extension", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public WikittyEvent delete(WikittyTransaction transaction, Collection<String> extNames) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public WikittyEvent delete(WikittyTransaction tx, Collection<String> extNames) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
WikittyEvent result = new WikittyEvent(this);
@@ -213,14 +228,12 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't delete extension", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public boolean exists(WikittyTransaction transaction, String id) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public boolean exists(WikittyTransaction tx, String id) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
//select the data with teh id "id" in the admin table
String q = String.format(jdbcQuery.getProperty(QUERY_SELECT_WHERE),
@@ -233,14 +246,12 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't test extension existance",eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public List<String> getAllExtensionIds(WikittyTransaction transaction) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public List<String> getAllExtensionIds(WikittyTransaction tx) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
List<String> result = new ArrayList<String>();
Statement statement = connection.createStatement();
@@ -256,15 +267,13 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't retrieve all extensions id", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public List<String> getAllExtensionsRequires(WikittyTransaction transaction,
+ public List<String> getAllExtensionsRequires(WikittyTransaction tx,
String extensionName) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
List<String> result = new ArrayList<String>();
String q = String.format(jdbcQuery.getProperty(QUERY_SELECT_WHERE),
@@ -283,8 +292,6 @@
} catch (SQLException eee) {
throw new WikittyException(String.format(
"Can't retrieve all extensions required by %s", extensionName), eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -295,12 +302,12 @@
* doesn't exist
*/
@Override
- public String getLastVersion(WikittyTransaction transaction,
+ public String getLastVersion(WikittyTransaction tx,
String extName) {
if (lastVersion == null) {
// create cache for futur call
Map<String, String> tmp = new HashMap<String, String>();
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
Statement statement = connection.createStatement();
//get all extensions names and versions
@@ -320,8 +327,6 @@
lastVersion = tmp;
} catch (SQLException eee) {
throw new WikittyException("Can't get last version of extensions", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
String result = lastVersion.get(extName);
@@ -329,12 +334,12 @@
}
@Override
- public WikittyExtension restore(WikittyTransaction transaction, String name, String version)
+ public WikittyExtension restore(WikittyTransaction tx, String name, String version)
throws WikittyException {
String id = WikittyExtension.computeId(name, version);
WikittyExtension result = extensionCache.get(id);
if (result == null) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
//get the data with the id "id" in the admin table
@@ -380,16 +385,14 @@
} catch (SQLException eee) {
throw new WikittyException(String.format("Can't load extension %s", id), eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
return result;
}
@Override
- public WikittyEvent clear(WikittyTransaction transaction) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public WikittyEvent clear(WikittyTransaction tx) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
lastVersion = null;
WikittyJDBCUtil.doQuery(connection, jdbcQuery.getProperty(QUERY_CLEAR_EXTENSION));
@@ -398,8 +401,6 @@
return result;
} catch (Exception eee) {
throw new WikittyException("Can't clear all extension", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
}
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java 2011-04-29 18:16:47 UTC (rev 851)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyJDBCUtil.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -45,7 +45,6 @@
import javax.transaction.TransactionManager;
import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.dbcp.managed.BasicManagedDataSource;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
@@ -54,6 +53,7 @@
import org.nuiton.util.ApplicationConfig;
import org.nuiton.wikitty.WikittyConfigOption;
import org.nuiton.wikitty.WikittyException;
+import org.nuiton.wikitty.services.WikittyTransaction;
/**
*
@@ -223,8 +223,8 @@
return result;
}
- private static Map<String, BasicManagedDataSource> dataSources =
- new HashMap<String, BasicManagedDataSource>();
+ private static Map<String, WikittyManagedDataSource> dataSources =
+ new HashMap<String, WikittyManagedDataSource>();
/**
* Get a new connection instance (i.e. it opens a new transaction) plug on
@@ -236,7 +236,12 @@
* @param conf configuration
* @return a new Connection (db transaction)
*/
- public static synchronized Connection getConnectionUnconfigured(ApplicationConfig conf) {
+ public static synchronized Connection getConnectionUnconfigured(
+ WikittyTransaction tx, ApplicationConfig conf) {
+ if (tx == null) {
+ throw new IllegalArgumentException("WikittyTransaction must not be null");
+ }
+
String driver = conf.getOption(
WikittyConfigOption.WIKITTY_STORAGE_JDBC_DRIVER.getKey());
String host = conf.getOption(
@@ -249,16 +254,13 @@
String xaDataSourceClassName = conf.getOption(
WikittyConfigOption.WIKITTY_STORAGE_JDBC_XADATASOURCE.getKey());
try {
- TransactionManager transactionManager =
- com.arjuna.ats.jta.TransactionManager.transactionManager();
-
String jdbcUrl = String.format("%s:%s@%s", username, password, host);
if (!dataSources.containsKey(jdbcUrl)) {
log.info("Creating BasicManagedDataSource for: " + jdbcUrl);
// Create datasource
- BasicManagedDataSource dataSource = new BasicManagedDataSource();
+ WikittyManagedDataSource dataSource = new WikittyManagedDataSource();
// if xadatasource
if(StringUtils.isNotEmpty(xaDataSourceClassName)) {
@@ -295,13 +297,18 @@
dataSource.setUrl(host);
dataSource.setUsername(username);
dataSource.setPassword(password);
- dataSource.setTransactionManager(transactionManager);
+ TransactionManager tm = tx.getTransactionManager();
+ dataSource.setTransactionManager(tm);
+
dataSources.put(jdbcUrl, dataSource);
}
- BasicManagedDataSource dataSource = dataSources.get(jdbcUrl);
+ WikittyManagedDataSource dataSource = dataSources.get(jdbcUrl);
Connection connection = dataSource.getConnection();
+ // ne surtout pas oublie d'ajouter la connection pour quelle soit
+ // bien fermee apres un commit ou un rollback
+ tx.addEnlistedConnection(connection);
return connection;
} catch(Exception eee) {
@@ -315,22 +322,23 @@
}
}
- /**
- * Closes a connection.
- *
- * @param connection the connection to close
- */
- public static void closeQuietly(Connection connection) {
- try {
- if (connection != null) {
- // delegate close can throw NPE
- // so this is necessary to catch all Exceptions
- connection.close();
- }
- } catch (Exception e) {
- log.error("Exception while closing connection", e);
- }
- }
+ // REMOVED because, we must used WikittyTransaction with jta management
+// /**
+// * Closes a connection.
+// *
+// * @param connection the connection to close
+// */
+// public static void closeQuietly(Connection connection) {
+// try {
+// if (connection != null) {
+// // delegate close can throw NPE
+// // so this is necessary to catch all Exceptions
+// connection.close();
+// }
+// } catch (Exception e) {
+// log.error("Exception while closing connection", e);
+// }
+// }
/**
* Get a new connection instance (i.e. it opens a new transaction).
@@ -338,9 +346,10 @@
* @return a new Connection (db transaction)
* @throws SQLException if the connection fails
*/
- public static synchronized Connection getConnection(ApplicationConfig config) {
+ public static synchronized Connection getConnection(
+ WikittyTransaction tx, ApplicationConfig config) {
try {
- Connection connection = getConnectionUnconfigured(config);
+ Connection connection = getConnectionUnconfigured(tx, config);
if (connection.getAutoCommit()) {
connection.setAutoCommit(false);
}
@@ -351,45 +360,46 @@
}
}
- /**
- * Closes a connection (i.e. transaction) and commit data.
- *
- * @param connection the connection to close and commit
- */
- public static void commitJDBCConnection(Connection connection) {
- try {
- connection.commit();
- } catch(SQLException eee) {
- throw new WikittyException("Can't commit transaction", eee);
- } finally {
- try {
- connection.close();
- } catch(SQLException eee) {
- throw new WikittyException("Can't close connection", eee);
- }
- }
- }
+ // REMOVED because, we must used WikittyTransaction with jta management
+// /**
+// * Closes a connection (i.e. transaction) and commit data.
+// *
+// * @param connection the connection to close and commit
+// */
+// public static void commitJDBCConnection(Connection connection) {
+// try {
+// connection.commit();
+// } catch(SQLException eee) {
+// throw new WikittyException("Can't commit transaction", eee);
+// } finally {
+// try {
+// connection.close();
+// } catch(SQLException eee) {
+// throw new WikittyException("Can't close connection", eee);
+// }
+// }
+// }
+//
+// /**
+// * Closes a connection (i.e. transaction) and rollback data.
+// *
+// * @param connection the connection to close and rollback
+// */
+// public static void rollbackJDBCConnection(Connection connection) {
+// try {
+// connection.rollback();
+// } catch(SQLException eee) {
+// throw new WikittyException("Can't rollback transaction", eee);
+// } finally {
+// try {
+// connection.close();
+// } catch(SQLException eee) {
+// throw new WikittyException("Can't close connection", eee);
+// }
+// }
+// }
/**
- * Closes a connection (i.e. transaction) and rollback data.
- *
- * @param connection the connection to close and rollback
- */
- public static void rollbackJDBCConnection(Connection connection) {
- try {
- connection.rollback();
- } catch(SQLException eee) {
- throw new WikittyException("Can't rollback transaction", eee);
- } finally {
- try {
- connection.close();
- } catch(SQLException eee) {
- throw new WikittyException("Can't close connection", eee);
- }
- }
- }
-
- /**
* Execute query.
*
* @param connection connection to use
Added: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyManagedDataSource.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyManagedDataSource.java (rev 0)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyManagedDataSource.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -0,0 +1,88 @@
+package org.nuiton.wikitty.jdbc;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import org.apache.commons.dbcp.managed.BasicManagedDataSource;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.pool.impl.GenericObjectPool;
+
+/**
+ * Extends BasicManagedDataSource to permit setWhenExhaustedAction configuration
+ * on GenericObjectPool internal field and change default action to Grow when
+ * exhausted
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyManagedDataSource extends BasicManagedDataSource {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyManagedDataSource.class);
+
+ /**
+ * nombre de connexions actives simultanement qui affiche un message
+ * lorsqu'un message est affiche ce nombre est multiplie par 2 pour le
+ * prochain message
+ */
+ protected int warnConnectionCount = 10;
+ protected byte whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_GROW;
+
+ /**
+ *
+ * @return whenExhaustedAction
+ *
+ * @see GenericObjectPool#WHEN_EXHAUSTED_BLOCK
+ * @see GenericObjectPool#WHEN_EXHAUSTED_FAIL
+ * @see GenericObjectPool#WHEN_EXHAUSTED_GROW
+ */
+ public byte getWhenExhaustedAction() {
+ byte result = whenExhaustedAction;
+ if (connectionPool != null) {
+ connectionPool.getWhenExhaustedAction();
+ }
+ return result;
+ }
+
+ /**
+ * Change whenExhaustedAction of connectionPool
+ *
+ * @param whenExhaustedAction
+ * @see GenericObjectPool#WHEN_EXHAUSTED_BLOCK
+ * @see GenericObjectPool#WHEN_EXHAUSTED_FAIL
+ * @see GenericObjectPool#WHEN_EXHAUSTED_GROW
+ */
+ public void setWhenExhaustedAction(byte whenExhaustedAction) {
+ this.whenExhaustedAction = whenExhaustedAction;
+ if (connectionPool != null) {
+ connectionPool.setWhenExhaustedAction(whenExhaustedAction);
+ }
+ }
+
+ @Override
+ protected void createConnectionPool() {
+ super.createConnectionPool();
+ connectionPool.setWhenExhaustedAction(whenExhaustedAction);
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ Connection result = super.getConnection();
+
+ int active = connectionPool.getNumActive();
+ if (active > warnConnectionCount) {
+ int idle = connectionPool.getNumIdle();
+ warnConnectionCount = warnConnectionCount * 2;
+
+ log.warn(String.format(
+ "Too many database connection open active:%s idle:%s",
+ active, idle));
+ }
+
+ return result;
+ }
+
+}
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2011-04-29 18:16:47 UTC (rev 851)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2011-04-29 18:22:17 UTC (rev 852)
@@ -118,42 +118,55 @@
this.config = config;
this.extensionStorage = extensionStorage;
jdbcQuery = WikittyJDBCUtil.loadQuery(config);
- checkTableOrCreation();
+
+ WikittyTransaction tx = WikittyTransaction.get();
+ boolean txBeginHere = false;
+ try {
+ if (!tx.isStarted()) {
+ tx.begin();
+ txBeginHere = true;
+ }
- // all time use alter after creation for binaryValue column because
- // this datatype is not portable
- checkColumnBinaryOrAlter();
+ checkTableOrCreation(tx);
+
+ // all time use alter after creation for binaryValue column because
+ // this datatype is not portable
+ checkColumnBinaryOrAlter(tx);
+
+ if (txBeginHere) {
+ tx.commit();
+ }
+ } catch (WikittyException eee) {
+ if (tx != null && tx.isStarted()) {
+ tx.rollback();
+ }
+ throw eee;
+ }
}
/**
* test table existance or create them if necessary
*/
- protected void checkTableOrCreation() {
- Connection connectionTest = WikittyJDBCUtil.getConnection(config);
+ protected void checkTableOrCreation(WikittyTransaction tx) {
+ Connection connectionTest = WikittyJDBCUtil.getConnection(tx, config);
try {
// If test of existance work, no exception and do nothing
// if exception try to create databse
Statement statementTest = connectionTest.createStatement();
statementTest.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_ADMIN_TEST));
statementTest.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_DATA_TEST));
- } catch (SQLException silentError) {
+ } catch (Exception silentError) {
if (log.isInfoEnabled()) {
log.info("try to create wikitty database");
}
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
Statement statement = connection.createStatement();
statement.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_ADMIN));
statement.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_DATA));
- WikittyJDBCUtil.commitJDBCConnection(connection);
- } catch (SQLException eee) {
- WikittyJDBCUtil.rollbackJDBCConnection(connection);
+ } catch (Exception eee) {
throw new WikittyException("Can't create table for wikitty storage", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
- } finally {
- WikittyJDBCUtil.closeQuietly(connectionTest);
}
}
@@ -161,34 +174,28 @@
* Add binary column if necessary
* If add can be done, wikitty work for all, except binary type
*/
- protected void checkColumnBinaryOrAlter() {
- Connection connectionTest = WikittyJDBCUtil.getConnection(config);
+ protected void checkColumnBinaryOrAlter(WikittyTransaction tx) {
+ Connection connectionTest = WikittyJDBCUtil.getConnection(tx, config);
try {
// If test of existance work, no exception and do nothing
- // if exception try to create databse
+ // if exception try to create binary column
Statement statementTest = connectionTest.createStatement();
statementTest.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_DATA_TEST_BINARY));
- } catch (SQLException silentError) {
+ } catch (Exception silentError) {
if (log.isInfoEnabled()) {
log.info("try to alter wikitty database to add binary column");
}
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
Statement statement = connection.createStatement();
statement.execute(jdbcQuery.getProperty(QUERY_CREATION_WIKITTY_DATA_ALTER_BINARY));
- WikittyJDBCUtil.commitJDBCConnection(connection);
- } catch (SQLException eee) {
- WikittyJDBCUtil.rollbackJDBCConnection(connection);
+ } catch (Exception eee) {
// no exception just log fatal, wikitty can work without this
// column but can't store binary. If binary is not used there is
// no probleme
log.fatal("Can add column to store binary field. You can't use binary", eee);
// throw new WikittyException("Can't create table for wikitty storage", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
- } finally {
- WikittyJDBCUtil.closeQuietly(connectionTest);
}
}
@@ -217,9 +224,9 @@
}
@Override
- public WikittyEvent store(WikittyTransaction transaction,
+ public WikittyEvent store(WikittyTransaction tx,
Collection<Wikitty> wikitties, boolean force) throws WikittyException {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
WikittyEvent result = new WikittyEvent(this);
for (Wikitty wikitty : wikitties) {
@@ -346,14 +353,12 @@
throw eee;
} catch (Exception eee) {
throw new WikittyException("Can't store wikitty", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public boolean exists(WikittyTransaction transaction, String id) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public boolean exists(WikittyTransaction tx, String id) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
//select the data with the id "id" in the admin table
String q = String.format(jdbcQuery.getProperty(QUERY_SELECT_WHERE), COL_ID,
@@ -366,14 +371,12 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't test wikitty existance", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public boolean isDeleted(WikittyTransaction transaction, String id) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public boolean isDeleted(WikittyTransaction tx, String id) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
//select the data with the id "id" in the admin table
String q = String.format(jdbcQuery.getProperty(QUERY_SELECT_WHERE),
@@ -391,15 +394,13 @@
}
} catch (SQLException eee) {
throw new WikittyException("Can't test if wikitty is already deleted", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public Wikitty restore(WikittyTransaction transaction,
+ public Wikitty restore(WikittyTransaction tx,
String id, String... fqFieldName) throws WikittyException {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
//select the data with the id "id" in the admin table
String q = String.format(jdbcQuery.getProperty(
@@ -418,7 +419,7 @@
sta.setString(1, id);
ResultSet dataResultSet = sta.executeQuery();
- Wikitty result = constructWikitty(transaction, id, version, extensionList,
+ Wikitty result = constructWikitty(tx, id, version, extensionList,
dataResultSet, fqFieldName);
return result;
} else {
@@ -428,20 +429,18 @@
} catch (SQLException eee) {
throw new WikittyException(String.format(
"Can't restore wikitty '%s'", id), eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public WikittyEvent delete(WikittyTransaction transaction, Collection<String> ids) throws WikittyException {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public WikittyEvent delete(WikittyTransaction tx, Collection<String> ids) throws WikittyException {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
WikittyEvent result = new WikittyEvent(this);
Date now = new Date();
for (String id : ids) {
- if (exists(transaction, id) && !isDeleted(transaction, id)) {
+ if (exists(tx, id) && !isDeleted(tx, id)) {
// addVersionUpdate delete date field
WikittyJDBCUtil.doQuery(connection, jdbcQuery.getProperty(
QUERY_DELETE_WIKITTY_ADMIN), id);
@@ -452,14 +451,12 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't delete wikitty", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public void scanWikitties(WikittyTransaction transaction, Scanner scanner) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public void scanWikitties(WikittyTransaction tx, Scanner scanner) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
Statement statement = connection.createStatement();
@@ -476,8 +473,6 @@
}
} catch (SQLException eee) {
throw new WikittyException("Can't scan whole wikitty", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@@ -491,7 +486,8 @@
* @param fqFieldName minimum field to restore
* @return
*/
- protected Wikitty constructWikitty(WikittyTransaction transaction, String id, String version, String extensionList,
+ protected Wikitty constructWikitty(WikittyTransaction tx,
+ String id, String version, String extensionList,
ResultSet resultSet, String... fqFieldName) throws SQLException {
Set<String> acceptedField = new HashSet<String>(Arrays.asList(fqFieldName));
Wikitty result = new WikittyImpl(id);
@@ -501,7 +497,8 @@
String extName = WikittyExtension.computeName(ext);
String extVersion = WikittyExtension.computeVersion(ext);
- WikittyExtension extension = extensionStorage.restore(transaction, extName, extVersion);
+ WikittyExtension extension =
+ extensionStorage.restore(tx, extName, extVersion);
result.addExtension(extension);
}
}
@@ -619,8 +616,8 @@
}
@Override
- public WikittyEvent clear(WikittyTransaction transaction) {
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ public WikittyEvent clear(WikittyTransaction tx) {
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
WikittyJDBCUtil.doQuery(connection, jdbcQuery.getProperty(QUERY_CLEAR_WIKITTY));
WikittyEvent result = new WikittyEvent(this);
@@ -628,15 +625,13 @@
return result;
} catch (SQLException eee) {
throw new WikittyException("Can't clear wikitty data", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
}
@Override
- public DataStatistic getDataStatistic(WikittyTransaction transaction) {
+ public DataStatistic getDataStatistic(WikittyTransaction tx) {
DataStatistic result;
- Connection connection = WikittyJDBCUtil.getConnection(config);
+ Connection connection = WikittyJDBCUtil.getConnection(tx, config);
try {
Statement statement = connection.createStatement();
@@ -652,8 +647,6 @@
} catch (SQLException eee) {
result = new DataStatistic();
log.warn("Can't retrieve statisticn data", eee);
- } finally {
- WikittyJDBCUtil.closeQuietly(connection);
}
return result;
}
1
0
r851 - trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr
by bpoussin@users.nuiton.org 29 Apr '11
by bpoussin@users.nuiton.org 29 Apr '11
29 Apr '11
Author: bpoussin
Date: 2011-04-29 20:16:47 +0200 (Fri, 29 Apr 2011)
New Revision: 851
Url: http://nuiton.org/repositories/revision/wikitty/851
Log:
ajout de commentaires d'explication
Modified:
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java 2011-04-29 15:58:21 UTC (rev 850)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/SolrResource.java 2011-04-29 18:16:47 UTC (rev 851)
@@ -58,8 +58,11 @@
static private Log log = LogFactory.getLog(SolrResource.class);
protected SolrServer solrServer;
- // FIXME poussin 20110131 est-ce vraiment util d'utiliser des ThreadLocal ?
- // WikittyTransaction est deja un ThreadLocal
+ // On utilise des ThreadLocal pour que chaque thread s'executant ait un
+ // 'context' non partage avec les autres, et que si l'on commit un
+ // seul ces documents soient commite et pas ceux des autres aussi en cours
+ // TODO poussin 20110429 peut-etre revoir ca, pour utilise le threadLocal
+ // de WikittyTransaction pour stocker ces infos
protected ThreadLocal<Map<String, SolrInputDocument>> addedDocs;
protected ThreadLocal<List<String>> deletedDocs;
1
0
Author: mfortun
Date: 2011-04-29 17:58:21 +0200 (Fri, 29 Apr 2011)
New Revision: 850
Url: http://nuiton.org/repositories/revision/wikitty/850
Log:
* cosmetic changes
Modified:
trunk/wikitty-publication/src/site/rst/sync.rst
Modified: trunk/wikitty-publication/src/site/rst/sync.rst
===================================================================
--- trunk/wikitty-publication/src/site/rst/sync.rst 2011-04-29 13:25:31 UTC (rev 849)
+++ trunk/wikitty-publication/src/site/rst/sync.rst 2011-04-29 15:58:21 UTC (rev 850)
@@ -10,17 +10,17 @@
-------------------------------------
Cette nouvelle approche du module wikitty publication, basé sur Rsync, et plus
-un "simple" système de commit/update/import/delete/relocate comme svn, est motivé
-par l'aspect plus généraliste que celà apporte.
+un "simple" système de commit/update/import/delete/relocate comme svn, est
+motivé par l'aspect plus généraliste que celà apporte.
-Cette approche permet de syncrhoniser le contenu de n'importe quel wikitty service
-avec un autre, et donc de redéployer simplement tout les wikittys que l'on souhaite
-d'un wikitty service à un autre.
+Cette approche permet de syncrhoniser le contenu de n'importe quel wikitty
+service avec un autre, et donc de redéployer simplement tout les wikittys que
+l'on souhaite d'un wikitty service à un autre.
-La nature du wikitty service cible importe pas, on peut synchroniser un wikitty service
-sur un file system avec un wikitty service sur un serveur cajo, ou deux wikitty service
-sur des serveurs cajo, cette approche se veut plus universelle. Et pourra être testé justement
-entre deux wikitty service sur serveur.
+La nature du wikitty service cible importe pas, on peut synchroniser un wikitty
+service sur un file system avec un wikitty service sur un serveur cajo, ou deux
+ wikitty service sur des serveurs cajo, cette approche se veut plus universelle.
+Et pourra être testé justement entre deux wikitty service sur serveur.
Définitions
@@ -38,15 +38,16 @@
- Name: correspondant au nom du fichier
- MimeType: crrespondant au type, qui donnera l'extension
- - Content: le contenu binaire pour pour les PubData et textuel pour les PubText
+ - Content: le contenu binaire pour pour les PubData et textuel pour les
+ PubText
-Le mimetype donne l'extention par exemple pour un PubData si on a en mimetype "image/png"
- alors l'extension du fichier associé sera ".png". Dans le cas d'un PubText
-le mimetype donnera l'extension et le langage de la source par exemple si on a
-en mimetype "application/javascript" le langage est javascript et l'extension
-sera donc ".js".
+Le mimetype donne l'extention par exemple pour un PubData si on a en mimetype
+"image/png" alors l'extension du fichier associé sera ".png". Dans le cas d'un
+PubText le mimetype donnera l'extension et le langage de la source par exemple
+si on a en mimetype "application/javascript" le langage est javascript et
+l'extension sera donc ".js".
A ces objets wikitty on associe un wikittyLabel, c'est un objet qui peut
contenir un ensemble de label différent, un label par exemple
@@ -77,22 +78,22 @@
l'on aura transformé en fichier, celà pour une synchronisation ultérieure avec un
autre wikitty service.
-On conservera trace ausi dans ce même fichier de propriété du label courant, permettant
-de ne pas faire d'opération "complexes" et pénible sur les noms de fichier afin de retrouver
-le label de travail. Conserver trace du label actuel à l'avantage de n'avoir pas
-besoin de rechercher dans l'arborescence la première occurence du fichier de propriété
-pour pouvoir reconstituer le label complet.
+On conservera trace ausi dans ce même fichier de propriété du label courant,
+permettant de ne pas faire d'opération "complexes" et pénible sur les noms de
+fichier afin de retrouver le label de travail. Conserver trace du label actuel à
+l'avantage de n'avoir pas besoin de rechercher dans l'arborescence la première
+occurence du fichier de propriété pour pouvoir reconstituer le label complet.
-On distinguera deux fichiers de propriétés pour les informations un qui conservera
-les id des wikitty lié à leur nom de fichier. Et un autre fichiers de propriété
-qui conservera un checksum, la version et les id aussi.
+On distinguera deux fichiers de propriétés pour les informations un qui
+conservera les id des wikitty lié à leur nom de fichier. Et un autre fichiers de
+propriété qui conservera un checksum, la version et les id aussi.
-On conserve les id dans un premier fichier puisque celà permet simplement de récupérer
-l'ensemble des id et leurs noms de fichier lié sans avoir besoin de faire le tri
-parmis toutes les propriétés enregistrées. On converse l'id aussi dans un autre fichier de
-propriété, à défaut d'avoir un system de type bidimap pour les proriétés, celà permet
-de récupérer l'id d'un wikitty à partir de son nom de fichier, et inversement du nom de fichier
-à l'id.
+On conserve les id dans un premier fichier puisque celà permet simplement de
+récupérer l'ensemble des id et leurs noms de fichier lié sans avoir besoin de
+faire le tri parmis toutes les propriétés enregistrées. On converse l'id aussi
+dans un autre fichier de propriété, à défaut d'avoir un system de type bidimap
+pour les proriétés, celà permet de récupérer l'id d'un wikitty à partir de son
+nom de fichier, et inversement du nom de fichier à l'id.
La propriété checksum sera utilisée pour enregistrer la somme de controle de
l'objet lors de son enregistrement, pour plus tard, savoir si celui ci à été
@@ -149,14 +150,14 @@
---------------------------
Un tel service devra fournir les méthodes suivantes les méthodes de sauvegarde
-des wikitty, de restauration, ainsi qu'un certain nombre de fonctionnalités concernant
-les recherches de wikitty.
+des wikitty, de restauration, ainsi qu'un certain nombre de fonctionnalités
+concernant les recherches de wikitty.
Le wikitty service sur file system prendra en charge les recherches sur critéria
-de façon compléte. A chaque recherche sur le wikitty service file system, il faudra
-indexer les nouveaux wikitty, enlever les property des fichiers/wikitty supprimé,
-incrémenter la version mineur si il y a eut des modifications depuis la dernière
-indexation.
+de façon compléte. A chaque recherche sur le wikitty service file system,
+il faudra indexer les nouveaux wikitty, enlever les property des
+fichiers/wikitty supprimé, incrémenter la version mineur si il y a eut des
+modifications depuis la dernière indexation.
Fonctionnalités
@@ -167,28 +168,30 @@
Définitions
***********
-La fonctionnalité CP permet de transférer l'ensemble des wikittys ciblés par l'uri,
-d'un service wikitty à un autre. Son fonctionnement doit être similaire à la commande
-linux "rsync".
+La fonctionnalité CP permet de transférer l'ensemble des wikittys ciblés par
+l'uri, d'un service wikitty à un autre. Son fonctionnement doit être similaire à
+ la commande linux "rsync".
On reprendra donc quelques options comme:
- Recursion pour savoir si l'on s'occupe des sous labels du label ciblé.
- Update, qui permettra de mettre à jour ce qui est présent et antérieur
sur la cible et d'y envoyer les nouveaux wikitty. Par défaut cette option
- sera active, et sera desactivée lorsque les autres option (delete ou existing)
- seront choisis.
+ sera active, et sera desactivée lorsque les autres options (delete ou
+ existing) seront choisis.
- Existing qui est un update mais sans l'envois des nouveaux fichiers, on
- envois juste ce qui à été mis à jour et qui existe sur le wikitty service cible.
+ envois juste ce qui à été mis à jour et qui existe sur le wikitty service
+ cible.
- Delete pour supprimer dans le wikitty cible, ce qui n'existe plus dans le
wikitty origine.
-La suppression n'est pas une vraie suppression elle se contente de supprimer le label
-ciblé du wikitty.
+La suppression n'est pas une vraie suppression elle se contente de supprimer le
+label ciblé du wikitty, sauf le cas d'un wikitty publication file system où il
+s'agira de la suppresion du fichier et des informations du wikitty.
-En fonction des uris des wikitty services ciblé par la fonction, une implémentation
-différente de service wikitty sera instancié, en fonction des protocoles (file, hessian
-ou cajo).
+En fonction des uris des wikitty services ciblé par la fonction, une
+implémentation différente de service wikitty sera instancié, en fonction des
+protocoles (file, hessian ou cajo).
Prototype commande
@@ -209,8 +212,8 @@
conservé, c'est à dire que des wikitties de la cible si ils ont besoin de se
mettre à jour, leurs labels seront conservés.
Dans le cas de wikitty qui n'existe pas dans la cible, on remplacera le label
-origine qui à permis de trouver ces wikitties et le remplacer par le label cible,
-les autres labels du wikitty seront transmit.
+origine qui à permis de trouver ces wikitties et le remplacer par le label
+cible, les autres labels du wikitty seront transmit.
Commit/update
@@ -219,17 +222,20 @@
Définitions
***********
-On va conserver des fonctionnalités de type commit/update, l'utilisation de ces fonctions
-nécessitera un "repository" wikitty publication file system existant dans l'arborescence.
-Le but de ces fonctionnalités est de faire des Sync avec un autre wikitty service sans
-avoir besoin de redonner sont adresse explicitement à chaque fois avec la commande sync.
+On va conserver des fonctionnalités de type commit/update, l'utilisation de ces
+fonctions nécessitera un "repository" wikitty publication file system existant
+dans l'arborescence. Le but de ces fonctionnalités est de faire des Sync avec un
+autre wikitty service sans avoir besoin de redonner sont adresse explicitement à
+chaque fois avec la commande sync.
-Un commit sera équivalent à un sync du "reposistory" local vers un autre wikitty service.
-Un update sera équivalent à un sync d'un autre wikitty service vers le repositotory local.
+Un commit sera équivalent à un sync du "reposistory" local vers un autre wikitty
+service. Un update sera équivalent à un sync d'un autre wikitty service vers le
+repositotory local.
-Pour ce faire dans le dossier racine qui contient l'arborescence des wikitty sous forme de fichier
-on enregistrera dans un dossier ".wp" un fichier "ws.properties" qui contiendra l'adresse
-du dernier wikitty service utilisé pour faire un sync.
+Pour ce faire dans le dossier racine qui contient l'arborescence des wikitty
+sous forme de fichier on enregistrera dans un dossier ".wp" un fichier
+"ws.properties" qui contiendra l'adresse du dernier wikitty service utilisé pour
+faire un sync.
Prototype commande
@@ -237,7 +243,8 @@
''wp [update|commit] [--norecursion] [--delete|--existing] [label] [URI file]''
-L'URI file est optionnelle, si pas précisée on va commit/update le dossier local.
+L'URI file est optionnelle, si pas précisée on va commit/update le dossier
+courrant.
-Pour le commit update, on doit forcément préciser le label pour le wikitty service cible,
-celà pour permettre de commit ou update au bon endroit.
+Pour le commit update, on doit forcément préciser le label pour le wikitty
+service cible, celà pour permettre de commit ou update au bon endroit.
1
0
Author: mfortun
Date: 2011-04-29 15:25:31 +0200 (Fri, 29 Apr 2011)
New Revision: 849
Url: http://nuiton.org/repositories/revision/wikitty/849
Log:
* complete the specs about the label for the commit/update operation
Modified:
trunk/wikitty-publication/src/site/rst/sync.rst
Modified: trunk/wikitty-publication/src/site/rst/sync.rst
===================================================================
--- trunk/wikitty-publication/src/site/rst/sync.rst 2011-04-29 12:26:10 UTC (rev 848)
+++ trunk/wikitty-publication/src/site/rst/sync.rst 2011-04-29 13:25:31 UTC (rev 849)
@@ -235,7 +235,9 @@
Prototype commande
******************
-''wp [update|commit] [--norecursion] [--delete|--existing] [URI file]''
+''wp [update|commit] [--norecursion] [--delete|--existing] [label] [URI file]''
L'URI file est optionnelle, si pas précisée on va commit/update le dossier local.
+Pour le commit update, on doit forcément préciser le label pour le wikitty service cible,
+celà pour permettre de commit ou update au bon endroit.
1
0
r848 - trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro
by mfortun@users.nuiton.org 29 Apr '11
by mfortun@users.nuiton.org 29 Apr '11
29 Apr '11
Author: mfortun
Date: 2011-04-29 14:26:10 +0200 (Fri, 29 Apr 2011)
New Revision: 848
Url: http://nuiton.org/repositories/revision/wikitty/848
Log:
* add a method that print wikitty publication usage
Modified:
trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java
Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java
===================================================================
--- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java 2011-04-29 12:20:25 UTC (rev 847)
+++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java 2011-04-29 12:26:10 UTC (rev 848)
@@ -541,7 +541,6 @@
String wikittyServiceInter = "";
String wikittyServiceFileSystem = "";
-
String labelInitial = "";
PropertiesExtended homeProperty = null;
@@ -575,7 +574,7 @@
wikittyServiceFileSystem = "file://"
+ homePropertyDir.getAbsolutePath() + "#" + labelCurrent;
labelInitial = homeProperty.getProperty(LABEL_KEY);
-
+
wikittyServiceInter += "#" + label
+ labelCurrent.replaceFirst(labelInitial, "");
@@ -601,7 +600,7 @@
.get(WIKITTY_SERVICE_INTERLOCUTEUR);
labelInitial = homeProperty.getProperty(LABEL_KEY);
-
+
wikittyServiceInter += "#" + label
+ originUri.getFragment().replaceFirst(labelInitial, "");
@@ -632,8 +631,23 @@
} else {
synchronisation(wikittyServiceInter, wikittyServiceFileSystem);
}
-
+
}
+ static public void usage() {
+ System.out.println("");
+
+ String usage = "Usage"
+ + "\n"
+ + "''wp sync [--norecursion] "
+ + "[--delete|--existing] [URI origin] [URI target]''"
+ + "\n \nwith URI :\n"
+ + "file:///truc/machin/#label\n"
+ + "hessian://www.adresse.com:8827/etc/etc#label\n"
+ + "cajo://www.adresse.com:8827/etc/etc#label"
+ + " \n\n or: \n"
+ + "''wp [update|commit] [--norecursion] [--delete|--existing] [URI file]''";
+ System.out.println(usage);
+ }
}
1
0
r847 - trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro
by mfortun@users.nuiton.org 29 Apr '11
by mfortun@users.nuiton.org 29 Apr '11
29 Apr '11
Author: mfortun
Date: 2011-04-29 14:20:25 +0200 (Fri, 29 Apr 2011)
New Revision: 847
Url: http://nuiton.org/repositories/revision/wikitty/847
Log:
* change commit update signature, add a label param
Modified:
trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java
Modified: trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java
===================================================================
--- trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java 2011-04-29 10:33:12 UTC (rev 846)
+++ trunk/wikitty-publication/src/main/java/org/nuiton/wikitty/publication/synchro/WikittyPublication.java 2011-04-29 12:20:25 UTC (rev 847)
@@ -96,6 +96,10 @@
*/
static public String LABEL_KEY = "working.label";
+ /**
+ *
+ */
+
/*
* Class don't have to be instantiate
*/
@@ -183,7 +187,8 @@
*/
// once on the service origin
- applicationConfig.setOption(WIKITTY_SERVICE_INTERLOCUTEUR, target);
+ applicationConfig.setOption(WIKITTY_SERVICE_INTERLOCUTEUR, new String(
+ target.replaceAll("\\#.*", "")));
ApplicationConfig temp1 = setUpApplicationConfigServerConnector(uriOrigin);
@@ -193,7 +198,8 @@
// store the other uri in the application, if the service is a
// wikittypublication file system
// it can need it to store wikittyservice property
- applicationConfig.setOption(WIKITTY_SERVICE_INTERLOCUTEUR, origin);
+ applicationConfig.setOption(WIKITTY_SERVICE_INTERLOCUTEUR, new String(
+ origin.replaceAll("\\#.*", "")));
// once on the service target
ApplicationConfig temp2 = setUpApplicationConfigServerConnector(uriTarget);
@@ -419,9 +425,9 @@
.criteria();
}
-
+
log.debug(criteriaOnLabels);
-
+
return criteriaOnLabels;
}
@@ -454,13 +460,13 @@
"org.nuiton.wikitty.services.WikittyServiceCajoClient");
// remove fragment from the uri.
- url = url.replaceAll("\\#.*", "");
+ url = new String(url.replaceAll("\\#.*", ""));
} else if (uri.getScheme().equals("hessian")) {
result.setOption(WIKITTY_OPTION_COMPONENT,
"org.nuiton.wikitty.services.WikittyServiceHessianClient");
// remove fragment from the uri.
- url = url.replaceAll("\\#.*", "");
+ url = new String(url.replaceAll("\\#.*", ""));
}
// set protocol to http, no use finally
@@ -479,23 +485,25 @@
}
- static public void update(String... uriFileSystem) throws Exception {
+ static public void update(String label, String... uriFileSystem)
+ throws Exception {
// only difference between update and commit is the param's order
// when calling synchronisation method
- commitUpdateDelegate(false, uriFileSystem);
+ commitUpdateDelegate(label, false, uriFileSystem);
}
- static public void commit(String... uriFileSystem) throws Exception {
+ static public void commit(String label, String... uriFileSystem)
+ throws Exception {
// only difference between update and commit is the param's order
// when calling synchronisation method
- commitUpdateDelegate(true, uriFileSystem);
+ commitUpdateDelegate(label, true, uriFileSystem);
}
- protected static void commitUpdateDelegate(boolean isCommit,
+ static protected void commitUpdateDelegate(String label, boolean isCommit,
String... uriFileSystem) throws Exception {
File currentDir = new File(FileUtil.getCurrentDirectory()
@@ -533,7 +541,7 @@
String wikittyServiceInter = "";
String wikittyServiceFileSystem = "";
- String wikittyServiceInterSave = "";
+
String labelInitial = "";
PropertiesExtended homeProperty = null;
@@ -567,8 +575,9 @@
wikittyServiceFileSystem = "file://"
+ homePropertyDir.getAbsolutePath() + "#" + labelCurrent;
labelInitial = homeProperty.getProperty(LABEL_KEY);
- wikittyServiceInterSave = wikittyServiceInter;
- wikittyServiceInter += labelCurrent.replaceFirst(labelInitial, "");
+
+ wikittyServiceInter += "#" + label
+ + labelCurrent.replaceFirst(labelInitial, "");
break;
// if a param is set it mean that the uri of the File system is set
@@ -592,9 +601,9 @@
.get(WIKITTY_SERVICE_INTERLOCUTEUR);
labelInitial = homeProperty.getProperty(LABEL_KEY);
- wikittyServiceInterSave = wikittyServiceInter;
- wikittyServiceInter += originUri.getFragment().replaceFirst(
- labelInitial, "");
+
+ wikittyServiceInter += "#" + label
+ + originUri.getFragment().replaceFirst(labelInitial, "");
break;
@@ -623,12 +632,8 @@
} else {
synchronisation(wikittyServiceInter, wikittyServiceFileSystem);
}
- // FIXME mfortun-2011-04-28 find a better way to do this, it's needed
- // because of the labels and how construct label for the wikitty service
- // interlocuteur
- homeProperty.setProperty(WIKITTY_SERVICE_INTERLOCUTEUR,
- wikittyServiceInterSave);
- homeProperty.store();
+
}
+
}
1
0