Home » commons-lang-2.4-src » org.apache.commons » lang » exception » [javadoc | source]
    1   /*
    2    * Copyright 2002-2005 The Apache Software Foundation.
    3    * 
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    * 
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    * 
   10    * Unless required by applicable law or agreed to in writing, software
   11    * distributed under the License is distributed on an "AS IS" BASIS,
   12    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   13    * See the License for the specific language governing permissions and
   14    * limitations under the License.
   15    */
   16   package org.apache.commons.lang.exception;
   17   
   18   import java.io.ByteArrayOutputStream;
   19   import java.io.EOFException;
   20   import java.io.IOException;
   21   import java.io.PrintStream;
   22   import java.io.PrintWriter;
   23   
   24   import junit.framework.Test;
   25   import junit.framework.TestSuite;
   26   import junit.textui.TestRunner;
   27   
   28   /**
   29    * Tests the org.apache.commons.lang.exception.NestableDelegate class.
   30    *
   31    * @author <a href="mailto:steven@caswell.name">Steven Caswell</a>
   32    * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a>
   33    * @version $Id: NestableDelegateTestCase.java 161244 2005-04-14 06:16:36Z ggregory $
   34    */
   35   public class NestableDelegateTestCase extends junit.framework.TestCase {
   36       private static final String CONSTRUCTOR_FAILED_MSG = 
   37       "The Nestable implementation passed to the NestableDelegate(Nestable) constructor must extend java.lang.Throwable";
   38   
   39       private static final String PARTIAL_STACK_TRACE =
   40           "ThrowableNestedNestable partial stack trace place-holder";
   41   
   42       protected String lineSeparator;
   43   
   44       /**
   45        * Construct a new instance of NestableDelegateTestCase with the specified name
   46        */
   47       public NestableDelegateTestCase(String name)
   48       {
   49           super(name);
   50       }
   51   
   52       /**
   53        * Set up instance variables required by this test case.
   54        */
   55       public void setUp()
   56       {
   57           lineSeparator = System.getProperty("line.separator");
   58       }
   59       
   60       public static Test suite()
   61       {
   62           return new TestSuite(NestableDelegateTestCase.class);
   63       }
   64       
   65       /**
   66        * Tear down instance variables required by this test case.
   67        */
   68       public void tearDown()
   69       {
   70           lineSeparator = null;
   71       }
   72       
   73       /**
   74        * Test the implementation
   75        */
   76       public void testNestableDelegateConstructor()
   77       {
   78           String msg = null;
   79           boolean constructorFailed = false;
   80           try
   81           {
   82               NestableDelegate nonThrowableCause = new NestableDelegate(new NonThrowableNestable());
   83           }
   84           catch(IllegalArgumentException iae)
   85           {
   86               constructorFailed = true;
   87               msg = iae.getMessage();
   88           }
   89           assertTrue("nestable delegate constructor with non-throwable cause failed == true", constructorFailed);
   90           assertTrue("constructor failed exception msg == " + CONSTRUCTOR_FAILED_MSG,
   91               msg.equals(CONSTRUCTOR_FAILED_MSG));
   92   
   93           constructorFailed = false;
   94           try
   95           {
   96               NestableDelegate nd1 = new NestableDelegate(new ThrowableNestable());
   97           }
   98           catch(IllegalArgumentException iae)
   99           {
  100               constructorFailed = true;
  101           }
  102           assertTrue("nestable delegate constructor with throwable cause failed == false", !constructorFailed);
  103       }
  104   
  105       public void testNestableDelegateGetMessage()
  106       {
  107           Nestable ne1 = new ThrowableNestable();
  108           assertTrue("ThrowableNestable ne1 getMessage() == ThrowableNestable exception",
  109               ne1.getMessage().equals("ThrowableNestable exception"));
  110           NestableDelegate nd1 = new NestableDelegate(ne1);
  111           assertTrue("nd1 getMessage() == " + ne1.getCause().getMessage(),
  112               nd1.getMessage("base").equals("base: " + ne1.getCause().getMessage()));
  113           
  114           Nestable ne2 = new ThrowableNestedNestable(new Exception("nested exception 2"));
  115           NestableDelegate nd2 = new NestableDelegate(ne2);
  116           assertTrue("nd2 getMessage() == base: " + ne2.getCause().getMessage(),
  117               nd2.getMessage("base").equals("base: " + ne2.getCause().getMessage()));
  118       }
  119   
  120       public void testNestableDelegateGetThrowableCount()
  121       {
  122           Nestable n = null;
  123           NestableDelegate d = null;
  124           
  125           n = new NestableDelegateTester1();
  126           d = new NestableDelegate(n);
  127           doNestableDelegateGetThrowableCount(d, 1);
  128           
  129           n = new NestableDelegateTester1("level 1");
  130           d = new NestableDelegate(n);
  131           doNestableDelegateGetThrowableCount(d, 1);
  132           
  133           n = new NestableDelegateTester1(new Exception());
  134           d = new NestableDelegate(n);
  135           doNestableDelegateGetThrowableCount(d, 2);
  136           
  137           n = new NestableDelegateTester1(new Exception("level 2"));
  138           d = new NestableDelegate(n);
  139           doNestableDelegateGetThrowableCount(d, 2);
  140           
  141           n = new NestableDelegateTester1("level 1", 
  142                   new NestableDelegateTester2("level 2", 
  143                       new NestableDelegateTester1(
  144                           new NestableDelegateTester2("level 4", 
  145                               new Exception("level 5")
  146                           )
  147                       )
  148                   )
  149               );
  150           d = new NestableDelegate(n);
  151           doNestableDelegateGetThrowableCount(d, 5);
  152       }
  153   
  154       private void doNestableDelegateGetThrowableCount(NestableDelegate d, int len)
  155       {
  156           // Compare the lengths
  157           assertEquals("delegate length", len, d.getThrowableCount());
  158       }
  159       
  160       public void testNestableDelegateGetMessages()
  161       {
  162           Nestable n = null;
  163           NestableDelegate d = null;
  164           String msgs[] = null;
  165           
  166           msgs = new String[1];
  167           n = new NestableDelegateTester1();
  168           d = new NestableDelegate(n);        
  169           doNestableDelegateGetMessages(d, msgs);
  170           
  171           msgs = new String[1];
  172           msgs[0] = "level 1";
  173           n = new NestableDelegateTester1(msgs[0]);
  174           d = new NestableDelegate(n);
  175           doNestableDelegateGetMessages(d, msgs);
  176   
  177           msgs = new String[2];
  178           n = new NestableDelegateTester1(new Exception());
  179           d = new NestableDelegate(n);
  180           doNestableDelegateGetMessages(d, msgs);
  181   
  182           msgs = new String[2];
  183           msgs[0] = null;
  184           msgs[1] = "level 2";
  185           n = new NestableDelegateTester1(new Exception(msgs[1]));
  186           d = new NestableDelegate(n);
  187           doNestableDelegateGetMessages(d, msgs);
  188    
  189           msgs = new String[5];
  190           msgs[0] = "level 1";
  191           msgs[1] = "level 2";
  192           msgs[2] = null;
  193           msgs[3] = "level 4";
  194           msgs[4] = "level 5";
  195           n = new NestableDelegateTester1(msgs[0], 
  196                   new NestableDelegateTester2(msgs[1], 
  197                       new NestableDelegateTester1(
  198                           new NestableDelegateTester2(msgs[3], 
  199                               new Exception(msgs[4])
  200                           )
  201                       )
  202                   )
  203               );
  204           d = new NestableDelegate(n);
  205           doNestableDelegateGetMessages(d, msgs);
  206       }
  207   
  208       private void doNestableDelegateGetMessages(NestableDelegate d, String[] nMsgs)
  209       {
  210           // Compare the messages
  211           String[] dMsgs = d.getMessages();
  212           assertEquals("messages length", nMsgs.length, dMsgs.length);
  213           for(int i = 0; i < nMsgs.length; i++)
  214           {
  215               assertEquals("message " + i, nMsgs[i], dMsgs[i]);
  216           }
  217       }
  218   
  219       public void testNestableDelegateGetMessageN()
  220       {
  221           Nestable n = null;
  222           NestableDelegate d = null;
  223           String[] msgs = new String[5];
  224           msgs[0] = "level 1";
  225           msgs[1] = "level 2";
  226           msgs[2] = null;
  227           msgs[3] = "level 4";
  228           msgs[4] = "level 5";
  229           n = new NestableDelegateTester1(msgs[0], 
  230                   new NestableDelegateTester2(msgs[1], 
  231                       new NestableDelegateTester1(
  232                           new NestableDelegateTester2(msgs[3], 
  233                               new Exception(msgs[4])
  234                           )
  235                       )
  236                   )
  237               );
  238           d = new NestableDelegate(n);
  239           for(int i = 0; i < msgs.length; i++)
  240           {
  241               assertEquals("message " + i, msgs[i], d.getMessage(i));
  242           }
  243           
  244           // Test for index out of bounds
  245           try
  246           {
  247               String msg = d.getMessage(-1);
  248               fail("getMessage(-1) should have thrown IndexOutOfBoundsException");
  249           }
  250           catch(IndexOutOfBoundsException ioode)
  251           {
  252           }
  253           try
  254           {
  255               String msg = d.getMessage(msgs.length + 100);
  256               fail("getMessage(999) should have thrown IndexOutOfBoundsException");
  257           }
  258           catch(IndexOutOfBoundsException ioode)
  259           {
  260           }
  261       }
  262   
  263       public void testNestableDelegateGetThrowableN()
  264       {
  265           Nestable n = null;
  266           NestableDelegate d = null;
  267           String msgs[] = null;
  268           Class[] throwables = null;
  269           
  270           msgs = new String[2];
  271           msgs[0] = null;
  272           msgs[1] = "level 2";
  273           throwables = new Class[2];
  274           throwables[0] = NestableDelegateTester1.class;
  275           throwables[1] = Exception.class;
  276           n = new NestableDelegateTester1(new Exception(msgs[1]));
  277           d = new NestableDelegate(n);
  278           doNestableDelegateGetThrowableN(d, throwables, msgs);
  279    
  280           msgs = new String[5];
  281           msgs[0] = "level 1";
  282           msgs[1] = "level 2";
  283           msgs[2] = null;
  284           msgs[3] = "level 4";
  285           msgs[4] = "level 5";
  286           throwables = new Class[5];
  287           throwables[0] = NestableDelegateTester1.class;
  288           throwables[1] = NestableDelegateTester2.class;
  289           throwables[2] = NestableDelegateTester1.class;
  290           throwables[3] = NestableDelegateTester2.class;
  291           throwables[4] = Exception.class;        
  292           n = new NestableDelegateTester1(msgs[0], 
  293                   new NestableDelegateTester2(msgs[1], 
  294                       new NestableDelegateTester1(
  295                           new NestableDelegateTester2(msgs[3], 
  296                               new Exception(msgs[4])
  297                               )
  298                           )
  299                       )
  300                   );
  301           d = new NestableDelegate(n);
  302           doNestableDelegateGetThrowableN(d, throwables, msgs);
  303       }
  304   
  305       private void doNestableDelegateGetThrowableN(NestableDelegate d, Class[] classes, String[] msgs)
  306       {
  307           Throwable t = null;
  308           String msg = null;
  309           
  310           for(int i = 0; i < classes.length; i++)
  311           {
  312               t = d.getThrowable(i);
  313               assertEquals("throwable class", classes[i], t.getClass());
  314               if(Nestable.class.isInstance(t))
  315               {
  316                   msg = ((Nestable) t).getMessage(0);
  317               }
  318               else
  319               {
  320                   msg = t.getMessage();
  321               }
  322               assertEquals("throwable message", msgs[i], msg);
  323           }
  324           
  325           // Test for index out of bounds
  326           try
  327           {
  328               t = d.getThrowable(-1);
  329               fail("getThrowable(-1) should have thrown IndexOutOfBoundsException");
  330           }
  331           catch(IndexOutOfBoundsException ioobe)
  332           {
  333           }
  334           try
  335           {
  336               t = d.getThrowable(999);
  337               fail("getThrowable(999) should have thrown IndexOutOfBoundsException");
  338           }
  339           catch(IndexOutOfBoundsException ioobe)
  340           {
  341           }
  342       }
  343   
  344       public void testNestableDelegateGetThrowables()
  345       {
  346           Nestable n = null;
  347           NestableDelegate d = null;
  348           String msgs[] = null;
  349           Class[] throwables = null;
  350           
  351           msgs = new String[2];
  352           msgs[0] = null;
  353           msgs[1] = "level 2";
  354           throwables = new Class[2];
  355           throwables[0] = NestableDelegateTester1.class;
  356           throwables[1] = Exception.class;
  357           n = new NestableDelegateTester1(new Exception(msgs[1]));
  358           d = new NestableDelegate(n);
  359           doNestableDelegateGetThrowables(d, throwables, msgs);
  360    
  361           msgs = new String[5];
  362           msgs[0] = "level 1";
  363           msgs[1] = "level 2";
  364           msgs[2] = null;
  365           msgs[3] = "level 4";
  366           msgs[4] = "level 5";
  367           throwables = new Class[5];
  368           throwables[0] = NestableDelegateTester1.class;
  369           throwables[1] = NestableDelegateTester2.class;
  370           throwables[2] = NestableDelegateTester1.class;
  371           throwables[3] = NestableDelegateTester2.class;
  372           throwables[4] = Exception.class;        
  373           n = new NestableDelegateTester1(msgs[0], 
  374                   new NestableDelegateTester2(msgs[1], 
  375                       new NestableDelegateTester1(
  376                           new NestableDelegateTester2(msgs[3], 
  377                               new Exception(msgs[4])
  378                           )
  379                       )
  380                   )
  381               );
  382           d = new NestableDelegate(n);
  383           doNestableDelegateGetThrowables(d, throwables, msgs);
  384       }
  385       
  386       private void doNestableDelegateGetThrowables(NestableDelegate d, Class[] classes, String[] msgs)
  387       {
  388           Throwable[] throwables = null;
  389           String msg = null;
  390   
  391           throwables = d.getThrowables();
  392           assertEquals("throwables length", classes.length, throwables.length);
  393           for(int i = 0; i < classes.length; i++)
  394           {
  395               assertEquals("throwable class", classes[i], throwables[i].getClass());
  396               Throwable t = throwables[i];
  397               if(Nestable.class.isInstance(t))
  398               {
  399                   msg = ((Nestable) t).getMessage(0);
  400               }
  401               else
  402               {
  403                   msg = t.getMessage();
  404               }
  405               assertEquals("throwable message", msgs[i], msg);
  406           }
  407       }
  408   
  409       public void testIndexOfThrowable()
  410       {
  411           Nestable n = null;
  412           NestableDelegate d = null;
  413           String msgs[] = null;
  414           Class[] throwables = null;
  415           
  416           msgs = new String[5];
  417           msgs[0] = "level 1";
  418           msgs[1] = "level 2";
  419           msgs[2] = null;
  420           msgs[3] = "level 4";
  421           msgs[4] = "level 5";
  422           throwables = new Class[5];
  423           throwables[0] = NestableDelegateTester1.class;
  424           throwables[1] = NestableDelegateTester2.class;
  425           throwables[2] = NestableDelegateTester1.class;
  426           throwables[3] = NestableDelegateTester2.class;
  427           throwables[4] = EOFException.class;
  428           int[] indexes = {0, 1, 0, 1, 4};
  429           n = new NestableDelegateTester1(msgs[0], 
  430                   new NestableDelegateTester2(msgs[1], 
  431                       new NestableDelegateTester1(
  432                           new NestableDelegateTester2(msgs[3], 
  433                               new EOFException(msgs[4])
  434                           )
  435                       )
  436                   )
  437               );
  438           d = new NestableDelegate(n);
  439           for(int i = 0; i < throwables.length; i++)
  440           {
  441               doNestableDelegateIndexOfThrowable(d, throwables[i], 0, indexes[i], msgs[indexes[i]]);
  442           }
  443           doNestableDelegateIndexOfThrowable(d, NestableDelegateTester2.class, 2, 3, msgs[3]);
  444           doNestableDelegateIndexOfThrowable(d, NestableDelegateTester1.class, 1, 2, msgs[2]);
  445           doNestableDelegateIndexOfThrowable(d, NestableDelegateTester1.class, 3, -1, null);
  446           doNestableDelegateIndexOfThrowable(d, NestableDelegateTester1.class, 4, -1, null);
  447           doNestableDelegateIndexOfThrowable(d, EOFException.class, 2, 4, msgs[4]);
  448           doNestableDelegateIndexOfThrowable(d, IOException.class, 2, 4, msgs[4]);
  449           doNestableDelegateIndexOfThrowable(d, Exception.class, 2, 2, msgs[2]);
  450           doNestableDelegateIndexOfThrowable(d, Exception.class, 0, 0, msgs[0]);
  451           doNestableDelegateIndexOfThrowable(d, java.util.Date.class, 0, -1, null);
  452           doNestableDelegateIndexOfThrowable(d, null, 0, -1, null);
  453           
  454           // Test for index out of bounds
  455           try
  456           {
  457               int index = d.indexOfThrowable(NestableDelegateTester1.class, -1);
  458               fail("method should have thrown IndexOutOfBoundsException");
  459           }
  460           catch(IndexOutOfBoundsException iooob)
  461           {
  462           }
  463           try
  464           {
  465               int index = d.indexOfThrowable(NestableDelegateTester1.class, 5);
  466               fail("method should have thrown IndexOutOfBoundsException");
  467           }
  468           catch(IndexOutOfBoundsException iooob)
  469           {
  470           }
  471       }
  472   
  473       private void doNestableDelegateIndexOfThrowable(NestableDelegate d, Class type, int fromIndex, int expectedIndex, String expectedMsg)
  474       {
  475           Throwable t = null;
  476           
  477           int index = d.indexOfThrowable(type, fromIndex);
  478           assertEquals("index of throwable " + (type == null ? "null" : type.getName()), expectedIndex, index);
  479           if(expectedIndex > -1)
  480           {
  481               t = d.getThrowable(index);
  482               if(expectedMsg != null)
  483               {
  484                   String msg = null;
  485                   if(Nestable.class.isInstance(t))
  486                   {
  487                       msg = ((Nestable) t).getMessage(0);
  488                   }
  489                   else
  490                   {
  491                       msg = t.getMessage();
  492                   }
  493                   assertEquals("message of indexed throwable", expectedMsg, msg);
  494               }
  495           }
  496       }
  497       
  498       public void testNestableDelegetePrintStackTrace()
  499       {
  500           int lineSepLen = lineSeparator.length();
  501           int partialStackTraceLen = PARTIAL_STACK_TRACE.length();
  502           Nestable ne3 = new ThrowableNestedNestable(new Exception("nested exception 3"));
  503           NestableDelegate nd3 = new NestableDelegate(ne3);
  504   
  505           ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
  506           PrintStream ps1 = new PrintStream(baos1);
  507           nd3.printStackTrace(ps1);
  508           String stack1 = baos1.toString();
  509           assertTrue("stack trace startsWith", stack1.startsWith(PARTIAL_STACK_TRACE));
  510   
  511           Nestable n = new NestableDelegateTester1("level 1", 
  512                   new NestableDelegateTester2("level 2", 
  513                       new NestableDelegateTester1(
  514                           new NestableDelegateTester2("level 4", 
  515                               new Exception("level 5")
  516                           )
  517                       )
  518                   )
  519               );
  520           NestableDelegate d = new NestableDelegate(n);
  521           
  522           // Only testing the flags for jdk1.3 and below
  523           if (!ExceptionUtils.isThrowableNested()) {
  524               NestableDelegate.topDown = true; NestableDelegate.trimStackFrames = true;
  525               checkStackTrace(d, true, true, NestableDelegateTester1.class.getName()+": level 1", 24);
  526               NestableDelegate.topDown = true; NestableDelegate.trimStackFrames = false;
  527               checkStackTrace(d, true, false, NestableDelegateTester1.class.getName()+": level 1", 80);
  528               NestableDelegate.topDown = false; NestableDelegate.trimStackFrames = true;
  529               checkStackTrace(d, false, true, "java.lang.Exception: level 5", 24);
  530               NestableDelegate.topDown = false; NestableDelegate.trimStackFrames = false;
  531               checkStackTrace(d, false, false, "java.lang.Exception: level 5", 80);
  532               NestableDelegate.topDown = true; NestableDelegate.trimStackFrames = true;
  533           }
  534       }
  535       private void checkStackTrace(NestableDelegate d, boolean topDown, boolean trimStackFrames,
  536               String startsWith, int expCount) {
  537           ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
  538           PrintStream ps1 = new PrintStream(baos1);
  539           d.printStackTrace(ps1);
  540           String stack1 = baos1.toString();
  541           int actCount = countLines(stack1);
  542           assertTrue("topDown: "+topDown+", trimStackFrames: "+trimStackFrames+" startsWith",
  543               stack1.startsWith(startsWith));
  544           // test is unreliable, as count varies depending on JUnit version/where main method is
  545   //        assertEquals("topDown: "+topDown+", trimStackFrames: "+trimStackFrames+" lineCount",
  546   //            expCount, actCount);
  547       }
  548       private int countLines(String s) {
  549           if (s == null) return 0;
  550           
  551           int i = 0, ndx = -1;
  552           while ((ndx = s.indexOf("\n", ndx+1)) != -1) {
  553               i++;
  554           }
  555           return i;
  556       }
  557       
  558       public static void main(String args[])
  559       {
  560           TestRunner.run(suite());
  561       }
  562   }
  563   
  564   /**
  565    * Nestable and Throwable class which can be passed to the NestableDelegate
  566    * constructor. Used for testing various methods which iterate through the
  567    * nested causes.
  568    */
  569   class NestableDelegateTester1 extends Exception implements Nestable
  570   {
  571       private Throwable cause = null;
  572   
  573       public NestableDelegateTester1()
  574       {
  575           super();
  576       }
  577   
  578       public NestableDelegateTester1(String reason, Throwable cause)
  579       {
  580           super(reason);
  581           this.cause = cause;
  582       }
  583       
  584       public NestableDelegateTester1(String reason)
  585       {
  586           super(reason);
  587       }
  588       
  589       public NestableDelegateTester1(Throwable cause)
  590       {
  591           super();
  592           this.cause = cause;
  593       }
  594       
  595       /**
  596        * @see Nestable#getThrowables()
  597        * Returns zero-length <code>Throwable</code> array for this test.
  598        */
  599       public Throwable[] getThrowables()
  600       {
  601           return new Throwable[0];
  602       }
  603       
  604       /**
  605        * @see Nestable#getMessages()
  606        * Returns zero-length String array for this test.
  607        */
  608       public String[] getMessages()
  609       {
  610           return new String[0];
  611       }
  612       
  613       /**
  614        * @see Nestable#indexOfThrowable(Class)
  615        * Returns -1 for this test.
  616        */
  617       public int indexOfThrowable(Class type)
  618       {
  619           return -1;
  620       }
  621       
  622       /**
  623        * @see Nestable#getThrowable(int)
  624        * Returns <code>null</code> for this test.
  625        */
  626       public Throwable getThrowable(int index)
  627       {
  628           return null;
  629       }
  630       
  631       /**
  632        * @see Nestable#getThrowableCount()
  633        * Returns 1 for this test.
  634        */
  635       public int getThrowableCount()
  636       {
  637           return 1;
  638       }
  639       
  640       /**
  641        * @see Nestable#getCause()
  642        */
  643       public Throwable getCause()
  644       {
  645           return cause;
  646       }
  647       
  648       /**
  649        * Empty method to satisfy the implemented interface. Does nothing
  650        * in this test.
  651        *
  652        * @param out The writer to use.
  653        */
  654       public void printPartialStackTrace(PrintWriter out)
  655       {
  656           super.printStackTrace(out);
  657       }
  658       
  659       /**
  660        * @see Nestable#getMessage(int)
  661        */
  662       public String getMessage(int index)
  663       {
  664           if(index == 0)
  665           {
  666               return super.getMessage();
  667           }
  668           else
  669           {
  670               return "";
  671           }
  672       }
  673       
  674       /**
  675        * @see Nestable#indexOfThrowable(Class, int)
  676        * Returns -1 for this test.
  677        */
  678       public int indexOfThrowable(Class type, int fromIndex)
  679       {
  680           return -1;
  681       }
  682       
  683   }
  684   
  685   /**
  686    * Nestable and Throwable class which can be passed to the NestableDelegate
  687    * constructor. Used for testing various methods which iterate through the
  688    * nested causes.
  689    */
  690   class NestableDelegateTester2 extends Throwable implements Nestable
  691   {
  692       private Throwable cause = null;
  693   
  694       public NestableDelegateTester2()
  695       {
  696           super();
  697       }
  698       
  699       public NestableDelegateTester2(String reason, Throwable cause)
  700       {
  701           super(reason);
  702           this.cause = cause;
  703       }
  704       
  705       public NestableDelegateTester2(String reason)
  706       {
  707           super(reason);
  708       }
  709       
  710       public NestableDelegateTester2(Throwable cause)
  711       {
  712           super();
  713           this.cause = cause;
  714       }
  715       
  716       /**
  717        * @see Nestable#getThrowables()
  718        * Returns zero-length <code>Throwable</code> array for this test.
  719        */
  720       public Throwable[] getThrowables()
  721       {
  722           return new Throwable[0];
  723       }
  724       
  725       /**
  726        * @see Nestable#getMessages()
  727        * Returns zero-length String array for this test.
  728        */
  729       public String[] getMessages()
  730       {
  731           return new String[0];
  732       }
  733       
  734       /**
  735        * @see Nestable#indexOfThrowable(Class)
  736        * Returns -1 for this test.
  737        */
  738       public int indexOfThrowable(Class type)
  739       {
  740           return -1;
  741       }
  742       
  743       /**
  744        * @see Nestable#getThrowable(int)
  745        * Returns <code>null</code> for this test.
  746        */
  747       public Throwable getThrowable(int index)
  748       {
  749           return null;
  750       }
  751       
  752       /**
  753        * @see Nestable#getThrowableCount()
  754        * Returns 1 for this test.
  755        *
  756        * @return 1
  757        */
  758       public int getThrowableCount()
  759       {
  760           return 1;
  761       }
  762       
  763       /**
  764        * @see Nestable#getCause()
  765        */
  766       public Throwable getCause()
  767       {
  768           return cause;
  769       }
  770       
  771       /**
  772        * Empty method to satisfy the implemented interface. Does nothing
  773        * in this test.
  774        *
  775        * @param out The writer to use.
  776        */
  777       public void printPartialStackTrace(PrintWriter out)
  778       {
  779           super.printStackTrace(out);
  780       }
  781       
  782       /**
  783        * @see Nestable#getMessage(int)
  784        */
  785       public String getMessage(int index)
  786       {
  787           if(index == 0)
  788           {
  789               return super.getMessage();
  790           }
  791           else
  792           {
  793               return "";
  794           }
  795       }
  796       
  797       /**
  798        * @see Nestable#indexOfThrowable(Class, int)     
  799        * Returns -1 for this test.
  800        */
  801       public int indexOfThrowable(Class type, int fromIndex)
  802       {
  803           return -1;
  804       }
  805       
  806   }
  807   
  808   /**
  809    * Used to test that the constructor passes when passed a throwable cause
  810    * And, the NestableDelegate.getMessage() returns the message from underlying 
  811    * nestable (which also has to be a Throwable).
  812    */
  813   class ThrowableNestable extends Throwable implements Nestable
  814   {
  815       private Throwable cause = new Exception("ThrowableNestable cause");
  816   
  817       /**
  818        * @see Nestable#getThrowableCount()
  819        * Returns 1 for this test.
  820        */
  821       public int getThrowableCount()
  822       {
  823           return 1;
  824       }
  825       
  826       /**
  827        * @see Nestable#getMessage()
  828        * Returns the hard-coded string "ThrowableNestable exception" for this
  829        * test.
  830        */
  831       public String getMessage()
  832       {
  833           return "ThrowableNestable exception";
  834       }
  835   
  836       /**
  837        * @see Nestable#getMessage(int)
  838        * Returns the hard-coded string "ThrowableNestable exception" for this
  839        * test.
  840        */
  841       public String getMessage(int index)
  842       {
  843           return getMessage();
  844       }
  845   
  846       /**
  847        * @see Nestable#getMessages()
  848        * Returns single-element string array with "ThrowableNestable exception".
  849        */
  850       public String[] getMessages()
  851       {
  852           String msgs[] = new String[1];
  853           msgs[0] = getMessage();
  854           return msgs;
  855       }
  856       
  857       /**
  858        * @see Nestable#getCause()
  859        */
  860       public Throwable getCause()
  861       {
  862           return cause;
  863       }
  864   
  865       /**
  866        * @see Nestable#printStackTrace(PrintWriter)
  867        * Empty method to satisfy the implemented interface. Does nothing
  868        * in this test.
  869        */
  870       public void printStackTrace(PrintWriter out)
  871       {
  872       }
  873       
  874       /**
  875        * @see Nestable#printPartialStackTrace(PrintWriter)
  876        * Empty method to satisfy the implemented interface. Does nothing
  877        * in this test.
  878        */
  879       public void printPartialStackTrace(PrintWriter out)
  880       {
  881       }
  882       
  883       /**
  884        * @see Nestable#getThrowable(int)
  885        */
  886       public Throwable getThrowable(int index)
  887       {
  888           return cause;
  889       }
  890       
  891       /**
  892        * @see Nestable#getThrowables()
  893        */
  894       public Throwable[] getThrowables()
  895       {
  896           Throwable throwables[] = new Throwable[1];
  897           throwables[0] = cause;
  898           return throwables;
  899       }
  900       
  901       /**
  902        * @see Nestable#indexOfThrowable(Class)
  903        */
  904       public int indexOfThrowable(Class type)
  905       {
  906           if(Exception.class.isInstance(type))
  907           {
  908               return 0;
  909           }
  910           return -1;
  911       }
  912       
  913       /**
  914        * @see Nestable#indexOfThrowable(Class,int)
  915        */
  916       public int indexOfThrowable(Class type, int fromIndex)
  917       {
  918           return indexOfThrowable(type);
  919       }
  920       
  921   }
  922   
  923   /**
  924    * Nestable and Throwable class which takes in a 'cause' object.
  925    * Returns a message wrapping the 'cause' message
  926    * Prints a fixed stack trace and partial stack trace.
  927    */
  928   class ThrowableNestedNestable extends Throwable implements Nestable
  929   {
  930       private Throwable cause = null;
  931       
  932       public ThrowableNestedNestable(Throwable cause)
  933       {
  934           this.cause = cause;
  935       }
  936       
  937       /**
  938        * @see Nestable#getThrowableCount()
  939        * Returns 1 for this test.
  940        */
  941       public int getThrowableCount()
  942       {
  943           return 1;
  944       }
  945       
  946       /**
  947        * @see Nestable#getMessage()
  948        * For this test, returns "ThrowableNestable exception (" appended to the
  949        * message of the cause specified in the constructor.
  950        */
  951       public String getMessage()
  952       {
  953           return "ThrowableNestedNestable exception (" + cause.getMessage() + ")";
  954       }
  955   
  956       /**
  957        * @see Nestable#getMessage(int)
  958        * For this test, returns "ThrowableNestable exception (" appended to the
  959        * message of the cause specified in the constructor.
  960        */
  961       public String getMessage(int index)
  962       {
  963           return "ThrowableNestedNestable exception (" + cause.getMessage() + ")";
  964       }
  965       
  966       /**
  967        * @see Nestable#getMessages()
  968        * For this test, returns a single-element string array containing
  969        * "ThrowableNestable exception (" appended to the
  970        * message of the cause specified in the constructor.
  971        */
  972       public String[] getMessages()
  973       {
  974           String[] msgs = new String[1];
  975           msgs[0] = "ThrowableNestedNestable exception (" + cause.getMessage() + ")";
  976           return msgs;
  977       }
  978       
  979       /**
  980        * @see Nestable#getCause()
  981        */
  982       public Throwable getCause()
  983       {
  984           return cause;
  985       }
  986       
  987       /**
  988        * @see Nestable#printStackTrace(PrintWriter)
  989        * For this test, writes the string
  990        * "ThrowableNestedNestable stack trace place-holder" to the print writer.
  991        */
  992       public void printStackTrace(PrintWriter out)
  993       {
  994           out.println("ThrowableNestedNestable stack trace place-holder");
  995       }
  996       
  997       /**
  998        * @see Nestable#printPartialStackTrace(PrintWriter)
  999        * For this test, writes the string
 1000        * "ThrowableNestedNestable partial stack trace place-holder" to the print
 1001        * writer.
 1002        */
 1003       public void printPartialStackTrace(PrintWriter out)
 1004       {
 1005           out.println("ThrowableNestedNestable partial stack trace place-holder");
 1006       }
 1007       
 1008       /**
 1009        * @see Nestable#getThrowable(int)
 1010        */
 1011       public Throwable getThrowable(int index)
 1012       {
 1013           return cause;
 1014       }
 1015       
 1016       /**
 1017        * @see Nestable#getThrowableS()
 1018        */
 1019       public Throwable[] getThrowables()
 1020       {
 1021           Throwable throwables[] = new Throwable[1];
 1022           throwables[0] = cause;
 1023           return throwables;
 1024       }
 1025       
 1026       /**
 1027        * @see Nestable#indexOfThrowable(Class)
 1028        */
 1029       public int indexOfThrowable(Class type)
 1030       {
 1031           if(Exception.class.isInstance(type))
 1032           {
 1033               return 0;
 1034           }
 1035           return -1;
 1036       }
 1037       
 1038       /**
 1039        * @see Nestable#indexOfThrowable(Class, int)
 1040        */
 1041       public int indexOfThrowable(Class type, int fromIndex)
 1042       {
 1043           return indexOfThrowable(type);
 1044       }
 1045       
 1046   }
 1047   
 1048   /**
 1049    * Used to test that the constructor fails when passed a non-throwable cause
 1050    */
 1051   class NonThrowableNestable implements Nestable
 1052   {
 1053       /**
 1054        * @see Nestable#getThrowableCount()
 1055        * Returns 1 for this test.
 1056        */
 1057       public int getThrowableCount()
 1058       {
 1059           return 1;
 1060       }
 1061       
 1062       /**
 1063        * @see Nestable#getMessage()
 1064        * Returns the string "non-throwable" for this test.
 1065        */
 1066       public String getMessage()
 1067       {
 1068           return "non-throwable";
 1069       }
 1070   
 1071       /**
 1072        * @see Nestable#getMessage(int)
 1073        * Returns the string "non-throwable" for this test.
 1074        */
 1075       public String getMessage(int index)
 1076       {
 1077           return "non-throwable";
 1078       }
 1079       
 1080       /**
 1081        * @see Nestable#getMessage()
 1082        * Returns a single-element array containing the string "non-throwable" for
 1083        * this test.
 1084        */
 1085       public String[] getMessages()
 1086       {
 1087           String[] msgs = new String[1];
 1088           msgs[0] = "non-throwable";
 1089           return msgs;
 1090       }
 1091       
 1092       /**
 1093        * @see Nestable#getCause()
 1094        * Returns <code>null</code> for this test.
 1095        */
 1096       public Throwable getCause()
 1097       {
 1098           return null;
 1099       }
 1100       
 1101       /**
 1102        * @see Nestable#printStackTrace(PrintWriter)
 1103        * Empty method to satisfy the implemented interface. Does nothing
 1104        * in this test.
 1105        */
 1106       public void printStackTrace(PrintWriter out)
 1107       {
 1108       }
 1109       
 1110       /**
 1111        * @see Nestable#printStackTrace(PrintStream)
 1112        * Empty method to satisfy the implemented interface. Does nothing
 1113        * in this test.
 1114        */
 1115       public void printStackTrace(PrintStream out)
 1116       {
 1117       }
 1118       
 1119       /**
 1120        * @see Nestable#printPartialStackTrace(PrintWriter)
 1121        * Empty method to satisfy the implemented interface. Does nothing
 1122        * in this test.
 1123        */
 1124       public void printPartialStackTrace(PrintWriter out)
 1125       {
 1126       }
 1127       
 1128   
 1129       /**
 1130        * @see Nestable#getThrowable(int)
 1131        * Returns <code>null</code> for this test.
 1132        */
 1133       public Throwable getThrowable(int index)
 1134       {
 1135           return null;
 1136       }
 1137       
 1138       /**
 1139        * @see Nestable#getThrowables()
 1140        * Returns zero-length <code>Throwable</code> array.
 1141        */
 1142       public Throwable[] getThrowables()
 1143       {
 1144           return new Throwable[0];
 1145       }
 1146       
 1147       /**
 1148        * @see Nestable#indexOfThrowable(Class)
 1149        * Returns -1 for this test.
 1150        */
 1151       public int indexOfThrowable(Class type)
 1152       {
 1153           return -1;
 1154       }
 1155       
 1156       /**
 1157        * @see Nestable#indexOfThrowable(Class, int)
 1158        * Returns -1 for this test.
 1159        */
 1160       public int indexOfThrowable(Class type, int fromIndex)
 1161       {
 1162           return -1;
 1163       }
 1164       
 1165   }

Save This Page
Home » commons-lang-2.4-src » org.apache.commons » lang » exception » [javadoc | source]