Index: topia2/src/java/org/codelutin/topia/service/servers/XMLRPCServer.java diff -u topia2/src/java/org/codelutin/topia/service/servers/XMLRPCServer.java:1.1 topia2/src/java/org/codelutin/topia/service/servers/XMLRPCServer.java:1.2 --- topia2/src/java/org/codelutin/topia/service/servers/XMLRPCServer.java:1.1 Wed Apr 18 12:21:25 2007 +++ topia2/src/java/org/codelutin/topia/service/servers/XMLRPCServer.java Fri Jun 8 14:03:29 2007 @@ -19,8 +19,14 @@ package org.codelutin.topia.service.servers; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.commons.beanutils.MethodUtils; import org.apache.commons.logging.Log; @@ -31,6 +37,7 @@ import org.apache.xmlrpc.server.XmlRpcHandlerMapping; import org.apache.xmlrpc.server.XmlRpcServer; import org.apache.xmlrpc.webserver.WebServer; +import org.codelutin.topia.persistence.TopiaEntity; import org.codelutin.topia.service.TopiaApplicationService; import org.codelutin.topia.service.TopiaServiceServerAbstract; @@ -38,9 +45,9 @@ * XMLRPCServer.java * * @author chatellier - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ * - * Last update : $Date: 2007/04/18 12:21:25 $ By : $Author: chatellier $ + * Last update : $Date: 2007/06/08 14:03:29 $ By : $Author: ndupont $ */ public class XMLRPCServer extends TopiaServiceServerAbstract implements XmlRpcHandler, XmlRpcHandlerMapping { @@ -56,7 +63,7 @@ /** Server already launched */ protected boolean alreadyLaunched = false; - + /** * Constructeur. * @@ -82,12 +89,13 @@ * lance le serveur */ public void launch() { - if(!alreadyLaunched) { + if (!alreadyLaunched) { try { webServer.start(); logger.info("XML-RPC server running..."); } catch (IOException e) { - logger.debug("I/O erreur while launching xml-rpc web serveur", e); + logger.debug("I/O erreur while launching xml-rpc web serveur", + e); } alreadyLaunched = true; } @@ -96,6 +104,16 @@ /* * (non-Javadoc) * + * @see org.apache.xmlrpc.server.XmlRpcHandlerMapping#getHandler(java.lang.String) + */ + public XmlRpcHandler getHandler(String className) throws XmlRpcException { + logger.debug("Request handler for " + className); + return this; + } + + /* + * (non-Javadoc) + * * @see org.apache.xmlrpc.XmlRpcHandler#execute(org.apache.xmlrpc.XmlRpcRequest) */ public Object execute(XmlRpcRequest xmlrequest) throws XmlRpcException { @@ -116,7 +134,7 @@ logger.debug("Receiving request : " + className + "." + methodName + "(" + Arrays.toString(args) + ")"); - + Class clazz; try { clazz = Class.forName(className); @@ -128,16 +146,93 @@ logger.debug("Class " + className + " not found !", e); } + // construit et retourne des maps pour les objets complexes qui ne sont + // pas supportés par XML-RPC + if (result instanceof List) { + result = listToMap((List) result); + } else if (result instanceof TopiaEntity) { + result = entityToMap((TopiaEntity) result); + } return result; } - /* - * (non-Javadoc) + /** + * Construit et retourne une map de "maps entité", clé : TopiaId de + * l'entité, valeur : Map de l'entité * - * @see org.apache.xmlrpc.server.XmlRpcHandlerMapping#getHandler(java.lang.String) + * @see entityToMap(E entity) + * @param + * la classe étendant TopiaEntity + * @param list + * la liste de TopiaEntity + * @return une map contenant les maps clé : TopiaId de l'entité, valeur : + * Map des champs de l'entité */ - public XmlRpcHandler getHandler(String className) throws XmlRpcException { - logger.debug("Request handler for " + className); - return this; + private Map listToMap(List list) { + // construire la map contenant les entités + // clé TopiaId, valeur :Map des attributs de l'entité + Map> resultMap = new HashMap>(); + for (E entity : list) { + // ajouter la map de l'entité + Map entityMap = entityToMap(entity); + resultMap.put(entity.getTopiaId(), entityMap); + } + return resultMap; + } + + /** + * Construit et retourne une map pour l'entité, clé : nom du champ, valeur : + * contenu du champ (si c'est une entité, on met le TopiaId de celle ci, si + * c'est une liste d'entités, on met un tableau de TopiaId) + * + * @param + * la classe étendant TopiaEntity + * @param entity + * l'entité + * @return une map + */ + private Map entityToMap(E entity) { + Map entityMap = new HashMap(); + // invoquer tous les getters pour construire la map de l'entité + for (Method m : entity.getClass().getMethods()) { + if (m.getName().startsWith("get")) { + logger.info("* method " + m); + String attributeName = m.getName().replace("get", ""); + try { + Object o = m.invoke(entity, null); + if (o instanceof String && !((String) o).equals("")) { + // nom de l'attribut : valeur + entityMap.put(attributeName, (String) o); + + } else if (o instanceof Date && o != null) { + // nom de l'attribut : date + entityMap.put(attributeName, ((Date) o).toString()); + + } else if (o instanceof TopiaEntity && o != null) { + // nom de l'attribut : TopiaId + entityMap.put(attributeName, ((TopiaEntity) o) + .getTopiaId()); + + } else if (o instanceof Collection && o != null + && ((Collection) o).size() > 0) { + String composite[] = new String[((Collection) o).size()]; + int index = 0; + for (Object obj : (Collection) o) { + composite[index++] = ((TopiaEntity) obj) + .getTopiaId(); + } + // nom de l'attribut : tableau de TopiaId + entityMap.put(attributeName, composite); + } + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + return entityMap; } -} +} \ No newline at end of file