sventon subversion web client - http://www.sventon.org
[show recent changes]
 
  Help
Rev: HEAD (53458) - http://anonsvn.icesoft.org/repo / bridge-support / patches / bridge-support-sf-12692 / src / main / javascript / exception.js
Show File - exception.js  [show properties]
spinner
/*
 * Copyright 2004-2013 ICEsoft Technologies Canada Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
10   * Unless required by applicable law or agreed to in writing,
11   * software distributed under the License is distributed on an "AS
12   * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13   * express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16 
17  /**
18   * Created by IntelliJ IDEA.
19   * User: mircea
20   * Date: Dec 14, 2010
21   * Time: 2:43:07 PM
22   * To change this template use File | Settings | File Templates.
23   */
24  var callStack = operator();
25  var exceptionMessage = operator();
26  var originalException = operator();
27  var Exception;
28 
29  (function() {
30      var functionDefinitionPattern = /function\s*([\w\-$]+)?\s*\(/i;
31      var anonymous = '\u03BB';
32 
33      function argumentAsString(arg) {
34          var result;
35          if (arg === undefined) {
36              result = 'undefined';
37          } else if (arg === null) {
38              result = 'null';
39          } else if (typeof arg == 'number') {
40              result = arg;
41          } else if (arg.constructor) {
42              if (arg.constructor === Array) {
43                  if (arg.length < 3) {
44                      result = '[' + asString(arg) + ']';
45                  } else {
46                      result = '[' + argumentAsString(arg[0]) + '...' + argumentAsString(arg[arg.length - 1]) + ']';
47                  }
48              } else if (arg.constructor === Object) {
49                  result = '[object]';
50              } else if (arg.constructor === Function) {
51                  var functionDefinition = arg.toString();
52                  result = '[' + substring(functionDefinition, 0, indexOf(functionDefinition, ')') + 1) + ']';
53              } else if (arg.constructor === String) {
54                  result = '\'' + arg + '\'';
55              } else {
56                  result = asString(arg);
57              }
58          } else {
59              result = asString(arg);
60          }
61 
62          return result;
63      }
64 
65      function captureCallStack(caller) {
66          var stack = [];
67          var maxStackSize = 10;
68          while (caller && stack.length < maxStackSize) {
69              var functionDefinition = caller.toString();
70              var functionName = functionDefinitionPattern.test(functionDefinition) ? RegExp.$1 || anonymous : anonymous;
71              var argumentNames = collect(split(substring(functionDefinition, indexOf(functionDefinition, '(') + 1, indexOf(functionDefinition, ')')), ','), trim);
72              var argumentValues = caller.arguments;
73              var nameValueArguments = [];
74              each(argumentNames, function(name, index) {
75                  var andValue = argumentValues.length <= index ? '' : (': ' + argumentAsString(argumentValues[index]));
76                  append(nameValueArguments, name + andValue);
77              });
78              stack[stack.length] = functionName + '(' + join(nameValueArguments, ', ') + ')';
79              caller = caller.caller;
80          }
81          if (caller) {
82              append(stack, '.......');
83          }
84 
85          return stack;
86      }
87 
88      Exception = function(message, originalException) {
89          var stack = captureCallStack(arguments.callee.caller);
90 
91          return object(function(method) {
92              method(callStack, function(self) {
93                  return stack;
94              });
95 
96              method(originalException, function(self) {
97                  return originalException;
98              });
99 
100              method(exceptionMessage, function(self) {
101                  return message;
102              });
103 
104              method(asString, function(self) {
105                  return join(concatenate(['exception <' + message + '>', ''], stack), '\n');
106              });
107          });
108      }
109  })();


feed icon

sventon 2.5.1