KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jruby > NativeException


1 /***** BEGIN LICENSE BLOCK *****
2  * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Common Public
5  * License Version 1.0 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.eclipse.org/legal/cpl-v10.html
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * Copyright (C) 2005 David Corbin <dcorbin@users.sourceforge.net>
15  *
16  * Alternatively, the contents of this file may be used under the terms of
17  * either of the GNU General Public License Version 2 or later (the "GPL"),
18  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
19  * in which case the provisions of the GPL or the LGPL are applicable instead
20  * of those above. If you wish to allow use of your version of this file only
21  * under the terms of either the GPL or the LGPL, and not to allow others to
22  * use your version of this file under the terms of the CPL, indicate your
23  * decision by deleting the provisions above and replace them with the notice
24  * and other provisions required by the GPL or the LGPL. If you do not delete
25  * the provisions above, a recipient may use your version of this file under
26  * the terms of any one of the CPL, the GPL or the LGPL.
27  ***** END LICENSE BLOCK *****/

28 package org.jruby;
29
30 import java.io.PrintStream JavaDoc;
31
32 import org.jruby.javasupport.JavaObject;
33 import org.jruby.runtime.Block;
34 import org.jruby.runtime.CallbackFactory;
35 import org.jruby.runtime.ObjectAllocator;
36 import org.jruby.runtime.builtin.IRubyObject;
37
38
39 public class NativeException extends RubyException {
40
41     private final Throwable JavaDoc cause;
42     public static final String JavaDoc CLASS_NAME = "NativeException";
43     private final Ruby runtime;
44
45     public NativeException(Ruby runtime, RubyClass rubyClass, Throwable JavaDoc cause) {
46         super(runtime, rubyClass, cause.getClass().getName()+": "+cause.getMessage());
47         this.runtime = runtime;
48         this.cause = cause;
49     }
50     
51     public static RubyClass createClass(Ruby runtime, RubyClass baseClass) {
52         // FIXME: If NativeException is expected to be used from Ruby code, it should provide
53
// a real allocator to be used. Otherwise Class.new will fail, as will marshalling. JRUBY-415
54
RubyClass exceptionClass = runtime.defineClass(CLASS_NAME, baseClass, ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR);
55         
56         CallbackFactory callbackFactory = runtime.callbackFactory(NativeException.class);
57         exceptionClass.defineMethod("cause",
58                 callbackFactory.getMethod("cause"));
59
60         return exceptionClass;
61     }
62     
63     public IRubyObject cause(Block unusedBlock) {
64         return getRuntime().getModule("JavaUtilities").callMethod(getRuntime().getCurrentContext(),
65             "wrap",
66             JavaObject.wrap(getRuntime(), cause));
67     }
68     
69     public IRubyObject backtrace() {
70         IRubyObject rubyTrace = super.backtrace();
71         if (rubyTrace.isNil())
72             return rubyTrace;
73         RubyArray array = (RubyArray) rubyTrace;
74         StackTraceElement JavaDoc[] stackTrace = cause.getStackTrace();
75         for (int i=stackTrace.length-1; i>=0; i--) {
76             StackTraceElement JavaDoc element = stackTrace[i];
77             String JavaDoc line = element.getFileName() + ":" + element.getLineNumber() + ":in `" + element.getClassName() + "." + element.getMethodName() + "'";
78             RubyString string = runtime.newString(line);
79             array.unshift(string);
80         }
81         return rubyTrace;
82     }
83     
84     public void printBacktrace(PrintStream JavaDoc errorStream) {
85         super.printBacktrace(errorStream);
86         errorStream.println("Complete Java stackTrace");
87         cause.printStackTrace(errorStream);
88     }
89 }
90
Popular Tags