r1308 - trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui
Author: glandais Date: 2008-03-08 00:28:20 +0000 (Sat, 08 Mar 2008) New Revision: 1308 Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java Log: Simplified Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java 2008-03-08 00:27:50 UTC (rev 1307) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java 2008-03-08 00:28:20 UTC (rev 1308) @@ -33,6 +33,7 @@ import fr.cemagref.simexplorer.is.entities.Entity; import fr.cemagref.simexplorer.is.entities.EntityVisitable; import fr.cemagref.simexplorer.is.entities.EntityVisitor; +import fr.cemagref.simexplorer.is.entities.EntityVisitorTreeNode; import fr.cemagref.simexplorer.is.entities.Leaf; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; @@ -48,14 +49,6 @@ protected static Log log = LogFactory.getLog(EntityTreeNodeHelper.class); - /** L'instance cachée de builder par Thread. */ - protected static final ThreadLocal<EntityVisitorBuilder> builder = new ThreadLocal<EntityVisitorBuilder>() { - @Override - protected EntityVisitorBuilder initialValue() { - return new EntityVisitorBuilder(); - } - }; - /** * Construit un arbre de navigation à partir d'un {@link LoggableElement}. * @@ -64,14 +57,11 @@ * @return le noeud parent de l'arbre de nivation construit. */ public static EntityTreeNode build(LoggableElement v, boolean remote) { - EntityVisitorBuilder instance; - synchronized (instance = EntityTreeNodeHelper.builder.get()) { - EntityTreeNode result; - // walk - result = instance.visit(v, remote); - log.info(v + " (" + remote + ") "); - return result; - } + EntityVisitorBuilder instance = new EntityVisitorBuilder(remote); + // walk + EntityTreeNode result = instance.treeNodeVisit(v); + log.info(v + " (" + remote + ") "); + return result; } public static LoggableElement getSelectedLoggableElement(TreeSelectionEvent e) { @@ -141,114 +131,130 @@ protected EntityTreeNodeHelper() { // no instance } + + public static class EntityVisitorBuilder extends EntityVisitorTreeNode<EntityTreeNode> { - /** - * Implantation de {@link SimpleEntityVisitor} pour construire l'arbre de navigation d'un {@link LoggableElement}. - * <p/> Cette classe est stateless, tous ces états internes doivent être nettoyé après une visite, en utilisant la - * méthode {@link #reset()}. <p/> - */ - public static class EntityVisitorBuilder implements EntityVisitor { - - /** - * le noeud parent de tous les autres. <p/> Ce noeud est positionné par la méthode - * {@link #markRootNode(EntityTreeNode)}. - */ - protected EntityTreeNode rootNode; + private boolean remote; - /** The node stack. */ - protected Deque<EntityTreeNode> nodeStack; - - /** - * flag qui indique si on travaille sur des objet locaux ou distants. <p/> Cette information est conservé dans - * les nodes pour permettre de gérer de manière transparent des objet locaux ou distants. - */ - protected Boolean remote; - - /** - * Visite un element visitable. - * - * @param v the v - * @param remote the remote - * - * @return the entity tree node - */ - public EntityTreeNode visit(EntityVisitable v, boolean remote) { - reset(); - try { - this.remote = remote; - visit(v); - EntityTreeNode result; - result = this.rootNode; - return result; - } finally { - reset(); - } + public EntityVisitorBuilder(boolean remote) { + super(); + this.remote = remote; } @Override - public void enterComposite(Composite v) { - EntityTreeNode newNode; - newNode = createNode(v, true); - nodeStack.addFirst(newNode); - markRootNode(newNode); + protected EntityTreeNode createNode(Entity v, boolean allowedChildren) { + return new EntityTreeNode(getCurrentParent(), v, remote, allowedChildren); } - /** - * Creates the node. - * - * @param e the e - * @param allowedChildren the allowed children - * - * @return the entity tree node - */ - private EntityTreeNode createNode(Entity e, boolean allowedChildren) { - EntityTreeNode newNode = new EntityTreeNode(nodeStack.peekFirst(), e, remote, allowedChildren); - return newNode; - } + } - @Override - public void exitComposite(Composite v) { - nodeStack.removeFirst(); - } - - @Override - public void visit(EntityVisitable v) { - if (v != null) { - // on lance la visite - v.accept(this); - } - } - - @Override - public void visitComposite(Composite v) { - createNode(v, false); - } - - @Override - public void visitLeaf(Leaf v) { - createNode(v, false); - } - - /** - * Tente de marquerle node donné comme noeud ancêtre de tous les autres. <p/> Le positionnement n'a lieu que si - * on a pas encore de rootNode. - * - * @param node le node a positionner comme rootNode (si nessecaire) - */ - protected void markRootNode(EntityTreeNode node) { - if (rootNode == null) { - rootNode = node; - } - } - - /** - * La méthode pour réinitialiser les états interne de la classe. <p/> Cette méthode doit être appeler après - * chaque visite, afin d'assurer la propriété stateless de la classe. - */ - protected void reset() { - nodeStack = new ArrayDeque<EntityTreeNode>(); - remote = null; - } - - } +// /** +// * Implantation de {@link SimpleEntityVisitor} pour construire l'arbre de navigation d'un {@link LoggableElement}. +// * <p/> Cette classe est stateless, tous ces états internes doivent être nettoyé après une visite, en utilisant la +// * méthode {@link #reset()}. <p/> +// */ +// public static class EntityVisitorBuilder implements EntityVisitor { +// +// /** +// * le noeud parent de tous les autres. <p/> Ce noeud est positionné par la méthode +// * {@link #markRootNode(EntityTreeNode)}. +// */ +// protected EntityTreeNode rootNode; +// +// /** The node stack. */ +// protected Deque<EntityTreeNode> nodeStack; +// +// /** +// * flag qui indique si on travaille sur des objet locaux ou distants. <p/> Cette information est conservé dans +// * les nodes pour permettre de gérer de manière transparent des objet locaux ou distants. +// */ +// protected Boolean remote; +// +// /** +// * Visite un element visitable. +// * +// * @param v the v +// * @param remote the remote +// * +// * @return the entity tree node +// */ +// public EntityTreeNode visit(EntityVisitable v, boolean remote) { +// reset(); +// try { +// this.remote = remote; +// visit(v); +// EntityTreeNode result; +// result = this.rootNode; +// return result; +// } finally { +// reset(); +// } +// } +// +// @Override +// public void enterComposite(Composite v) { +// EntityTreeNode newNode; +// newNode = createNode(v, true); +// nodeStack.addFirst(newNode); +// markRootNode(newNode); +// } +// +// /** +// * Creates the node. +// * +// * @param e the e +// * @param allowedChildren the allowed children +// * +// * @return the entity tree node +// */ +// private EntityTreeNode createNode(Entity e, boolean allowedChildren) { +// EntityTreeNode newNode = new EntityTreeNode(nodeStack.peekFirst(), e, remote, allowedChildren); +// return newNode; +// } +// +// @Override +// public void exitComposite(Composite v) { +// nodeStack.removeFirst(); +// } +// +// @Override +// public void visit(EntityVisitable v) { +// if (v != null) { +// // on lance la visite +// v.accept(this); +// } +// } +// +// @Override +// public void visitComposite(Composite v) { +// createNode(v, false); +// } +// +// @Override +// public void visitLeaf(Leaf v) { +// createNode(v, false); +// } +// +// /** +// * Tente de marquerle node donné comme noeud ancêtre de tous les autres. <p/> Le positionnement n'a lieu que si +// * on a pas encore de rootNode. +// * +// * @param node le node a positionner comme rootNode (si nessecaire) +// */ +// protected void markRootNode(EntityTreeNode node) { +// if (rootNode == null) { +// rootNode = node; +// } +// } +// +// /** +// * La méthode pour réinitialiser les états interne de la classe. <p/> Cette méthode doit être appeler après +// * chaque visite, afin d'assurer la propriété stateless de la classe. +// */ +// protected void reset() { +// nodeStack = new ArrayDeque<EntityTreeNode>(); +// remote = null; +// } +// +// } }
participants (1)
-
glandais@users.labs.libre-entreprise.org