001 package com.croftsoft.core.lang; 002 003 /********************************************************************* 004 * Indicates an Exception while accessing an external resource. 005 * 006 * <p> 007 * Useful for propagating an SQLException or RemoteException through 008 * a Data Access Object (DAO) interface. Define the data accessor 009 * interface methods so that they throw ExternalAccessException instead 010 * of SQLException, RemoteException, IOException, or any other 011 * Exception indicating external access failure. Since the calling 012 * application no longer needs to be hard-coded to handle an Exception 013 * subclass specific to the data access mechanism, the mechanism can be 014 * easily replaced, at run-time if desired, simply by instantiating a 015 * different concrete implementation of the data accessor interface. 016 * </p> 017 * 018 * <p> 019 * The original Exception is passed into the ExternalAccessException as 020 * a constructor argument. The Exception stack trace is stored as a 021 * String within the ExternalAccessException in order to facilitate 022 * serialization and persistence without the need to transport class 023 * files. 024 * </p> 025 * 026 * @see 027 * <a href="http://developer.java.sun.com/developer/restricted/patterns/DataAccessObject.html"> 028 * Sun Java Center J2EE Patterns: Data Access Object</a> 029 * 030 * @see 031 * <a href="http://www.sun.com/tech/techrep/1994/abstract-29.html"> 032 * "A Note on Distributed Computing"</a> 033 * 034 * @version 035 * 2001-06-21 036 * @since 037 * 2001-02-28 038 * @author 039 * <a target="_blank" href="https://www.croftsoft.com/">David W. Croft</a> 040 *********************************************************************/ 041 042 public final class ExternalAccessException 043 extends Exception 044 ////////////////////////////////////////////////////////////////////// 045 ////////////////////////////////////////////////////////////////////// 046 { 047 048 private static final long serialVersionUID = 1L; 049 050 private String rootExceptionStackTrace; 051 052 ////////////////////////////////////////////////////////////////////// 053 // constructor methods 054 ////////////////////////////////////////////////////////////////////// 055 056 public ExternalAccessException ( 057 String message, 058 Exception rootException ) 059 ////////////////////////////////////////////////////////////////////// 060 { 061 super ( message ); 062 063 if ( rootException != null ) 064 { 065 this.rootExceptionStackTrace 066 = ThrowableLib.getStackTrace ( rootException ); 067 } 068 else 069 { 070 this.rootExceptionStackTrace = null; 071 } 072 } 073 074 public ExternalAccessException ( Exception rootException ) 075 ////////////////////////////////////////////////////////////////////// 076 { 077 this ( 078 rootException != null ? rootException.getMessage ( ) : null, 079 rootException ); 080 } 081 082 public ExternalAccessException ( String message ) 083 ////////////////////////////////////////////////////////////////////// 084 { 085 this ( message, null ); 086 } 087 088 public ExternalAccessException ( ) 089 ////////////////////////////////////////////////////////////////////// 090 { 091 this ( null, null ); 092 } 093 094 ////////////////////////////////////////////////////////////////////// 095 ////////////////////////////////////////////////////////////////////// 096 097 public String getRootExceptionStackTrace ( ) 098 ////////////////////////////////////////////////////////////////////// 099 { 100 return rootExceptionStackTrace; 101 } 102 103 ////////////////////////////////////////////////////////////////////// 104 ////////////////////////////////////////////////////////////////////// 105 }