r1493 - in trunk: wikitty-api/src/main/java/org/nuiton/wikitty/entities wikitty-api/src/main/xmi wikitty-api/src/test/java/org/nuiton/wikitty wikitty-api/src/test/resources/xml wikitty-generators/src/main/java/org/nuiton/wikitty/generator
Author: bpoussin Date: 2012-08-03 11:02:38 +0200 (Fri, 03 Aug 2012) New Revision: 1493 Url: http://nuiton.org/repositories/revision/wikitty/1493 Log: Anomalie #2222: Field extension order seems to be not maintened with JDBC storage Maintenant on peut ajouter le tag: TAG_FIELD_ORDER (fieldOrder) pour forcer la position Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java trunk/wikitty-api/src/main/xmi/wikitty.properties trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java trunk/wikitty-api/src/test/resources/xml/importclient.xml trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java 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-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldType.java 2012-08-03 09:02:38 UTC (rev 1493) @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; @@ -255,6 +256,31 @@ } /** + * @see #TAG_FIELD_INDEX + */ + public boolean hasFieldIndex() { + return null != getTagValue(TAG_FIELD_INDEX); + } + + /** + * @see #TAG_FIELD_INDEX + */ + public double getFieldIndex() { + double result = Double.MAX_VALUE; + String fieldIndex = getTagValue(TAG_FIELD_INDEX); + if (fieldIndex != null) { + try { + result = Double.parseDouble(fieldIndex); + } catch (NumberFormatException eee) { + if (log.isDebugEnabled()) { + log.debug(String.format("Bad fieldIndex value '%s'", fieldIndex), eee); + } + } + } + return result; + } + + /** * @see #TAG_UNIQUE */ public boolean isUnique() { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java 2012-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/FieldTypeConstaintChecker.java 2012-08-03 09:02:38 UTC (rev 1493) @@ -296,9 +296,11 @@ // les ids en erreur refaire la meme requete sur le in memory if (!result) { result = true; - log.warn(String.format( - "Field '%s' contains unallowed Wikitty values %s", - fqfield, unallowed)); + if (log.isDebugEnabled()) { + log.debug(String.format( + "Field '%s' contains unallowed Wikitty values %s", + fqfield, unallowed)); + } } // FIN du FIXME } 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-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyExtension.java 2012-08-03 09:02:38 UTC (rev 1493) @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -134,11 +135,7 @@ setRequires(requires); setTagValues(tagValues); if (fields != null) { - for (Map.Entry<String, FieldType> entry : fields.entrySet()) { - String fieldName = entry.getKey(); - FieldType fieldType = entry.getValue(); - addField(fieldName, fieldType); - } + addField(fields); } } @@ -339,10 +336,49 @@ return result; } + /** + * Cette methode ne doit-etre utilise que par des methodes qui tri par la + * suite la Map de champs, car celle-ci ne le fait pas + * @param fieldName + * @param type + */ + protected void addField(Map<String, FieldType> newFields) { + // check fieldname and fieldType + for (Map.Entry<String, FieldType> e : newFields.entrySet()) { + if (null == e.getValue()) { + throw new IllegalArgumentException( + "FieldType must not be null for field '" + e.getKey() +"'"); + } + Matcher matcher = fieldNamePattern.matcher(e.getKey()); + if(!matcher.find()) { + throw new IllegalArgumentException( + "For field name [" + e.getKey() +"], only word character [a-zA-Z_0-9] is accepted"); + } + } + + fields.putAll(newFields); + // sort field on TAG_FIELD_INDEX after add + fields = sortField(fields); + + getPropertyChangeSupport().firePropertyChange("fields", null, fields); + } + + /** + * Ajoute un nouveau champs a l'extension, la liste des champs est automatiquement + * trie après chaque insertion. + * @param fieldName le nom du champs + * @param type le type du champs contenant un tag TAG_FIELD_INDEX pour le tri + */ public void addField(String fieldName, FieldType type) { + if (null == type) { + throw new IllegalArgumentException( + "FieldType must not be null for field '" + fieldName +"'"); + } Matcher matcher = fieldNamePattern.matcher(fieldName); if(matcher.find()) { fields.put(fieldName, type); + // sort field on TAG_FIELD_INDEX after add + fields = sortField(fields); // TODO EC20100610 null for old value getPropertyChangeSupport().firePropertyChange("fields", null, fields); } else { @@ -350,6 +386,28 @@ } } + /** + * Tri la map en entree suivant la valeur de TAG_FIELD_INDEX de la valeur + */ + protected LinkedHashMap<String, FieldType> sortField(Map<String, FieldType> map) { + List<Map.Entry<String, FieldType>> list = + new ArrayList<Map.Entry<String, FieldType>>(map.entrySet()); + Collections.sort(list, new Comparator<Map.Entry<String, FieldType>>() { + public int compare(Map.Entry<String, FieldType> o1, Map.Entry<String, FieldType> o2) { + Double f1 = o1.getValue().getFieldIndex(); + Double f2 = o2.getValue().getFieldIndex(); + int result = f1.compareTo(f2); + return result; + } + }); + + LinkedHashMap<String, FieldType> result = new LinkedHashMap<String, FieldType>(); + for (Map.Entry<String, FieldType> e : list) { + result.put(e.getKey(), e.getValue()); + } + return result; + } + public void removeField(String fieldName) { fields.remove(fieldName); // TODO EC20100610 null for old value @@ -476,7 +534,7 @@ String result = "Extension " + getId(); result += WikittyUtil.tagValuesToString(tagValues); result += " {\n"; - for (String fieldName : fields.keySet()) { + for (String fieldName : getFieldNames()) { result += fields.get(fieldName).toDefinition(fieldName) + "\n"; } result += "}"; Modified: trunk/wikitty-api/src/main/xmi/wikitty.properties =================================================================== --- trunk/wikitty-api/src/main/xmi/wikitty.properties 2012-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-api/src/main/xmi/wikitty.properties 2012-08-03 09:02:38 UTC (rev 1493) @@ -22,11 +22,11 @@ # <http://www.gnu.org/licenses/lgpl-3.0.html>. # #L% ### -org.nuiton.wikitty.entities.WikittyAuthorisation.class.tagvalue.version=2.0 -org.nuiton.wikitty.entities.WikittyGroup.class.tagvalue.version=2.0 -org.nuiton.wikitty.entities.WikittyLabel.class.tagvalue.version=2.0 -org.nuiton.wikitty.entities.WikittyToken.class.tagvalue.version=3.0 -org.nuiton.wikitty.entities.WikittyTreeNode.class.tagvalue.version=3.0 -org.nuiton.wikitty.entities.WikittyUser.class.tagvalue.version=2.0 -org.nuiton.wikitty.entities.WikittyI18n.class.tagvalue.version=2.0 -org.nuiton.wikitty.entities.WikittyAccessStat.class.tagvalue.version=2.0 +org.nuiton.wikitty.entities.WikittyAuthorisation.class.tagvalue.version=3.0 +org.nuiton.wikitty.entities.WikittyGroup.class.tagvalue.version=3.0 +org.nuiton.wikitty.entities.WikittyLabel.class.tagvalue.version=3.0 +org.nuiton.wikitty.entities.WikittyToken.class.tagvalue.version=4.0 +org.nuiton.wikitty.entities.WikittyTreeNode.class.tagvalue.version=4.0 +org.nuiton.wikitty.entities.WikittyUser.class.tagvalue.version=3.0 +org.nuiton.wikitty.entities.WikittyI18n.class.tagvalue.version=3.0 +org.nuiton.wikitty.entities.WikittyAccessStat.class.tagvalue.version=3.0 Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-08-03 09:02:38 UTC (rev 1493) @@ -742,11 +742,15 @@ String xmlExport = ieService.syncExportAllByQuery(FORMAT.XML, query); // extension definition is present in xml export - Assert.assertTrue(xmlExport.contains("<extension name='WikittyTreeNode' version='3.0'>")); + Assert.assertTrue("#### xmlExport ####\n" + xmlExport + "\n#############", + xmlExport.contains("<extension name='WikittyTreeNode' version='4.0'>")); // some data too - Assert.assertTrue(xmlExport.contains("<WikittyTreeNode.name>Books</WikittyTreeNode.name>")); - Assert.assertTrue(xmlExport.contains("extensions='WikittyTreeNode[3.0],CatalogNode[2.0]'")); - Assert.assertTrue(xmlExport.contains("<WikittyTreeNode.attachment>")); + Assert.assertTrue("#### xmlExport ####\n" + xmlExport + "\n#############", + xmlExport.contains("<WikittyTreeNode.name>Books</WikittyTreeNode.name>")); + Assert.assertTrue("#### xmlExport ####\n" + xmlExport + "\n#############", + xmlExport.contains("extensions='WikittyTreeNode[4.0],CatalogNode[2.0]'")); + Assert.assertTrue("#### xmlExport ####\n" + xmlExport + "\n#############", + xmlExport.contains("<WikittyTreeNode.attachment>")); } /** @@ -785,12 +789,17 @@ String csvExport = ieService.syncExportAllByQuery(FORMAT.CSV, query); // extension definition is present in xml export - Assert.assertTrue(csvExport.startsWith("\"Wikitty.Id\",\"Wikitty.Ext\",\"WikittyTreeNode.attachment\",\"WikittyTreeNode.name\",\"WikittyTreeNode.parent\"")); + Assert.assertTrue("#### csvExport ####\n" + csvExport + "\n#############", + csvExport.startsWith("\"Wikitty.Id\",\"Wikitty.Ext\",\"WikittyTreeNode.name\",\"WikittyTreeNode.attachment\",\"WikittyTreeNode.parent\"")); // some data too - Assert.assertTrue(csvExport.contains("\"WikittyTreeNode,CatalogNode\",,\"Everything else\"")); - Assert.assertTrue(csvExport.contains("\"WikittyTreeNode,CatalogNode\",,\"Catalog\"")); - Assert.assertTrue(csvExport.contains("\"WikittyTreeNode,CatalogNode\",,\"Books\"")); - Assert.assertTrue(csvExport.contains("Nouvelles")); + Assert.assertTrue("#### csvExport ####\n" + csvExport + "\n#############", + csvExport.contains("\"WikittyTreeNode,CatalogNode\",\"Everything else\",,")); + Assert.assertTrue("#### csvExport ####\n" + csvExport + "\n#############", + csvExport.contains("\"WikittyTreeNode,CatalogNode\",\"Catalog\",,")); + Assert.assertTrue("#### csvExport ####\n" + csvExport + "\n#############", + csvExport.contains("\"WikittyTreeNode,CatalogNode\",\"Books\",,")); + Assert.assertTrue("#### csvExport ####\n" + csvExport + "\n#############", + csvExport.contains("Nouvelles")); } /** Modified: trunk/wikitty-api/src/test/resources/xml/importclient.xml =================================================================== --- trunk/wikitty-api/src/test/resources/xml/importclient.xml 2012-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-api/src/test/resources/xml/importclient.xml 2012-08-03 09:02:38 UTC (rev 1493) @@ -25,11 +25,11 @@ --> <wikitty> - <extension name='WikittyTreeNode' version='2.0'> - <tagvalues> version="2.0"</tagvalues> - <field>STRING name unique="true"</field> - <field>WIKITTY attachment[0-*] unique="true" version="2.0"</field> - <field>WIKITTY parent unique="true"</field> + <extension name='WikittyTreeNode' version='4.0'> + <tagvalues> version="4.0"</tagvalues> + <field>STRING name unique="true" fieldIndex=1</field> + <field>WIKITTY attachment[0-*] unique="true" version="2.0" fieldIndex=2</field> + <field>WIKITTY parent unique="true" fieldIndex=3</field> </extension> <extension name='Client' version='1.0'> <tagvalues></tagvalues> @@ -38,19 +38,19 @@ <object id='fbcc8aed-7f67-4e3c-a9aa-221373765f8d' version='0.1' extensions='Client[1.0]'> <Client.name>Entreprise dupont</Client.name> </object> - <object id='4f6fc798-41f8-48d7-9398-119ef6ab02b6' version='0.1' extensions='WikittyTreeNode[2.0]'> + <object id='4f6fc798-41f8-48d7-9398-119ef6ab02b6' version='0.1' extensions='WikittyTreeNode[4.0]'> <WikittyTreeNode.name>MyRootNode</WikittyTreeNode.name> </object> <extension name='Tag' version='1.0'> <tagvalues></tagvalues> <field>STRING tags</field> </extension> - <object id='1142aa4c-af5a-4264-9918-9f72d9ef9d59' version='0.3' extensions='Tag[1.0],WikittyTreeNode[2.0]'> + <object id='1142aa4c-af5a-4264-9918-9f72d9ef9d59' version='0.3' extensions='Tag[1.0],WikittyTreeNode[4.0]'> <WikittyTreeNode.parent>4f6fc798-41f8-48d7-9398-119ef6ab02b6</WikittyTreeNode.parent> <WikittyTreeNode.attachment>fbcc8aed-7f67-4e3c-a9aa-221373765f8d</WikittyTreeNode.attachment> <WikittyTreeNode.name>MyTreeNode</WikittyTreeNode.name> </object> - <object id='0d13cb0b-bc06-431c-9438-7bcb357f45da' version='0.2' extensions='WikittyTreeNode[2.0]'> + <object id='0d13cb0b-bc06-431c-9438-7bcb357f45da' version='0.2' extensions='WikittyTreeNode[4.0]'> <WikittyTreeNode.parent>1142aa4c-af5a-4264-9918-9f72d9ef9d59</WikittyTreeNode.parent> <WikittyTreeNode.name>MySubNode</WikittyTreeNode.name> </object> 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-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyAbstractGenerator.java 2012-08-03 09:02:38 UTC (rev 1493) @@ -208,10 +208,10 @@ List<String> buildFieldMapExtensionParameters = new ArrayList<String>(); - + int fieldIndex = 0; // now process attributes for(ObjectModelAttribute attribute : businessEntity.getAttributes()) { - if (attribute.isNavigable()) { + if (attribute.isNavigable()) { // now add the attribute to the piece of code that build the extension String wikittyType = WikittyTransformerUtil.typeToWikittyColumn(attribute.getType()); String multiplicity = ""; @@ -236,6 +236,12 @@ } } + // si l'attribut n'a pas d'index on lui ajoute sa position par defaut + fieldIndex++; + if (null == attribute.getTagValue(TAG_FIELD_INDEX)) { + attribute.getTagValues().put(TAG_FIELD_INDEX, String.valueOf(fieldIndex)); + } + // 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) Modified: trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java =================================================================== --- trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java 2012-08-01 09:03:36 UTC (rev 1492) +++ trunk/wikitty-generators/src/main/java/org/nuiton/wikitty/generator/WikittyTagValue.java 2012-08-03 09:02:38 UTC (rev 1493) @@ -83,6 +83,13 @@ */ public static final String TAG_SORT_ORDER = "sortOrder"; + /** + * fieldIndex: indique la position de ce champs dans la liste des champs. + * *la valeur est un nombre réel pour facilement inserer un champs entre deux + * champs sans devoir tous les modifiers. + */ + public static final String TAG_FIELD_INDEX = "fieldIndex"; + /** * 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
participants (1)
-
bpoussin@users.nuiton.org