Author: tchemit Date: 2010-06-28 15:50:33 +0200 (Mon, 28 Jun 2010) New Revision: 2002 Url: http://nuiton.org/repositories/revision/jaxx/2002 Log: make child loadors have another generic type to defined how to load datas. Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoHelper.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoNode.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/ActorsNodeLoadors.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/MoviesNodeLoadors.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNodeChildLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxTreeHelper.java Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoHelper.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoHelper.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoHelper.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -45,7 +45,6 @@ public static String ACTORS_CATEGORY_NODE = "actors"; public JaxxTreeDemoHelper(JaxxTreeDemoDataProvider provider) { - super(); setDataProvider(provider); } @@ -64,7 +63,7 @@ String.class, n_(MOVIES_CATEGORY_NODE), null, - new MoviesNodeLoadors() + getChildLoador(MoviesNodeLoadors.class) ); // Create peoples category node @@ -72,7 +71,7 @@ String.class, n_(ACTORS_CATEGORY_NODE), null, - new ActorsNodeLoadors() + getChildLoador(ActorsNodeLoadors.class) ); // Add to root @@ -80,13 +79,8 @@ root.add(peoplesCategoryNode); // Create model - DefaultTreeModel model = getModel(); - if (model == null) { - model = createModel(root); - } else { - model.setRoot(root); - } - + DefaultTreeModel model = createModel(root); + // Populate childs nodes root.populateChilds(model, getDataProvider()); Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoNode.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoNode.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/JaxxTreeDemoNode.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -34,11 +34,16 @@ */ public class JaxxTreeDemoNode extends JaxxNode<JaxxTreeDemoNode> { + private static final long serialVersionUID = 1L; + public JaxxTreeDemoNode(String id) { super(id); } - public JaxxTreeDemoNode(Class<?> internalClass, String id, String context, JaxxNodeChildLoador<?, JaxxTreeDemoNode> jaxxDemoNodeJaxxNodeChildLoador) { - super(internalClass, id, context, jaxxDemoNodeJaxxNodeChildLoador); + public JaxxTreeDemoNode(Class<?> internalClass, + String id, + String context, + JaxxNodeChildLoador<?, ?, JaxxTreeDemoNode> loador) { + super(internalClass, id, context, loador); } } Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/ActorsNodeLoadors.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/ActorsNodeLoadors.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/ActorsNodeLoadors.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -37,7 +37,9 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class ActorsNodeLoadors extends JaxxNodeChildLoador<People, JaxxTreeDemoNode> { +public class ActorsNodeLoadors extends JaxxNodeChildLoador<People,People, JaxxTreeDemoNode> { + + private static final long serialVersionUID = 1L; public ActorsNodeLoadors() { super(People.class); Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/MoviesNodeLoadors.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/MoviesNodeLoadors.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/tree/loadors/MoviesNodeLoadors.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -40,7 +40,9 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class MoviesNodeLoadors extends JaxxNodeChildLoador<Movie, JaxxTreeDemoNode> { +public class MoviesNodeLoadors extends JaxxNodeChildLoador<Movie, Movie, JaxxTreeDemoNode> { + + private static final long serialVersionUID = 1L; public MoviesNodeLoadors() { super(Movie.class); @@ -73,7 +75,7 @@ String.class, n_(JaxxTreeDemoHelper.ACTORS_CATEGORY_NODE), null, - new ActorsNodeLoadors() + JaxxTreeDemoHelper.getChildLoador(ActorsNodeLoadors.class) ); // Add actors nodes to movies node Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -38,7 +38,11 @@ private static final long serialVersionUID = 1L; public DemoNode(String id) { - super(String.class, id, null, DemoTreeHelper.getChildLoador(DemoNodeLoador.class)); + super(String.class, + id, + null, + DemoTreeHelper.getChildLoador(DemoNodeLoador.class) + ); } @Override Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -34,7 +34,7 @@ * @author tchemit <tchemit@codelutin.com> * @since 2.1 */ -public class DemoNodeLoador extends JaxxNodeChildLoador<Object, DemoNode> { +public class DemoNodeLoador extends JaxxNodeChildLoador<Object,Object, DemoNode> { private static final long serialVersionUID = 1L; @@ -68,7 +68,8 @@ } if (node == null) { - throw new IllegalArgumentException("Data [" + data + "] can not be use to build a node"); + throw new IllegalArgumentException( + "Data [" + data + "] can not be use to build a node"); } Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNode.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNode.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNode.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -118,7 +118,7 @@ protected boolean loaded; /** Optional child loador to lazy create childs of the node. */ - protected final JaxxNodeChildLoador<?, N> childLoador; + protected final JaxxNodeChildLoador<?, ?, N> childLoador; protected JaxxNode(String id) { this(String.class, id, null, null); @@ -127,7 +127,7 @@ public JaxxNode(Class<?> internalClass, String id, String context, - JaxxNodeChildLoador<?, N> childLoador) { + JaxxNodeChildLoador<?, ?, N> childLoador) { this.internalClass = internalClass; this.id = id; this.context = context; Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNodeChildLoador.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNodeChildLoador.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxNodeChildLoador.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -46,11 +46,14 @@ * a such object rathen than duplicate same code in helper... * * @author tchemit <chemit@codelutin.com> + * @param <T> type of data used to create nodes (can be just a String type to use only ids) + * @param <O> type of data associated with nodes + * @param <N> type of node to used (to make possible full co-variance and no cast in fal implementations). * @see JaxxTreeHelper * @see JaxxNode * @since 2.1 */ -public abstract class JaxxNodeChildLoador<O, N extends JaxxNode<N>> implements Serializable { +public abstract class JaxxNodeChildLoador<T, O, N extends JaxxNode<N>> implements Serializable { /** Logger */ static private final Log log = LogFactory.getLog(JaxxNodeChildLoador.class); @@ -63,7 +66,9 @@ } /** - * Obtain the list of data to put in childs. + * Obtain the list of data used to create nodes. + * <p/> + * If type {@code T} is {@code O}, we directly use the data associated with nodes. * * @param parentClass type of parent * @param parentId id of parent @@ -71,7 +76,7 @@ * @return the list of data * @throws Exception if any problem */ - public abstract List<O> getData(Class<?> parentClass, + public abstract List<T> getData(Class<?> parentClass, String parentId, DataProvider dataProvider) throws Exception; @@ -81,35 +86,39 @@ * @param data the data of the node to create * @return the created node */ - public abstract N createNode(O data); -// public abstract N createNode(N parentNode, O data); + public abstract N createNode(T data); + /** + * Returns the type of data associated with nodes to create. + * + * @return the type of data associated with created nodes. + */ public Class<O> getBeanType() { return beanType; } /** - * Charge les fils du noeud parent donne. + * Load childs of the given {@code parentnode}. * - * @param model le model de l'arbre a impacter - * @param parentNode le noeud parent - * @param source le service pour recuperer les donnees + * @param model the model owner of nodes + * @param parentNode the parent node where to insert nodes + * @param dataProvider data provider * @throws Exception pour tout probleme de recuperation de donnees */ public void loadChilds(DefaultTreeModel model, N parentNode, - DataProvider source) throws Exception { + DataProvider dataProvider) throws Exception { N containerNode = parentNode.getContainerNode(); - List<O> datas; + List<T> datas; if (containerNode == null) { // pas d'ancetre, il doit s'agir d'un premier noeud de données // depuis le noeud root // recuperation des objets fils (sans connaitre de parent) - datas = getData(null, null, source); + datas = getData(null, null, dataProvider); } else { if (log.isDebugEnabled()) { @@ -120,7 +129,7 @@ // recuperation des objets fils datas = getData(containerNode.getInternalClass(), containerNode.getId(), - source); + dataProvider); } // on charge les fils @@ -130,11 +139,20 @@ JaxxTreeHelper.notifyChildNodesInserted(model, parentNode); } - protected void addChildNodes(N parentNode, List<O> datas) { + /** + * Add childs to given {@code parentNode} using retrive {@code datas} from + * the data provider. + * <p/> + * This method is invoked by the {@link #loadChilds(DefaultTreeModel, JaxxNode, DataProvider)}. + * + * @param parentNode the node where to insert + * @param datas the data used to create node + */ + protected void addChildNodes(N parentNode, List<T> datas) { // creation des noeuds fils if (datas != null) { - for (O o : datas) { + for (T o : datas) { if (log.isInfoEnabled()) { log.info("[" + parentNode + "] Will add child node for " + o); } Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxTreeHelper.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxTreeHelper.java 2010-06-27 07:01:41 UTC (rev 2001) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/tree/JaxxTreeHelper.java 2010-06-28 13:50:33 UTC (rev 2002) @@ -182,11 +182,11 @@ protected TreeModelListener treeModelListener; /** Cache of child loadors. */ - protected static Set<? super JaxxNodeChildLoador<?, ?>> childLoadors; + protected static Set<? super JaxxNodeChildLoador<?, ?, ?>> childLoadors; - protected static Set<? super JaxxNodeChildLoador<?, ?>> getChildLoadors() { + protected static Set<? super JaxxNodeChildLoador<?, ?, ?>> getChildLoadors() { if (childLoadors == null) { - childLoadors = new HashSet<JaxxNodeChildLoador<?, ?>>(); + childLoadors = new HashSet<JaxxNodeChildLoador<?, ?, ?>>(); } return childLoadors; } @@ -201,12 +201,12 @@ * @param <L> the type of loador to get * @return the loador from cache */ - public static <L extends JaxxNodeChildLoador<?, ?>> L getChildLoador(Class<L> type) { - Set<? super JaxxNodeChildLoador<?, ?>> cache = getChildLoadors(); - JaxxNodeChildLoador<?, ?> result = null; + public static <L extends JaxxNodeChildLoador<?, ?, ?>> L getChildLoador(Class<L> type) { + Set<? super JaxxNodeChildLoador<?, ?, ?>> cache = getChildLoadors(); + JaxxNodeChildLoador<?, ?, ?> result = null; for (Object loador : cache) { if (type.equals(loador.getClass())) { - result = (JaxxNodeChildLoador<?, ?>) loador; + result = (JaxxNodeChildLoador<?, ?, ?>) loador; break; } } @@ -671,8 +671,8 @@ * @param dataProvider the data provider used to populate nodes */ public void loadAllNodes(DefaultTreeModel model, - JaxxNode<?> node, - DataProvider dataProvider) { + JaxxNode<?> node, + DataProvider dataProvider) { if (!checkModel()) { return; } @@ -781,11 +781,11 @@ /** * Register a new root node. - * + * <p/> * If internal {@link #model} does not exists, creates a new one from his given root {@code node}, * otherwise just set the new root on the existing model. * <p/> - * + * <p/> * <b>Note:</b> As a side-effect, the model will be keep in field {@link #model} * and the {@link #treeModelListener} will be registred on this model. * @@ -799,7 +799,7 @@ } else { model.setRoot(node); } - + // notify structure has changed model.nodeStructureChanged(getRootNode()); return model;