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.html#SunJCEProvider} + */ + 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); + } } /**