001: /* Copyright 2004 The JA-SIG Collaborative. All rights reserved.
002: * See license distributed with this file and
003: * available online at http://www.uportal.org/license.html
004: */
005:
006: package org.jasig.portal.channels.error.error2xml;
007:
008: import java.util.ArrayList;
009: import java.util.Iterator;
010: import java.util.List;
011:
012: import org.w3c.dom.Document;
013: import org.w3c.dom.Element;
014:
015: /**
016: * A wrapper for a List of child ThrowableToElements and the logic to poll
017: * them in order, accepting the result from the first to support the given throwable.
018: * Defaults to the standard List of ThrowableToElement implementations, but provides
019: * API hooks to change the list.
020: *
021: * You can add handling for other Throwables by either editing this implementation
022: * code to include additional ThrowableToElement implementations by default or
023: * by injecting a different List of ThrowableToElement implementations where
024: * the instance of this class that CError actually uses is configured
025: * in applicationContext.xml.
026: *
027: * @version $Revision: 35611 $ $Date: 2005-04-18 13:55:13 -0700 (Mon, 18 Apr 2005) $
028: * @since uPortal 2.5
029: */
030: public class DelegatingThrowableToElement implements
031: IThrowableToElement {
032:
033: /**
034: * List of ThrowableToElement implementations in order from most specific
035: * to least specific. These will be polled in order to make our response to our
036: * interface methods.
037: * Our constructor currently defaults this to a basic list of such mappings.
038: */
039: private List throwableToElements;
040:
041: /**
042: * Instantiate a DelegatingThrowableToElement with
043: * a default List of delegates.
044: */
045: public DelegatingThrowableToElement() {
046: List tempThrowableToElements = new ArrayList();
047: // note that the list is populated most specific to least specific.
048: tempThrowableToElements
049: .add(new ResourceMissingExceptionToElement());
050: tempThrowableToElements
051: .add(new InternalTimeoutExceptionToElement());
052: tempThrowableToElements
053: .add(new AuthorizationExceptionToElement());
054: tempThrowableToElements.add(new ThrowableToElement());
055: this .throwableToElements = tempThrowableToElements;
056: }
057:
058: /**
059: * Get the List of ThrowableToElements delegates.
060: * @return Returns the List of throwableToElements delegates..
061: */
062: public List getThrowableToElements() {
063: return this .throwableToElements;
064: }
065:
066: /**
067: * Set the List of ThrowableToElement implementations which this
068: * implementation will poll in order.
069: * The List should be in order from most specific to least specific.
070: * @param throwableToElements List of ThrowableToElement impls.
071: */
072: public void setThrowableToElements(List throwableToElements) {
073: this .throwableToElements = throwableToElements;
074: }
075:
076: public boolean supports(Class c) throws IllegalArgumentException {
077: if (c == null)
078: throw new IllegalArgumentException(
079: "Cannot support a null class");
080: if (!Throwable.class.isAssignableFrom(c)) {
081: throw new IllegalArgumentException(
082: "Cannot support a class which"
083: + "is not an instance of throwable: offending class: "
084: + c.getName());
085: }
086: for (Iterator iter = this .throwableToElements.iterator(); iter
087: .hasNext();) {
088: IThrowableToElement current = (IThrowableToElement) iter
089: .next();
090: if (current.supports(c)) {
091: return true;
092: }
093: }
094: return false;
095: }
096:
097: public Element throwableToElement(Throwable t, Document parentDoc)
098: throws IllegalArgumentException {
099:
100: if (t == null)
101: throw new IllegalArgumentException(
102: "Cannot translate a null throwable");
103: for (Iterator iter = this .throwableToElements.iterator(); iter
104: .hasNext();) {
105: IThrowableToElement current = (IThrowableToElement) iter
106: .next();
107: if (current.supports(t.getClass())) {
108: return current.throwableToElement(t, parentDoc);
109: }
110: }
111: throw new IllegalArgumentException("Throwable [" + t
112: + "] is unsupported.");
113: }
114:
115: public String toString() {
116: StringBuffer sb = new StringBuffer();
117: sb.append(getClass().getName());
118: sb.append(" delegates:").append(this.throwableToElements);
119: return sb.toString();
120: }
121: }
|