Index: topia/src/java/org/codelutin/topia/TopiaAssociationManager.java diff -u topia/src/java/org/codelutin/topia/TopiaAssociationManager.java:1.1 topia/src/java/org/codelutin/topia/TopiaAssociationManager.java:1.2 --- topia/src/java/org/codelutin/topia/TopiaAssociationManager.java:1.1 Fri Jul 22 22:01:33 2005 +++ topia/src/java/org/codelutin/topia/TopiaAssociationManager.java Tue Jul 26 14:02:57 2005 @@ -30,6 +30,7 @@ package org.codelutin.topia; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -40,7 +41,7 @@ /** * Classe gérant les associations entre les entités. * Chaque association différente est une HashMapMultiKey identifiée dans la - * table associations par un identifiant de l'association. + * Map associations par un identifiant de l'association. * Les instances d'associations sont représentées par la présence d'une * instance de Key dont les clés sont les deux instances des * entités concernées. @@ -78,7 +79,33 @@ return null; return assocMap.get(key); } - + + public Object getAssociationClass(String associationName, Object partOfKey, int pos) { + Key key = getFirstKeyForPosition(associationName, partOfKey, pos); + return getAssociationClass(associationName, key); + } + + public List getAssociationClasses(String associationName, Object partOfKey, int pos) { + List associationClasses = new ArrayList(); + for (Key key : getKeys(associationName, partOfKey)) { + if ((pos < key.size()) && (key.get(pos).equals(partOfKey))) + associationClasses.add(getAssociationClass(associationName, key)); + } + return associationClasses; + } + + public Object getAssociationClassForIndex(String associationName, Object partOfKey, int pos, int index) { + int i = 0; + for (Key key : getKeys(associationName, partOfKey)) { + if ((pos < key.size()) && (key.get(pos).equals(partOfKey))) + if (i < index) + i++; + else + return getAssociationClass(associationName, key); + } + return null; + } + public List getKeysForPosition(String associationName, Object partOfKey, int pos) { List keys = getKeys(associationName, partOfKey); for (Key key : keys) { @@ -87,7 +114,23 @@ } return keys; } - + + public Key getFirstKeyForPosition(String associationName, Object partOfKey, int pos) { + for (Key key : getKeys(associationName, partOfKey)) { + if ((pos < key.size()) && (key.get(pos).equals(partOfKey))) + return key; + } + return null; + } + + public Key getFirstKeyWithOpposite(String associationName, Object partOfKey, int pos, Object value) { + for (Key key : getKeys(associationName, partOfKey)) { + if ((pos < key.size()) && (key.get(pos).equals(partOfKey)) && (key.get(pos).equals(value))) + return key; + } + return null; + } + public Object getFirstOppositeObjectForPosition(String associationName, Object partOfKey, int pos) { Iterator it = getKeys(associationName, partOfKey).iterator(); if (it.hasNext()) @@ -99,9 +142,50 @@ public int numberInPosition(String associationName, Object partOfKey, int pos) { int number = 0; for (Key key : getKeys(associationName, partOfKey)) { - if ((pos < key.size()) || (key.get(pos).equals(partOfKey))) + if ((pos < key.size()) && (key.get(pos).equals(partOfKey))) number++; } return number; + } + + public void removeAssociationClass(String associationName, Key key) { + HashMapMultiKey assocMap = associations.get(associationName); + if (assocMap == null) + return; + assocMap.remove(key); + } + + public void removeAssociationClass(String associationName, Object partOfKey, int pos) { + Key key = getFirstKeyForPosition(associationName, partOfKey, pos); + removeAssociationClass(associationName, key); + } + + public void removeAssociationClass(String associationName, Object partOfKey, int pos, Object value) { + Key key = getFirstKeyWithOpposite(associationName, partOfKey, pos, value); + removeAssociationClass(associationName, key); + } + + public void removeAllAssociationClass(String associationName, Object partOfKey, int pos) { + for (Key key : getKeysForPosition(associationName, partOfKey, pos)) + if ((pos < key.size()) && (key.get(pos).equals(partOfKey))) + removeAssociationClass(associationName, key); + } + + public void addAssociationClass(String associationName, Key key, Object assocClass) { + HashMapMultiKey assocMap = associations.get(associationName); + if (assocMap == null) { + assocMap = new HashMapMultiKey(); + associations.put(associationName, assocMap); + } + assocMap.put(key, assocClass); + } + + public void addAssociationClass(String associationName, Object partOfKey, int pos, Object assocClass, Object value) { + Key key = new Key(); + if (pos == 0) + key = key.add(partOfKey).add(value); + else + key = key.add(value).add(partOfKey); + addAssociationClass(associationName, key, assocClass); } }