Index: topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceProxy.java diff -u topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceProxy.java:1.17 topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceProxy.java:1.18 --- topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceProxy.java:1.17 Thu Sep 22 12:45:38 2005 +++ topia/src/java/org/codelutin/topia/persistence/TopiaPersistenceProxy.java Thu Sep 22 14:50:05 2005 @@ -23,10 +23,10 @@ * Created: 16 juillet 2005 23:52:35 CEST * * @author Benjamin POUSSIN -* @version $Revision: 1.17 $ +* @version $Revision: 1.18 $ * -* Last update: $Date: 2005/09/22 12:45:38 $ -* by : $Author: bpoussin $ +* Last update: $Date: 2005/09/22 14:50:05 $ +* by : $Author: thimel $ */ package org.codelutin.topia.persistence; @@ -528,41 +528,70 @@ TopiaPersistenceService assoPS = ph.getContext().getPersistenceService(assoClass); boolean partyA = 'A' == MethodInfoHelper.associationParty(method); int[] thisCardinality = ClassInfoHelper.associationCardinality(partyA, assoClass); -// String thisField = ClassInfoHelper.associationField(partyA, assoClass); - String thisField = "_attribute_" + ((partyA) ? 'A' : 'B') + "_"; int[] otherCardinality = ClassInfoHelper.associationCardinality(!partyA, assoClass); -// String otherField = ClassInfoHelper.associationField(!partyA, assoClass); - String otherField = "_attribute_" + ((!partyA) ? 'A' : 'B') + "_"; - if(thisCardinality[1] == 1){ - if(MethodInfoHelper.isFieldModifier(method)){ - setFieldAssociationCardinality1( - assoPS, partyA, thisField, otherField, entity, - (TopiaEntity)args[0], otherCardinality[1] == 1); - return null; + if (MethodInfoHelper.fieldType(method).equals(MethodInfoHelper.associationClass(method))) { + //on cherche à obtenir un instance de classe d'association + String thisField = ClassInfoHelper.associationField(partyA, assoClass); + String otherField = ClassInfoHelper.associationField(!partyA, assoClass); + + if (args != null && args.length == 1 && ((TopiaEntity)args[0]).getEntityClass().equals(ClassInfoHelper.fieldType(assoClass, thisField))) { + methodName = "findByAttributes"; + Class firstClass = ((partyA) ? ClassInfoHelper.fieldType(assoClass, thisField) : ClassInfoHelper.fieldType(assoClass, otherField)); + Class secondClass = ((partyA) ? ClassInfoHelper.fieldType(assoClass, otherField) : ClassInfoHelper.fieldType(assoClass, thisField));; + Class[] argsClass = {firstClass, secondClass}; + m = MethodUtils.getAccessibleMethod(assoPS.getClass(), methodName, argsClass); + + if (!partyA) { + return m.invoke(assoPS, entity, args[0]); + } else { + return m.invoke(assoPS, args[0], entity); + } } else { - return getFieldAssociationCardinality1( - assoPS, partyA, thisField, otherField, entity); + methodName = "find"; + if (otherCardinality[1] != 1) { + methodName += "All"; + } + methodName += "By" + StringUtils.capitalize(otherField); + m = MethodUtils.getAccessibleMethod(assoPS.getClass(), methodName, ClassInfoHelper.fieldType(assoClass, otherField)); + return m.invoke(assoPS, entity); } + //TODO A faire pour les setters } else { - if(MethodInfoHelper.isFieldModifier(method)){ - if(methodName.startsWith("add")){ - addFieldAssociationCardinalityN( +// String thisField = ClassInfoHelper.associationField(partyA, assoClass); + String thisField = "_attribute_" + ((partyA) ? 'A' : 'B') + "_"; +// String otherField = ClassInfoHelper.associationField(!partyA, assoClass); + String otherField = "_attribute_" + ((!partyA) ? 'A' : 'B') + "_"; + if(thisCardinality[1] == 1){ + if(MethodInfoHelper.isFieldModifier(method)){ + setFieldAssociationCardinality1( assoPS, partyA, thisField, otherField, entity, (TopiaEntity)args[0], otherCardinality[1] == 1); return null; - } else if(methodName.startsWith("remove")){ - removeFieldAssociationCardinalityN( - assoPS, thisField, otherField, entity, - (TopiaEntity)args[0]); - return null; - } else if(methodName.startsWith("clean")){ - clearFieldAssociationCardinalityN( - assoPS, thisField, otherField, entity); - return null; + } else { + return getFieldAssociationCardinality1( + assoPS, partyA, thisField, otherField, entity); } } else { - return getFieldAssociationCardinalityN( - assoPS, thisField, otherField, entity); + if(MethodInfoHelper.isFieldModifier(method)){ + if(methodName.startsWith("add")){ + addFieldAssociationCardinalityN( + assoPS, partyA, thisField, otherField, entity, + (TopiaEntity)args[0], otherCardinality[1] == 1); + return null; + } else if(methodName.startsWith("remove")){ + removeFieldAssociationCardinalityN( + assoPS, thisField, otherField, entity, + (TopiaEntity)args[0]); + return null; + } else if(methodName.startsWith("clean")){ + clearFieldAssociationCardinalityN( + assoPS, thisField, otherField, entity); + return null; + } + } else { + return getFieldAssociationCardinalityN( + assoPS, thisField, otherField, entity); + } } } }