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
September 2010
- 6 participants
- 98 discussions
r348 - in trunk/wikitty-jdbc-impl/src/main: java/org/nuiton/wikitty/jdbc resources
by echatellier@users.nuiton.org 27 Sep '10
by echatellier@users.nuiton.org 27 Sep '10
27 Sep '10
Author: echatellier
Date: 2010-09-27 16:39:06 +0200 (Mon, 27 Sep 2010)
New Revision: 348
Url: http://nuiton.org/repositories/revision/wikitty/348
Log:
Clear deletionDate column during store
Modified:
trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
trunk/wikitty-jdbc-impl/src/main/resources/wikitty-jdbc-query.properties
Modified: trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
===================================================================
--- trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2010-09-27 08:59:55 UTC (rev 347)
+++ trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2010-09-27 14:39:06 UTC (rev 348)
@@ -274,7 +274,7 @@
// update extensions in wikitty object
String q = conf.getProperty(QUERY_UPDATE_WIKITTY_ADMIN);
- doQuery(connection, q, newVersion, extensionList, wikitty.getId());
+ doQuery(connection, q, newVersion, extensionList, null, wikitty.getId());
wikitty.setVersion(newVersion);
wikitty.clearDirty();
Modified: trunk/wikitty-jdbc-impl/src/main/resources/wikitty-jdbc-query.properties
===================================================================
--- trunk/wikitty-jdbc-impl/src/main/resources/wikitty-jdbc-query.properties 2010-09-27 08:59:55 UTC (rev 347)
+++ trunk/wikitty-jdbc-impl/src/main/resources/wikitty-jdbc-query.properties 2010-09-27 14:39:06 UTC (rev 348)
@@ -62,7 +62,7 @@
(id, version, extension_list) VALUES (?, ?, ?);
#wikitty update in the admin table query
jdbc.queries.update.wikitty.admin=UPDATE wikitty_admin \
-SET version = ?, extension_list = ? WHERE id = ?;
+SET version = ?, extension_list = ?, deletionDate = ? WHERE id = ?;
#wikitty insertion in the data table query
jdbc.queries.insert.wikitty.data=INSERT INTO wikitty_data\
(id, fieldName, %s) VALUES (?, ?, ?);
1
0
27 Sep '10
Author: echatellier
Date: 2010-09-27 10:59:55 +0200 (Mon, 27 Sep 2010)
New Revision: 347
Url: http://nuiton.org/repositories/revision/wikitty/347
Log:
Rename TreeNode#children to "attachment"
Added:
trunk/src/site/rst/changes.rst
Removed:
trunk/src/site/rst/gwt.rst
Modified:
trunk/src/site/site.xml
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java
trunk/wikitty-api/src/main/xmi/wikitty.zargo
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/conform/StorageTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/importexport/ImportExportCSVTest.java
trunk/wikitty-api/src/test/resources/csv/importtree.csv
trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/TreeTest.java
Added: trunk/src/site/rst/changes.rst
===================================================================
--- trunk/src/site/rst/changes.rst (rev 0)
+++ trunk/src/site/rst/changes.rst 2010-09-27 08:59:55 UTC (rev 347)
@@ -0,0 +1,14 @@
+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/gwt.rst
===================================================================
--- trunk/src/site/rst/gwt.rst 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/src/site/rst/gwt.rst 2010-09-27 08:59:55 UTC (rev 347)
@@ -1,12 +0,0 @@
-Probleme
-========
-
-GWT ne support pas:
-- BigDecimal
- le plus gros probleme
-- PropertyChangeSupport
- normalement il est possible de l'utiliser en ajouter des choses a GWT (voir avec Nicolas C.)
-- Pattern
- a ete deplace dans des methodes util
-- String.format
- peut-etre remplace par une methode util dans wikitty car seulement utilise pour les messages d'erreur avec des arguments (donc toString sur les arguments si non null)
Modified: trunk/src/site/site.xml
===================================================================
--- trunk/src/site/site.xml 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/src/site/site.xml 2010-09-27 08:59:55 UTC (rev 347)
@@ -11,9 +11,9 @@
<body>
<menu name="Overview">
<item name="Accueil" href="index.html"/>
+ <item name="Changes" href="changes.html"/>
<item name="Migration" href="migration.html"/>
<item name="Hessian" href="hessian.html"/>
- <item name="GWT problem" href="gwt.html"/>
<item name="TODO" href="todo.html"/>
</menu>
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-09-27 08:59:55 UTC (rev 347)
@@ -535,14 +535,14 @@
}
// Store node with have deleted child
- criteria = Search.query().eq(TreeNode.FQ_FIELD_TREENODE_CHILDREN, id).criteria();
+ criteria = Search.query().eq(TreeNode.FQ_FIELD_TREENODE_ATTACHMENT, id).criteria();
wikittyNodesId = findAllByCriteria(
securityToken, transaction, criteria).getAll();
for (String wikittyNodeId : wikittyNodesId) {
if(!ids.contains(wikittyNodeId)) {
Wikitty treeNode = restore(
securityToken, transaction, wikittyNodeId);
- TreeNodeHelper.removeChildren(treeNode, id);
+ TreeNodeHelper.removeAttachment(treeNode, id);
storedWikitties.add(treeNode);
}
}
Modified: trunk/wikitty-api/src/main/xmi/wikitty.zargo
===================================================================
(Binary files differ)
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java 2010-09-27 08:59:55 UTC (rev 347)
@@ -425,6 +425,6 @@
WikittyExtension wikittyExtension = TreeNodeAbstract.extensionTreeNode;
Assert.assertEquals(TYPE.WIKITTY, wikittyExtension.getFieldType(TreeNode.FIELD_TREENODE_PARENT).getType());
Assert.assertEquals(TYPE.STRING, wikittyExtension.getFieldType(TreeNode.FIELD_TREENODE_NAME).getType());
- Assert.assertEquals(TYPE.WIKITTY, wikittyExtension.getFieldType(TreeNode.FIELD_TREENODE_CHILDREN).getType());
+ Assert.assertEquals(TYPE.WIKITTY, wikittyExtension.getFieldType(TreeNode.FIELD_TREENODE_ATTACHMENT).getType());
}
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/conform/StorageTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/conform/StorageTest.java 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/conform/StorageTest.java 2010-09-27 08:59:55 UTC (rev 347)
@@ -467,7 +467,7 @@
}
fail( "Unable to find node " + nodeName + " inside " + currentNode.getName() );
}
- currentNode.addChildren( wikitty.getId() );
+ currentNode.addAttachment(wikitty.getId());
ws.store(null, currentNode.getWikitty());
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/importexport/ImportExportCSVTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/importexport/ImportExportCSVTest.java 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/importexport/ImportExportCSVTest.java 2010-09-27 08:59:55 UTC (rev 347)
@@ -182,7 +182,7 @@
PagedResult<TreeNode> pagedResult3 = proxy.findAllByCriteria(TreeNode.class, criteria3);
Assert.assertEquals(1, pagedResult3.getNumFound());
TreeNode myTreeNode = pagedResult3.getFirst();
- Assert.assertEquals(1, myTreeNode.getChildren().size());
+ Assert.assertEquals(1, myTreeNode.getAttachment().size());
// test des requetes imbriquées
Criteria criteria4 = Search.query().eq(TreeNode.FQ_FIELD_TREENODE_PARENT, myTreeNode.getWikittyId()).criteria();
Modified: trunk/wikitty-api/src/test/resources/csv/importtree.csv
===================================================================
--- trunk/wikitty-api/src/test/resources/csv/importtree.csv 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-api/src/test/resources/csv/importtree.csv 2010-09-27 08:59:55 UTC (rev 347)
@@ -1,3 +1,3 @@
-"Wikitty.Id","Wikitty.Ext","TreeNode.name","TreeNode.parent","TreeNode.children"
+"Wikitty.Id","Wikitty.Ext","TreeNode.name","TreeNode.parent","TreeNode.attachment"
"4f6fc798-41f8-48d7-9398-119ef6ab02b6",,"MyRootNode",,
"1142aa4c-af5a-4264-9918-9f72d9ef9d59","Tag","MyTreeNode","4f6fc798-41f8-48d7-9398-119ef6ab02b6","(fbcc8aed-7f67-4e3c-a9aa-221373765f8d),(677ee1e7-239f-416c-a353-6e56bc0451e2)"
Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
===================================================================
--- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-27 08:59:55 UTC (rev 347)
@@ -180,51 +180,51 @@
parents = new HashMap<String, String>();
}
- public void putIncludedChildren(String nodeId, Collection<String> childIds) {
- putChildren(includedNodeIds, nodeId, childIds);
+ public void putIncludedAttachments(String nodeId, Collection<String> attchmentIds) {
+ putAttachements(includedNodeIds, nodeId, attchmentIds);
}
- public void putExcludedChildren(String nodeId, Collection<String> childIds) {
- putChildren(excludedNodeIds, nodeId, childIds);
+ public void putExcludedAttachments(String nodeId, Collection<String> attachmentIds) {
+ putAttachements(excludedNodeIds, nodeId, attachmentIds);
}
- public void putIncludedChild(String nodeId, String childId) {
- putChild(includedNodeIds, nodeId, childId);
+ public void putIncludedAttachment(String nodeId, String attachmentId) {
+ putAttachment(includedNodeIds, nodeId, attachmentId);
}
- public void putExcludedChild(String nodeId, String childId) {
- putChild(excludedNodeIds, nodeId, childId);
+ public void putExcludedAttachment(String nodeId, String attachmentId) {
+ putAttachment(excludedNodeIds, nodeId, attachmentId);
}
- public Collection<String> getExcludedNodeIds(String childId) {
- Collection<String> result = excludedNodeIds.get(childId);
- if(result == null) {
+ public Collection<String> getExcludedNodeIds(String attachmentId) {
+ Collection<String> result = excludedNodeIds.get(attachmentId);
+ if (result == null) {
result = new HashSet<String>();
}
return result;
}
- public Collection<String> getIncludedNodeIds(String childId) {
- Collection<String> result = includedNodeIds.get(childId);
- if(result == null) {
+ public Collection<String> getIncludedNodeIds(String attachmentId) {
+ Collection<String> result = includedNodeIds.get(attachmentId);
+ if (result == null) {
result = new HashSet<String>();
}
return result;
}
- protected void putChildren(Map<String, Collection<String>> map, String nodeId, Collection<String> childIds) {
- if(childIds != null) {
- for (String childId : childIds) {
- putChild(map, nodeId, childId);
+ protected void putAttachements(Map<String, Collection<String>> map, String nodeId, Collection<String> attachmentIds) {
+ if (attachmentIds != null) {
+ for (String attachmentId : attachmentIds) {
+ putAttachment(map, nodeId, attachmentId);
}
}
}
- protected void putChild(Map<String, Collection<String>> map, String nodeId, String childId) {
- Collection<String> values = map.get(childId);
+ protected void putAttachment(Map<String, Collection<String>> map, String nodeId, String attachmentId) {
+ Collection<String> values = map.get(attachmentId);
if(values == null) {
values = new HashSet<String>();
- map.put(childId, values);
+ map.put(attachmentId, values);
}
values.add(nodeId);
}
@@ -310,7 +310,7 @@
Collection<String> excludedChildNodeIds = getExcludedNodeIds(id);
// Find all node contain child
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + TreeNode.FQ_FIELD_TREENODE_CHILDREN + ":" + id);
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + TreeNode.FQ_FIELD_TREENODE_ATTACHMENT + ":" + id);
QueryResponse response = solrServer.query(query);
SolrDocumentList updateDocs = response.getResults();
@@ -519,24 +519,24 @@
for (Wikitty w : wikitties) {
String id = w.getId();
- if(w.hasExtension(TreeNode.EXT_TREENODE)) {
+ if (w.hasExtension(TreeNode.EXT_TREENODE)) {
- Set<String> children = w.getFieldAsSet(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, String.class);
- reindexChildTreeNode.putIncludedChildren(id, children);
+ Set<String> attachments = w.getFieldAsSet(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, String.class);
+ reindexChildTreeNode.putIncludedAttachments(id, attachments);
// Search deleted children
SolrDocument treeNodeDoc = findById(id);
- if(treeNodeDoc != null) {
- Collection oldChildren = treeNodeDoc.getFieldValues(TreeNode.FQ_FIELD_TREENODE_CHILDREN);
- if(oldChildren != null) {
+ if (treeNodeDoc != null) {
+ Collection oldAttachments = treeNodeDoc.getFieldValues(TreeNode.FQ_FIELD_TREENODE_ATTACHMENT);
+ if (oldAttachments != null) {
// if no more children, remove all old children
- if(children == null) {
- reindexChildTreeNode.putExcludedChildren(id, oldChildren);
+ if(attachments == null) {
+ reindexChildTreeNode.putExcludedAttachments(id, oldAttachments);
} else {
// exclude only the removed children
- for (Object oldChild : oldChildren) {
- if(!children.contains(oldChild)) {
- reindexChildTreeNode.putExcludedChild(id,(String) oldChild);
+ for (Object oldAttachment : oldAttachments) {
+ if(!attachments.contains(oldAttachment)) {
+ reindexChildTreeNode.putExcludedAttachment(id,(String) oldAttachment);
}
}
}
@@ -580,7 +580,7 @@
for (Iterator<SolrDocument> iterator = updateDocs.iterator(); iterator.hasNext();) {
SolrDocument solrDocument = iterator.next();
String childId = (String) solrDocument.getFieldValue(SOLR_ID);
- reindexChildTreeNode.putExcludedChild(id, childId);
+ reindexChildTreeNode.putExcludedAttachment(id, childId);
}
solrResource.deleteDoc(id);
Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/TreeTest.java
===================================================================
--- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/TreeTest.java 2010-09-27 08:53:29 UTC (rev 346)
+++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/TreeTest.java 2010-09-27 08:59:55 UTC (rev 347)
@@ -133,7 +133,7 @@
Wikitty node = findNode(nodeName);
assertNotNull(node);
- node.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, leaf.getId());
+ node.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, leaf.getId());
ws.store(null, node);
}
@@ -163,7 +163,7 @@
// Sum value in node
Set<String> values = node.getFieldAsSet(TreeNode.EXT_TREENODE,
- TreeNode.FIELD_TREENODE_CHILDREN, String.class);
+ TreeNode.FIELD_TREENODE_ATTACHMENT, String.class);
if(values != null) {
sum = values.size();
}
@@ -292,7 +292,7 @@
// Add it in the node2 (now: two values in it)
Wikitty node = findNode("node2");
assertNotNull(node);
- node.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, leaf.getId());
+ node.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, leaf.getId());
ws.store(null, node);
// now, there is one more value for the root node
@@ -343,8 +343,8 @@
// Remove a value on node2
Wikitty node = findNode("node11");
- List<String> leafs = node.getFieldAsList(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, String.class);
- node.removeFromField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, leafs.get(0));
+ List<String> leafs = node.getFieldAsList(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, String.class);
+ node.removeFromField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, leafs.get(0));
ws.store(null, node);
// now, there is one more value for the root node
@@ -405,11 +405,11 @@
String valueId = value.getId();
Wikitty node31 = findNode("node31");
- node31.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, valueId);
+ node31.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, valueId);
ws.store(null, node31);
Wikitty node32 = findNode("node32");
- node32.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_CHILDREN, valueId);
+ node32.addToField(TreeNode.EXT_TREENODE, TreeNode.FIELD_TREENODE_ATTACHMENT, valueId);
ws.store(null, node32);
Wikitty node3 = findNode("node3");
1
0
r346 - in trunk/wikitty-api/src: main/java/org/nuiton/wikitty test/java/org/nuiton/wikitty test/java/org/nuiton/wikitty/layers
by bleny@users.nuiton.org 27 Sep '10
by bleny@users.nuiton.org 27 Sep '10
27 Sep '10
Author: bleny
Date: 2010-09-27 10:53:29 +0200 (Mon, 27 Sep 2010)
New Revision: 346
Url: http://nuiton.org/repositories/revision/wikitty/346
Log:
start implementing security layer
Added:
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/AbstractWikittyServiceTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceSecurityTest.java
Removed:
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/cache/
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/Wikitty.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCopyOnWrite.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImpl.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/Wikitty.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/Wikitty.java 2010-09-27 08:49:33 UTC (rev 345)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/Wikitty.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -36,6 +36,24 @@
void addExtension(List<WikittyExtension> exts);
+ /**
+ * add a meta-extension about the given extension to this wikitty
+ * @param metaExtension the metaExtension to add
+ * @param extension an extension already added to the wikitty
+ * @since 2.1
+ */
+ void addMetaExtension(WikittyExtension metaExtension,
+ WikittyExtension extension);
+
+
+ /**
+ * add a meta-extension on the given extension to this wikitty
+ * @param metaExtension the metaExtension to add
+ * @param extensionFqn the name of the extension already added to the wikitty
+ * @since 2.1
+ */
+ void addMetaExtension(WikittyExtension metaExtension, String extensionFqn);
+
boolean hasExtension(String extName);
boolean hasField(String extName, String fieldName);
@@ -137,6 +155,8 @@
boolean isEmpty();
- Wikitty clone() throws CloneNotSupportedException;
+ Wikitty clone() throws CloneNotSupportedException;
+
+
}
\ No newline at end of file
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCopyOnWrite.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCopyOnWrite.java 2010-09-27 08:49:33 UTC (rev 345)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyCopyOnWrite.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -249,5 +249,25 @@
public boolean isEmpty() {
return target.isEmpty();
}
+
+ /**
+ * @see org.nuiton.wikitty.Wikitty#addMetaExtension(WikittyExtension, WikittyExtension)
+ */
+ @Override
+ public void addMetaExtension(WikittyExtension metaExtension,
+ WikittyExtension extension) {
+ substituteTargetWithCopy();
+ target.addMetaExtension(metaExtension, extension);
+ }
+
+ /**
+ * @see org.nuiton.wikitty.Wikitty#addMetaExtension(WikittyExtension, String)
+ */
+ @Override
+ public void addMetaExtension(WikittyExtension metaExtension,
+ String extensionFqn) {
+ substituteTargetWithCopy();
+ target.addMetaExtension(metaExtension, extensionFqn);
+ }
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImpl.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImpl.java 2010-09-27 08:49:33 UTC (rev 345)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyImpl.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -208,7 +208,32 @@
}
extensions.put(ext.name, ext);
}
+
+ /**
+ * @see org.nuiton.wikitty.Wikitty#addMetaExtension(WikittyExtension, WikittyExtension)
+ */
+ @Override
+ public void addMetaExtension(WikittyExtension metaExtension,
+ WikittyExtension extension) {
+ addMetaExtension(metaExtension, extension.getName());
+ }
+ /**
+ * @see org.nuiton.wikitty.Wikitty#addMetaExtension(WikittyExtension, String)
+ */
+ @Override
+ public void addMetaExtension(WikittyExtension metaExtension, String extensionFqn) {
+ if (hasExtension(extensionFqn)) {
+ extensions.put( String.format("%s:%s",
+ extensionFqn,
+ metaExtension.getName()),
+ metaExtension);
+ // add field
+ } else {
+ throw new IllegalArgumentException("this wikitty doesn't have an extension named " + extensionFqn);
+ }
+ }
+
/*
* @see org.nuiton.wikitty.Wikitty#addExtension(java.util.List)
*/
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java 2010-09-27 08:49:33 UTC (rev 345)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -1,27 +1,10 @@
-/* *##%
- * Copyright (c) 2010 poussin. All rights reserved.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU 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 Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *##%*/
-
package org.nuiton.wikitty;
import static org.nuiton.i18n.I18n._;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -52,9 +35,40 @@
/** cache de l'id du groupe AppAdmin */
transient protected String appAdminGroupId = null;
+ public static final String APPADMIN_LOGIN = "root";
+ // TODO 20100826 bleny look for password in a config file
+ public static final String APPADMIN_PASSWORD = "toto";
+
public WikittyServiceSecurity(WikittyService ws) {
this.ws = ws;
+
+ Wikitty appAdminGroup = getAppAdminGroup(null);
+
+ if (WikittyGroupHelper.getMembers(appAdminGroup) == null) {
+ // first time boot
+ ws.storeExtension(null, WikittyUserAbstract.extensions);
+ ws.storeExtension(null, SecurityTokenAbstract.extensions);
+ ws.storeExtension(null, WikittyGroupAbstract.extensions);
+
+ // create the appAdmin account
+ Wikitty appAdmin = new WikittyImpl();
+ WikittyUserHelper.addExtension(appAdmin);
+ WikittyUserHelper.setLogin(appAdmin, APPADMIN_LOGIN);
+ WikittyUserHelper.setPassword(appAdmin, APPADMIN_PASSWORD);
+ ws.store(null, appAdmin);
+
+ // add APPADMIN_LOGIN to AppAdmin group
+ WikittyGroupHelper.addMembers(appAdminGroup, appAdmin.getId());
+ ws.store(null, appAdminGroup);
+
+ // login as admin to add some security polices
+ String adminToken = login(APPADMIN_LOGIN, APPADMIN_PASSWORD);
+
+ // FIXME 20100923 bleny make all tokens unwritable, except for app admin
+
+ logout(adminToken);
+ }
}
@Override
@@ -69,21 +83,65 @@
@Override
public String login(String login, String password) {
- String token = WikittyUtil.genSecurityToken();
- Wikitty wToken = new WikittyImpl(token);
- // force add extension to wikitty
- SecurityTokenHelper.addExtension(wToken);
- // on passe token comme securityToken, mais il ne me semble pas
- // que ce soit tres utile, mais comme ca c'est uniform
- ws.store(null, wToken);
- return token;
+ Wikitty user = ws.findByCriteria(null, Search.query().eq(
+ WikittyUser.FQ_FIELD_WIKITTYUSER_LOGIN, login).criteria());
+ if (user == null) {
+ throw new IllegalArgumentException(String.format("no such account '%s'", login));
+ } else {
+ // check password is valid
+ if (WikittyUserHelper.getPassword(user).equals(password)) {
+ String tokenId = WikittyUtil.genSecurityTokenId();
+ Wikitty wikittyToken = new WikittyImpl(tokenId);
+ // force add extension to wikitty
+ SecurityTokenHelper.addExtension(wikittyToken);
+ SecurityTokenHelper.setUser(wikittyToken, user.getId());
+ ws.store(null, wikittyToken);
+ log.debug(String.format("token '%s' is for login '%s'",
+ tokenId, login));
+ return tokenId;
+ } else {
+ throw new SecurityException("bad password");
+ }
+ }
}
+
+ public void createAccount(String securityToken, String login, String password) {
+ String userId = getUserId(securityToken);
+ if (isAppAdmin(securityToken, userId)) {
+ Wikitty user = ws.findByCriteria(securityToken, Search.query().eq(
+ WikittyUser.FQ_FIELD_WIKITTYUSER_LOGIN, login).criteria());
+ if (user == null) {
+ user = new WikittyImpl();
+ WikittyUserHelper.addExtension(user);
+ WikittyUserHelper.setLogin(user, login);
+ WikittyUserHelper.setPassword(user, password);
+ ws.store(null, user);
+ log.debug(String.format("login '%s' has userId '%s'", login, user.getId()));
+ } else {
+ throw new IllegalArgumentException(
+ String.format("account already exists '%s'",
+ login));
+ }
+ } else {
+ throw new SecurityException("only admin can create accounts");
+ }
+ }
+ public String getUserWikittyId(String securityToken, String login) {
+ String userId = getUserId(securityToken);
+ String userWikittyId = null;
+ Wikitty user = ws.findByCriteria(null, Search.query().eq(
+ WikittyUser.FQ_FIELD_WIKITTYUSER_LOGIN, login).criteria());
+ if (user != null) {
+ userWikittyId = user.getId();
+ }
+ return userWikittyId;
+ }
+
@Override
public void logout(String securityToken) {
- // on passe securityToken comme token, mais il ne me semble pas
- // que ce soit tres utile, mais comme ca c'est uniform
- ws.delete(null, securityToken);
+ getUserId(securityToken); // will throw exception if token is not valid
+ ws.delete(securityToken, securityToken);
}
@Override
@@ -93,177 +151,321 @@
// seul les AppAdmin on le droit a cette method
ws.clear(securityToken);
} else {
- throw new SecurityException(_("user %s can't clear data",
- getUserId(securityToken)));
+ throw new SecurityException(_("user %s can't clear data", userId));
}
}
-
- /**
- * Prepare l'ecriture en ajoutant s'il le faut l'extension
- * WikittyAuthorisation et en fixant l'owner a l'utilisateur courant
+
+ protected String extensionToWikittySecurityId(WikittyExtension extension) {
+ return String.format("WikittySecurity'%s'", extension.getName());
+ }
+
+ /** */
+ public Wikitty addWikittyAuthorisation(String securityToken,
+ WikittyExtension extension) {
+ String userId = getUserId(securityToken);
+ if (isAppAdmin(securityToken, userId)) {
+ if (restoreExtensionAuthorisation(securityToken, extension) == null) {
+ String wikittyAuthorisationId = extensionToWikittySecurityId(extension);
+ Wikitty wikittyAuthorisation = new WikittyImpl(wikittyAuthorisationId);
+ WikittyAuthorisationHelper.addExtension(wikittyAuthorisation);
+ WikittyAuthorisationHelper.setOwner(wikittyAuthorisation, userId);
+ ws.store(securityToken, wikittyAuthorisation);
+ return wikittyAuthorisation;
+ } else {
+ throw new SecurityException(String.format(
+ "extension %s already has an security extension attached",
+ extension.getName()));
+ }
+ } else {
+ throw new SecurityException(String.format(
+ "Only members of %s group can add authorisation",
+ WIKITTY_APPADMIN_GROUP_NAME));
+ }
+ }
+
+ /** restore the wikitty authorisation attached to given extension
*
- * @param securityToken le token de securite qui permet de retrouver
- * l'utilisateur
- * @param wikitty le wikitty a sauver
+ * @return a wikitty with WikittyAuthorisation extension, or null if given
+ * extension has no security policy attached
+ * @throws SecurityException if user don't have rights required
*/
- protected void prepareWrite(String securityToken, Wikitty wikitty) {
- Wikitty oldVersion = ws.restore(securityToken, wikitty.getId());
- if (oldVersion == null) {
- // creation d'une nouvelle entity, on a des choses a faire
-
- // recuperation de l'utilisateur associe au securityToken
- String userId = getUserId(securityToken);
-
- // on ajoute et on fixe les droits par defaut
- WikittyAuthorisationHelper.addExtension(wikitty);
- WikittyAuthorisationHelper.setOwner(wikitty, userId);
+ public Wikitty restoreExtensionAuthorisation(String securityToken,
+ WikittyExtension extension) {
+ String userId = getUserId(securityToken);
+ String wikittyAuthorisationId = extensionToWikittySecurityId(extension);
+ Wikitty wikittyAuthorisation = restore(securityToken, wikittyAuthorisationId);
+ if (wikittyAuthorisation == null) {
+ log.debug(extension + " has no authorization attached");
+ } else {
+ /*
+ if ( ! canAdmin(securityToken, userId, wikittyAuthorisation)) {
+ throw new SecurityException(String.format(
+ "user %s doesn't have admin rights on extension %s",
+ userId, extension.getName()));
+ }
+ */
}
+ return wikittyAuthorisation;
}
+
+ public void storeWikittyAuthorisation(String securityToken,
+ Wikitty wikitty) {
- @Override
- public boolean canWrite(String securityToken, Wikitty wikitty) {
- boolean result = false;
-
String userId = getUserId(securityToken);
- //
- // check security
- //
- // recuperation de l'ancienne version de l'objet pour verifier les droits
- Wikitty oldVersion = ws.restore(securityToken, wikitty.getId());
- if (oldVersion == null) {
- // creation d'une nouvelle entity
+ Wikitty oldVersion = ws.restore(null, wikitty.getId());
- // on verifie que l'on a le droit de creer une entity avec cette extension
- // TODO poussin 20100607 trouver ou mettre l'autorisation qui retient l'information de qui a le droit de cree une extension
- result = true;
- } else {
- // modification d'une entity existante
+ // check that the wikitty does not have
+ if (WikittyAuthorisationHelper.isExtension(wikitty)) {
- // si c'est le owner il a tous les droits, a defaut les admins
- // peuvent aussi le modifier
- result =
- // owner et admin peuvent tout modifier
- isOwner(securityToken, userId, oldVersion)
- || isAppAdmin(securityToken, userId)
- || isAdmin(securityToken, userId, oldVersion)
- // un writer ne peut pas modifier l'extension d'autorisation
- || (WikittyAuthorisationAbstract.equals(oldVersion, wikitty)
- && isWriter(securityToken, userId, oldVersion));
- }
- return result;
- }
+ if (oldVersion == null) {
+ // if this exception is raised, you should use addWikittyAuthorisation()
+ throw new IllegalArgumentException("you can't store an authorisation for the fist time");
- @Override
- public boolean canDelete(String securityToken, String wikittyId) {
- boolean result = false;
+ } else {
+
+ if ( canAdmin(securityToken, userId, oldVersion) ) {
+
+ if (isAdmin(securityToken, userId, oldVersion)) {
+ // admin can't change owner, admin or parent
+ // putting back old values
+ Object oldValue = oldVersion.getFieldAsObject(
+ WikittyAuthorisation.EXT_WIKITTYAUTHORISATION,
+ WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_OWNER);
+ wikitty.setField(WikittyAuthorisation.EXT_WIKITTYAUTHORISATION,
+ WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_OWNER,
+ oldValue);
- //
- // check security
- //
+ WikittyAuthorisationHelper.setOwner(wikitty,
+ WikittyAuthorisationHelper.getOwner(oldVersion));
+ WikittyAuthorisationHelper.setParent(wikitty,
+ WikittyAuthorisationHelper.getParent(oldVersion));
+
+ }
- // recuperation de l'ancienne version de l'objet pour verifier les droits
- Wikitty oldVersion = ws.restore(securityToken, wikittyId);
- if (oldVersion == null) {
- // l'objet n'existe pas donc la suppression retourne true
- result = true;
+ ws.store(null, wikitty);
+ } else {
+ throw new SecurityException(String.format(
+ "user %s can't admin rights for this extension", userId));
+ }
+ }
} else {
- // suppresion d'une entity existante
- String userId = getUserId(securityToken);
-
- // si c'est le owner il a tous les droits, a defaut les admins
- // peuvent aussi le supprimer
- result =
- // owner et admin peuvent tout modifier
- isOwner(securityToken, userId, oldVersion)
- || isAppAdmin(securityToken, userId)
- || isAdmin(securityToken, userId, oldVersion);
+ throw new IllegalArgumentException(String.format(
+ "wikitty %s is not a wikittyAuthorisation. It misses the extension",
+ wikitty));
}
- return result;
+
}
-
- @Override
- public boolean canRead(String securityToken, String wikittyId) {
- // recuperation de l'utilisateur associe au securityToken
- Wikitty securityTokenWikitty = ws.restore(securityToken, securityToken);
- String userId = SecurityTokenHelper.getUser(securityTokenWikitty);
- //
- // check security
- //
+ /** true if userId has the right to write on extension */
+ protected boolean canRead(String securityToken, String userId, Wikitty extensionRights) {
+ boolean canRead = isReader(securityToken, userId, extensionRights)
+ || canWrite(securityToken, userId, extensionRights);
+ return canRead;
+ }
- // recuperation de l'objet pour verifier les droits
- Wikitty w = ws.restore(securityToken, wikittyId);
- boolean result = isReader(securityToken, userId, w)
- || isOwner(securityToken, userId, w)
- || isAppAdmin(securityToken, userId)
- || isAdmin(securityToken, userId, w)
- || isWriter(securityToken, userId, w);
- return result;
+ /** true if userId has the right to write on extension */
+ protected boolean canWrite(String securityToken, String userId, Wikitty extensionRights) {
+ boolean canWrite = isWriter(securityToken, userId, extensionRights)
+ || isOwner(securityToken, userId, extensionRights)
+ || isAppAdmin(securityToken, userId);
+ return canWrite;
}
+ /** true if userId has the right to admin on extension */
+ protected boolean canAdmin(String securityToken, String userId, Wikitty extensionRights) {
+ boolean canWrite = isAdmin(securityToken, userId, extensionRights)
+ || isOwner(securityToken, userId, extensionRights)
+ || isAppAdmin(securityToken, userId);
+ return canWrite;
+ }
+
+ /** true if userId has the right is owner of all the extensions of the given wikitty */
+ protected boolean canDelete(String securityToken, String userId, Wikitty wikitty) {
+ if (isAppAdmin(securityToken, userId)) {
+ return true;
+ }
+
+ // now read all extensions for this wikitty, and return false
+ // if user is not owner on one of those extensions
+ for (WikittyExtension extension : wikitty.getExtensions()) {
+ Wikitty extensionRights = restoreExtensionAuthorisation(securityToken, extension);
+ boolean canDelete = extensionRights == null
+ || isOwner(securityToken, userId, extensionRights);
+ // FIXME 20100922 bleny if appadmin ?
+ if (! canDelete) {
+ return false;
+ }
+ }
+ return true;
+ }
+
@Override
public UpdateResponse store(String securityToken, Wikitty wikitty) {
- if (canWrite(securityToken, wikitty)) {
- prepareWrite(securityToken, wikitty);
- UpdateResponse result = ws.store(securityToken, wikitty);
- return result;
- } else {
- throw new SecurityException(_("user %s can't modify object %s",
- getUserId(securityToken), wikitty.getId()));
- }
+ Collection<Wikitty> wikitties = Arrays.asList(wikitty);
+ wikitties = removeUnauthorizedModifications(securityToken, wikitties);
+ UpdateResponse result = ws.store(securityToken, wikitties);
+ return result;
}
@Override
public UpdateResponse store(String securityToken, Collection<Wikitty> wikitties) {
- for (Wikitty w : wikitties) {
- if (!canWrite(securityToken, w)) {
- throw new SecurityException(_("user %s can't modify object %s",
- getUserId(securityToken), w.getId()));
+ Collection<Wikitty> wikittiesToStore = removeUnauthorizedModifications(securityToken, wikitties);
+ UpdateResponse result = ws.store(securityToken, wikittiesToStore);
+ return result;
+ }
+
+ @Override
+ public UpdateResponse store(String securityToken, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) {
+ Collection<Wikitty> wikittiesToStore = removeUnauthorizedModifications(securityToken, wikitties);
+ UpdateResponse result = ws.store(securityToken, wikittiesToStore, disableAutoVersionIncrement);
+ return result;
+ }
+
+ /**
+ *
+ */
+ protected Collection<Wikitty> removeUnauthorizedModifications(String securityToken, Collection<Wikitty> wikitties) {
+ String userId = getUserId(securityToken);
+ List<Wikitty> wikittiesToStore = new ArrayList<Wikitty>();
+ for (Wikitty wikitty : wikitties) {
+ // check that the wikitty does not have
+ if (WikittyAuthorisationHelper.isExtension(wikitty)) {
+ storeWikittyAuthorisation(securityToken, wikitty);
+ } else {
+ // usual case, a user want to store a wikitty
+ Wikitty oldVersion = ws.restore(null, wikitty.getId());
+ if (oldVersion == null) { // it's a creation
+ // check that **reader** right on Security for all extension
+ } else { // it's an update
+ // filtering, revert changes on field that this user can't write
+ for (WikittyExtension extension : wikitty.getExtensions()) {
+ Wikitty extensionRights = restoreExtensionAuthorisation(securityToken, extension);
+ if (extensionRights != null) {
+ if ( ! canWrite(securityToken, userId, extensionRights)) {
+ // the user doesn't have the rights to write
+ // on the fields of extension. Moving back
+ // values to the old one
+ for (String fieldName : extension.getFieldNames()) {
+ if (oldVersion == null) {
+ wikitty.setField(extension.getName(), fieldName, null);
+ } else {
+ Object oldValue = oldVersion.getFieldAsObject(extension.getName(), fieldName);
+ wikitty.setField(extension.getName(), fieldName, oldValue);
+ }
+ }
+ }
+ } // else no particular right on this extension
+ }
+ wikittiesToStore.add(wikitty);
+ }
}
}
- for (Wikitty w : wikitties) {
- prepareWrite(securityToken, w);
- }
- UpdateResponse result = ws.store(securityToken, wikitties);
+ return wikittiesToStore;
+ }
+
+ @Override
+ public UpdateResponse store(String securityToken, WikittyTransaction transaction, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) {
+ Collection<Wikitty> wikittiesToStore = removeUnauthorizedModifications(securityToken, wikitties);
+ UpdateResponse result = ws.store(securityToken, transaction, wikittiesToStore, disableAutoVersionIncrement);
return result;
}
+
+ @Override
+ public Wikitty restore(String securityToken, String id) {
+ List<String> ids = Arrays.asList(id);
+ List<Wikitty> wikitties = restore(securityToken, ids);
+ Wikitty wikitty = null;
+ if (! wikitties.isEmpty()) {
+ wikitty = wikitties.get(0);
+ }
+ return wikitty;
+ }
@Override
- public UpdateResponse store(String securityToken, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) {
- for (Wikitty w : wikitties) {
- if (!canWrite(securityToken, w)) {
- throw new SecurityException(_("user %s can't modify object %s",
- getUserId(securityToken), w.getId()));
+ public List<Wikitty> restore(String securityToken, List<String> ids) {
+ List<Wikitty> wikitties = new ArrayList<Wikitty>();
+ for (String id : ids) {
+ // do it first, will throw an exception if security token is invalid
+
+ String userId = getUserId(securityToken);
+
+ Wikitty wikitty = ws.restore(securityToken, id);
+ if (wikitty != null) {
+ // FIXME 20100827 bleny copy on write is done because setting some field to null below modify stored wikitty if WikittyServiceInMemory is used
+ wikitty = new WikittyCopyOnWrite(wikitty);
+
+ for (WikittyExtension extension : wikitty.getExtensions()) {
+ Wikitty extensionRights = restoreExtensionAuthorisation(securityToken, extension);
+
+ // field of extension can be read if no policy attached
+ // if a policy is attached, check that user has right to read
+ boolean canRead = extensionRights == null || canRead(securityToken, userId, extensionRights);
+ if ( ! canRead) {
+ for (String fieldName : extension.getFieldNames()) {
+ wikitty.setField(extension.getName(), fieldName, null);
+ }
+ }
+ }
+ wikitties.add(wikitty);
}
}
- for (Wikitty w : wikitties) {
- prepareWrite(securityToken, w);
- }
- UpdateResponse result = ws.store(securityToken, wikitties, disableAutoVersionIncrement);
- return result;
+ return wikitties;
}
@Override
- public UpdateResponse store(String securityToken, WikittyTransaction transaction,
- Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) {
- for (Wikitty w : wikitties) {
- if (!canWrite(securityToken, w)) {
- throw new SecurityException(_("user %s can't modify object %s",
- getUserId(securityToken), w.getId()));
+ public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> ids) {
+ throw new UnsupportedOperationException();
+ // ws.restore(securityToken, transaction, ids);
+ }
+
+ @Override
+ public void delete(String securityToken, String id) {
+ Collection<String> ids = Arrays.asList(id);
+ delete(securityToken, ids);
+ }
+
+ @Override
+ public void delete(String securityToken, Collection<String> ids) {
+ List<String> idsAsList = new ArrayList<String>(ids);
+ secureDelete(securityToken, idsAsList);
+ }
+
+ /** delete wikitties only if user has right to */
+ protected void secureDelete(String securityToken, List<String> ids) {
+ String userId = getUserId(securityToken);
+
+ List<Wikitty> wikitties = ws.restore(securityToken, ids);
+ List<String> idsToRemove = new ArrayList<String>();
+
+ for (Wikitty wikitty : wikitties) {
+ if ( canDelete(securityToken, userId, wikitty)) {
+ idsToRemove.add(wikitty.getId());
}
}
- for (Wikitty w : wikitties) {
- // preparation des wikitty pour la sauvegarde
- // - ajout extension d'autorisation si necessaire
- prepareWrite(securityToken, w);
- }
- UpdateResponse result = ws.store(securityToken, transaction, wikitties,
- disableAutoVersionIncrement);
- return result;
- }
+ ws.delete(securityToken, idsToRemove);
+ }
+
@Override
+ @Deprecated
+ public boolean canWrite(String securityToken, Wikitty wikitty) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ @Deprecated
+ public boolean canDelete(String securityToken, String wikittyId) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ @Deprecated
+ public boolean canRead(String securityToken, String wikittyId) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public List<String> getAllExtensionIds(String securityToken) {
// All people can read extension
return ws.getAllExtensionIds(securityToken);
@@ -279,22 +481,30 @@
@Override
public UpdateResponse storeExtension(
String securityToken, WikittyExtension ext) {
- // TODO poussin 20100607 check security, mais qui a le droit ?
- return ws.storeExtension(securityToken, ext);
+ Collection<WikittyExtension> exts = Arrays.asList(ext);
+ return storeExtension(securityToken, exts);
}
@Override
public UpdateResponse storeExtension(String securityToken,
Collection<WikittyExtension> exts) {
// TODO poussin 20100607 check security, mais qui a le droit ?
+
+
+
+
return ws.storeExtension(securityToken, exts);
}
@Override
public UpdateResponse storeExtension(String securityToken,
WikittyTransaction transaction, Collection<WikittyExtension> exts) {
- // TODO poussin 20100607 check security, mais qui a le droit ?
- return ws.storeExtension(securityToken, transaction, exts);
+ String userId = getUserId(securityToken);
+ UpdateResponse response = null;
+ if (isAppAdmin(securityToken, userId)) {
+ response = ws.storeExtension(securityToken, transaction, exts);
+ }
+ return response;
}
@Override
@@ -325,75 +535,6 @@
}
@Override
- public Wikitty restore(String securityToken, String id) {
- Wikitty result = null;
- if (canRead(securityToken, id)) {
- result = ws.restore(securityToken, id);
- } else {
- if (log.isDebugEnabled()) {
- log.debug(_("user %s can't read object %s",
- getUserId(securityToken), id));
- }
- }
- return result;
- }
-
- @Override
- public List<Wikitty> restore(String securityToken, List<String> ids) {
- List<String> authorizedIds = new LinkedList<String>(ids);
- for (Iterator<String> i=authorizedIds.iterator(); i.hasNext();) {
- String id = i.next();
- if (!canRead(securityToken, id)) {
- if (log.isDebugEnabled()) {
- log.debug(_(
- "user %s can't read object %s, remove it in restore list",
- getUserId(securityToken), id));
- }
- i.remove();
- }
- }
-
- return ws.restore(securityToken, authorizedIds);
- }
-
- @Override
- public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> ids) {
- List<String> authorizedIds = new LinkedList<String>(ids);
- for (Iterator<String> i=authorizedIds.iterator(); i.hasNext();) {
- String id = i.next();
- if (!canRead(securityToken, id)) {
- if (log.isDebugEnabled()) {
- log.debug(_(
- "user %s can't read object %s, remove it in restore list",
- getUserId(securityToken), id));
- }
- i.remove();
- }
- }
-
- return ws.restore(securityToken, transaction, authorizedIds);
- }
-
- @Override
- public void delete(String securityToken, String id) {
- if (canDelete(securityToken, id)) {
- ws.delete(securityToken, id);
- }
- }
-
- @Override
- public void delete(String securityToken, Collection<String> ids) {
- for (String id : ids) {
- if (!canDelete(securityToken, id)) {
- throw new SecurityException(_("user %s can't delete object %s",
- getUserId(securityToken), id));
- }
- }
-
- ws.delete(securityToken, ids);
- }
-
- @Override
public PagedResult<String> findAllByCriteria(String securityToken, Criteria criteria) {
// All people can read PagedResult that contains only id
PagedResult<String> result = ws.findAllByCriteria(securityToken, criteria);
@@ -420,16 +561,6 @@
}
@Override
- public Wikitty findByCriteria(String securityToken, WikittyTransaction transaction, Criteria criteria) {
- Wikitty result = ws.findByCriteria(securityToken, transaction, criteria);
- if (!canRead(securityToken, result.getId())) {
- // user don't have correct right, return null
- result = null;
- }
- return result;
- }
-
- @Override
public void addLabel(String securityToken, String wikittyId, String label) {
// TODO poussin 20100607 check security
ws.addLabel(securityToken, wikittyId, label);
@@ -467,12 +598,6 @@
}
@Override
- public List<String> deleteTree(String securityToken, String wikittyId) {
- // FIXME poussin 20100607 check security
- return ws.deleteTree(securityToken, wikittyId);
- }
-
- @Override
public Entry<TreeNode, Integer> restoreNode(
String securityToken, String wikittyId, Criteria filter) {
// FIXME poussin 20100607 check security
@@ -504,7 +629,7 @@
// seul les AppAdmin on le droit a cette method
return ws.syncEngin(securityToken);
} else {
- throw new SecurityException(_("user %s can't sync sear engine",
+ throw new SecurityException(_("user %s can't sync search engine",
getUserId(securityToken)));
}
}
@@ -538,56 +663,71 @@
// recuperation de l'utilisateur associe au securityToken
// le securityToken est aussi l'id de l'objet
Wikitty securityTokenWikitty = ws.restore(securityToken, securityToken);
- if (securityTokenWikitty != null) {
+ if (securityTokenWikitty == null) {
+ throw new SecurityException(_("trying to use an invalidate security token %s", securityToken));
+ } else {
result = SecurityTokenHelper.getUser(securityTokenWikitty);
}
return result;
}
-
/**
- * Verifie que l'utilisateur est bien le proprietaire de l'objet
+ * verifie que l'utilisateur est dans la liste des admin
*
* @param userId
* @param w
- * @return
+ * @return vrai si et seulement si l'utilisateur est dans la liste des
+ * admin
*/
- protected boolean isOwner(String securityToken, String userId, Wikitty w) {
- boolean result = false;
- if (WikittyAuthorisationHelper.isExtension(w)) {
- String owner = WikittyAuthorisationHelper.getOwner(w);
- result = userId.equals(owner);
- }
+ protected boolean isAdmin(String securityToken, String userId, Wikitty extensionRights) {
+ boolean result = isMember(
+ securityToken, userId, extensionRights, WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_ADMIN);
return result;
}
/**
- * verifie que l'utilisateur est dans la liste des admin
+ * verifie que l'utilisateur est dans la liste des writer
*
* @param userId
* @param w
* @return vrai si et seulement si l'utilisateur est dans la liste des
- * admin
+ * writers
*/
- protected boolean isAdmin(String securityToken, String userId, Wikitty w) {
+ protected boolean isWriter(String securityToken, String userId, Wikitty extensionRights) {
boolean result = isMember(
- securityToken, userId, w, WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_ADMIN);
+ securityToken, userId, extensionRights, WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_WRITER);
return result;
}
/**
- * verifie que l'utilisateur est dans la liste des writer
+ * Verifie que l'utilisateur est bien le proprietaire de l'objet
*
* @param userId
* @param w
- * @return vrai si et seulement si l'utilisateur est dans la liste des
- * writers
+ * @return
*/
- protected boolean isWriter(String securityToken, String userId, Wikitty w) {
- boolean result = isMember(
- securityToken, userId, w, WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_WRITER);
+ protected boolean isOwner(String securityToken, String userId, Wikitty extensionRights) {
+ String owner = WikittyAuthorisationHelper.getOwner(extensionRights);
+ boolean result = userId.equals(owner);
return result;
}
+
+ protected boolean isMember(String securityToken, String userId, Wikitty extensionRights, String fieldName) {
+ Set<String> groupOrUser = extensionRights.getFieldAsSet(
+ WikittyAuthorisation.EXT_WIKITTYAUTHORISATION,
+ fieldName,
+ String.class);
+ boolean result = isMember(securityToken, userId, groupOrUser);
+ if (!result) {
+ // user don't have right on current object, check parent right
+ String parentId = WikittyAuthorisationHelper.getParent(extensionRights);
+ if (parentId != null) {
+ Wikitty parent = ws.restore(securityToken, parentId);
+ result = isMember(securityToken, userId, parent, fieldName);
+ }
+ }
+ return result;
+ }
/**
* Par defaut un objet est lisible par tous, sauf s'il a l'extension
@@ -627,6 +767,13 @@
* @return
*/
protected boolean isAppAdmin(String securityToken, String userId) {
+ Wikitty group = getAppAdminGroup(securityToken);
+ Set<String> ids = WikittyGroupHelper.getMembers(group);
+ boolean result = isMember(securityToken, userId, ids);
+ return result;
+ }
+
+ protected Wikitty getAppAdminGroup(String securityToken) {
Wikitty group;
if (appAdminGroupId == null) {
// 1er fois, on le recherche
@@ -639,48 +786,19 @@
group = ws.restore(securityToken, appAdminGroupId);
// group peut-etre null, si entre temps un admin a supprime le group
}
+
if (group == null) {
// il n'existe pas on le cree.
- WikittyGroup appAdminGroup = new WikittyGroupImpl();
+ WikittyGroupAbstract appAdminGroup = new WikittyGroupImpl();
appAdminGroup.setName(WIKITTY_APPADMIN_GROUP_NAME);
- }
- // on garde l'id pour ne plus faire la recherche,
- // vu que le groupe doit etre unique cela ne pose pas de probleme
- appAdminGroupId = group.getId();
+ ws.store(securityToken, appAdminGroup.getWikitty());
+ group = appAdminGroup.getWikitty();
- Set<String> ids = WikittyGroupHelper.getMembers(group);
- boolean result = isMember(securityToken, userId, ids);
- return result;
- }
-
- /**
- * verifie qu'un utilisateur est membre d'un groupe passe en parametre via
- * l'arguement field
- *
- * @param userId
- * @param w
- * @param field must be WikittyAuthorisation field name: admin, writer, reader
- * @return
- */
- protected boolean isMember(
- String securityToken, String userId, Wikitty w, String field) {
- boolean result = false;
- if (WikittyAuthorisationHelper.isExtension(w)) {
- Set<String> groupOrUser = w.getFieldAsSet(
- WikittyAuthorisation.EXT_WIKITTYAUTHORISATION,
- field,
- String.class);
- result = isMember(securityToken, userId, groupOrUser);
- if (!result) {
- // user don't have right on current object, check parent right
- String parentId = WikittyAuthorisationHelper.getParent(w);
- if (parentId != null) {
- Wikitty parent = ws.restore(securityToken, parentId);
- result = isMember(securityToken, userId, parent, field);
- }
- }
+ // on garde l'id pour ne plus faire la recherche,
+ // vu que le groupe doit etre unique cela ne pose pas de probleme
+ appAdminGroupId = group.getId();
}
- return result;
+ return group;
}
/**
@@ -693,26 +811,33 @@
*/
protected boolean isMember(
String securityToken, String userId, Set<String> groupOrUser) {
- boolean result = false;
if (groupOrUser != null) {
for (String id : groupOrUser) {
if (userId.equals(id)) {
- result = true;
- break;
+ return true;
} else {
- Wikitty w = ws.restore(securityToken, id);
- if (WikittyGroupHelper.isExtension(w)) {
- Set<String> members = WikittyGroupHelper.getMembers(w);
- if (isMember(securityToken, userId, members)) {
- result = true;
- break;
- }
+ Wikitty groupWikitty = ws.restore(securityToken, id);
+ if (WikittyGroupHelper.isExtension(groupWikitty)) {
+ Set<String> members = WikittyGroupHelper.getMembers(groupWikitty);
+ return isMember(securityToken, userId, members);
}
}
}
}
- // not found in groupOrUser
- return result;
+ return false; // not found in groupOrUser
}
+ @Override
+ public Wikitty findByCriteria(String securityToken,
+ WikittyTransaction transaction, Criteria criteria) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<String> deleteTree(String securityToken, String treeNodeId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2010-09-27 08:49:33 UTC (rev 345)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -774,7 +774,7 @@
*
* @return SecurityToken that can be used like wikitty id
*/
- static public String genSecurityToken() {
+ static public String genSecurityTokenId() {
String result = "_" + Math.abs(Math.random());
result.replace(".", ""); // on supprime le '.' dans le nombre aleatoire
result = genUID() + result;
Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/AbstractWikittyServiceTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/AbstractWikittyServiceTest.java (rev 0)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/AbstractWikittyServiceTest.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -0,0 +1,39 @@
+package org.nuiton.wikitty.layers;
+
+import org.junit.Before;
+import org.nuiton.wikitty.ExtensionFactory;
+import org.nuiton.wikitty.FieldType.TYPE;
+import org.nuiton.wikitty.Wikitty;
+import org.nuiton.wikitty.WikittyExtension;
+import org.nuiton.wikitty.WikittyImpl;
+import org.nuiton.wikitty.WikittyService;
+
+public abstract class AbstractWikittyServiceTest {
+
+ /** a wikitty service (in memory) with a cache */
+ protected WikittyService service;
+
+ protected static final String EXT_NAME = "myextension";
+ protected static final String FIELD_NAME = "myfield";
+ protected static final String VALUE = "myvalue";
+
+ /** an extension */
+ protected WikittyExtension extension;
+
+ /** a wikitty with extension */
+ protected Wikitty aWikitty;
+
+ protected String token;
+
+ /** create a service, an extension, a wikitty, login, and store wikitty */
+ @Before
+ public void setUp() throws Exception {
+ extension = ExtensionFactory.create(EXT_NAME, "1")
+ .addField(FIELD_NAME, TYPE.STRING)
+ .extension();
+ aWikitty = new WikittyImpl();
+ aWikitty.addExtension(extension);
+ aWikitty.setField(EXT_NAME, FIELD_NAME, VALUE);
+ }
+
+}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/cache/WikittyServiceCachedTest.java 2010-09-20 12:34:30 UTC (rev 325)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceCachedTest.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -1,9 +1,7 @@
-package org.nuiton.wikitty.cache;
+package org.nuiton.wikitty.layers;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
@@ -11,53 +9,25 @@
import org.junit.Before;
import org.junit.Test;
-import org.nuiton.wikitty.ExtensionFactory;
-import org.nuiton.wikitty.FieldType.TYPE;
import org.nuiton.wikitty.Wikitty;
-import org.nuiton.wikitty.WikittyExtension;
-import org.nuiton.wikitty.WikittyImpl;
-import org.nuiton.wikitty.WikittyService;
import org.nuiton.wikitty.WikittyServiceCached;
import org.nuiton.wikitty.WikittyServiceInMemory;
-/** check that the cache */
-public class WikittyServiceCachedTest {
+/** test {@link WikittyServiceCached} */
+public class WikittyServiceCachedTest extends AbstractWikittyServiceTest {
- /** a wikitty service (in memory) with a cache */
- protected WikittyService service;
-
- protected static final String EXT_NAME = "myextension";
- protected static final String FIELD_NAME = "myfield";
-
- /** an extension */
- protected WikittyExtension extension;
-
- /** a wikitty with extension */
- protected Wikitty aWikitty;
-
- protected String token;
-
- /** create a service, an extension, a wikitty, login, and store wikitty */
@Before
- public void setUp() throws Exception {
-
- extension = ExtensionFactory.create(EXT_NAME, "1")
- .addField(FIELD_NAME, TYPE.STRING)
- .extension();
- aWikitty = new WikittyImpl();
- aWikitty.addExtension(extension);
- aWikitty.setField(EXT_NAME, FIELD_NAME, "myvalue");
-
+ public void setUpWikittyServiceCachedTest() {
service = new WikittyServiceCached(new WikittyServiceInMemory());
token = service.login(null, null);
- service.store(token, aWikitty);
+ service.store(token, aWikitty);
}
/** setting a field value doesn't corrupt cache */
@Test
public void testRestore() throws Exception {
Wikitty anotherWikitty = service.restore(token, aWikitty.getId());
-
+
// we set the value of a field
anotherWikitty.setField(EXT_NAME, FIELD_NAME, "myothervalue");
@@ -109,5 +79,5 @@
assertEquals(anotherWikitty, yetAnotherWikitty);
assertNotSame(anotherWikitty, yetAnotherWikitty); // two different objects
}
-
+
}
Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceSecurityTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceSecurityTest.java (rev 0)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/layers/WikittyServiceSecurityTest.java 2010-09-27 08:53:29 UTC (rev 346)
@@ -0,0 +1,236 @@
+package org.nuiton.wikitty.layers;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.nuiton.wikitty.FieldType;
+import org.nuiton.wikitty.FieldType.TYPE;
+import org.nuiton.wikitty.TreeNodeAbstract;
+import org.nuiton.wikitty.Wikitty;
+import org.nuiton.wikitty.WikittyAuthorisation;
+import org.nuiton.wikitty.WikittyAuthorisationHelper;
+import org.nuiton.wikitty.WikittyAuthorisationImpl;
+import org.nuiton.wikitty.WikittyService;
+import org.nuiton.wikitty.WikittyServiceInMemory;
+import org.nuiton.wikitty.WikittyServiceSecurity;
+
+/** test {@link org.nuiton.wikitty.WikittyServiceSecurity} */
+public class WikittyServiceSecurityTest extends AbstractWikittyServiceTest {
+
+ private static final Log log = LogFactory.getLog(WikittyServiceSecurityTest.class);
+
+ protected static final String APPADMIN_LOGIN = WikittyServiceSecurity.APPADMIN_LOGIN;
+ protected static final String APPADMIN_PASSWORD = WikittyServiceSecurity.APPADMIN_PASSWORD;
+
+ protected WikittyServiceSecurity securityService;
+
+ protected String noRightsToken;
+ protected String readerToken;
+ protected String writerToken;
+ protected String adminToken;
+ protected String ownerToken;
+
+ @Before
+ public void setUpWikittyServiceSecurityTest() {
+ WikittyService inMemoryService = new WikittyServiceInMemory();
+
+ securityService = new WikittyServiceSecurity(inMemoryService);
+
+ service = securityService;
+
+ token = service.login(APPADMIN_LOGIN, APPADMIN_PASSWORD);
+
+ securityService.createAccount(token, "i have no rights", "");
+ securityService.createAccount(token, "reader", "");
+ securityService.createAccount(token, "writer", "");
+ securityService.createAccount(token, "admin", "");
+ securityService.createAccount(token, "owner", "");
+
+ Wikitty authorizations = securityService.addWikittyAuthorisation(token, extension);
+ WikittyAuthorisationHelper.addReader(authorizations, securityService.getUserWikittyId(token, "reader"));
+ WikittyAuthorisationHelper.addWriter(authorizations, securityService.getUserWikittyId(token, "writer"));
+ WikittyAuthorisationHelper.addAdmin(authorizations, securityService.getUserWikittyId(token, "admin"));
+ WikittyAuthorisationHelper.setOwner(authorizations, securityService.getUserWikittyId(token, "owner"));
+
+ log.debug("initial wikitty rights" + authorizations);
+
+ service.store(token, authorizations);
+
+ Wikitty extensionAuthorisation = securityService.restoreExtensionAuthorisation(token, extension);
+ log.debug("restored initial rights " + extensionAuthorisation);
+
+ service.logout(token);
+ token = null;
+
+ ownerToken = service.login("owner", "");
+ adminToken = service.login("admin", "");
+ writerToken = service.login("writer", "");
+ readerToken = service.login("reader", "");
+ noRightsToken = service.login("i have no rights", "");
+ }
+
+ @Test
+ public void testInvalidToken() {
+ // try to store with invalid token
+ String invalidToken = "INVALID TOKEN";
+ try {
+ service.store(invalidToken, aWikitty);
+ fail();
+ } catch (SecurityException e) {}
+
+ // now storing the wikitty for next tests
+ token = service.login(APPADMIN_LOGIN, APPADMIN_PASSWORD);
+ service.store(token, aWikitty);
+
+ // try to make operations on the stored wikitty with a bad token
+ try {
+ service.restore(invalidToken, aWikitty.getId());
+ fail();
+ } catch (SecurityException e) {}
+
+ try {
+ service.logout(invalidToken);
+ fail();
+ } catch (SecurityException e) {}
+
+ // now try to make a valid token invalid
+ service.logout(token);
+ try {
+ service.store(token, aWikitty);
+ fail();
+ } catch (SecurityException e) {}
+ }
+
+ /* *** level 1 security tests ***/
+
+ @Ignore
+ @Test
+ public void testReaderRightOnWikitty() {
+
+// aWikitty.addMetaExtension(WikittyAuthorisation.EXT_WIKITTYAUTHORISATION, extension);
+ // delegate to WikittyAuthorisationHelper.addMetaExtension(extension, aWikitty)
+
+// WikittyAuthorisation auth = new WikittyAuthorisationImpl(extension, aWikitty);
+// auth
+// WikittyAuthorisation authautre = new WikittyAuthorisationImpl(aWikitty);
+//
+// auth.clearReader();
+
+
+ }
+
+ /* *** level 2 security tests ***/
+
+ /** test level 2 reader right */
+ @Ignore
+ @Test
+ public void checkReaderRightOnExtension() {
+
+ try {
+ service.store(noRightsToken, aWikitty);
+ fail("an exception should have been raised");
+ } catch (SecurityException e) {
+ log.debug("creating a wikitty without rights", e);
+ }
+
+ try {
+ service.restoreExtension(noRightsToken, extension.getId());
+ fail("an exception should have been raised");
+ } catch (SecurityException e) {
+ log.debug("creating a wikitty without rights", e);
+ }
+
+ try {
+ service.restoreExtensionLastVersion(noRightsToken, extension.getName());
+ fail("an exception should have been raised");
+ } catch (SecurityException e) {
+ log.debug("creating a wikitty without rights", e);
+ }
+
+ try {
+ service.store(readerToken, aWikitty);
+ service.restoreExtension(readerToken, extension.getId());
+ service.restoreExtensionLastVersion(readerToken, extension.getName());
+ } catch (SecurityException e) {
+ fail("an exception has been raised");
+ }
+
+ }
+
+ @Ignore
+ @Test
+ public void checkWriterRightOnExtension() {
+
+ FieldType fieldType = new FieldType(FieldType.TYPE.STRING, 0, 1);
+
+ service.restoreExtensionLastVersion(writerToken, extension.getName());
+ extension.addField("new_field", fieldType);
+
+ try {
+ service.storeExtension(readerToken, extension);
+ fail("an exception should have been raised");
+ } catch (SecurityException e) {}
+
+ try {
+ service.storeExtension(writerToken, extension);
+ } catch (SecurityException e) {
+ fail("an exception has been raised");
+ }
+ }
+
+ @Ignore
+ @Test
+ public void checkAdminRightOnExtention() {
+ // TODO 20100923 bleny check that store with no sufficient rights fail
+
+ Wikitty extensionAuthorisation = securityService.restoreExtensionAuthorisation(adminToken, extension);
+
+ log.debug("initial rights " + extensionAuthorisation);
+
+ // set no reader, ID1 as single writer and ID2 as owner
+ WikittyAuthorisationHelper.clearReader(extensionAuthorisation);
+ WikittyAuthorisationHelper.clearWriter(extensionAuthorisation);
+ WikittyAuthorisationHelper.addWriter(extensionAuthorisation, "ID1");
+ WikittyAuthorisationHelper.setOwner(extensionAuthorisation, "ID2");
+
+ // FIXME 20100920 bleny this instruction mekes the test fail by clearing
+ // the admin field. There is a side effect on the stored wikitty and restored
+ // wikitty in store (oldVersion) has "admin" field empty
+ // WikittyAuthorisationHelper.clearAdmin(extensionAuthorisation);
+
+ log.debug("will store rights " + extensionAuthorisation);
+ service.store(adminToken, extensionAuthorisation);
+
+ // now, restore and check that rights are preserved
+ extensionAuthorisation = service.restore(adminToken, extensionAuthorisation.getId());
+
+ log.debug("restored rights " + extensionAuthorisation);
+
+ // check that reader changes has been saved
+ assertTrue(WikittyAuthorisationHelper.getReader(extensionAuthorisation).isEmpty());
+
+ // check that ID1 is writer
+ assertTrue(WikittyAuthorisationHelper.getWriter(extensionAuthorisation).contains("ID1"));
+ // ... and no one else
+ assertEquals(1, WikittyAuthorisationHelper.getWriter(extensionAuthorisation).size());
+
+ // check that admin is not modified
+ assertFalse(WikittyAuthorisationHelper.getAdmin(extensionAuthorisation).isEmpty());
+
+ // check that ID2 is NOT owner (admin should not be able to change owner)
+ assertFalse(WikittyAuthorisationHelper.getOwner(extensionAuthorisation).equals("ID2"));
+ }
+
+ @Test
+ public void checkOwnerRightOnExtention() {
+ // TODO
+ }
+}
1
0
r345 - branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator
by bleny@users.nuiton.org 27 Sep '10
by bleny@users.nuiton.org 27 Sep '10
27 Sep '10
Author: bleny
Date: 2010-09-27 10:49:33 +0200 (Mon, 27 Sep 2010)
New Revision: 345
Url: http://nuiton.org/repositories/revision/wikitty/345
Log:
begining suport of meta-extension code generation
Modified:
branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java
branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java
Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
===================================================================
--- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2010-09-27 07:49:11 UTC (rev 344)
+++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2010-09-27 08:49:33 UTC (rev 345)
@@ -16,6 +16,7 @@
import org.nuiton.eugene.models.object.ObjectModel;
import org.nuiton.eugene.models.object.ObjectModelAttribute;
import org.nuiton.eugene.models.object.ObjectModelClass;
+import org.nuiton.eugene.models.object.ObjectModelInterface;
import org.nuiton.eugene.models.object.ObjectModelModifier;
import org.nuiton.eugene.models.object.ObjectModelOperation;
@@ -59,8 +60,7 @@
modelBusinessEntities.add(clazz);
}
}
-
-
+
for (ObjectModelClass businessEntity : modelBusinessEntities) {
ObjectModelClass abstractClass = createAbstractClass(WikittyTransformerUtil.businessEntityToAbstractName(businessEntity),
businessEntity.getPackageName());
@@ -87,11 +87,18 @@
addConstants(businessEntity, abstractClassForThisEntity);
addToString(businessEntity, abstractClassForThisEntity);
}
+
+ // for all classes of model, check if steroptyped with "meta"
+ for (ObjectModelClass clazz : model.getClasses()) {
+ if (WikittyTransformerUtil.isMetaExtension(clazz)) {
+ // if so, add operations
+ addMetaExtensionOperations(clazz, processedClasses.get(clazz));
+ }
+ }
processedClasses.clear();
}
-
-
+
protected void addImports(ObjectModelClass clazz) {
// TODO 20100811 bleny remove unused imports
addImport(clazz, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
@@ -251,6 +258,9 @@
String extensionVariableName = WikittyTransformerUtil.classToExtensionVariableName(businessEntity, true);
String helperClassName = WikittyTransformerUtil.businessEntityToHelperName(businessEntity);
+ boolean isMetaExtension = WikittyTransformerUtil.isMetaExtension(businessEntity);
+
+
// generating operations with bodies to realize contract
for (ObjectModelAttribute attribute : businessEntity.getAttributes()) {
if (attribute.isNavigable()) {
@@ -277,22 +287,51 @@
getterName = "get" + StringUtils.capitalize(attributeName);
ObjectModelOperation getter = addOperation(abstractClass, getterName, attributeTypeSimpleNameInSet);
addAnnotation(abstractClass, getter, "Override");
- String getterBody = ""
+ String getterBody;
+ if (isMetaExtension) {
+ getterBody = ""
/*{
+ <%=attributeTypeSimpleNameInSet%> result;
+ if (extensionForMetaExtension == null) {
+ result = <%=helperClassName%>.<%=getterName%>(getWikitty());
+ } else {
+ result = <%=helperClassName%>.<%=getterName%>(extensionForMetaExtension, getWikitty());
+ }
+ return result;
+}*/;
+ } else {
+ getterBody = ""
+/*{
<%=attributeTypeSimpleNameInSet%> result = <%=helperClassName%>.<%=getterName%>(getWikitty());
return result;
-}*/;
+}*/;
+ }
setOperationBody(getter, getterBody);
String addName = "add" + StringUtils.capitalize(attributeName);
ObjectModelOperation adder = addOperation(abstractClass, addName, "void");
addAnnotation(abstractClass, adder, "Override");
addParameter(adder, "String", "element");
- String adderBody = ""
+ String adderBody;
+ if (isMetaExtension) {
+ adderBody = ""
/*{
+ if (extensionForMetaExtension == null) {
+ <%=helperClassName%>.<%=addName%>(getWikitty(), element);
+ getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%= getter.getName() %>());
+ } else {
+ <%=helperClassName%>.<%=addName%>(extensionForMetaExtension, getWikitty(), element);
+ String fieldName = <%=helperClassName%>.getMetaFieldName(extensionForMetaExtension, "<%=attributeName%>");
+ getPropertyChangeSupport().firePropertyChange(fieldName, null, <%= getter.getName() %>());
+ }
+}*/;
+ } else {
+ adderBody = ""
+/*{
<%=helperClassName%>.<%=addName%>(getWikitty(), element);
getPropertyChangeSupport().firePropertyChange(<%=fieldVariableName%>, null, <%= getter.getName() %>());
}*/;
+ }
setOperationBody(adder, adderBody);
String removeName = "remove" + StringUtils.capitalize(attributeName);
@@ -435,4 +474,24 @@
addAnnotation(abstractClass, toString, "Override");
setOperationBody(toString, toStringOperationBody);
}
+
+ protected void addMetaExtensionOperations(ObjectModelClass metaExtension,
+ ObjectModelClass abstractClassForThisMetaExtension) {
+
+ ObjectModelAttribute extension = addAttribute(abstractClassForThisMetaExtension, "extensionForMetaExtension", WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN);
+ setDocumentation(extension, "the metaExtension operations target this extension, may be null");
+
+ ObjectModelOperation addMetaExtension = addOperation(abstractClassForThisMetaExtension, "addMetaExtension", "void");
+ addAnnotation(abstractClassForThisMetaExtension, addMetaExtension, "Override");
+ addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension");
+ setDocumentation(addMetaExtension, String.format(
+ "add %s meta-extension on given extension to this entity",
+ metaExtension.getName()));
+ String helperName = WikittyTransformerUtil.businessEntityToHelperName(metaExtension);
+ setOperationBody(addMetaExtension, ""
+/*{
+ extensionForMetaExtension = extension;
+ <%=helperName%>.addMetaExtension(extension, getWikitty());
+}*/);
+ }
}
Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
===================================================================
--- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2010-09-27 07:49:11 UTC (rev 344)
+++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2010-09-27 08:49:33 UTC (rev 345)
@@ -32,7 +32,11 @@
return new WikittyPurifierTransformer();
}
-
+ /** will permet to get the result of a processed class
+ * it is useful for dealing with inheritence : when an extension depend
+ * of another. In this case the child can find the processed class of the parent
+ * and then look into it to find methods and data to copy
+ */
protected Map<ObjectModelClass, ObjectModelInterface> processedClasses =
new HashMap<ObjectModelClass, ObjectModelInterface>();
@@ -46,44 +50,70 @@
processEntity(clazz);
}
}
+
+ for (ObjectModelClass clazz : model.getClasses()) {
+ if (WikittyTransformerUtil.isMetaExtension(clazz)) {
+ processMetaExtension(clazz);
+ }
+ }
processedClasses.clear();
}
+
+ /** contains code commons to entities and meta-extensions */
+ protected ObjectModelInterface prepareOutputClass(ObjectModelClass businessEntity) {
+
+ ObjectModelInterface contract;
+
+ if (processedClasses.containsKey(businessEntity)) {
- protected void processEntity(ObjectModelClass businessEntity) {
- log.info("will process " + businessEntity.getPackageName() + ".." + businessEntity.getName());
- ObjectModelInterface contract = createInterface(WikittyTransformerUtil.businessEntityToContractName(businessEntity),
- businessEntity.getPackageName());
- addInterface(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
+ contract = processedClasses.get(businessEntity);
- // TODO 20100811 bleny remove unused imports
- addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
- addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN);
- addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN);
- addImport(contract, "org.nuiton.wikitty.WikittyExtension");
- addImport(contract, "org.nuiton.wikitty.WikittyUtil");
- addImport(contract, "org.nuiton.wikitty.WikittyUser");
- addImport(contract, "org.nuiton.wikitty.WikittyUserAbstract");
- addImport(contract, "org.nuiton.wikitty.WikittyUserImpl");
- addImport(contract, "org.nuiton.wikitty.TreeNode");
- addImport(contract, "org.nuiton.wikitty.TreeNodeAbstract");
- addImport(contract, "org.nuiton.wikitty.TreeNodeImpl");
- addImport(contract, java.util.List.class);
- addImport(contract, java.util.ArrayList.class);
- addImport(contract, java.util.Collection.class);
- addImport(contract, java.util.Collections.class);
- addImport(contract, java.util.Set.class);
- addImport(contract, java.util.Date.class);
- addImport(contract, java.util.LinkedHashSet.class);
+ } else {
- String documentation = businessEntity.getDocumentation();
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION)) {
- documentation += "\n\n";
- documentation += businessEntity.getTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION);
+ log.info("will process " + businessEntity.getPackageName() + ".." + businessEntity.getName());
+ contract = createInterface(WikittyTransformerUtil.businessEntityToContractName(businessEntity),
+ businessEntity.getPackageName());
+ addInterface(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
+
+ // TODO 20100811 bleny remove unused imports
+ addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
+ addImport(contract, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN);
+ addImport(contract, WikittyTransformerUtil.WIKITTY_CLASS_FQN);
+ addImport(contract, "org.nuiton.wikitty.WikittyExtension");
+ addImport(contract, "org.nuiton.wikitty.WikittyUtil");
+ addImport(contract, "org.nuiton.wikitty.WikittyUser");
+ addImport(contract, "org.nuiton.wikitty.WikittyUserAbstract");
+ addImport(contract, "org.nuiton.wikitty.WikittyUserImpl");
+ addImport(contract, "org.nuiton.wikitty.TreeNode");
+ addImport(contract, "org.nuiton.wikitty.TreeNodeAbstract");
+ addImport(contract, "org.nuiton.wikitty.TreeNodeImpl");
+ addImport(contract, java.util.List.class);
+ addImport(contract, java.util.ArrayList.class);
+ addImport(contract, java.util.Collection.class);
+ addImport(contract, java.util.Collections.class);
+ addImport(contract, java.util.Set.class);
+ addImport(contract, java.util.Date.class);
+ addImport(contract, java.util.LinkedHashSet.class);
+
+ String documentation = businessEntity.getDocumentation();
+ if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION)) {
+ documentation += "\n\n";
+ documentation += businessEntity.getTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION);
+ }
+
+ setDocumentation(contract, documentation);
+
+ processedClasses.put(businessEntity, contract);
}
- setDocumentation(contract, documentation);
+
+ return contract;
+ }
+ protected void processEntity(ObjectModelClass businessEntity) {
+ ObjectModelInterface contract = prepareOutputClass(businessEntity);
+
// adding public static final String EXT_CLIENT = "Client";
addConstant(contract,
"EXT_" + businessEntity.getName().toUpperCase(),
@@ -180,7 +210,21 @@
}
}
}
-
+
processedClasses.put(businessEntity, contract);
}
+
+ /** add stuff if input model element is stereotyped as "meta" */
+ protected void processMetaExtension(ObjectModelClass metaExtension) {
+
+ ObjectModelInterface contract = prepareOutputClass(metaExtension);
+
+ ObjectModelOperation addMetaExtension = addOperation(contract, "addMetaExtension", "void");
+ addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension");
+ setDocumentation(addMetaExtension, String.format(
+ "add %s meta-extension on given extension to this entity",
+ metaExtension.getName()));
+
+
+ }
}
Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
===================================================================
--- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2010-09-27 07:49:11 UTC (rev 344)
+++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2010-09-27 08:49:33 UTC (rev 345)
@@ -16,12 +16,10 @@
*/
public class WikittyHelperGenerator extends ObjectModelTransformerToJava {
+ protected static final String META_EXTENSION_SEPARATOR = ":";
+
@Override
public void transformFromClass(ObjectModelClass clazz) {
-
- if (! WikittyTransformerUtil.isBusinessEntity(clazz)) {
- return ;
- }
ObjectModelClass helper = createClass(WikittyTransformerUtil.businessEntityToHelperName(clazz),
clazz.getPackageName());
@@ -51,10 +49,23 @@
setDocumentation(constructor, "utility class all provided methods are accessible the static way");
setOperationBody(constructor, "// empty\n"); // empty implementation
- String extensionVariableName = WikittyTransformerUtil.classToExtensionVariableName(clazz, true);
+ if ( WikittyTransformerUtil.isBusinessEntity(clazz) ) {
+ createOperationsForBusinessEntity(clazz, helper);
+ }
- // generating operations with bodies to realize contract
- for (ObjectModelAttribute attribute : clazz.getAttributes()) {
+ if ( WikittyTransformerUtil.isMetaExtension(clazz)) {
+ createOperationForMetaExtension(clazz, helper);
+ }
+ }
+
+ /** add operation if input model element has stereotype "entity" */
+ protected void createOperationsForBusinessEntity(ObjectModelClass entity,
+ ObjectModelClass helper) {
+
+ String extensionVariableName = WikittyTransformerUtil.classToExtensionVariableName(entity, true);
+
+ // generating operations with bodies
+ for (ObjectModelAttribute attribute : entity.getAttributes()) {
if (attribute.isNavigable()) {
// needed below, in templates
String fieldVariableName = WikittyTransformerUtil.attributeToFielVariableName(attribute, true);
@@ -142,6 +153,9 @@
}
+
+ // now, adding the equals(w1, w2)
+
ObjectModelOperation equals = addOperation(helper, "equals", "boolean", ObjectModelModifier.STATIC);
addParameter(equals, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "w1");
addParameter(equals, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "w2");
@@ -152,7 +166,7 @@
boolean result = true;
}*/;
- for(ObjectModelAttribute attribute : clazz.getAttributes()) {
+ for(ObjectModelAttribute attribute : entity.getAttributes()) {
if (attribute.isNavigable()) {
// two variables needed below
String fieldVariableName = WikittyTransformerUtil.attributeToFielVariableName(attribute, true);
@@ -176,6 +190,12 @@
}*/;
setOperationBody(equals, equalsBody);
+
+
+
+
+ // finally, adding isExtention and addExtension
+
ObjectModelOperation isExtension = addOperation(helper, "isExtension", "boolean", ObjectModelModifier.STATIC);
addParameter(isExtension, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
setDocumentation(isExtension, "Check if wikitty has current extension");
@@ -187,7 +207,7 @@
ObjectModelOperation addExtension = addOperation(helper, "addExtension", "void", ObjectModelModifier.STATIC);
addParameter(addExtension, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
setDocumentation(addExtension, "ajout les extensions static de cette classe au wikitty en argument");
- String contractName = WikittyTransformerUtil.businessEntityToAbstractName(clazz);
+ String contractName = WikittyTransformerUtil.businessEntityToAbstractName(entity);
setOperationBody(addExtension, ""
/*{
for (WikittyExtension ext : <%=contractName%>.extensions) {
@@ -195,4 +215,54 @@
}
}*/);
}
+
+ /** add needed operations if input model element has stereotype "meta" */
+ protected void createOperationForMetaExtension(ObjectModelClass metaExtension,
+ ObjectModelClass helper) {
+
+ ObjectModelOperation addMetaExtension = addOperation(helper, "addMetaExtension", "void", ObjectModelModifier.STATIC);
+ addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension");
+ addParameter(addMetaExtension, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
+ setDocumentation(addMetaExtension, String.format(
+ "add %s meta-extension on given extension to the given wikitty",
+ metaExtension.getName()));
+ String abstractName = WikittyTransformerUtil.businessEntityToAbstractName(metaExtension);
+ String contractName = WikittyTransformerUtil.businessEntityToContractName(metaExtension);
+ setOperationBody(addMetaExtension, ""
+/*{
+ wikitty.addMetaExtension(<%=abstractName%>.extension<%=contractName%>, extension);
+}*/);
+
+
+
+ // now adding getMetaFielName, both implementations
+
+ ObjectModelOperation getMetaFieldNameFromExtension = addOperation(helper, "getMetaFieldName", "String", ObjectModelModifier.STATIC);
+ addParameter(getMetaFieldNameFromExtension, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension");
+ addParameter(getMetaFieldNameFromExtension, "String", "fieldName");
+ setDocumentation(getMetaFieldNameFromExtension, String.format(
+ "for extension 'Ext' and field 'f', return 'Ext:%s.f'",
+ metaExtension.getName()));
+ setOperationBody(getMetaFieldNameFromExtension, ""
+/*{
+ String metaFieldName = getMetaFieldName(extension.getName(), fieldName);
+ return metaFieldName;
+}*/);
+
+ ObjectModelOperation getMetaFieldNameFromExtensionName = addOperation(helper, "getMetaFieldName", "String", ObjectModelModifier.STATIC);
+ addParameter(getMetaFieldNameFromExtensionName, "String", "extensionName");
+ addParameter(getMetaFieldNameFromExtensionName, "String", "fieldName");
+ setDocumentation(getMetaFieldNameFromExtensionName, String.format(
+ "for extension 'Ext' and field 'f', return 'Ext:%s.f'",
+ metaExtension.getName()));
+ setOperationBody(getMetaFieldNameFromExtensionName, ""
+/*{
+ String metaFieldName = String.format("%s<%=META_EXTENSION_SEPARATOR%><%=metaExtension.getName()%>.%s", extensionName, fieldName);
+ return metaFieldName;
+}*/);
+
+
+
+ // now, adding all
+ }
}
Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java
===================================================================
--- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java 2010-09-27 07:49:11 UTC (rev 344)
+++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyImplementationGenerator.java 2010-09-27 08:49:33 UTC (rev 345)
@@ -1,5 +1,7 @@
package org.nuiton.wikitty.generator;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Random;
import org.nuiton.eugene.java.ObjectModelTransformerToJava;
@@ -16,38 +18,73 @@
*/
public class WikittyImplementationGenerator extends ObjectModelTransformerToJava {
+ protected Map<ObjectModelClass, ObjectModelClass> processedClasses =
+ new HashMap<ObjectModelClass, ObjectModelClass>();
+
@Override
public void transformFromClass(ObjectModelClass clazz) {
+
+ if ( WikittyTransformerUtil.isBusinessEntity(clazz) ) {
+ ObjectModelClass implementation = prepareImplementation(clazz);
+ processBusinessEntity(clazz, implementation);
+ }
+
+ if ( WikittyTransformerUtil.isBusinessEntity(clazz) ) {
+ ObjectModelClass implementation = prepareImplementation(clazz);
+ processMetaExtension(clazz, implementation);
+ }
+ }
+
+ protected ObjectModelClass prepareImplementation(ObjectModelClass clazz) {
+ ObjectModelClass implementation;
- if (! WikittyTransformerUtil.isBusinessEntity(clazz)) {
- return ;
+ if (processedClasses.containsKey(clazz)) {
+ // class has been already processed, return the implementation
+ implementation = processedClasses.get(clazz);
+ } else {
+ implementation = createClass(
+ WikittyTransformerUtil.businessEntityToImplementationName(clazz),
+ clazz.getPackageName());
+
+ // TODO 20100811 bleny remove unused imports
+ addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
+ addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN);
+ addImport(implementation, WikittyTransformerUtil.WIKITTY_CLASS_FQN);
+ addImport(implementation, "org.nuiton.wikitty.WikittyExtension");
+ addImport(implementation, "org.nuiton.wikitty.WikittyUtil");
+ addImport(implementation, "org.nuiton.wikitty.WikittyUser");
+ addImport(implementation, "org.nuiton.wikitty.WikittyUserAbstract");
+ addImport(implementation, "org.nuiton.wikitty.WikittyUserImpl");
+ addImport(implementation, "org.nuiton.wikitty.TreeNode");
+ addImport(implementation, "org.nuiton.wikitty.TreeNodeAbstract");
+ addImport(implementation, "org.nuiton.wikitty.TreeNodeImpl");
+ addImport(implementation, java.util.List.class);
+ addImport(implementation, java.util.ArrayList.class);
+ addImport(implementation, java.util.Collection.class);
+ addImport(implementation, java.util.Collections.class);
+ addImport(implementation, java.util.Set.class);
+ addImport(implementation, java.util.Date.class);
+ addImport(implementation, java.util.LinkedHashSet.class);
+
+ setSuperClass(implementation, WikittyTransformerUtil.businessEntityToAbstractName(clazz));
+
+ // adding a generated serialVersionUID
+ Random random = new Random();
+ Long serialVersionUIDs = random.nextLong();
+ addConstant(implementation,
+ "serialVersionUID",
+ "long",
+ serialVersionUIDs.toString() + "L",
+ ObjectModelModifier.PRIVATE);
+
}
- ObjectModelClass implementation = createClass(WikittyTransformerUtil.businessEntityToImplementationName(clazz),
- clazz.getPackageName());
+ return implementation;
+ }
+
+ protected void processBusinessEntity(ObjectModelClass clazz,
+ ObjectModelClass implementation) {
- // TODO 20100811 bleny remove unused imports
- addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_CLASS_FQN);
- addImport(implementation, WikittyTransformerUtil.BUSINESS_ENTITY_WIKITTY_CLASS_FQN);
- addImport(implementation, WikittyTransformerUtil.WIKITTY_CLASS_FQN);
- addImport(implementation, "org.nuiton.wikitty.WikittyExtension");
- addImport(implementation, "org.nuiton.wikitty.WikittyUtil");
- addImport(implementation, "org.nuiton.wikitty.WikittyUser");
- addImport(implementation, "org.nuiton.wikitty.WikittyUserAbstract");
- addImport(implementation, "org.nuiton.wikitty.WikittyUserImpl");
- addImport(implementation, "org.nuiton.wikitty.TreeNode");
- addImport(implementation, "org.nuiton.wikitty.TreeNodeAbstract");
- addImport(implementation, "org.nuiton.wikitty.TreeNodeImpl");
- addImport(implementation, java.util.List.class);
- addImport(implementation, java.util.ArrayList.class);
- addImport(implementation, java.util.Collection.class);
- addImport(implementation, java.util.Collections.class);
- addImport(implementation, java.util.Set.class);
- addImport(implementation, java.util.Date.class);
- addImport(implementation, java.util.LinkedHashSet.class);
-
- setSuperClass(implementation, WikittyTransformerUtil.businessEntityToAbstractName(clazz));
-
// adding constructor
ObjectModelOperation constructor = addConstructor(implementation, ObjectModelModifier.PUBLIC);
setOperationBody(constructor, ""
@@ -69,14 +106,20 @@
super(businessEntityWikitty.getWikitty());
}*/);
- // adding a generated serialVersionUID
- Random random = new Random();
- Long serialVersionUIDs = random.nextLong();
- addConstant(implementation,
- "serialVersionUID",
- "long",
- serialVersionUIDs.toString() + "L",
- ObjectModelModifier.PRIVATE);
}
-
+
+ protected void processMetaExtension(ObjectModelClass metaExtension,
+ ObjectModelClass implementation) {
+
+
+ ObjectModelOperation constructor = addConstructor(implementation, ObjectModelModifier.PUBLIC);
+ addParameter(constructor, WikittyTransformerUtil.WIKITTY_EXTENSION_CLASS_FQN, "extension");
+ addParameter(constructor, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
+ String contractName = WikittyTransformerUtil.businessEntityToContractName(metaExtension);
+ setOperationBody(constructor, ""
+/*{
+ this.wikitty = wikitty;
+ addMetaExtension(extension<%=contractName%>, extension);
+}*/);
+ }
}
Modified: branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java
===================================================================
--- branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2010-09-27 07:49:11 UTC (rev 344)
+++ branches/wikitty-eugene-migration/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2010-09-27 08:49:33 UTC (rev 345)
@@ -16,6 +16,7 @@
protected static final String BUSINESS_ENTITY_CLASS_FQN = "org.nuiton.wikitty.BusinessEntity";
protected static final String BUSINESS_ENTITY_WIKITTY_CLASS_FQN = "org.nuiton.wikitty.BusinessEntityWikitty";
protected static final String WIKITTY_CLASS_FQN = "org.nuiton.wikitty.Wikitty";
+ protected static final String WIKITTY_EXTENSION_CLASS_FQN = "org.nuiton.wikitty.WikittyExtension";
protected static final String TAG_VERSION = "version";
protected static final String TAG_ALTERNATIVE_NAME = "alternativeName";
@@ -28,6 +29,9 @@
/** user will use this stereotype in his model */
protected static final String BUSINESS_ENTITY_STEREOTYPE_NAME = "entity";
+
+ /** user will use this stereotype to make an extension a meta-extension */
+ protected static final String META_EXTENSION_STEREOTYPE_NAME = "meta";
/** given a class called Client will return "EXT_CLIENT"
* should be used as a variable name to store the extension name
@@ -73,6 +77,11 @@
return result;
}
+ public static boolean isMetaExtension(ObjectModelClass clazz) {
+ boolean result = clazz.hasStereotype(META_EXTENSION_STEREOTYPE_NAME);
+ return result;
+ }
+
/**
* wikitty interface provide getFieldAsString, getFieldAsDate etc. methods
* this method returns the good name of the method to call depending the
1
0
r344 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty
by echatellier@users.nuiton.org 27 Sep '10
by echatellier@users.nuiton.org 27 Sep '10
27 Sep '10
Author: echatellier
Date: 2010-09-27 09:49:11 +0200 (Mon, 27 Sep 2010)
New Revision: 344
Url: http://nuiton.org/repositories/revision/wikitty/344
Log:
Add more jgroups init log messages
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JGroupsNotifier.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JGroupsNotifier.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JGroupsNotifier.java 2010-09-27 07:46:12 UTC (rev 343)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/JGroupsNotifier.java 2010-09-27 07:49:11 UTC (rev 344)
@@ -109,16 +109,17 @@
channel.setReceiver(this);
// don't receive messages sent by myself
- channel.setOpt(Channel.LOCAL, false);
+ channel.setOpt(Channel.LOCAL, false);
if (log.isInfoEnabled()) {
- log.info("JGroup communication channel initialized to " + channel.getAddressAsString() + " (" + channel.getClusterName() + ")");
+ log.info("JGroup communication channel initialized to "
+ + channel.getAddressAsString() + " ("
+ + channel.getClusterName() + ")");
log.info("Channel view: " + channel.getView());
}
- }
- catch (ChannelException eee) {
+ } catch (ChannelException eee) {
if (log.isErrorEnabled()) {
- log.error("Can't init jgroup channel");
+ log.error("Can't init jgroup channel", eee);
}
}
}
@@ -132,6 +133,7 @@
if (log.isInfoEnabled()) {
log.info("Send message : " + wikittyMessage);
}
+
Message msg = new Message(null, null, wikittyMessage);
try {
channel.send(msg);
@@ -151,9 +153,9 @@
*/
@Override
public void receive(Message msg) {
-
+
Object message = msg.getObject();
-
+
if (log.isInfoEnabled()) {
log.info("Receive message : " + msg.getObject());
}
@@ -162,7 +164,7 @@
WikittyJGroupMessage wikittyMessage = (WikittyJGroupMessage)message;
WikittyJGroupType type = wikittyMessage.type;
WikittyServiceEvent event = wikittyMessage.event;
-
+
//source is transient, add it here :
event.setSource(ws);
event.setRemote(true); // received event became remote
@@ -195,8 +197,7 @@
public void putWikitty(WikittyServiceEvent event) {
if (propagateCache) {
sendJGroupMessage(new WikittyJGroupMessage(WikittyJGroupType.PUT_WIKITTY, event));
- }
- else {
+ } else {
if (log.isDebugEnabled()) {
log.debug("Not master cache, do not propagate putWikitty event");
}
@@ -210,8 +211,7 @@
public void removeWikitty(WikittyServiceEvent event) {
if (propagateCache) {
sendJGroupMessage(new WikittyJGroupMessage(WikittyJGroupType.REMOVE_WIKITTY, event));
- }
- else {
+ } else {
if (log.isDebugEnabled()) {
log.debug("Not master cache, do not propagate removeWikitty event");
}
@@ -225,8 +225,7 @@
public void clearWikitty(WikittyServiceEvent event) {
if (propagateCache) {
sendJGroupMessage(new WikittyJGroupMessage(WikittyJGroupType.CLEAR_WIKITTY, event));
- }
- else {
+ } else {
if (log.isDebugEnabled()) {
log.debug("Not master cache, do not propagate clearWikitty event");
}
@@ -240,8 +239,7 @@
public void putExtension(WikittyServiceEvent event) {
if (propagateCache) {
sendJGroupMessage(new WikittyJGroupMessage(WikittyJGroupType.PUT_EXTENSION, event));
- }
- else {
+ } else {
if (log.isDebugEnabled()) {
log.debug("Not master cache, do not propagate putExtension event");
}
@@ -255,8 +253,7 @@
public void removeExtension(WikittyServiceEvent event) {
if (propagateCache) {
sendJGroupMessage(new WikittyJGroupMessage(WikittyJGroupType.REMOVE_EXTENSION, event));
- }
- else {
+ } else {
if (log.isDebugEnabled()) {
log.debug("Not master cache, do not propagate removeExtension event");
}
@@ -270,8 +267,7 @@
public void clearExtension(WikittyServiceEvent event) {
if (propagateCache) {
sendJGroupMessage(new WikittyJGroupMessage(WikittyJGroupType.CLEAR_EXTENSION, event));
- }
- else {
+ } else {
if (log.isDebugEnabled()) {
log.debug("Not master cache, do not propagate clearExtension event");
}
1
0
r343 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport
by echatellier@users.nuiton.org 27 Sep '10
by echatellier@users.nuiton.org 27 Sep '10
27 Sep '10
Author: echatellier
Date: 2010-09-27 09:46:12 +0200 (Mon, 27 Sep 2010)
New Revision: 343
Url: http://nuiton.org/repositories/revision/wikitty/343
Log:
Add comments
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java 2010-09-24 09:29:36 UTC (rev 342)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ImportExportCSV.java 2010-09-27 07:46:12 UTC (rev 343)
@@ -156,7 +156,7 @@
// add value to correct field
FieldType fieldType = currentWikitty.getFieldType(extName + "." + fieldName);
- if(fieldType.isCollection()) {
+ if (fieldType.isCollection()) {
String[] multiplesValues = StringUtil.split(value);
for (String multiplesValue : multiplesValues) {
// begin and ends with () only if fields
@@ -167,6 +167,8 @@
// remove non existant wikitty on Wikitty type field
if (fieldType.getType().equals(TYPE.WIKITTY)) {
+
+ // restore works (database) but solr criteria won't
List<Wikitty> wikitties = ws.restore(securityToken, transaction, Collections.singletonList(multiplesValue));
if ( wikitties != null && wikitties.size() == 1) {
currentWikitty.addToField(extName, fieldName, multiplesValue);
@@ -179,6 +181,8 @@
} else {
// remove non existant wikitty on Wikitty type field
if (fieldType.getType().equals(TYPE.WIKITTY)) {
+
+ // restore works (database) but solr criteria won't
List<Wikitty> wikitties = ws.restore(securityToken, transaction, Collections.singletonList(value));
if ( wikitties != null && wikitties.size() == 1) {
currentWikitty.setField(extName, fieldName, value);
1
0
r342 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty
by echatellier@users.nuiton.org 24 Sep '10
by echatellier@users.nuiton.org 24 Sep '10
24 Sep '10
Author: echatellier
Date: 2010-09-24 11:29:36 +0200 (Fri, 24 Sep 2010)
New Revision: 342
Url: http://nuiton.org/repositories/revision/wikitty/342
Log:
Propagation des events dans un nouveau thread pour que les listeners ne soit pas dans le m?\195?\170me thread
que celui qui ?\195?\160 lanc?\195?\169 l'event (JTA = une transaction par thread).
Modified:
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java 2010-09-23 16:53:35 UTC (rev 341)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java 2010-09-24 09:29:36 UTC (rev 342)
@@ -554,20 +554,30 @@
*
* @param event event to fire
*/
- protected void firePutWikitty(WikittyServiceEvent event) {
- for (WikittyServiceListener l : allWikittyServiceListeners) {
- l.putWikitty(event);
- }
- if (event.isRemote()) {
- for (WikittyServiceListener l : localWikittyServiceListeners) {
- l.putWikitty(event);
+ protected void firePutWikitty(final WikittyServiceEvent event) {
+ // ajout d'un thread, car si les listener doit
+ // ouvrir une transaction WikittyTransaction
+ // alors que celui qui lance l'event en a une ouverte
+ // cela cause une exception JTA
+ Thread eventThread = new Thread("wikitty-event-thread") {
+ @Override
+ public void run() {
+ for (WikittyServiceListener l : allWikittyServiceListeners) {
+ l.putWikitty(event);
+ }
+ if (event.isRemote()) {
+ for (WikittyServiceListener l : localWikittyServiceListeners) {
+ l.putWikitty(event);
+ }
+ }
+ else {
+ for (WikittyServiceListener l : remoteWikittyServiceListeners) {
+ l.putWikitty(event);
+ }
+ }
}
- }
- else {
- for (WikittyServiceListener l : remoteWikittyServiceListeners) {
- l.putWikitty(event);
- }
- }
+ };
+ eventThread.start();
}
/**
@@ -577,20 +587,30 @@
*
* @param event event to fire
*/
- protected void fireRemoveWikitty(WikittyServiceEvent event) {
- for (WikittyServiceListener l : allWikittyServiceListeners) {
- l.removeWikitty(event);
- }
- if (event.isRemote()) {
- for (WikittyServiceListener l : localWikittyServiceListeners) {
- l.removeWikitty(event);
+ protected void fireRemoveWikitty(final WikittyServiceEvent event) {
+ // ajout d'un thread, car si les listener doit
+ // ouvrir une transaction WikittyTransaction
+ // alors que celui qui lance l'event en a une ouverte
+ // cela cause une exception JTA
+ Thread eventThread = new Thread("wikitty-event-thread") {
+ @Override
+ public void run() {
+ for (WikittyServiceListener l : allWikittyServiceListeners) {
+ l.removeWikitty(event);
+ }
+ if (event.isRemote()) {
+ for (WikittyServiceListener l : localWikittyServiceListeners) {
+ l.removeWikitty(event);
+ }
+ }
+ else {
+ for (WikittyServiceListener l : remoteWikittyServiceListeners) {
+ l.removeWikitty(event);
+ }
+ }
}
- }
- else {
- for (WikittyServiceListener l : remoteWikittyServiceListeners) {
- l.removeWikitty(event);
- }
- }
+ };
+ eventThread.start();
}
/**
@@ -600,20 +620,30 @@
*
* @param event event to fire
*/
- protected void fireClearWikitty(WikittyServiceEvent event) {
- for (WikittyServiceListener l : allWikittyServiceListeners) {
- l.clearWikitty(event);
- }
- if (event.isRemote()) {
- for (WikittyServiceListener l : localWikittyServiceListeners) {
- l.clearWikitty(event);
+ protected void fireClearWikitty(final WikittyServiceEvent event) {
+ // ajout d'un thread, car si les listener doit
+ // ouvrir une transaction WikittyTransaction
+ // alors que celui qui lance l'event en a une ouverte
+ // cela cause une exception JTA
+ Thread eventThread = new Thread("wikitty-event-thread") {
+ @Override
+ public void run() {
+ for (WikittyServiceListener l : allWikittyServiceListeners) {
+ l.clearWikitty(event);
+ }
+ if (event.isRemote()) {
+ for (WikittyServiceListener l : localWikittyServiceListeners) {
+ l.clearWikitty(event);
+ }
+ }
+ else {
+ for (WikittyServiceListener l : remoteWikittyServiceListeners) {
+ l.clearWikitty(event);
+ }
+ }
}
- }
- else {
- for (WikittyServiceListener l : remoteWikittyServiceListeners) {
- l.clearWikitty(event);
- }
- }
+ };
+ eventThread.start();
}
/**
@@ -623,20 +653,30 @@
*
* @param event event to fire
*/
- protected void firePutExtension(WikittyServiceEvent event) {
- for (WikittyServiceListener l : allWikittyServiceListeners) {
- l.putExtension(event);
- }
- if (event.isRemote()) {
- for (WikittyServiceListener l : localWikittyServiceListeners) {
- l.putExtension(event);
+ protected void firePutExtension(final WikittyServiceEvent event) {
+ // ajout d'un thread, car si les listener doit
+ // ouvrir une transaction WikittyTransaction
+ // alors que celui qui lance l'event en a une ouverte
+ // cela cause une exception JTA
+ Thread eventThread = new Thread("wikitty-event-thread") {
+ @Override
+ public void run() {
+ for (WikittyServiceListener l : allWikittyServiceListeners) {
+ l.putExtension(event);
+ }
+ if (event.isRemote()) {
+ for (WikittyServiceListener l : localWikittyServiceListeners) {
+ l.putExtension(event);
+ }
+ }
+ else {
+ for (WikittyServiceListener l : remoteWikittyServiceListeners) {
+ l.putExtension(event);
+ }
+ }
}
- }
- else {
- for (WikittyServiceListener l : remoteWikittyServiceListeners) {
- l.putExtension(event);
- }
- }
+ };
+ eventThread.start();
}
/**
@@ -646,20 +686,30 @@
*
* @param event event to fire
*/
- protected void fireRemoveExtension(WikittyServiceEvent event) {
- for (WikittyServiceListener l : allWikittyServiceListeners) {
- l.removeExtension(event);
- }
- if (event.isRemote()) {
- for (WikittyServiceListener l : localWikittyServiceListeners) {
- l.removeExtension(event);
+ protected void fireRemoveExtension(final WikittyServiceEvent event) {
+ // ajout d'un thread, car si les listener doit
+ // ouvrir une transaction WikittyTransaction
+ // alors que celui qui lance l'event en a une ouverte
+ // cela cause une exception JTA
+ Thread eventThread = new Thread("wikitty-event-thread") {
+ @Override
+ public void run() {
+ for (WikittyServiceListener l : allWikittyServiceListeners) {
+ l.removeExtension(event);
+ }
+ if (event.isRemote()) {
+ for (WikittyServiceListener l : localWikittyServiceListeners) {
+ l.removeExtension(event);
+ }
+ }
+ else {
+ for (WikittyServiceListener l : remoteWikittyServiceListeners) {
+ l.removeExtension(event);
+ }
+ }
}
- }
- else {
- for (WikittyServiceListener l : remoteWikittyServiceListeners) {
- l.removeExtension(event);
- }
- }
+ };
+ eventThread.start();
}
/**
@@ -669,19 +719,29 @@
*
* @param event event to fire
*/
- protected void fireClearExtension(WikittyServiceEvent event) {
- for (WikittyServiceListener l : allWikittyServiceListeners) {
- l.clearExtension(event);
- }
- if (event.isRemote()) {
- for (WikittyServiceListener l : localWikittyServiceListeners) {
- l.clearExtension(event);
+ protected void fireClearExtension(final WikittyServiceEvent event) {
+ // ajout d'un thread, car si les listener doit
+ // ouvrir une transaction WikittyTransaction
+ // alors que celui qui lance l'event en a une ouverte
+ // cela cause une exception JTA
+ Thread eventThread = new Thread("wikitty-event-thread") {
+ @Override
+ public void run() {
+ for (WikittyServiceListener l : allWikittyServiceListeners) {
+ l.clearExtension(event);
+ }
+ if (event.isRemote()) {
+ for (WikittyServiceListener l : localWikittyServiceListeners) {
+ l.clearExtension(event);
+ }
+ }
+ else {
+ for (WikittyServiceListener l : remoteWikittyServiceListeners) {
+ l.clearExtension(event);
+ }
+ }
}
- }
- else {
- for (WikittyServiceListener l : remoteWikittyServiceListeners) {
- l.clearExtension(event);
- }
- }
+ };
+ eventThread.start();
}
}
1
0
r341 - trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr
by echatellier@users.nuiton.org 23 Sep '10
by echatellier@users.nuiton.org 23 Sep '10
23 Sep '10
Author: echatellier
Date: 2010-09-23 18:53:35 +0200 (Thu, 23 Sep 2010)
New Revision: 341
Url: http://nuiton.org/repositories/revision/wikitty/341
Log:
Fix multiples fields sorting
Modified:
trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
===================================================================
--- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-23 14:01:59 UTC (rev 340)
+++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-23 16:53:35 UTC (rev 341)
@@ -618,7 +618,7 @@
String queryString = restriction2Solr.toSolr(criteria.getRestriction(), solrServer);
SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + queryString);
- // Add pagged
+ // Add paged
int firstIndex = criteria.getFirstIndex();
int endIndex = criteria.getEndIndex();
@@ -637,7 +637,7 @@
if(sortAscending != null) {
for (String sort : sortAscending) {
String tranform = fieldModifier.convertToSolr(transaction, sort);
- query.setSortField(tranform, SolrQuery.ORDER.asc);
+ query.addSortField(tranform, SolrQuery.ORDER.asc);
}
}
@@ -645,7 +645,7 @@
if(sortDescending != null) {
for (String sort : sortDescending) {
String tranform = fieldModifier.convertToSolr(transaction, sort);
- query.setSortField(tranform, SolrQuery.ORDER.desc);
+ query.addSortField(tranform, SolrQuery.ORDER.desc);
}
}
1
0
r340 - trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr
by echatellier@users.nuiton.org 23 Sep '10
by echatellier@users.nuiton.org 23 Sep '10
23 Sep '10
Author: echatellier
Date: 2010-09-23 16:01:59 +0200 (Thu, 23 Sep 2010)
New Revision: 340
Url: http://nuiton.org/repositories/revision/wikitty/340
Log:
Fix treenode field indexation
Modified:
trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java
===================================================================
--- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-23 10:13:48 UTC (rev 339)
+++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-09-23 14:01:59 UTC (rev 340)
@@ -310,7 +310,7 @@
Collection<String> excludedChildNodeIds = getExcludedNodeIds(id);
// Find all node contain child
- SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + TreeNode.FQ_FIELD_TREENODE_CHILDREN + "_s:" + id);
+ SolrQuery query = new SolrQuery(SOLR_QUERY_PARSER + TreeNode.FQ_FIELD_TREENODE_CHILDREN + ":" + id);
QueryResponse response = solrServer.query(query);
SolrDocumentList updateDocs = response.getResults();
@@ -527,7 +527,7 @@
// Search deleted children
SolrDocument treeNodeDoc = findById(id);
if(treeNodeDoc != null) {
- Collection oldChildren = treeNodeDoc.getFieldValues(TreeNode.FQ_FIELD_TREENODE_CHILDREN + "_s");
+ Collection oldChildren = treeNodeDoc.getFieldValues(TreeNode.FQ_FIELD_TREENODE_CHILDREN);
if(oldChildren != null) {
// if no more children, remove all old children
if(children == null) {
1
0
Author: bleny
Date: 2010-09-23 12:13:48 +0200 (Thu, 23 Sep 2010)
New Revision: 339
Url: http://nuiton.org/repositories/revision/wikitty/339
Log:
update spec
Modified:
trunk/src/site/rst/Spec.rst
Modified: trunk/src/site/rst/Spec.rst
===================================================================
--- trunk/src/site/rst/Spec.rst 2010-09-23 10:12:47 UTC (rev 338)
+++ trunk/src/site/rst/Spec.rst 2010-09-23 10:13:48 UTC (rev 339)
@@ -7,6 +7,7 @@
identifiants commence par un UUID et peut être séparé d'une extension
spécifique pour certain besoin par un '_' (underscore)
+Un wikitty a toujours un identifiant.
Gestion des droits
==================
@@ -15,7 +16,7 @@
-----------------------
Les utilisateurs ont un nom et un mot de passe, les groupes contiennent
-des utilisateurs (d'autres groupes ?)
+des utilisateurs et d'autres groupes
Par défaut il existe un *WikittyGroup* portant le nom **WikittyAppAdmin**.
Si ce groupe n'existe pas ou qu'il est vide, cela indique que tous les
@@ -24,7 +25,7 @@
- pour permettre d'avoir une authentification, mais que l'on ne souhaite pas de
gestion d'autorisation.
-- pour servire de bootstrap au lancement de l'application seul les AppAdmin
+- pour servir de bootstrap au lancement de l'application seul les AppAdmin
peuvent modifier le *WikittyGroup* portant le nom **WikittyAppAdmin**, or s'il
est vide il faut pouvoir le remplir.
@@ -45,17 +46,16 @@
SecurityToken ne fera qu'augmenter. Pour éviter cela, il faut prévoir un petit
job qui de temps en temps fait le ménage dans les SecurityToken trop vieux.
+Gestion des droits sur un Wikitty (sécurité niveau 1)
+-----------------------------------------------------
-Gestion des droits sur un Wikitty
----------------------------------
-
Un wikitty a plusieurs extensions, pour chacune de ces extensions, on a plusieurs
droits. On distinque quatre niveaux de droits :
* owner (un utilisateur) donne tous les droits sur un wikitty
* admin (zéro ou plusieurs utilisateurs / groupes) permet d'ajouter ou de
- supprimer des éléments dans writer et reader
+ supprimer des éléments dans writer et reader, et tous les droits comme 'owner'
* writer (zéro ou plusieurs utilisateurs / groupes) permet, pour chacun des
champs de cette extension, de modifier la valeur
@@ -70,13 +70,24 @@
owner en tant que reader. Car de toute façon l'owner aura toujours le droit
en lecture.
-La granularité est donc au niveau des extensions. C'est à dire qu'avoir
-le droit reader de l'extension Ext permet de lire tous les champs de l'extension
-Ext de tous les wikitty qui ont l'extension Ext.
+La granularité des droits se situe donc au niveau de chaque instance. On doit
+pouvoir définir le droit pour chaque extension, de chaque wikitty. Il n'y a
+pas de gestion des droits par champs. Avoir le droit *reader* sur une extension
+d'un wikitty donne le droit de lecture sur tous les champs de cette extension.
-Gestion des droits sur les extensions
--------------------------------------
+Du point de vue structure de données, ces droits sont stockés sur le wikitty
+lui-même, dans des champs spécifiques. Par exemple, si le wikitty porte
+l'extension *Ext*, il portera également l'extension « Ext:WikittySecurity »
+et il y aura, sur le Wikitty, un champ nommé « owner » (dont le FQN est
+« Ext:WikittySecurity.owner »).
+Autre exemple, si un wikitty porte 3 extensions, ayant chacune 10 champs.
+Le wikitty aura, au total, 42 champs : 3 × 10 champs + 3 extensions × 4 champs
+(les 4 champs de l'extension WikittySecurity).
+
+Gestion des droits sur les extensions (sécurité niveau 2)
+---------------------------------------------------------
+
Pour chaque extension, on a la même hiérachie de droit qui donnent des
possibilités différentes :
@@ -85,7 +96,7 @@
* admin : permet de changer les droits de l'extension. Donc, permet d'ajouter
ou de supprimer des éléments dans writer et reader
-* writer : permet de modifier l'extension l'extension
+* writer : permet de modifier l'extension
* reader : permet de lire l'extension pour en créer des instances. Si le reader
est vide, tout le monde peut créer. Pour que seuls les AppAdmin et le owner
@@ -94,22 +105,11 @@
Si une extension ne dispose pas de ces informations, seuls les AppAdmin peuvent
créer les instances et modifier l'extension.
-Comment ces droits sont stockés
--------------------------------
+Ces droits sont stockés sous le forme d'un Wikitty. Pour chaque extension
+connue, il y aura donc un wikitty dont la seule extension sera WikittySecurity.
-Pour chaque extension connue, il y aura donc un wikitty dont le seule
-extension sera WikittySecurity. Chacun de ces wikitty aura pour identifiant
-« WikittySecurity'ExtensionName' ».
+À VALIDER : Chacun de ces wikitty aura pour identifiant « WikittySecurity'ExtensionName' ».
-Pour stoker les droits qui portent sur les extensions, on fait appel
-à des **meta-extensions**. Une
-
-Pseudo extension est portée par les extensions du wikitty. Exemple avec
-WikittySecurity sur un Wikitty Personne qui a une extension Employee et
-Customer. Il y a une extension Employee:WikittySecurity et une extension
-Customer:WikittySecurity. le séparateur de pseudo-extension = ':' comme css
-
-
Localisation
============
@@ -148,5 +148,4 @@
Pseudo extension
================
-
migration : méthode migrate(oldExtension, newExtension, Wikitty, Locale) Locale pouvant etre null.
1
0