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
March 2012
- 2 participants
- 23 discussions
Author: bpoussin
Date: 2012-03-05 02:27:14 +0100 (Mon, 05 Mar 2012)
New Revision: 1437
Url: http://nuiton.org/repositories/revision/wikitty/1437
Log:
ajout de la doc sur les tags values disponibles
Modified:
trunk/src/site/rst/user/generation.rst.vm
Modified: trunk/src/site/rst/user/generation.rst.vm
===================================================================
--- trunk/src/site/rst/user/generation.rst.vm 2012-03-05 00:52:40 UTC (rev 1436)
+++ trunk/src/site/rst/user/generation.rst.vm 2012-03-05 01:27:14 UTC (rev 1437)
@@ -91,7 +91,7 @@
Vous pourriez être étonné que le lien entre vos entités soit représenté par une
chaîne de caractère. En fait, dans vos entité Wikitty, un lien vers un autre
-Wikitty estreprésenté par son identifiant qui est une chaîne de caractères.
+Wikitty est représenté par son identifiant qui est une chaîne de caractères.
Ainsi, un getXXXXX vous retournera l'identifiant d'un Wikitty qu'il faudra
récupérer en passant par le WikittyClient. Vous pouvez alors utiliser le cache
pour limiter les appels côté serveur.
@@ -114,9 +114,70 @@
Si vous souhaitez qu'une entité crée un arbre, vous avez juste à faire hériter
cette entité de WikittyTreeNode (pas besoin de référence sur elle-même). De
-cette manière, la gestion de l'arbre est assurée par Wikity, de même que
+cette manière, la gestion de l'arbre est assurée par Wikitty, de même que
l'indexation et la recherche.
.. image:: wikittyTree.png
-.. _EUGene::http://maven-site.nuiton.org/eugene/
\ No newline at end of file
+.. _EUGene::http://maven-site.nuiton.org/eugene/
+
+Tag Value disponible
+====================
+
+L'ensemble des tags disponible se trouve dans la classe WikittyTagValue.
+
+:version: s'applique au extension, indique la version de l'extension. Il est
+ obligatoire de modifier la valeur de la version lorsque vous modifiez la
+ définition de votre extension.
+
+:alternativeName: s'applique au champs, ce tag peut etre mis pour qu'a la
+ generation un des accesseur avec un autre nom soit genere.
+
+:documentation: s'applicque au extension et au champs. Il indique la
+ documentation a mettre lors de la generation peut aussi servir de
+ documentation utilisateur a l'execution.
+
+:toString: s'applique au extension et indique la facon de representer une
+ extension textuellement. Par exemple::
+
+ %Person.lastName$s %Person.firstName$s: %Person.birthday$tm %Person.birthday$te,%Person.birthday$tY"
+ "Hello %Person.firstName|unknow$s" if firstName field doesn't exist, unknow is used
+
+:sortOrder: s'applique au extension et indique le tri par defaut pour cette
+ extension. C'est une liste des champs dans l'importance de l'ordre de trie.
+ Il est possible d'ajouter asc ou desc apres le champs pour indique qu'il faut
+ trier en ordre croissant ou decroissant. Par exemple::
+
+ "Person.lastName asc, Person.firstName, Person.birthday desc"
+
+:Unique: s'applique au champs de type collection et indique s'il vaut
+ true que la collection ne peut pas contenir de doublon (Set) si unique
+ est false alors la collection peut contenir des doublons (List).
+
+:notNull: s'applique au champs et indique que le champs ne peut pas etre null,
+ il doit forcement avoir une valeur lors de la sauvegarde.
+
+:pattern: s'applique au champs et indique pour une String indique que le champs
+ doit respecter un certain pattern, sinon la sauvegarde echoue. Pour un numeric
+ ou une date pattern peut-etre utilise comme masque de saisie. Exemple::
+
+ "A.*" le champs doit commencer par 'A'
+ "[0-9]+\.[0-9][0-9]" le nombre doit avoir deux chiffres apres la virgule
+
+:indexed: s'applique au champs et indique si un champs doit etre indexe ou non.
+ par defaut si ce tag value n'existe pas il vaut true. Il faut donc le
+ positionner explicitement a false si on ne veut pas indexer un champs
+
+:crypt: s'applique au champs et indique que le champs doit etre crypte avant
+ d'etre sauve et decrypter lors de la restauration, de plus le champs ne
+ sera pas indexe. Si le cryptage n'est pas possible, la sauvegarde ne se
+ fera pas (Exeption). Par exemple::
+
+ crypt=Blowfish:password
+
+:extensionAllowed: s'applique au champs de type Wikitty et indique que le champs
+ ne peut prendre comme valeur que des wikitties ayant les extensions specifiees.
+ Par exemple::
+
+ Person,Employee;Company
+ Ici il faut que l'objet ait les extensions Person et Employee ou l'extension Company
1
0
Author: bpoussin
Date: 2012-03-05 01:52:40 +0100 (Mon, 05 Mar 2012)
New Revision: 1436
Url: http://nuiton.org/repositories/revision/wikitty/1436
Log:
correction dans le pom.xml (2 fois le meme repository)
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-03-05 00:47:56 UTC (rev 1435)
+++ trunk/pom.xml 2012-03-05 00:52:40 UTC (rev 1436)
@@ -1005,14 +1005,6 @@
</pluginManagement>
</build>
- <repositories>
- <repository>
- <id>wikitty-group</id>
- <name>wikitty-group</name>
- <url>http://nexus.nuiton.org/nexus/content/groups/wikitty/</url>
- </repository>
- </repositories>
-
<profiles>
<profile>
<id>wikitty-extra-modules</id>
1
0
Author: bpoussin
Date: 2012-03-05 01:47:56 +0100 (Mon, 05 Mar 2012)
New Revision: 1435
Url: http://nuiton.org/repositories/revision/wikitty/1435
Log:
Gestion de tous les tag/values
Evolution #1153: Add pattern tagValue on wikitties
Evolution #1154: Add indexed tagValue on wikitty
Evolution #1155: Add Crypt tagvalue on wikitties
Evolution #1985: Add tag value wikitty-extension on field of type Wikitty
Evolution #1987: Add sort-order tag value as toString tag value
Added:
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java
Modified:
trunk/pom.xml
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaTransformer.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyPurifierTransformer.java
trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java
trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/pom.xml 2012-03-05 00:47:56 UTC (rev 1435)
@@ -1005,6 +1005,14 @@
</pluginManagement>
</build>
+ <repositories>
+ <repository>
+ <id>wikitty-group</id>
+ <name>wikitty-group</name>
+ <url>http://nexus.nuiton.org/nexus/content/groups/wikitty/</url>
+ </repository>
+ </repositories>
+
<profiles>
<profile>
<id>wikitty-extra-modules</id>
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -25,6 +25,7 @@
package org.nuiton.wikitty;
import java.util.Properties;
+import org.apache.commons.lang3.StringUtils;
import static org.nuiton.i18n.I18n._;
@@ -109,6 +110,20 @@
return conf;
}
+ /**
+ * Par default on utilise le mot de passe en parametre, sauf s'il est blanc
+ * ou null, dans se cas on utilise le mot de passe general.
+ * @param config
+ * @param password
+ * @return
+ */
+ static public String getCryptPassword(ApplicationConfig config, String password) {
+ if (StringUtils.isBlank(password)) {
+ password = config.getOption(WikittyConfigOption.WIKITTY_STORAGE_CRYPT_PASSWORD.getKey());
+ }
+ return password;
+ }
+
static public void help() {
System.out.println("Wikitty configuration and action");
System.out.println("Options (set with --option <key> <value>:");
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfigOption.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -50,6 +50,11 @@
n_("Data directory where wikitty store data"),
"./target/data",
String.class, false, false),
+ WIKITTY_STORAGE_CRYPT_PASSWORD(
+ "wikitty.storage.crypt.password",
+ n_("Password utilise pour crypter les champs qui n'ont pas de mot de passe propre"),
+ "",
+ String.class, false, false),
WIKITTY_STORAGE_JDBC_QUERY_FILE(
"wikitty.storage.jdbc.queryfile",
n_("JDBC query configuration file. You can put more than one file"
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -44,6 +44,7 @@
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
+import java.security.Key;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -61,8 +62,12 @@
import java.util.Set;
import java.util.TimeZone;
import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
import net.iharder.Base64;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.converters.DateTimeConverter;
@@ -200,7 +205,7 @@
// legacy field definition : unique
String uniqueString = match.group(6);
if (uniqueString != null) {
- tagValuesMap.put(FieldType.UNIQUE, "true");
+ tagValuesMap.put(FieldType.TAG_UNIQUE, "true");
if (log.isWarnEnabled()) {
log.warn("Old field constraints definition detected \"unique\" ; prefer use of \"unique=true\"");
}
@@ -209,7 +214,7 @@
// legacy field definition : not null
String notNullString = match.group(7);
if (notNullString != null) {
- tagValuesMap.put(FieldType.NOT_NULL, "true");
+ tagValuesMap.put(FieldType.TAG_NOT_NULL, "true");
log.warn("Old field constraints definition detected \"non null\" ; prefer use of \"notNull=true\"");
}
@@ -434,12 +439,15 @@
byte[] result = null;
if (value == null || "".equals(value)) {
result = new byte[0]; // default to 0
- } else if (value instanceof String) {
- try {
- result = Base64.decode((String) value);
- } catch (IOException eee) {
- throw new WikittyException("Bad Base64 format", eee);
- }
+ // poussin 20120305 non, il ne faut pas convertir automatiquement les
+ // chaine en base64. Si on le souhaite, il faut le faire explicitement
+ // par exemple pour l'export csv/xml
+// } else if (value instanceof String) {
+// try {
+// result = Base64.decode((String) value);
+// } catch (IOException eee) {
+// throw new WikittyException("Bad Base64 format", eee);
+// }
} else if (value instanceof byte[]) {
result = (byte[]) value;
} else {
@@ -521,6 +529,10 @@
result = solrDateFormat.format((Calendar)value);
} else if (value instanceof BigDecimal) {
result = ((BigDecimal)value).stripTrailingZeros().toString();
+ } else if (value instanceof byte[]) {
+ // poussin 20120305 il faut etre coherent avec le toBinary qui fait un String.toByte
+// result = Base64.encodeBytes((byte[]) value);
+ result = new String((byte[]) value);
} else {
// try to convert to String
result = value.toString();
@@ -634,6 +646,32 @@
}
/**
+ * Convert object o for export CSV/XML.
+ *
+ * @param field field description
+ * @param o field value
+ * @return solr representation
+ */
+ static public Object fromStringForExport(FieldType field, String s) {
+ Object result = null;
+ switch (field.getType()) {
+ case BINARY:
+ try {
+ result = Base64.decode(s);
+ } catch (IOException eee) {
+ throw new WikittyException("Can't decode string", eee);
+ }
+ break;
+ default:
+ // pour les autres conversion, les conversions auto du wikitty
+ // suffise
+ result = s;
+ break;
+ }
+ return result;
+ }
+
+ /**
* Convert object o for indexation
*
* @param field field description
@@ -672,15 +710,7 @@
Object result = null;
switch (field.getType()) {
case BINARY:
- if (s == null | "".equals(s)) {
- result = new byte[0];
- } else {
- try {
- result = Base64.decode(s);
- } catch (IOException eee) {
- throw new WikittyException("Bad Base64 format", eee);
- }
- }
+ result = WikittyUtil.toBinary(s);
break;
case BOOLEAN:
result = WikittyUtil.toBoolean(s);
@@ -1433,4 +1463,44 @@
}
}
+ static public byte[] crypt(String algo, String password, byte[] value) {
+ try {
+ byte[] result;
+ if (StringUtils.isBlank(password)) {
+ // on ne crypt pas s'il n'y a pas de mot de passe
+ result = value;
+ } else {
+ byte[] passwordInBytes = password.getBytes();
+ Key clef = new SecretKeySpec(passwordInBytes, algo);
+ Cipher cipher = Cipher.getInstance(algo);
+ cipher.init(Cipher.ENCRYPT_MODE, clef);
+
+ result = cipher.doFinal(value);
+ }
+ return result;
+ } catch (Exception eee) {
+ throw new WikittyException("Can't crypt data", eee);
+ }
+ }
+
+ static public byte[] decrypt(String algo, String password, byte[] value) {
+ try {
+ byte[] result;
+ if (StringUtils.isBlank(password)) {
+ // on ne decrypt pas s'il n'y a pas de mot de passe
+ result = value;
+ } else {
+ byte[] passwordInBytes = password.getBytes();
+ Key clef = new SecretKeySpec(passwordInBytes, algo);
+ Cipher cipher = Cipher.getInstance(algo);
+ cipher.init(Cipher.DECRYPT_MODE, clef);
+
+ result = cipher.doFinal(value);
+ }
+ return result;
+ } catch (Exception eee) {
+ throw new WikittyException("Can't decrypt data", eee);
+ }
+ }
+
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportCSV.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -185,7 +185,8 @@
}
}
else {
- currentWikitty.addToField(extName, fieldName, multiplesValue);
+ Object v = WikittyUtil.fromStringForExport(fieldType, multiplesValue);
+ currentWikitty.addToField(extName, fieldName, v);
}
}
} else {
@@ -199,7 +200,8 @@
}
}
else {
- currentWikitty.setField(extName, fieldName, value);
+ Object v = WikittyUtil.fromStringForExport(fieldType, value);
+ currentWikitty.setField(extName, fieldName, v);
}
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/addons/importexport/ImportExportXML.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -131,10 +131,11 @@
String extensionName = WikittyExtension.extractExtensionName(name);
String fieldName = WikittyExtension.extractFieldName(name);
FieldType fieldType = w.getFieldType(name);
+ Object v = WikittyUtil.fromStringForExport(fieldType, CDATA);
if (fieldType.isCollection()) {
- w.addToField(extensionName, fieldName, CDATA);
+ w.addToField(extensionName, fieldName, v);
} else {
- w.setField(extensionName, fieldName, CDATA);
+ w.setField(extensionName, fieldName, v);
}
}
} else if (eventType == XmlPullParser.TEXT) {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldFactory.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -26,6 +26,7 @@
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
import org.nuiton.wikitty.entities.WikittyTypes;
@@ -75,15 +76,71 @@
}
public FieldFactory unique() {
- addTagValue(FieldType.UNIQUE, "true");
+ addTagValue(FieldType.TAG_UNIQUE, "true");
return this;
}
public FieldFactory notNull() {
- addTagValue(FieldType.NOT_NULL, "true");
+ addTagValue(FieldType.TAG_NOT_NULL, "true");
return this;
}
+ /**
+ * Ajoute le tag crypt au champs
+ * @param algo l'algo de cryptage par exemple Blowfish
+ * @param password le mot de passe, ou null pour utiliser le mot de passe general
+ * @return
+ */
+ public FieldFactory crypt(String algo, String password) {
+ if (StringUtils.isNotBlank(password)) {
+ algo += ":" + password;
+ }
+ addTagValue(FieldType.TAG_CRYPT, "true");
+ return this;
+ }
+
+ /**
+ * Ajoute le nom des extensions autorise pour ce champs (doit etre de type
+ * Wikitty). Par exemple: "Person,Employee;Company"
+ * Soit l'objet doit avoir Person et Employee soit Company seul
+ *
+ * @param extNames
+ * @return
+ */
+ public FieldFactory extensionAllowed(String extNames) {
+ addTagValue(FieldType.TAG_EXTENSION_ALLOWED, extNames);
+ return this;
+ }
+
+ /**
+ * Met a vrai la valeur indexed
+ * @return
+ */
+ public FieldFactory indexed() {
+ addTagValue(FieldType.TAG_INDEXED, "true");
+ return this;
+ }
+
+ /**
+ * Met a false la valeur indexed
+ * @return
+ */
+ public FieldFactory notIndexed() {
+ addTagValue(FieldType.TAG_INDEXED, "false");
+ return this;
+ }
+
+ /**
+ * Ajout le pattern que doit respecter le champs.
+ * Exemple: "A.*" pour un champs commencant par A
+ * @param pattern
+ * @return
+ */
+ public FieldFactory pattern(String pattern) {
+ addTagValue(FieldType.TAG_PATTERN, pattern);
+ return this;
+ }
+
public FieldFactory addTagValue(String tag, String value) {
tagValues.put(tag, value);
return this;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -26,13 +26,17 @@
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.lang.StringUtils;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.generator.WikittyTagValue;
/**
*
@@ -42,16 +46,11 @@
* Last update: $Date$
* by : $Author$
*/
-public class FieldType implements Serializable {
+public class FieldType implements WikittyTagValue, Serializable {
/** serialVersionUID. */
private static final long serialVersionUID = -4375308750387837026L;
- /** tag/value use for unique */
- static public String UNIQUE = "unique";
- /** tag/value use for not null */
- static public String NOT_NULL = "notNull";
-
public static final int NOLIMIT = Integer.MAX_VALUE;
protected WikittyTypes type;
@@ -227,12 +226,97 @@
this.upperBound = upperBound;
}
+ /**
+ * @see #TAG_UNIQUE
+ */
public boolean isUnique() {
- return "true".equalsIgnoreCase(getTagValue(UNIQUE));
+ return "true".equalsIgnoreCase(getTagValue(TAG_UNIQUE));
}
+ /**
+ * @see #TAG_NOT_NULL
+ */
public boolean isNotNull() {
- return "true".equalsIgnoreCase(getTagValue(NOT_NULL));
+ return "true".equalsIgnoreCase(getTagValue(TAG_NOT_NULL));
}
+ /**
+ * @see #TAG_INDEXED
+ */
+ public boolean isIndexed() {
+ String indexed = getTagValue(TAG_INDEXED);
+ boolean result =
+ !isCrypted() && !StringUtils.equalsIgnoreCase("false", indexed);
+ return result;
+ }
+
+ /**
+ * @see #TAG_PATTERN
+ */
+ public boolean hasPattern() {
+ String result = getTagValue(TAG_PATTERN);
+ return result != null;
+ }
+
+ /**
+ * @see #TAG_PATTERN
+ */
+ public String getPattern() {
+ String result = getTagValue(TAG_PATTERN);
+ return result;
+ }
+
+ /**
+ * @see #TAG_CRYPT
+ */
+ public boolean isCrypted() {
+ String crypt = getTagValue(TAG_CRYPT);
+ return crypt != null;
+ }
+
+ /**
+ * @see #TAG_CRYPT
+ */
+ public String getCryptAlgo() {
+ String crypt = getTagValue(TAG_CRYPT);
+ String result = StringUtils.substringBefore(crypt, ":");
+ return result;
+ }
+
+ /**
+ * @return password or "" if general password must be used
+ * @see #TAG_CRYPT
+ */
+ public String getCryptPassword() {
+ String crypt = getTagValue(TAG_CRYPT);
+ String result = StringUtils.substringAfter(crypt, ":");
+ return result;
+ }
+
+ /**
+ * @see #TAG_EXTENSION_ALLOWED
+ */
+ public List<List<String>> getExtensionAllowed() {
+ List<List<String>> result = null;
+ if (isExtensionRestrited()) {
+ result = new ArrayList<List<String>>();
+ String allowed = getTagValue(TAG_EXTENSION_ALLOWED);
+ String[] exts = allowed.split("\\s*;\\s*");
+ for (String s : exts) {
+ String [] e = s.split("\\s*,\\s*");
+ result.add(Arrays.asList(e));
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Si les extensions autorisees pour ce champs est contrainte par le tag value
+ * {@link #TAG_EXTENSION_ALLOWED} alors retourne true, sinon false.
+ * @see #TAG_EXTENSION_ALLOWED
+ */
+ public boolean isExtensionRestrited() {
+ String allowed = getTagValue(TAG_EXTENSION_ALLOWED);
+ return allowed != null;
+ }
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -42,7 +42,7 @@
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.nuiton.wikitty.WikittyUtil;
-import org.nuiton.wikitty.generator.WikittyTransformerUtil;
+import org.nuiton.wikitty.generator.WikittyTagValue;
/**
*
@@ -428,7 +428,7 @@
*/
public String toString(Wikitty wikitty) {
String result;
- String format = getTagValue(WikittyTransformerUtil.TAG_TO_STRING);
+ String format = getTagValue(WikittyTagValue.TAG_TO_STRING);
if (StringUtils.isNotBlank(format)) {
result = WikittyUtil.format(format, wikitty);
} else {
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -49,7 +49,7 @@
import org.nuiton.util.VersionUtil;
import org.nuiton.wikitty.WikittyException;
import org.nuiton.wikitty.WikittyUtil;
-import org.nuiton.wikitty.generator.WikittyTransformerUtil;
+import org.nuiton.wikitty.generator.WikittyTagValue;
/**
* Wikitty implementation.
@@ -982,7 +982,7 @@
// les extensions requises et donc moins specifiques que les dernieres
for (int i=exts.length-1; i>=0; i--) {
WikittyExtension ext = exts[i];
- String format = ext.getTagValue(WikittyTransformerUtil.TAG_TO_STRING);
+ String format = ext.getTagValue(WikittyTagValue.TAG_TO_STRING);
if (StringUtils.isNotBlank(format)) {
extFormat = ext;
break;
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceStorage.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -38,6 +38,7 @@
import java.util.Map;
import java.util.Set;
import java.util.LinkedHashSet;
+import java.util.regex.Pattern;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
@@ -54,6 +55,7 @@
import org.nuiton.wikitty.entities.WikittyTreeNode;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.WikittyTypes;
import org.nuiton.wikitty.query.WikittyQuery;
import org.nuiton.wikitty.query.WikittyQueryMaker;
import org.nuiton.wikitty.query.WikittyQueryResult;
@@ -160,6 +162,14 @@
return true;
}
+ /**
+ * Check les contraintes sur les champs:
+ * <li> notNull
+ * <li> pattern
+ * <li> extensionAllowed
+ *
+ * @param wikitties
+ */
protected void checkConstraint(Collection<Wikitty> wikitties) {
for(Wikitty w : wikitties) {
for(WikittyExtension ext : w.getExtensions()) {
@@ -168,9 +178,41 @@
if (type.isNotNull()) {
if (null == w.getFieldAsObject(ext.getName(), fieldName)) {
throw new WikittyException(String.format(
- "Field '%s' must not be null", fieldName));
+ "Field '%s.%s' must not be null",
+ ext.getName(), fieldName));
}
}
+ if (type.hasPattern() && type.getType() == WikittyTypes.STRING) {
+ String pattern = type.getPattern();
+ String value = w.getFieldAsString(ext.getName(), fieldName);
+ if (!Pattern.matches(pattern, value)) {
+ throw new WikittyException(String.format(
+ "Field '%s.%s' must match pattern '%s' but value is '%s'",
+ ext.getName(), fieldName, pattern, value));
+ }
+ }
+ if (type.isExtensionRestrited() && type.getType() == WikittyTypes.WIKITTY) {
+ String id = w.getFieldAsWikitty(ext.getName(), fieldName);
+ Wikitty wikittyField = restore(null, id);
+ if (wikittyField != null) {
+ Collection<String> extensionNames =
+ wikittyField.getExtensionNames();
+
+ boolean authorized = false;
+ List<List<String>> allowed = type.getExtensionAllowed();
+ for (List<String> l : allowed) {
+ if (extensionNames.containsAll(l)) {
+ authorized = true;
+ break;
+ }
+ }
+ if (!authorized) {
+ throw new WikittyException(String.format(
+ "Field '%s.%s' must have extension '%s' but have '%s'",
+ ext.getName(), fieldName, allowed, extensionNames));
+ }
+ }
+ }
}
}
}
Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java
===================================================================
--- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -816,15 +816,17 @@
boolean result = false;
+ boolean isIndexed = true;
Map<String, Collection> fieldValues = new HashMap<String, Collection>();
collectFieldValue(element, fieldValues);
for (String fqf : fieldValues.keySet()) {
FieldType type = null;
if (w.hasField(fqf)) {
type = w.getFieldType(fqf);
+ isIndexed = type.isIndexed();
}
Collection<Object> contained = convert(type, expected);
- if (contained != null) {
+ if (isIndexed && contained != null) {
// si on a reussi a convertir dans le bon type on fait la verif
Collection values;
values = fieldValues.get(fqf);
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -740,10 +740,10 @@
String xmlExport = ieService.syncExportAllByQuery(FORMAT.XML, query);
// extension definition is present in xml export
- Assert.assertTrue(xmlExport.contains("<extension name='WikittyTreeNode' version='2.0'>"));
+ Assert.assertTrue(xmlExport.contains("<extension name='WikittyTreeNode' version='3.0'>"));
// some data too
Assert.assertTrue(xmlExport.contains("<WikittyTreeNode.name>Books</WikittyTreeNode.name>"));
- Assert.assertTrue(xmlExport.contains("extensions='WikittyTreeNode[2.0],CatalogNode[2.0]'"));
+ Assert.assertTrue(xmlExport.contains("extensions='WikittyTreeNode[3.0],CatalogNode[2.0]'"));
Assert.assertTrue(xmlExport.contains("<WikittyTreeNode.attachment>"));
}
@@ -2364,4 +2364,54 @@
treeNodeResult = wikittyClient.findAllIdTreeNode(eeNode.getWikittyId(), 0, true, null);
Assert.assertEquals(2, treeNodeResult.getAttCount()); // 0 before move
}
+
+ @Test
+ public void testCryptAndPatternField() throws Exception {
+ WikittyExtension ext = new WikittyExtension("UserTest",
+ "1.0", // version
+ WikittyUtil.tagValuesToMap(" version=\"2.0\""), // tag/values
+ (List)null,
+ WikittyUtil.buildFieldMapExtension( // building field map
+ "String login pattern=\\w+",
+ "String password crypt=Blowfish:xxxxxxxx"));
+
+ Wikitty w = new WikittyImpl();
+ w.addExtension(ext);
+ w.setField("UserTest", "login", "moi");
+ w.setField("UserTest", "password", "monpassword");
+
+ w = wikittyClient.store(w);
+ {
+ WikittyQuery q = new WikittyQueryMaker()
+ .eq(Element.get("UserTest.login"), "moi").end();
+ WikittyQueryResult<Wikitty> r =
+ wikittyClient.findAllByQuery(Wikitty.class, q);
+ Assert.assertEquals(1, r.size());
+ Assert.assertEquals("monpassword",
+ r.peek().getFieldAsString("UserTest", "password"));
+ }
+
+ {
+ WikittyQuery q = new WikittyQueryMaker()
+ .eq(Element.get("UserTest.password"), "monpassword").end();
+ WikittyQueryResult<Wikitty> r =
+ wikittyClient.findAllByQuery(Wikitty.class, q);
+ // les champs cryptes ne sont pas indexe et on ne peut donc pas
+ // faire de recherche dessus
+ Assert.assertEquals(0, r.size());
+ }
+
+ w= new WikittyImpl();
+ w.addExtension(ext);
+ w.setField("UserTest", "login", "++IllegaleLogin++");
+ w.setField("UserTest", "password", "monpassword");
+
+ try {
+ w = wikittyClient.store(w);
+ Assert.assertTrue(false);
+ } catch(WikittyException eee) {
+ // le storage doit echouer car le pattern ne permet pas les +
+ Assert.assertTrue(true);
+ }
+ }
}
Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java
===================================================================
--- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyUtilTest.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -27,6 +27,7 @@
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.text.ParseException;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
@@ -680,6 +681,21 @@
}
}
+ @Test
+ public void testCrypt() throws Exception {
+ String[] algos = {"Blowfish"};
+ String password = "password";
+ byte[] value = "Le message en clair".getBytes();
+
+ for (String algo : algos) {
+ byte[] valueCrypt = WikittyUtil.crypt(algo, password, value);
+ Assert.assertFalse(Arrays.equals(value, valueCrypt));
+
+ byte[] valueDecrypt = WikittyUtil.decrypt(algo, password, valueCrypt);
+ Assert.assertArrayEquals(value, valueDecrypt);
+ }
+ }
+
static public class LabelDTO implements WikittyLabel {
protected String wikittyId;
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -55,7 +55,7 @@
*
* @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.wikitty.generator.WikittyAbstractGenerator"
*/
-public class WikittyAbstractGenerator extends ObjectModelTransformerToJava {
+public class WikittyAbstractGenerator extends ObjectModelTransformerToJava implements WikittyTagValue {
private static final Log log = LogFactory.getLog(WikittyAbstractGenerator.class);
@@ -225,23 +225,29 @@
+ "]";
}
-// // generate a string line like " deprecated=true" or ""
-// String deprecated = attribute.hasTagValue("deprecated") ? " deprecated=" + attribute.getTagValue("deprecated") : "";
-// // generate a string line like ' documentation="my documentation"' or ""
-// String attributeDocumentation =
-// attribute.hasTagValue("documentation") ? " documentation=\\\""
-// + StringEscapeUtils.escapeJava(attribute.getTagValue("documentation"))
-// + "\\\"": "";
-// // generate a string like " notNull=true" or ""
-// String notNull = attribute.hasTagValue("notNull") ? " notNull=" + attribute.getTagValue("notNull") : "";
-// buildFieldMapExtensionParameters.add("" // generate a line like '"Wikitty attributName[0-*] unique=true deprecated=true documentation=\"my documentation\""'
-///* { "<%=wikittyType%> <%=attribute.getName()%><%=multiplicity%><%=unique%><%=deprecated%><%=notNull%><%=attributeDocumentation%>"}* /);
+ // le tag value unique ne doit exister que si c'est une collection
+ // ou que l'utilisateur a force sa creation a la main avec l'ajout
+ // explicite d'un tag/value
+ if (attribute.getMaxMultiplicity() > 1 || attribute.getMaxMultiplicity() <0) {
+ // generate a string line like " unique=true" if not already
+ // present in tag/value
+ if (attribute.isUnique() && !attribute.getTagValues().containsKey(TAG_UNIQUE)) {
+ attribute.getTagValues().put(TAG_UNIQUE, "true");
+ }
+ }
- // generate a string line like " unique=true" if not already
- // present in tag/value
- if (attribute.isUnique() && !attribute.getTagValues().containsKey("unique")) {
- attribute.getTagValues().put("unique", "true");
+ // si le champs est de type wikitty et qu'il n'y a pas de tag value
+ // on regarde s'il faut en generer un
+ if (StringUtils.equals("Wikitty", wikittyType)
+ && null == attribute.getTagValue(TAG_EXTENSION_ALLOWED)) {
+ String type = WikittyTransformerUtil.FQNtoSimpleName(attribute.getType());
+ if (!StringUtils.equals("Wikitty", type)) {
+ // dans le modele on a specifie un type particulier, on
+ // le met comme contrainte
+ attribute.getTagValues().put(TAG_EXTENSION_ALLOWED, type);
+ }
}
+
String tagvalue = "";
for (Map.Entry<String, String> tv : attribute.getTagValues().entrySet()) {
tagvalue += " " + tv.getKey() + "=\\\"" + StringEscapeUtils.escapeJava(tv.getValue()) + "\\\"";
@@ -319,18 +325,18 @@
// there is a conflict, purifier transformer give as the right name to use
String attributeName;
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName())) {
- attributeName = businessEntity.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName());
- } else if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (businessEntity.hasTagValue(TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName())) {
+ attributeName = businessEntity.getTagValue(TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName());
+ } else if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
} else {
attributeName = attribute.getName();
}
// le nom du getter peut avoir été renommé pour toute la hierarchie
String helperGetterSetterName;
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- helperGetterSetterName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ helperGetterSetterName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
} else {
helperGetterSetterName = attribute.getName();
}
@@ -563,18 +569,18 @@
if (attribute.isNavigable()) {
// there is a conflict, purifier transformer give as the right name to use
String attributeName;
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName())) {
- attributeName = businessEntity.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName());
- } else if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (businessEntity.hasTagValue(TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName())) {
+ attributeName = businessEntity.getTagValue(TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName());
+ } else if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
} else {
attributeName = attribute.getName();
}
// le nom du getter peut avoir été renommé pour toute la hierarchie
String helperGetterSetterName;
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- helperGetterSetterName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ helperGetterSetterName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
} else {
helperGetterSetterName = attribute.getName();
}
@@ -608,7 +614,7 @@
ObjectModelOperation toString = addOperation(abstractClass, "toString", "String");
setDocumentation(toString,
"Return toString representation. Use tagValue '"
- + WikittyTransformerUtil.TAG_TO_STRING
+ + TAG_TO_STRING
+ "' format, if exist, else standard toString is call");
addAnnotation(abstractClass, toString, "Override");
setOperationBody(toString, ""
@@ -645,9 +651,9 @@
String attributeType = WikittyTransformerUtil.generateResultType(attribute, false);
String attributeName = attribute.getName();
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
// there is a conflict, purifier transformer give as the right name to use
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
}
String getterName;
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyContractGenerator.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -55,7 +55,7 @@
*
* @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.wikitty.generator.WikittyContractGenerator"
*/
-public class WikittyContractGenerator extends ObjectModelTransformerToJava {
+public class WikittyContractGenerator extends ObjectModelTransformerToJava implements WikittyTagValue {
private static final Log log = LogFactory.getLog(WikittyContractGenerator.class);
@@ -129,9 +129,9 @@
addImport(contract, LinkedHashSet.class);
String documentation = businessEntity.getDocumentation();
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION)) {
+ if (businessEntity.hasTagValue(TAG_DOCUMENTATION)) {
documentation += "\n\n";
- documentation += businessEntity.getTagValue(WikittyTransformerUtil.TAG_DOCUMENTATION);
+ documentation += businessEntity.getTagValue(TAG_DOCUMENTATION);
}
setDocumentation(contract, documentation);
@@ -215,11 +215,11 @@
if (attribute.isNavigable()) {
// there is a conflict, purifier transformer give as the right name to use
String attributeName;
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName())) {
- attributeName = businessEntity.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName());
- } else if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
+ if (businessEntity.hasTagValue(TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName())) {
+ attributeName = businessEntity.getTagValue(TAG_ALTERNATIVE_NAME + "." + businessEntity.getName() + "." + attribute.getName());
+ } else if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
} else {
attributeName = attribute.getName();
}
@@ -247,8 +247,8 @@
for (ObjectModelAttribute attribute : superClass.getAttributes()) {
// there is a conflict, purifier transformer give as the right name to use
String attributeName;
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName())) {
- attributeName = businessEntity.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName());
+ if (businessEntity.hasTagValue(TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName())) {
+ attributeName = businessEntity.getTagValue(TAG_ALTERNATIVE_NAME + "." + superClass.getName() + "." + attribute.getName());
addOperationWithName(contract, attribute, attributeName);
}
// sinon, on ne génère rien, on herite de la methode
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyDTOGenerator.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -56,7 +56,7 @@
*
* @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.wikitty.generator.WikittyDTOGenerator"
*/
-public class WikittyDTOGenerator extends ObjectModelTransformerToJava {
+public class WikittyDTOGenerator extends ObjectModelTransformerToJava implements WikittyTagValue {
private static final Log log = LogFactory.getLog(WikittyDTOGenerator.class);
@@ -180,8 +180,8 @@
addImport(abstractClass, attribute.getType());
//If alternative name, use it
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
}
String getterName;
@@ -395,8 +395,8 @@
String toStringOperationBody;
- if (businessEntity.hasTagValue(WikittyTransformerUtil.TAG_TO_STRING)) {
- String toStringPattern = businessEntity.getTagValue(WikittyTransformerUtil.TAG_TO_STRING);
+ if (businessEntity.hasTagValue(TAG_TO_STRING)) {
+ String toStringPattern = businessEntity.getTagValue(TAG_TO_STRING);
// toStringPattern is something like
// "hello {Person.name|unknow} employe of {Company.name|unknow}"
@@ -673,8 +673,8 @@
}
//If alternative name, use it
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
}
String capitalizedAttributeName = StringUtils.capitalize(attributeName);
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyHelperGenerator.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -48,7 +48,7 @@
*
* @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.wikitty.generator.WikittyHelperGenerator"
*/
-public class WikittyHelperGenerator extends ObjectModelTransformerToJava {
+public class WikittyHelperGenerator extends ObjectModelTransformerToJava implements WikittyTagValue {
protected static final String META_EXTENSION_SEPARATOR = ":";
@@ -115,9 +115,9 @@
String attributeType = WikittyTransformerUtil.generateResultType(attribute, false);
String attributeName = attribute.getName();
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
// there is a conflict, purifier transformer give as the right name to use
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
}
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
@@ -307,7 +307,7 @@
addParameter(toString, WikittyTransformerUtil.WIKITTY_CLASS_FQN, "wikitty");
setDocumentation(toString,
"Return toString representation. Use tagValue '"
- + WikittyTransformerUtil.TAG_TO_STRING
+ + TAG_TO_STRING
+ "' format, if exist, else standard toString is call");
setOperationBody(toString, ""
/*{
@@ -392,9 +392,9 @@
String attributeType = WikittyTransformerUtil.generateResultType(attribute, false);
String attributeName = attribute.getName();
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
// there is a conflict, purifier transformer give as the right name to use
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
}
if (WikittyTransformerUtil.isAttributeCollection(attribute)) {
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaTransformer.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaTransformer.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyMetaTransformer.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -52,7 +52,7 @@
* @author bleny
* @plexus.component role="org.nuiton.eugene.Template" role-hint="org.nuiton.wikitty.generator.WikittyMetaGenerator"
*/
-public class WikittyMetaTransformer extends AbstractMetaTransformer<ObjectModel> {
+public class WikittyMetaTransformer extends AbstractMetaTransformer<ObjectModel> implements WikittyTagValue {
private static final Log log = LogFactory.getLog(WikittyMetaTransformer.class);
@@ -85,9 +85,9 @@
"\" instead");
}
- if (!clazz.hasTagValue(WikittyTransformerUtil.TAG_VERSION)) {
+ if (!clazz.hasTagValue(TAG_VERSION)) {
log.warn(clazz.getQualifiedName() + " misses a \"" +
- WikittyTransformerUtil.TAG_VERSION + "\" tagValue");
+ TAG_VERSION + "\" tagValue");
}
}
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyPurifierTransformer.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyPurifierTransformer.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyPurifierTransformer.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -58,7 +58,7 @@
* - manage name collision for attributes or methods inherited from two
* different classes
*/
-public class WikittyPurifierTransformer extends ObjectModelTransformer<ObjectModel> {
+public class WikittyPurifierTransformer extends ObjectModelTransformer<ObjectModel> implements WikittyTagValue {
private static final Log log =
LogFactory.getLog(WikittyPurifierTransformer.class);
@@ -95,8 +95,8 @@
String attributeName;
// tag value définie par le developpeur
- if (attribute.hasTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME)) {
- attributeName = attribute.getTagValue(WikittyTransformerUtil.TAG_ALTERNATIVE_NAME);
+ if (attribute.hasTagValue(TAG_ALTERNATIVE_NAME)) {
+ attributeName = attribute.getTagValue(TAG_ALTERNATIVE_NAME);
} else {
attributeName = attribute.getName();
}
@@ -104,7 +104,7 @@
// check conflics
if (attributeNames.contains(attributeName)) {
attributeName += "From" + superClass.getName();
- builder.addTagValue(clazz, WikittyTransformerUtil.TAG_ALTERNATIVE_NAME
+ builder.addTagValue(clazz, TAG_ALTERNATIVE_NAME
+ "." + superClass.getName() + "." + attribute.getName(), attributeName);
}
Added: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java (rev 0)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -0,0 +1,126 @@
+package org.nuiton.wikitty.generator;
+
+/**
+ * Definition des noms de l'ensemble des tags values utilisable dans wikitty.
+ * Cette liste ne contient que les tags values qui influencent le comportement
+ * de wikitty ou qui aide a la normalisation de tag value. L'utilisateur peut
+ * en ajouter d'autre.
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public interface WikittyTagValue {
+
+ /**
+ * version: indique la version de l'extension.
+ * <li> target: extension for generation
+ */
+ public static final String TAG_VERSION = "version";
+
+ /**
+ * alternativeName: ce champs peut etre mis pour qu'a la generation un
+ * des accesseur avec un autre nom soit genere.
+ * <li> target: field
+ */
+ public static final String TAG_ALTERNATIVE_NAME = "alternativeName";
+
+ /**
+ * documentation: indique la documentation a mettre lors de la generation
+ * peut aussi servir de documentation utilisateur a l'execution.
+ * <li> target: extension or field
+ */
+ public static final String TAG_DOCUMENTATION = "documentation";
+
+ /**
+ * toString: indique la facon de representer une extension textuellement.
+ * exemple:
+ * <li> "%Person.lastName$s %Person.firstName$s: %Person.birthday$tm %Person.birthday$te,%Person.birthday$tY"
+ * <li> "Hello %Person.firstName|unknow$s" if firstName field doesn't exist, unknow is used
+ * <p>
+ * <li> target: extension
+ *
+ * @see WikittyUtil#format
+ */
+ public static final String TAG_TO_STRING = "toString";
+
+ /**
+ * sortOrder: indique le tri par defaut pour cette extension.
+ * exemple:
+ * <li> "Person.lastName asc, Person.firstName, Person.birthday desc"
+ * Liste des champs dans l'importance de l'ordre de trie. Il est possible
+ * d'ajouter asc ou desc apres le champs pour indique qu'il faut trier en
+ * ordre croissant ou decroissant.
+ * <p>
+ * <li> target: extension
+ * @see WikittyUtil#format
+ */
+ public static final String TAG_SORT_ORDER = "sortOrder";
+
+ /**
+ * Unique: le champs doit etre une collection, ce tag indique alors s'il vaut
+ * true que la collection ne peut pas contenir de doublon (Set) si unique
+ * est false alors la collection peut contenir des doublons (List).
+ * <li> target: collection field
+ */
+ public static final String TAG_UNIQUE = "unique";
+
+ /**
+ * notNull: indique que le champs ne peut pas etre null, il doit forcement
+ * avoir une valeur lors de la sauvegarde.
+ * <li> target: field
+ */
+ public static final String TAG_NOT_NULL = "notNull";
+
+ /**
+ * pattern: pour une String indique que le champs doit respecter un certain
+ * pattern, sinon la sauvegarde echoue. Pour un numeric ou une date pattern
+ * peut-etre utilise comme masque de saisie. Exemple:
+ * <li>"A.*" le champs doit commencer par 'A'
+ * <li>"[0-9]+\.[0-9][0-9]" le nombre doit avoir deux chiffres apres la virgule
+ * <p>
+ *
+ * <li> target: numeric or String field
+ */
+ public static final String TAG_PATTERN = "pattern";
+
+ /**
+ * indexed: indique qu'un champs ne doit pas etre indexe, par defaut si ce
+ * tag value n'existe pas il vaut true. Il faut donc le positionner
+ * explicitement a false si on ne veut pas indexer un champs
+ * <li> target: field
+ */
+ public static final String TAG_INDEXED = "indexed";
+
+ /**
+ * crypt: indique que le champs doit etre crypte avant d'etre sauve et
+ * decrypter lors de la restauration, de plus le champs ne
+ * sera pas indexe. Si le cryptage n'est pas possible, la sauvegarde ne se
+ * fera pas (Exeption).
+ * exemple:
+ * <li>crypt=Blowfish:password
+ *
+ * TODO: si le mot de passe n'est pas specifie, utiliser le mot de passe
+ * du fichier de configuration
+ * <p>
+ *
+ * <li> target: field
+ * @see {@link http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders…
+ */
+ public static final String TAG_CRYPT = "crypt";
+
+ /**
+ * extensionAllowed: indique que le champs wikitty ne peut prendre comme
+ * valeur que des wikitties ayant les extensions specifiees.
+ * exemple:
+ * <li>Person,Employee;Company
+ * Ici il faut que l'objet ait les extensions Person et Employee ou
+ * l'extension Company
+ * <p>
+ * <li> target: wikitty type field
+ */
+ public static final String TAG_EXTENSION_ALLOWED = "extensionAllowed";
+
+}
Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java
===================================================================
--- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTransformerUtil.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -53,11 +53,6 @@
protected static final String WIKITTY_EXTENSION_CLASS_FQN =
ENTITY_PACKAGE + ".WikittyExtension";
- protected static final String TAG_VERSION = "version";
- protected static final String TAG_ALTERNATIVE_NAME = "alternativeName";
- public static final String TAG_TO_STRING = "toString";
- protected static final String TAG_DOCUMENTATION = "documentation";
-
/** @deprecated name change : see ticket #798. use BUSINESS_ENTITY_STEREOTYPE_NAME */
@Deprecated
protected static final String BUSINESS_ENTITY_STEREOTYPE_OLD_NAME = "BusinessEntity";
Modified: trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java
===================================================================
--- trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-jdbc/src/main/java/org/nuiton/wikitty/jdbc/WikittyStorageJDBC.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -26,6 +26,8 @@
import java.io.IOException;
import java.io.InputStream;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
import static org.nuiton.wikitty.jdbc.WikittyJDBCUtil.COL_BINARY_VALUE;
import static org.nuiton.wikitty.jdbc.WikittyJDBCUtil.COL_BOOLEAN_VALUE;
import static org.nuiton.wikitty.jdbc.WikittyJDBCUtil.COL_DATE_VALUE;
@@ -72,13 +74,19 @@
import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyConfig;
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.WikittyException;
@@ -290,7 +298,16 @@
} else {
Object value = wikitty.getFieldAsObject(ext.getName(), fieldName);
if (value != null) {
- String colName = getColName(type.getType());
+ String colName;
+ if (type.isCrypted()) {
+ value = wikitty.getFieldAsBytes(ext.getName(), fieldName);
+ value = WikittyUtil.crypt(type.getCryptAlgo(),
+ WikittyConfig.getCryptPassword(config, type.getCryptPassword()),
+ (byte[])value);
+ colName = getColName(WikittyTypes.BINARY);
+ } else {
+ colName = getColName(type.getType());
+ }
String q = String.format(jdbcQuery.getProperty(
QUERY_INSERT_WIKITTY_DATA), colName);
WikittyJDBCUtil.doQuery(connection, q,
@@ -510,7 +527,11 @@
} else if (isAcceptedField(acceptedField, fqfieldName)) {
FieldType type = result.getFieldType(fqfieldName);
Object value = null;
- switch (type.getType()) {
+ WikittyTypes fieldType = type.getType();
+ if (type.isCrypted()) {
+ fieldType = WikittyTypes.BINARY;
+ }
+ switch (fieldType) {
case BINARY:
InputStream blob = resultSet.getBinaryStream(COL_BINARY_VALUE);
try {
@@ -542,6 +563,12 @@
break;
}
+ if (type.isCrypted()) {
+ value = WikittyUtil.decrypt(type.getCryptAlgo(),
+ WikittyConfig.getCryptPassword(config, type.getCryptPassword()),
+ (byte[])value);
+ }
+
if (type.isCollection()) {
// for list just stock array of element in map
Matcher match = listFieldPattern.matcher(fqfieldName);
@@ -651,6 +678,4 @@
}
return result;
}
-
-
}
Modified: trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java
===================================================================
--- trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-02-25 15:31:44 UTC (rev 1434)
+++ trunk/wikitty-solr/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2012-03-05 00:47:56 UTC (rev 1435)
@@ -59,6 +59,7 @@
import org.nuiton.wikitty.entities.WikittyTreeNode;
import org.nuiton.wikitty.entities.WikittyTreeNodeHelper;
import org.nuiton.wikitty.entities.WikittyTypes;
+import org.nuiton.wikitty.generator.WikittyTagValue;
import org.nuiton.wikitty.query.FacetQuery;
import org.nuiton.wikitty.query.FacetTopic;
import org.nuiton.wikitty.query.WikittyQuery;
@@ -966,8 +967,10 @@
*/
protected void addToIndexDocument(SolrInputDocument doc, Wikitty w, String fqfieldName) {
WikittyTypes type = null;
- Object fieldValue;
+ Object fieldValue = null;
boolean collection = false;
+ // indique si ce champs doit etre reellement indexe ou non
+ boolean mustIndex = true;
if (SOLR_ID.equals(fqfieldName)) {
// extra field #id
fieldValue = w.getId();
@@ -977,13 +980,16 @@
} else {
// un champs normal
FieldType fieldType = w.getFieldType(fqfieldName);
- type = fieldType.getType();
- collection = fieldType.isCollection();
-
- fieldValue = w.getFqField(fqfieldName);
-
+ mustIndex = fieldType.isIndexed();
+ if (mustIndex) {
+ type = fieldType.getType();
+ collection = fieldType.isCollection();
+ fieldValue = w.getFqField(fqfieldName);
+ }
}
- addToIndexDocument(doc, type, fqfieldName, fieldValue, collection);
+ if (mustIndex) {
+ addToIndexDocument(doc, type, fqfieldName, fieldValue, collection);
+ }
}
/**
1
0