|
PicoContainer example source code file (AbstractPicoVisitor.java)
The PicoContainer AbstractPicoVisitor.java source code/***************************************************************************** * Copyright (C) PicoContainer Organization. All rights reserved. * * ------------------------------------------------------------------------- * * The software in this package is published under the terms of the BSD * * style license a copy of which has been included with this distribution in * * the LICENSE.txt file. * *****************************************************************************/ package org.picocontainer.visitors; import org.picocontainer.PicoVisitor; import org.picocontainer.PicoException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.AccessController; import java.security.PrivilegedAction; /** * Abstract PicoVisitor implementation. A generic traverse method is implemented, that * accepts any object with a method named "accept", that takes a * {@link PicoVisitor} as argument and and invokes it. Additionally it provides the * {@link #checkTraversal()} method, that throws a {@link PicoVisitorTraversalException}, * if currently no traversal is running. * * @author Jörg Schaible */ public abstract class AbstractPicoVisitor implements PicoVisitor { private boolean traversal; public Object traverse(final Object node) { traversal = true; Object retval = AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { return node.getClass().getMethod("accept", PicoVisitor.class); } catch (NoSuchMethodException e) { return e; } } }); try { if (retval instanceof NoSuchMethodException) { throw (NoSuchMethodException) retval; } Method accept = (Method) retval; accept.invoke(node, this); return Void.TYPE; } catch (NoSuchMethodException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { Throwable cause = e.getTargetException(); if (cause instanceof RuntimeException) { throw (RuntimeException)cause; } else if (cause instanceof Error) { throw (Error)cause; } } finally { traversal = false; } throw new IllegalArgumentException(node.getClass().getName() + " is not a valid type for traversal"); } /** * Checks the traversal flag, indicating a currently running traversal of the visitor. * @throws PicoVisitorTraversalException if no traversal is active. */ protected void checkTraversal() { if (!traversal) { throw new PicoVisitorTraversalException(this); } } /** * Exception for a PicoVisitor, that is dependent on a defined starting point of the traversal. * If the traversal is not initiated with a call of {@link PicoVisitor#traverse} * * @author joehni */ public static class PicoVisitorTraversalException extends PicoException { /** * Construct the PicoVisitorTraversalException. * * @param visitor The visitor casing the exception. */ public PicoVisitorTraversalException(PicoVisitor visitor) { super("Traversal for PicoVisitor of type " + visitor.getClass().getName() + " must start with the visitor's traverse method"); } } } Other PicoContainer examples (source code examples)Here is a short list of links related to this PicoContainer AbstractPicoVisitor.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.