hydroponics 0.3.3 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog.markdown +6 -0
- data/VERSION +1 -1
- data/app/views/dupe.erb +49 -0
- data/app/views/foreign_dupe.erb +59 -0
- data/app/views/single/index.erb +31 -0
- data/config/hydro_app.rb +2 -1
- data/hydroponics.gemspec +11 -4
- data/spec/hydro_app_spec.rb +1 -1
- data/static/dupe.css +57 -0
- data/static/dupe.js +4 -5
- data/static/vendor/esapi4js/esapi-compressed.js +11 -0
- data/static/vendor/esapi4js/lib/log4js-lib.js +1 -0
- data/static/vendor/esapi4js/lib/log4js.js +2501 -0
- data/static/vendor/esapi4js/resources/Base.esapi.properties.js +68 -0
- data/static/vendor/esapi4js/resources/i18n/ESAPI_Standard_en_US.properties.js +50 -0
- metadata +13 -6
- data/app/views/dupe/index.erb +0 -99
- data/app/views/foreign_dupe/index.erb +0 -111
data/ChangeLog.markdown
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# Hydroponics 0.3.4
|
2
|
+
|
3
|
+
* Refactored templates into partials with a common layout in views/single
|
4
|
+
* now using ESAPI JavaScript XSS library
|
5
|
+
* Added ability to manually enter new row count in Dupe and ForeignDupe
|
6
|
+
|
1
7
|
# hydroponics 0.3.3
|
2
8
|
|
3
9
|
* Generalized the routes, so new actions can be added without changing them
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.4
|
data/app/views/dupe.erb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
$(function(){
|
3
|
+
$("#slider div").slider({
|
4
|
+
slide: function(event, ui) {
|
5
|
+
$("#sliderct").val(ui.value);
|
6
|
+
},
|
7
|
+
change: function(event, ui) {
|
8
|
+
$("button").button("enable");
|
9
|
+
},
|
10
|
+
max: 25000,
|
11
|
+
value: j("<%= db[@table].count %>")
|
12
|
+
});
|
13
|
+
|
14
|
+
$("#sliderct").val(j("<%= db[@table].count %>"));
|
15
|
+
$("#sliderct").keyup(function() {
|
16
|
+
$("#slider div").slider("value", parseInt($("#sliderct").val()));
|
17
|
+
})
|
18
|
+
|
19
|
+
$("button").button();
|
20
|
+
$("button").button("enable");
|
21
|
+
$("button").click(function(){
|
22
|
+
$("#slider div").slider("disable");
|
23
|
+
$("button").button("disable");
|
24
|
+
$(".loader").show();
|
25
|
+
$.ajax({
|
26
|
+
type: "POST",
|
27
|
+
url: "/dupe/" + j("<%= @table %>"),
|
28
|
+
data: JSON.stringify({
|
29
|
+
count: parseInt($("#sliderct").val())
|
30
|
+
}),
|
31
|
+
success: function(data, status, xhr) {
|
32
|
+
$("#sliderct").val(j(data));
|
33
|
+
$("#slider div").slider("enable");
|
34
|
+
$(".loader").hide();
|
35
|
+
},
|
36
|
+
processData: false
|
37
|
+
});
|
38
|
+
});
|
39
|
+
});
|
40
|
+
</script>
|
41
|
+
<div class="dupecontainer">
|
42
|
+
<div class="dupe">
|
43
|
+
<h3>Dupe</h3>
|
44
|
+
<div id='slider'><div></div></div>
|
45
|
+
<div class="loader" style="display:none;"></div>
|
46
|
+
<div id='button'><button>Update</button></div>
|
47
|
+
<div class="count"><p><%= @table.to_s.gsub("_"," ") %>:</p> <input id='sliderct'></input></div>
|
48
|
+
</div>
|
49
|
+
</div>
|
@@ -0,0 +1,59 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
$(function(){
|
3
|
+
$("#slider div").slider({
|
4
|
+
slide: function(event, ui) {
|
5
|
+
$("#sliderct").val(ui.value);
|
6
|
+
},
|
7
|
+
change: function(event, ui) {
|
8
|
+
$("button").button("enable");
|
9
|
+
},
|
10
|
+
max: 25000,
|
11
|
+
value: j("<%= db[@table].count %>")
|
12
|
+
});
|
13
|
+
|
14
|
+
|
15
|
+
$("#sliderct").val(j("<%= db[@table].count %>"));
|
16
|
+
$("#sliderct").keyup(function() {
|
17
|
+
$("#slider div").slider("value", parseInt($("#sliderct").val()));
|
18
|
+
})
|
19
|
+
|
20
|
+
$("button").button();
|
21
|
+
$("button").button("enable");
|
22
|
+
$("button").click(function(){
|
23
|
+
$("#slider div").slider("disable");
|
24
|
+
$("button").button("disable");
|
25
|
+
$(".loader").show();
|
26
|
+
|
27
|
+
var postData = {
|
28
|
+
count: $("#slider div").slider("value"),
|
29
|
+
foreign_table: j("<%= params[:foreign_table] %>")
|
30
|
+
};
|
31
|
+
if($("#foreign_key").val() != "") {
|
32
|
+
postData.foreign_key = $("#foreign_key").val()
|
33
|
+
}
|
34
|
+
|
35
|
+
$.ajax({
|
36
|
+
type: "POST",
|
37
|
+
url: "/foreign_dupe/" + j("<%= @table %>"),
|
38
|
+
data: JSON.stringify(postData),
|
39
|
+
success: function(data, status, xhr) {
|
40
|
+
$("#sliderct").val(j(data));
|
41
|
+
$("#slider div").slider("enable");
|
42
|
+
$(".loader").hide();
|
43
|
+
},
|
44
|
+
processData: false
|
45
|
+
});
|
46
|
+
});
|
47
|
+
})
|
48
|
+
</script>
|
49
|
+
|
50
|
+
<div class="column dupecontainer span-10">
|
51
|
+
<div class="foreign-dupe">
|
52
|
+
<h3>Foreign Dupe</h3>
|
53
|
+
<div id='slider'><div></div></div>
|
54
|
+
<div class="loader" style="display:none;"></div>
|
55
|
+
<div id='button'><button>Update</button></div>
|
56
|
+
<input id='foreign_key'></input>
|
57
|
+
<div class="count"><p><%= @table.to_s.gsub("_"," ") %>:</p> <input id='sliderct'></input></div>
|
58
|
+
</div>
|
59
|
+
</div>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
4
|
+
|
5
|
+
<head>
|
6
|
+
<link href="../vendor/jquery-ui-1.8.5.custom/css/smoothness/jquery-ui-1.8.5.custom.css" media="screen" rel="stylesheet" type="text/css" />
|
7
|
+
|
8
|
+
<script type="text/javascript" src="../vendor/jquery-ui-1.8.5.custom/js/jquery-1.4.2.min.js"></script>
|
9
|
+
<script type="text/javascript" src="../vendor/jquery-ui-1.8.5.custom/js/jquery-ui-1.8.5.custom.min.js"></script>
|
10
|
+
|
11
|
+
<script type="text/javascript" src="../vendor/esapi4js/lib/log4js.js"></script>
|
12
|
+
<script type="text/javascript" src="../vendor/esapi4js/resources/i18n/ESAPI_Standard_en_US.properties.js"></script>
|
13
|
+
<script type="text/javascript" src="../vendor/esapi4js/esapi-compressed.js"></script>
|
14
|
+
<script type="text/javascript" src="../vendor/esapi4js/resources/Base.esapi.properties.js"></script>
|
15
|
+
<script type="text/javascript">
|
16
|
+
org.owasp.esapi.ESAPI.initialize();
|
17
|
+
var j = $ESAPI.encoder().encodeForJavaScript
|
18
|
+
</script>
|
19
|
+
|
20
|
+
<link href="../dupe.css" media="screen" rel="stylesheet" type="text/css" />
|
21
|
+
|
22
|
+
<title>Hydroponics <%= settings.version.split(".").collect(&:to_i).collect(&:to_s).join(".") %></title>
|
23
|
+
</head>
|
24
|
+
|
25
|
+
<body class="container">
|
26
|
+
<div class="header">
|
27
|
+
<h1>Hydroponics</h1>
|
28
|
+
</div>
|
29
|
+
<%= erb @action %>
|
30
|
+
</body>
|
31
|
+
</html>
|
data/config/hydro_app.rb
CHANGED
data/hydroponics.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{hydroponics}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tyler Boyd"]
|
12
|
-
s.date = %q{2010-11-
|
12
|
+
s.date = %q{2010-11-15}
|
13
13
|
s.default_executable = %q{hydro}
|
14
14
|
s.description = %q{A user interface to seed or destroy large quantities of data in a Rails app.}
|
15
15
|
s.email = %q{tboyd47@gmail.com}
|
@@ -29,8 +29,9 @@ Gem::Specification.new do |s|
|
|
29
29
|
"VERSION",
|
30
30
|
"app/actions/dupe.rb",
|
31
31
|
"app/actions/foreigndupe.rb",
|
32
|
-
"app/views/dupe
|
33
|
-
"app/views/foreign_dupe
|
32
|
+
"app/views/dupe.erb",
|
33
|
+
"app/views/foreign_dupe.erb",
|
34
|
+
"app/views/single/index.erb",
|
34
35
|
"bin/hydro",
|
35
36
|
"config/hydro_app.rb",
|
36
37
|
"hydroponics.gemspec",
|
@@ -42,9 +43,15 @@ Gem::Specification.new do |s|
|
|
42
43
|
"spec/spec.opts",
|
43
44
|
"spec/spec_helper.rb",
|
44
45
|
"static/ajax-loader.gif",
|
46
|
+
"static/dupe.css",
|
45
47
|
"static/dupe.js",
|
46
48
|
"static/test/dupe_test.js",
|
47
49
|
"static/test/index.html",
|
50
|
+
"static/vendor/esapi4js/esapi-compressed.js",
|
51
|
+
"static/vendor/esapi4js/lib/log4js-lib.js",
|
52
|
+
"static/vendor/esapi4js/lib/log4js.js",
|
53
|
+
"static/vendor/esapi4js/resources/Base.esapi.properties.js",
|
54
|
+
"static/vendor/esapi4js/resources/i18n/ESAPI_Standard_en_US.properties.js",
|
48
55
|
"static/vendor/jquery-ui-1.8.5.custom/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png",
|
49
56
|
"static/vendor/jquery-ui-1.8.5.custom/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png",
|
50
57
|
"static/vendor/jquery-ui-1.8.5.custom/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png",
|
data/spec/hydro_app_spec.rb
CHANGED
@@ -31,7 +31,7 @@ describe "HydroApp" do
|
|
31
31
|
|
32
32
|
it "should show the table's count" do
|
33
33
|
get '/dupe/users'
|
34
|
-
last_response.body.include?(
|
34
|
+
last_response.body.include?(@db[:users].count.to_s).should be_true
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
data/static/dupe.css
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
.container {width:950px;margin:0 auto;}
|
2
|
+
.dupe h3, .foreign-dupe h3 {
|
3
|
+
margin: 10px 5px 10px 18px;
|
4
|
+
color: #444;
|
5
|
+
float: left;
|
6
|
+
}
|
7
|
+
.dupe #slider {
|
8
|
+
float: left;
|
9
|
+
width: 352px;
|
10
|
+
margin: 16px 12px;
|
11
|
+
}
|
12
|
+
.foreign-dupe #slider {
|
13
|
+
float: left;
|
14
|
+
width: 252px;
|
15
|
+
margin: 16px 12px;
|
16
|
+
}
|
17
|
+
.dupecontainer {
|
18
|
+
height: 130px;
|
19
|
+
width: 501px;
|
20
|
+
}
|
21
|
+
.dupe, .foreign-dupe {
|
22
|
+
height: 106px;
|
23
|
+
width: 500px;
|
24
|
+
border: 1px #ddd solid;
|
25
|
+
}
|
26
|
+
#button {
|
27
|
+
float: right;
|
28
|
+
margin: 2px 12px;
|
29
|
+
}
|
30
|
+
#sliderct {
|
31
|
+
width: 50px;
|
32
|
+
float: left;
|
33
|
+
margin: 10px 5px;
|
34
|
+
}
|
35
|
+
h1, h3, p {
|
36
|
+
font-family: Verdana,Arial,sans-serif
|
37
|
+
}
|
38
|
+
p {
|
39
|
+
float: left;
|
40
|
+
font-size: 12px;
|
41
|
+
}
|
42
|
+
.count {
|
43
|
+
left: 18px;
|
44
|
+
position: relative;
|
45
|
+
top: 2px;
|
46
|
+
}
|
47
|
+
.loader {
|
48
|
+
background-image: url('../ajax-loader.gif');
|
49
|
+
width: 32px;
|
50
|
+
height: 16px;
|
51
|
+
margin-top: 16px;
|
52
|
+
float: left;
|
53
|
+
}
|
54
|
+
#foreign_key {
|
55
|
+
float: right;
|
56
|
+
margin-top: 12px;
|
57
|
+
}
|
data/static/dupe.js
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
};
|
1
|
+
function dupe() {
|
2
|
+
(function($){
|
3
|
+
})(jQuery);
|
4
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
var $namespace=function(d,g,b){var f=d.split(g||"."),h=b||window,e,a;for(e=0,a=f.length;e<a;e++){h=h[f[e]]=h[f[e]]||{}}return h};var $type=function(a,b){if(!a instanceof b){throw new SyntaxError()}};if(!$){var $=function(a){return document.getElementById(a)}}if(!Array.prototype.each){Array.prototype.each=function(a){if(typeof a!="function"){throw"Illegal Argument for Array.each"}for(var b=0;b<this.length;b++){a(this[b])}}}if(!Array.prototype.contains){Array.prototype.contains=function(b){var a=false;this.each(function(d){if((b.equals&&b.equals(d))||d==b){a=true;return}});return a}}if(!Array.prototype.containsKey){Array.prototype.containsKey=function(b){for(var a in this){if(a.toLowerCase()==b.toLowerCase()){return true}}return false}}if(!Array.prototype.getCaseInsensitive){Array.prototype.getCaseInsensitive=function(b){for(var a in this){if(a.toLowerCase()==b.toLowerCase()){return this[a]}}return null}}if(!String.prototype.charCodeAt){String.prototype.charCodeAt=function(a){var e=this.charAt(a);for(var b=0;b<65536;b++){var d=String.fromCharCode(b);if(d==e){return b}}return 0}}if(!String.prototype.endsWith){String.prototype.endsWith=function(a){return this.substr((this.length-a.length),a.length)==a}}if(!Exception){var Exception=function(a,b){this.cause=b;this.errorMessage=a};Exception.prototype=Error.prototype;Exception.prototype.getCause=function(){return this.cause};Exception.prototype.getMessage=function(){return this.message};Exception.prototype.getStackTrace=function(){if(this.callstack){return this.callstack}if(this.stack){var b=stack.split("\n");for(var d=0,a=b.length;d<a;d++){if(b[d].match(/^\s*[A-Za-z0-9\=+\$]+\(/)){this.callstack.push(b[d])}}this.callstack.shift();return this.callstack}else{if(window.opera&&this.message){var b=this.message.split("\n");for(var d=0,a=b.length;d<a;d++){if(b[d].match(/^\s*[A-Za-z0-9\=+\$]+\(/)){var f=b[d];if(b[d+1]){f+=" at "+b[d+1];d++}this.callstack.push(f)}}this.callstack.shift();return this.callstack}else{var g=arguments.callee.caller;while(g){var e=g.toString();var h=e.substring(e.indexOf("function")+8,e.indexOf("("))||"anonymous";this.callstack.push(h);g=g.caller}return this.callstack}}};Exception.prototype.printStackTrace=function(b){var a=this.getMessage()+"|||"+this.getStackTrace().join("|||");if(this.cause){if(this.cause.printStackTrace){a+="||||||Caused by "+this.cause.printStackTrace().replace("\n","|||")}}if(!b){return b.replace("|||","\n")}else{if(b.value){b.value=a.replace("|||","\n")}else{if(b.writeln){b.writeln(a.replace("|||","\n"))}else{if(b.innerHTML){b.innerHTML=a.replace("|||","<br/>")}else{if(b.innerText){b.innerText=a.replace("|||","<br/>")}else{if(b.append){b.append(a.replace("|||","\n"))}else{if(b instanceof Function){b(a.replace("|||","\n"))}}}}}}}}}if(!RuntimeException){var RuntimeException=Exception}if(!IllegalArgumentException){var IllegalArgumentException=Exception}if(!DateFormat){var DateFormat=function(d){var b=d;var a={longMonths:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longDays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],d:function(e){return(e.getDate()<10?"0":"")+e.getDate()},D:function(e){return a.shortDays[e.getDay()]},j:function(e){return e.getDate()},l:function(e){return a.longDays[e.getDay()]},N:function(e){return e.getDay()+1},S:function(e){return(e.getDate()%10==1&&e.getDate()!=11?"st":(e.getDate()%10==2&&e.getDate()!=12?"nd":(e.getDate()%10==3&&e.getDate()!=13?"rd":"th")))},w:function(e){return e.getDay()},z:function(e){return"Not Yet Supported"},W:function(e){return"Not Yet Supported"},F:function(e){return a.longMonths[e.getMonth()]},m:function(e){return(e.getMonth()<9?"0":"")+(e.getMonth()+1)},M:function(e){return a.shortMonths[e.getMonth()]},n:function(e){return e.getMonth()+1},t:function(e){return"Not Yet Supported"},L:function(e){return(((e.getFullYear()%4==0)&&(e.getFullYear()%100!=0))||(e.getFullYear()%400==0))?"1":"0"},o:function(e){return"Not Supported"},Y:function(e){return e.getFullYear()},y:function(e){return(""+e.getFullYear()).substr(2)},a:function(e){return e.getHours()<12?"am":"pm"},A:function(e){return e.getHours()<12?"AM":"PM"},B:function(e){return"Not Yet Supported"},g:function(e){return e.getHours()%12||12},G:function(e){return e.getHours()},h:function(e){return((e.getHours()%12||12)<10?"0":"")+(e.getHours()%12||12)},H:function(e){return(e.getHours()<10?"0":"")+e.getHours()},i:function(e){return(e.getMinutes()<10?"0":"")+e.getMinutes()},s:function(e){return(e.getSeconds()<10?"0":"")+e.getSeconds()},e:function(e){return"Not Yet Supported"},I:function(e){return"Not Supported"},O:function(e){return(-e.getTimezoneOffset()<0?"-":"+")+(Math.abs(e.getTimezoneOffset()/60)<10?"0":"")+(Math.abs(e.getTimezoneOffset()/60))+"00"},P:function(e){return(-e.getTimezoneOffset()<0?"-":"+")+(Math.abs(e.getTimezoneOffset()/60)<10?"0":"")+(Math.abs(e.getTimezoneOffset()/60))+":"+(Math.abs(e.getTimezoneOffset()%60)<10?"0":"")+(Math.abs(e.getTimezoneOffset()%60))
|
2
|
+
},T:function(g){var f=g.getMonth();g.setMonth(0);var e=g.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/,"$1");g.setMonth(f);return e},Z:function(e){return -e.getTimezoneOffset()*60},c:function(e){return e.format("Y-m-d")+"T"+e.format("H:i:sP")},r:function(e){return e.toString()},U:function(e){return e.getTime()/1000}};return{format:function(g){var e="";for(var f=0;f<b.length;f++){var h=b.charAt(f);if(a[h]){e+=a[h].call(g)}else{e+=h}}return e}}};DateFormat.getDateInstance=function(){return new DateFormat("M/d/y h:i a")}}$namespace("org.owasp.esapi");org.owasp.esapi.ESAPI=function(g){var b=g;if(!b){throw new RuntimeException("Configuration Error - Unable to load $ESAPI_Properties Object")}var a=null;var e=null;var d=null;var f=null;var h=null;return{properties:b,encoder:function(){if(!a){if(!b.encoder.Implementation){throw new RuntimeException("Configuration Error - $ESAPI.properties.encoder.Implementation object not found.")}a=new b.encoder.Implementation()}return a},logFactory:function(){if(!d){if(!b.logging.Implementation){throw new RuntimeException("Configuration Error - $ESAPI.properties.logging.Implementation object not found.")}d=new b.logging.Implementation()}return d},logger:function(i){return this.logFactory().getLogger(i)},locale:function(){return org.owasp.esapi.i18n.Locale.getLocale(b.localization.DefaultLocale)},resourceBundle:function(){if(!f){if(!b.localization.StandardResourceBundle){throw new RuntimeException("Configuration Error - $ESAPI.properties.localization.StandardResourceBundle not found.")}f=new org.owasp.esapi.i18n.ObjectResourceBundle(b.localization.StandardResourceBundle)}return f},validator:function(){if(!e){if(!b.validation.Implementation){throw new RuntimeException("Configuration Error - $ESAPI.properties.validation.Implementation object not found.")}e=new b.validation.Implementation()}return e},httpUtilities:function(){if(!h){h=new org.owasp.esapi.HTTPUtilities()}return h}}};var $ESAPI=null;org.owasp.esapi.ESAPI.initialize=function(){$ESAPI=new org.owasp.esapi.ESAPI(Base.esapi.properties)};$namespace("org.owasp.esapi");org.owasp.esapi.Encoder=function(){};$namespace("org.owasp.esapi");org.owasp.esapi.EncoderConstants={CHAR_LOWERS:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],CHAR_UPPERS:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],CHAR_DIGITS:["0","1","2","3","4","5","6","7","8","9"],CHAR_SPECIALS:["!","$","*","+","-",".","=","?","@","^","_","|","~"],CHAR_LETTERS:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],CHAR_ALNUM:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"]};$namespace("org.owasp.esapi");org.owasp.esapi.EnterpriseSecurityException=function(b,a,e){var f=a;var d=new Exception(b,e);return{getMessage:d.getMessage,getUserMessage:d.getMessage,getLogMessage:function(){return f},getStackTrace:d.getStackTrace,printStackTrace:d.printStackTrace}};$namespace("org.owasp.esapi");org.owasp.esapi.HTTPUtilities=function(){var b=$ESAPI.logger("HTTPUtilities");var d=$ESAPI.resourceBundle();var a=org.owasp.esapi.Logger.EventType;return{addCookie:function(h){$type(h,org.owasp.esapi.net.Cookie);if(window.top.location.protocol!="http:"||window.top.location.protocol!="https:"){throw new RuntimeException(d.getString("HTTPUtilities.Cookie.Protocol",{protocol:window.top.location.protocol}))}var f=h.getName(),m=h.getValue(),k=h.getMaxAge(),i=h.getDomain(),p=h.getPath(),e=h.getSecure();var n=new org.owasp.esapi.ValidationErrorList();var l=$ESAPI.validator().getValidInput("cookie name",f,"HttpCookieName",50,false,n);var g=$ESAPI.validator().getValidInput("cookie value",m,"HttpCookieValue",5000,false,n);if(n.size()==0){var j=f+"="+escape(m);j+=k?";expires="+(new Date((new Date()).getTime()+(1000*k)).toGMTString()):"";j+=p?";path="+p:"";j+=i?";domain="+i:"";j+=e||$ESAPI.properties.httputilities.cookies.ForceSecure?";secure":"";document.cookie=j}else{b.warning(a.SECURITY_FAILURE,d.getString("HTTPUtilities.Cookie.UnsafeData",{name:f,value:m}))}},getCookie:function(j){var f=document.cookie.split("; ");for(var h=0,e=f.length;h<e;h++){var g=f[h].split("=");if(g[0]==escape(j)){return new org.owasp.esapi.net.Cookie(j,g[1]?unescape(g[1]):"")}}return null},killAllCookies:function(){var f=document.cookie.split("; ");for(var j=0,e=f.length;j<e;j++){var h=f[j].split("=");var g=unescape(h[0]);if(!this.killCookie(g)){throw new RuntimeException(d.getString("HTTPUtilities.Cookie.CantKill",{name:g}))}}},killCookie:function(e){var f=this.getCookie(e);if(f){f.setMaxAge(-10);this.addCookie(f);if(this.getCookie(e)){throw new RuntimeException(d.getString("HTTPUtilities.Cookie.CantKill",{name:e}))
|
3
|
+
}return true}return false},getRequestParameter:function(f){var e=window.top.location.search.substring(1);var g=e.indexOf(f);if(g<0){return null}g=g+f.length;var h=e.indexOf("&",g);if(h<0){h=e.length}return unescape(e.substring(g,h))}}};$namespace("org.owasp.esapi");org.owasp.esapi.IntrusionException=function(d,b,a){var e=new org.owasp.esapi.EnterpriseSecurityException(d,b,a);return{getMessage:e.getMessage,getUserMessage:e.getMessage,getLogMessage:e.getLogMessage,getStackTrace:e.getStackTrace,printStackTrace:e.printStackTrace}};$namespace("org.owasp.esapi");org.owasp.esapi.LogFactory=function(){return{getLogger:false}};$namespace("org.owasp.esapi");org.owasp.esapi.Logger=function(){return{setLevel:false,fatal:false,error:false,isErrorEnabled:false,warning:false,isWarningEnabled:false,info:false,isInfoEnabled:false,debug:false,isDebugEnabled:false,trace:false,isTraceEnabled:false}};org.owasp.esapi.Logger.EventType=function(d,b){var a=d;var e=b;return{isSuccess:function(){return e},toString:function(){return a}}};with(org.owasp.esapi.Logger){EventType.SECURITY_SUCCESS=new EventType("SECURITY SUCCESS",true);EventType.SECURITY_FAILURE=new EventType("SECURITY FAILURE",false);EventType.EVENT_SUCCESS=new EventType("EVENT SUCCESS",true);EventType.EVENT_FAILURE=new EventType("EVENT FAILURE",false);OFF=Number.MAX_VALUE;FATAL=1000;ERROR=800;WARNING=600;INFO=400;DEBUG=200;TRACE=100;ALL=Number.MIN_VALUE}$namespace("org.owasp.esapi");org.owasp.esapi.PreparedString=function(d,a,g){var f=[];var e=[];function b(k){var h=0,l=0;for(var j=0;j<k.length;j++){if(k.charAt(j)==g){l++;f.push(k.substr(h,j));h=j+1}}f.push(k.substr(h));e=new Array(l)}if(!g){g="?"}b(d);return{set:function(h,j,i){if(h<1||h>e.length){throw new IllegalArgumentException("Attempt to set parameter: "+h+" on a PreparedString with only "+e.length+" placeholders")}if(!i){i=a}e[h-1]=i.encode([],j)},toString:function(){for(var h=0;h<e.length;h++){if(e[h]==null){throw new RuntimeException("Attempt to render PreparedString without setting parameter "+(h+1))}}var j="",k=0;for(var l=0;l<f.length;l++){j+=f[l];if(k<e.length){j+=e[k++]}}return j}}};$namespace("org.owasp.esapi");org.owasp.esapi.ValidationErrorList=function(){var a=Array();return{addError:function(b,d){if(b==null){throw new RuntimeException("Context cannot be null: "+d.getLogMessage(),d)}if(d==null){throw new RuntimeException("Context ("+b+") - Error cannot be null")}if(a[b]){throw new RuntimeException("Context ("+b+") already exists. must be unique.")}a[b]=d},errors:function(){return a},isEmpty:function(){return a.length==0},size:function(){return a.length}}};$namespace("org.owasp.esapi");org.owasp.esapi.ValidationRule=function(){return{getValid:false,setAllowNull:false,getTypeName:false,setTypeName:false,setEncoder:false,assertValid:false,getSafe:false,isValid:false,whitelist:false}};$namespace("org.owasp.esapi");org.owasp.esapi.Validator=function(){return{addRule:false,getRule:false,getValidInput:false,isValidDate:false,getValidDate:false,isValidSafeHTML:false,getValidSafeHTML:false,isValidCreditCard:false,getValidCreditCard:false,isValidFilename:false,getValidFilename:false,isValidNumber:false,getValidNumber:false,isValidPrintable:false,getValidPrintable:false}};$namespace("org.owasp.esapi.codecs.Base64");org.owasp.esapi.codecs.Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(h){if(!h){return null}var e="";var d,b,a,m,l,k,j;var f=0;var g=org.owasp.esapi.codecs.UTF8.encode(h);while(f<g.length){d=g.charCodeAt(f++);b=g.charCodeAt(f++);a=g.charCodeAt(f++);m=d>>2;l=((d&3)<<4)|(b>>4);k=((b&15)<<2)|(a>>6);j=a&63;if(isNaN(b)){k=j=64}else{if(isNaN(a)){j=64}}e+=this._keyStr.charAt(m)+this._keyStr.charAt(l)+this._keyStr.charAt(k)+this._keyStr.charAt(j)}return e},decode:function(h){if(!h){return null}var e="";var d,b,a,m,l,k,j;var f=0;var g=h.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<g.length){m=this._keyStr.indexOf(g.charAt(f++));l=this._keyStr.indexOf(g.charAt(f++));k=this._keyStr.indexOf(g.charAt(f++));j=this._keyStr.indexOf(g.charAt(f++));d=(m<<2)|(l>>4);b=((l&15)<<4)|(k>>2);a=((k&3)<<6)|j;e+=String.fromCharCode(d);if(k!=64){e+=String.fromCharCode(b)}if(j!=64){e+=String.fromCharCode(a)}}e=org.owasp.esapi.codecs.UTF8.decode(e);return e}};$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.CSSCodec=function(){var a=new org.owasp.esapi.codecs.Codec();return{encode:a.encode,decode:a.decode,encodeCharacter:function(b,e){if(b.contains(e)){return e}var d=org.owasp.esapi.codecs.Codec.getHexForNonAlphanumeric(e);if(d==null){return e}return"\\"+d+" "},decodeCharacter:function(l){l.mark();var h=l.next();if(h==null){l.reset();return null}if(h!="\\"){l.reset();return null}var d=l.next();if(d==null){l.reset();return null}if(l.isHexDigit(d)){var b=d;for(var f=0;f<6;f++){var k=l.next();if(k==null||k.charCodeAt(0)==32){break}if(l.isHexDigit(k)){b+=k}else{input.pushback(k);break}}try{var j=parseInt(b,16);return String.fromCharCode(j)}catch(g){l.reset();return null}}return d
|
4
|
+
}}};$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.Codec=function(){return{encode:function(d,e){var a="";for(var b=0;b<e.length;b++){var f=e.charAt(b);a+=this.encodeCharacter(d,f)}return a},encodeCharacter:function(a,b){return b},decode:function(b){var a="";var d=new org.owasp.esapi.codecs.PushbackString(b);while(d.hasNext()){var e=this.decodeCharacter(d);if(e!=null){a+=e}else{a+=d.next()}}return a},decodeCharacter:function(a){return a.next()}}};org.owasp.esapi.codecs.Codec.getHexForNonAlphanumeric=function(a){if(a.charCodeAt(0)<256){return org.owasp.esapi.codecs.Codec.hex[a.charCodeAt(0)]}return a.charCodeAt(0).toString(16)};org.owasp.esapi.codecs.Codec.hex=[];for(var c=0;c<255;c++){if(c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122){org.owasp.esapi.codecs.Codec.hex[c]=null}else{org.owasp.esapi.codecs.Codec.hex[c]=c.toString(16)}}var entityToCharacterMap=[];entityToCharacterMap["""]="34";entityToCharacterMap["&"]="38";entityToCharacterMap["<"]="60";entityToCharacterMap[">"]="62";entityToCharacterMap[" "]="160";entityToCharacterMap["¡"]="161";entityToCharacterMap["¢"]="162";entityToCharacterMap["£"]="163";entityToCharacterMap["¤"]="164";entityToCharacterMap["¥"]="165";entityToCharacterMap["¦"]="166";entityToCharacterMap["§"]="167";entityToCharacterMap["¨"]="168";entityToCharacterMap["©"]="169";entityToCharacterMap["ª"]="170";entityToCharacterMap["«"]="171";entityToCharacterMap["¬"]="172";entityToCharacterMap["­"]="173";entityToCharacterMap["®"]="174";entityToCharacterMap["¯"]="175";entityToCharacterMap["°"]="176";entityToCharacterMap["±"]="177";entityToCharacterMap["²"]="178";entityToCharacterMap["³"]="179";entityToCharacterMap["´"]="180";entityToCharacterMap["µ"]="181";entityToCharacterMap["¶"]="182";entityToCharacterMap["·"]="183";entityToCharacterMap["¸"]="184";entityToCharacterMap["¹"]="185";entityToCharacterMap["º"]="186";entityToCharacterMap["»"]="187";entityToCharacterMap["¼"]="188";entityToCharacterMap["½"]="189";entityToCharacterMap["¾"]="190";entityToCharacterMap["¿"]="191";entityToCharacterMap["À"]="192";entityToCharacterMap["Á"]="193";entityToCharacterMap["Â"]="194";entityToCharacterMap["Ã"]="195";entityToCharacterMap["Ä"]="196";entityToCharacterMap["Å"]="197";entityToCharacterMap["Æ"]="198";entityToCharacterMap["Ç"]="199";entityToCharacterMap["È"]="200";entityToCharacterMap["É"]="201";entityToCharacterMap["Ê"]="202";entityToCharacterMap["Ë"]="203";entityToCharacterMap["Ì"]="204";entityToCharacterMap["Í"]="205";entityToCharacterMap["Î"]="206";entityToCharacterMap["Ï"]="207";entityToCharacterMap["Ð"]="208";entityToCharacterMap["Ñ"]="209";entityToCharacterMap["Ò"]="210";entityToCharacterMap["Ó"]="211";entityToCharacterMap["Ô"]="212";entityToCharacterMap["Õ"]="213";entityToCharacterMap["Ö"]="214";entityToCharacterMap["×"]="215";entityToCharacterMap["Ø"]="216";entityToCharacterMap["Ù"]="217";entityToCharacterMap["Ú"]="218";entityToCharacterMap["Û"]="219";entityToCharacterMap["Ü"]="220";entityToCharacterMap["Ý"]="221";entityToCharacterMap["Þ"]="222";entityToCharacterMap["ß"]="223";entityToCharacterMap["à"]="224";entityToCharacterMap["á"]="225";entityToCharacterMap["â"]="226";entityToCharacterMap["ã"]="227";entityToCharacterMap["ä"]="228";entityToCharacterMap["å"]="229";entityToCharacterMap["æ"]="230";entityToCharacterMap["ç"]="231";entityToCharacterMap["è"]="232";entityToCharacterMap["é"]="233";entityToCharacterMap["ê"]="234";entityToCharacterMap["ë"]="235";entityToCharacterMap["ì"]="236";entityToCharacterMap["í"]="237";entityToCharacterMap["î"]="238";entityToCharacterMap["ï"]="239";entityToCharacterMap["ð"]="240";entityToCharacterMap["ñ"]="241";entityToCharacterMap["ò"]="242";entityToCharacterMap["ó"]="243";entityToCharacterMap["ô"]="244";entityToCharacterMap["õ"]="245";entityToCharacterMap["ö"]="246";entityToCharacterMap["÷"]="247";entityToCharacterMap["ø"]="248";entityToCharacterMap["ù"]="249";entityToCharacterMap["ú"]="250";entityToCharacterMap["û"]="251";entityToCharacterMap["ü"]="252";entityToCharacterMap["ý"]="253";entityToCharacterMap["þ"]="254";entityToCharacterMap["ÿ"]="255";entityToCharacterMap["&OElig"]="338";entityToCharacterMap["&oelig"]="339";entityToCharacterMap["&Scaron"]="352";entityToCharacterMap["&scaron"]="353";entityToCharacterMap["&Yuml"]="376";entityToCharacterMap["&fnof"]="402";entityToCharacterMap["&circ"]="710";entityToCharacterMap["&tilde"]="732";entityToCharacterMap["&Alpha"]="913";entityToCharacterMap["&Beta"]="914";entityToCharacterMap["&Gamma"]="915";entityToCharacterMap["&Delta"]="916";
|
5
|
+
entityToCharacterMap["&Epsilon"]="917";entityToCharacterMap["&Zeta"]="918";entityToCharacterMap["&Eta"]="919";entityToCharacterMap["&Theta"]="920";entityToCharacterMap["&Iota"]="921";entityToCharacterMap["&Kappa"]="922";entityToCharacterMap["&Lambda"]="923";entityToCharacterMap["&Mu"]="924";entityToCharacterMap["&Nu"]="925";entityToCharacterMap["&Xi"]="926";entityToCharacterMap["&Omicron"]="927";entityToCharacterMap["&Pi"]="928";entityToCharacterMap["&Rho"]="929";entityToCharacterMap["&Sigma"]="931";entityToCharacterMap["&Tau"]="932";entityToCharacterMap["&Upsilon"]="933";entityToCharacterMap["&Phi"]="934";entityToCharacterMap["&Chi"]="935";entityToCharacterMap["&Psi"]="936";entityToCharacterMap["&Omega"]="937";entityToCharacterMap["&alpha"]="945";entityToCharacterMap["&beta"]="946";entityToCharacterMap["&gamma"]="947";entityToCharacterMap["&delta"]="948";entityToCharacterMap["&epsilon"]="949";entityToCharacterMap["&zeta"]="950";entityToCharacterMap["&eta"]="951";entityToCharacterMap["&theta"]="952";entityToCharacterMap["&iota"]="953";entityToCharacterMap["&kappa"]="954";entityToCharacterMap["&lambda"]="955";entityToCharacterMap["&mu"]="956";entityToCharacterMap["&nu"]="957";entityToCharacterMap["&xi"]="958";entityToCharacterMap["&omicron"]="959";entityToCharacterMap["&pi"]="960";entityToCharacterMap["&rho"]="961";entityToCharacterMap["&sigmaf"]="962";entityToCharacterMap["&sigma"]="963";entityToCharacterMap["&tau"]="964";entityToCharacterMap["&upsilon"]="965";entityToCharacterMap["&phi"]="966";entityToCharacterMap["&chi"]="967";entityToCharacterMap["&psi"]="968";entityToCharacterMap["&omega"]="969";entityToCharacterMap["&thetasym"]="977";entityToCharacterMap["&upsih"]="978";entityToCharacterMap["&piv"]="982";entityToCharacterMap["&ensp"]="8194";entityToCharacterMap["&emsp"]="8195";entityToCharacterMap["&thinsp"]="8201";entityToCharacterMap["&zwnj"]="8204";entityToCharacterMap["&zwj"]="8205";entityToCharacterMap["&lrm"]="8206";entityToCharacterMap["&rlm"]="8207";entityToCharacterMap["&ndash"]="8211";entityToCharacterMap["&mdash"]="8212";entityToCharacterMap["&lsquo"]="8216";entityToCharacterMap["&rsquo"]="8217";entityToCharacterMap["&sbquo"]="8218";entityToCharacterMap["&ldquo"]="8220";entityToCharacterMap["&rdquo"]="8221";entityToCharacterMap["&bdquo"]="8222";entityToCharacterMap["&dagger"]="8224";entityToCharacterMap["&Dagger"]="8225";entityToCharacterMap["&bull"]="8226";entityToCharacterMap["&hellip"]="8230";entityToCharacterMap["&permil"]="8240";entityToCharacterMap["&prime"]="8242";entityToCharacterMap["&Prime"]="8243";entityToCharacterMap["&lsaquo"]="8249";entityToCharacterMap["&rsaquo"]="8250";entityToCharacterMap["&oline"]="8254";entityToCharacterMap["&frasl"]="8260";entityToCharacterMap["&euro"]="8364";entityToCharacterMap["&image"]="8365";entityToCharacterMap["&weierp"]="8472";entityToCharacterMap["&real"]="8476";entityToCharacterMap["&trade"]="8482";entityToCharacterMap["&alefsym"]="8501";entityToCharacterMap["&larr"]="8592";entityToCharacterMap["&uarr"]="8593";entityToCharacterMap["&rarr"]="8594";entityToCharacterMap["&darr"]="8595";entityToCharacterMap["&harr"]="8596";entityToCharacterMap["&crarr"]="8629";entityToCharacterMap["&lArr"]="8656";entityToCharacterMap["&uArr"]="8657";entityToCharacterMap["&rArr"]="8658";entityToCharacterMap["&dArr"]="8659";entityToCharacterMap["&hArr"]="8660";entityToCharacterMap["&forall"]="8704";entityToCharacterMap["&part"]="8706";entityToCharacterMap["&exist"]="8707";entityToCharacterMap["&empty"]="8709";entityToCharacterMap["&nabla"]="8711";entityToCharacterMap["&isin"]="8712";entityToCharacterMap["¬in"]="8713";entityToCharacterMap["&ni"]="8715";entityToCharacterMap["&prod"]="8719";entityToCharacterMap["&sum"]="8721";entityToCharacterMap["&minus"]="8722";entityToCharacterMap["&lowast"]="8727";entityToCharacterMap["&radic"]="8730";entityToCharacterMap["&prop"]="8733";entityToCharacterMap["&infin"]="8734";entityToCharacterMap["&ang"]="8736";entityToCharacterMap["&and"]="8743";entityToCharacterMap["&or"]="8744";entityToCharacterMap["&cap"]="8745";entityToCharacterMap["&cup"]="8746";entityToCharacterMap["&int"]="8747";entityToCharacterMap["&there4"]="8756";entityToCharacterMap["&sim"]="8764";entityToCharacterMap["&cong"]="8773";entityToCharacterMap["&asymp"]="8776";entityToCharacterMap["&ne"]="8800";entityToCharacterMap["&equiv"]="8801";entityToCharacterMap["&le"]="8804";entityToCharacterMap["&ge"]="8805";entityToCharacterMap["&sub"]="8834";entityToCharacterMap["&sup"]="8835";entityToCharacterMap["&nsub"]="8836";entityToCharacterMap["&sube"]="8838";entityToCharacterMap["&supe"]="8839";entityToCharacterMap["&oplus"]="8853";entityToCharacterMap["&otimes"]="8855";entityToCharacterMap["&perp"]="8869";entityToCharacterMap["&sdot"]="8901";entityToCharacterMap["&lceil"]="8968";entityToCharacterMap["&rceil"]="8969";entityToCharacterMap["&lfloor"]="8970";entityToCharacterMap["&rfloor"]="8971";entityToCharacterMap["&lang"]="9001";entityToCharacterMap["&rang"]="9002";entityToCharacterMap["&loz"]="9674";
|
6
|
+
entityToCharacterMap["&spades"]="9824";entityToCharacterMap["&clubs"]="9827";entityToCharacterMap["&hearts"]="9829";entityToCharacterMap["&diams"]="9830";var characterToEntityMap=[];for(var entity in entityToCharacterMap){characterToEntityMap[entityToCharacterMap[entity]]=entity}$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.HTMLEntityCodec=function(){var f=new org.owasp.esapi.codecs.Codec();var a=function(g){var h=g.peek();if(h==null){return null}if(h=="x"||h=="X"){g.next();return d(g)}return e(g)};var e=function(g){var h="";while(g.hasNext()){var j=g.peek();if(j.match(/[0-9]/)){h+=j;g.next()}else{if(j==";"){g.next();break}else{break}}}try{return parseInt(h)}catch(i){return null}};var d=function(g){var h="";while(g.hasNext()){var j=g.peek();if(j.match(/[0-9A-Fa-f]/)){h+=j;g.next()}else{if(j==";"){g.next();break}else{break}}}try{return parseInt(h,16)}catch(i){return null}};var b=function(h){var g="";while(h.hasNext()){var i=h.peek();if(i.match(/[A-Za-z]/)){g+=i;h.next();if(entityToCharacterMap.containsKey("&"+g)){if(h.peek(";")){h.next()}break}}else{if(i==";"){h.next()}else{break}}}return String.fromCharCode(entityToCharacterMap.getCaseInsensitive("&"+g))};return{encode:f.encode,decode:f.decode,encodeCharacter:function(h,k){if(h.contains(k)){return k}var i=org.owasp.esapi.codecs.Codec.getHexForNonAlphanumeric(k);if(i==null){return k}var j=k.charCodeAt(0);if((j<=31&&k!="\t"&&k!="\n"&&k!="\r")||(j>=127&&j<=159)||k==" "){return" "}var g=characterToEntityMap[j];if(g!=null){return g+";"}return"&#x"+i+";"},decodeCharacter:function(k){var g=k;g.mark();var i=g.next();if(i==null||i!="&"){g.reset();return null}var h=g.next();if(h==null){g.reset();return null}if(h=="#"){var j=a(g);if(j!=null){return j}}else{if(h.match(/[A-Za-z]/)){g.pushback(h);j=b(g);if(j!=null){return j}}}g.reset();return null}}};$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.JavascriptCodec=function(){var a=new org.owasp.esapi.codecs.Codec();return{encode:function(f,h){var d="";for(var b=0;b<h.length;b++){var g=h.charAt(b);if(f.contains(g)){d+=g}else{var i=org.owasp.esapi.codecs.Codec.getHexForNonAlphanumeric(g);if(i==null){d+=g}else{var e=g.charCodeAt(0).toString(16);if(g.charCodeAt(0)<256){var j="00".substr(e.length);d+="\\x"+j+e.toUpperCase()}else{j="0000".substr(e.length);d+="\\u"+j+e.toUpperCase()}}}}return d},decode:a.decode,decodeCharacter:function(p){p.mark();var k=p.next();if(k==null){p.reset();return null}if(k!="\\"){p.reset();return null}var b=p.next();if(b==null){p.reset();return null}if(b=="b"){return 8}else{if(b=="t"){return 9}else{if(b=="n"){return 10}else{if(b=="v"){return 11}else{if(b=="f"){return 12}else{if(b=="r"){return 13}else{if(b=='"'){return 34}else{if(b=="'"){return 39}else{if(b=="\\"){return 92}else{if(b.toLowerCase()=="x"){h="";for(var j=0;j<2;j++){var m=p.nextHex();if(m!=null){h+=m}else{input.reset();return null}}try{d=parseInt(h,16);return String.fromCharCode(d)}catch(l){p.reset();return null}}else{if(b.toLowerCase()=="u"){h="";for(j=0;j<4;j++){m=p.nextHex();if(m!=null){h+=m}else{input.reset();return null}}try{var d=parseInt(h,16);return String.fromCharCode(d)}catch(l){p.reset();return null}}else{if(p.isOctalDigit(b)){var h=b;var g=p.next();if(!p.isOctalDigit(g)){p.pushback(g)}else{h+=g;var f=p.next();if(!p.isOctalDigit(f)){p.pushback(f)}else{h+=f}}try{d=parseInt(h,8);return String.fromCharCode(d)}catch(l){p.reset();return null}}}}}}}}}}}}}return b}}};$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.PercentCodec=function(){var e=new org.owasp.esapi.codecs.Codec();var d="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";var b="-._~";var a=true;var g=d+(a?"":b);var f=function(h){var i="";if(h<-128||h>127){throw new IllegalArgumentException("b is not a byte (was "+h+")")}h&=255;if(h<16){i+="0"}return i+h.toString(16).toUpperCase()};return{encode:e.encode,decode:e.decode,encodeCharacter:function(k,l){if(g.indexOf(l)>-1){return l}var i=org.owasp.esapi.codecs.UTF8.encode(l);var j="";for(var h=0;h<i.length;h++){j+="%"+f(i.charCodeAt(h))}return j},decodeCharacter:function(q){q.mark();var l=q.next();if(l==null||l!="%"){q.reset();return null}var h="";for(var j=0;j<2;j++){var p=q.nextHex();if(p!=null){h+=p}}if(h.length==2){try{var m=parseInt(h,16);return String.fromCharCode(m)}catch(k){}}q.reset();return null}}};$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.PushbackString=function(b){var e=b,g="",a="",f=0,d=0;return{pushback:function(h){g=h},index:function(){return f},hasNext:function(){if(g!=null){return true}return !(e==null||e.length==0||f>=e.length)},next:function(){if(g!=null){var h=g;g=null;return h}if(e==null||e.length==0||f>=e.length){return null}return e.charAt(f++)},nextHex:function(){var h=this.next();if(this.isHexDigit(h)){return h}return null},nextOctal:function(){var h=this.next();if(this.isOctalDigit(h)){return h}return null},isHexDigit:function(h){return h!=null&&((h>="0"&&h<="9")||(h>="a"&&h<="f")||(h>="A"&&h<="F"))},isOctalDigit:function(h){return h!=null&&(h>="0"&&h<="7")
|
7
|
+
},peek:function(h){if(!h){if(g!=null){return g}if(e==null||e.length==0||f>=e.length){return null}return e.charAt(f)}else{if(g!=null&&g==h){return true}if(e==null||e.length==0||f>=e.length){return false}return e.charAt(f)==h}},mark:function(){a=g;d=f},reset:function(){g=a;f=d},remainder:function(){var h=e.substr(f);if(g!=null){h=g+h}return h}}};$namespace("org.owasp.esapi.codecs");org.owasp.esapi.codecs.UTF8={encode:function(d){var b=d.replace(/\r\n/g,"\n");var a="";for(var f=0;f<b.length;f++){var e=b.charCodeAt(f);if(e<128){a+=String.fromCharCode(e)}else{if((e>127)&&(e<2048)){a+=String.fromCharCode((e>>6)|192);a+=String.fromCharCode((e&63)|128)}else{a+=String.fromCharCode((e>>12)|224);a+=String.fromCharCode(((e>>6)&63)|128);a+=String.fromCharCode((e&63)|128)}}}return a},decode:function(d){var a="";var b=c=c1=c2=0;while(b<d.length){c=d.charCodeAt(b);if(c<128){a+=String.fromCharCode(c);b++}else{if((c>191)&&(c<224)){c2=d.charCodeAt(b+1);a+=String.fromCharCode(((c&31)<<6)|(c2&63));b+=2}else{c2=utftext.charCodeAt(b+1);c3=utftext.charCodeAt(b+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));b+=3}}}return a}};$namespace("org.owasp.esapi.i18n");org.owasp.esapi.i18n.ArrayResourceBundle=function(sName,oLocale,aMessages,oParent){with(org.owasp.esapi.i18n){var _super=new ResourceBundle(sName,oLocale,oParent)}var messages=aMessages;return{getParent:_super.getParent,getLocale:_super.getLocale,getName:_super.getName,getString:_super.getString,getMessage:function(sKey){return messages[sKey]}}};$namespace("org.owasp.esapi.i18n");org.owasp.esapi.i18n.Locale=function(f,d,a){var g=f,e=d,b=a;return{getLanguage:function(){return g},getCountry:function(){return e},getVariant:function(){return b},toString:function(){return g+(e?"-"+e+(b?"-"+b:""):"")}}};org.owasp.esapi.i18n.Locale.US=new org.owasp.esapi.i18n.Locale("en","US");org.owasp.esapi.i18n.Locale.GB=new org.owasp.esapi.i18n.Locale("en","GB");org.owasp.esapi.i18n.Locale.getLocale=function(b){var a=b.split("-");return new org.owasp.esapi.i18n.Locale(a[0],(a.length>1?a[1]:""),(a.length>2?a.length[2]:""))};org.owasp.esapi.i18n.Locale.getDefault=function(){var a=(navigator.language?navigator.language:(navigator.userLanguage?navigator.userLanguage:"en-US")).split("-");return new org.owasp.esapi.i18n.Locale(a[0],(a.length>1?a[1]:""),(a.length>2?a.length[2]:""))};$namespace("org.owasp.esapi.i18n");org.owasp.esapi.i18n.ObjectResourceBundle=function(e,d){var b=new org.owasp.esapi.i18n.ResourceBundle(e.name,org.owasp.esapi.i18n.Locale.getLocale(e.locale),d);var a=e.messages;return{getParent:b.getParent,getLocale:b.getLocale,getName:b.getName,getString:b.getString,getMessage:function(f){return a[f]}}};$namespace("org.owasp.esapi.i18n");org.owasp.esapi.i18n.ResourceBundle=function(g,e,b){var f=b;var a=e;var d=g;if(!d){throw new SyntaxError("Name required for implementations of org.owasp.esapi.i18n.ResourceBundle")}if(!a){throw new SyntaxError("Locale required for implementations of org.owasp.esapi.i18n.ResourceBundle")}return{getParent:function(){return f},getLocale:function(){return a},getName:function(){return d},getMessage:function(h){return h},getString:function(l,p){if(arguments.length<1){throw new IllegalArgumentException("No key passed to getString")}var m=this.getMessage(l);if(!m){if(f){return f.getString(l,p)}else{return l}}if(!m.match(/\{([A-Za-z]+)\}/)||!p){return m}var h="",n=0;while(true){var j=m.indexOf("{",n);var k=m.indexOf("}",j);if(j<0){h+=m.substr(n,m.length-n);break}if(j>=0&&k<-1){throw new SyntaxError("Invalid Message - Unclosed Context Reference: "+m)}h+=m.substring(n,j);var i=m.substring(j+1,k);if(p[i]){h+=p[i]}else{h+=m.substring(j,k+1)}n=k+1}return h}}};org.owasp.esapi.i18n.ResourceBundle.getResourceBundle=function(sResource,oLocale){var classname=sResource+"_"+oLocale.toString().replace("-","_");with(org.owasp.esapi.i18n){if(ResourceBundle[classname] instanceof Object){return ResourceBundle[classname]}else{return new ResourceBundle[classname]()}}};$namespace("org.owasp.esapi.net");org.owasp.esapi.net.Cookie=function(g,n){var b;var m;var h;var f;var l;var p;var a;var k;var d=$ESAPI.resourceBundle();var i=",; ";var e=function(u){for(var r=0,q=u.length;r<q;r++){var t=u.charCodeAt(r),s=u.charAt(r);if(t<32||t>=127||i.indexOf(s)!=-1){return false}}return true};if(!e(g)||g.toLowerCase()=="comment"||g.toLowerCase()=="discard"||g.toLowerCase()=="domain"||g.toLowerCase()=="expires"||g.toLowerCase()=="max-age"||g.toLowerCase()=="path"||g.toLowerCase()=="secure"||g.toLowerCase()=="version"||g.charAt(0)=="$"){var j=d.getString("Cookie.Name",{name:g});throw new IllegalArgumentException(j)}b=g;m=n;return{setComment:function(q){h=q},getComment:function(){return h},setDomain:function(q){f=q.toLowerCase()},getDomain:function(){return f},setMaxAge:function(q){l=q},getMaxAge:function(){return l},setPath:function(q){p=q},getPath:function(){return p},setSecure:function(q){a=q},getSecure:function(){return a},getName:function(){return b},setValue:function(q){m=q},getValue:function(){return m
|
8
|
+
},setVersion:function(q){if(q<0||q>1){throw new IllegalArgumentException(d.getString("Cookie.Version",{version:q}))}k=q},getVersion:function(){return k}}};$namespace("org.owasp.esapi.reference.encoding");org.owasp.esapi.reference.encoding.DefaultEncoder=function(a){var h=[],k=new org.owasp.esapi.codecs.HTMLEntityCodec(),f=new org.owasp.esapi.codecs.JavascriptCodec(),g=new org.owasp.esapi.codecs.CSSCodec(),b=new org.owasp.esapi.codecs.PercentCodec();if(!a){h.push(k);h.push(f);h.push(g);h.push(b)}else{h=a}var e=new Array(",",".","-","_"," ");var d=new Array(",",".","-","_");var j=new Array();var i=new Array(",",".","_");return{cananicalize:function(r,m){if(!r){return null}var l=r,p=null,s=1,n=0,q=false;while(!q){q=true;h.each(function(u){var t=l;l=u.decode(l);if(t!=l){if(p!=null&&p!=u){s++}p=u;if(q){n++}q=false}})}if(n>=2&&s>1){if(m){throw new org.owasp.esapi.IntrusionException("Input validation failure","Multiple ("+n+"x) and mixed encoding ("+s+"x) detected in "+r)}}else{if(n>=2){if(m){throw new org.owasp.esapi.IntrusionException("Input validation failure","Multiple ("+n+"x) encoding detected in "+r)}}else{if(s>1){if(m){throw new org.owasp.esapi.IntrusionException("Input validation failure","Mixed ("+s+"x) encoding detected in "+r)}}}}return l},normalize:function(l){return l.replace(/[^\x00-\x7F]/g,"")},encodeForHTML:function(l){return !l?null:k.encode(e,l)},decodeForHTML:function(l){return !l?null:k.decode(l)},encodeForHTMLAttribute:function(l){return !l?null:k.encode(d,l)},encodeForCSS:function(l){return !l?null:g.encode(j,l)},encodeForJavaScript:function(l){return !l?null:f.encode(i,l)},encodeForJavascript:this.encodeForJavaScript,encodeForURL:function(l){return !l?null:escape(l)},decodeFromURL:function(l){return !l?null:unescape(l)},encodeForBase64:function(l){return !l?null:org.owasp.esapi.codecs.Base64.encode(l)},decodeFromBase64:function(l){return !l?null:org.owasp.esapi.codecs.Base64.decode(l)}}};$namespace("org.owasp.esapi.reference.logging");org.owasp.esapi.reference.logging.Log4JSLogFactory=function(){var d=Array();var b=function(m){var f=null;var e=m?m:null;var k=Log4js.Level;var i=false,j=false,l=false,h=$ESAPI.encoder().encodeForHTML;f=Log4js.getLogger(e);var g=function(p){var n=org.owasp.esapi.Logger;switch(p){case n.OFF:return Log4js.Level.OFF;case n.FATAL:return Log4js.Level.FATAL;case n.ERROR:return Log4js.Level.ERROR;case n.WARNING:return Log4js.Level.WARN;case n.INFO:return Log4js.Level.INFO;case n.DEBUG:return Log4js.Level.DEBUG;case n.TRACE:return Log4js.Level.TRACE;case n.ALL:return Log4js.Level.ALL}};return{setLevel:function(n){try{f.setLevel(g(n))}catch(p){this.error(org.owasp.esapi.Logger.SECURITY_FAILURE,"",p)}},trace:function(p,n,q){this.log(k.TRACE,p,n,q)},debug:function(p,n,q){this.log(k.DEBUG,p,n,q)},info:function(p,n,q){this.log(k.INFO,p,n,q)},warning:function(p,n,q){this.log(k.WARN,p,n,q)},error:function(p,n,q){this.log(k.ERROR,p,n,q)},fatal:function(p,n,q){this.log(k.FATAL,p,n,q)},log:function(s,r,p,t){switch(s){case k.TRACE:if(!f.isTraceEnabled()){return}break;case k.DEBUG:if(!f.isDebugEnabled()){return}break;case k.INFO:if(!f.isInfoEnabled()){return}break;case k.WARNING:if(!f.isWarnEnabled()){return}break;case k.ERROR:if(!f.isErrorEnabled()){return}break;case k.FATAL:if(!f.isFatalEnabled()){return}break}if(!p){p=""}p="["+r.toString()+"] - "+p;var n=p.replace("\n","_").replace("\r","_");if(l){n=h(n);if(n!=p){n+=" [Encoded]"}}var q=(i?window.location.href:"")+(j?"/"+$ESAPI.properties.application.Name:"");f.log(s,(q!=""?"["+q+"] ":"")+n,t)},addAppender:function(n){f.addAppender(n)},isLogUrl:function(){return i},setLogUrl:function(n){i=n},isLogApplicationName:function(){return j},setLogApplicationName:function(n){j=n},isEncodingRequired:function(){return l},setEncodingRequired:function(n){l=n},setEncodingFunction:function(n){h=n},isDebugEnabled:function(){return f.isDebugEnabled()},isErrorEnabled:function(){return f.isErrorEnabled()},isFatalEnabled:function(){return f.isFatalEnabled()},isInfoEnabled:function(){return f.isInfoEnabled()},isTraceEnabled:function(){return f.isTraceEnabled()},isWarningEnabled:function(){return f.isWarnEnabled()}}};var a=function(f){var e=$ESAPI.properties.logging;if(e[f]){e=e[f]}return e};return{getLogger:function(g){var h=(typeof g=="string")?g:g.constructor.toString();var f=d[h];if(!f){f=new b(h);var e=a(g);f.setLevel(e.Level);f.setLogUrl(e.LogUrl);f.setLogApplicationName(e.LogApplicationName);f.setEncodingRequired(e.EncodingRequired);if(e.EncodingFunction){f.setEncodingFunction(e.EncodingFunction)}e.Appenders.each(function(i){if(e.Layout){i.setLayout(e.Layout)}f.addAppender(i)});d[h]=f}return f}}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.BaseValidationRule=function(f,h,a){var g=$ESAPI.logger("Validation");var b=org.owasp.esapi.Logger.EventType;var i=f;var j=h?h:$ESAPI.encoder();var l=false;var e=org.owasp.esapi.i18n.ResourceBundle;var k=a?a:$ESAPI.locale();var d;if($ESAPI.properties.validation.ResourceBundle){d=e.getResourceBundle($ESAPI.properties.validation.ResourceBundle,k)
|
9
|
+
}if(!d){d=$ESAPI.resourceBundle();g.info(b.EVENT_FAILURE,"No Validation ResourceBundle - Defaulting to "+d.getName()+"("+d.getLocale().toString()+")")}g.info(b.EVENT_SUCCESS,"Validation Rule Initialized with ResourceBundle: "+d.getName());return{setAllowNull:function(m){l=m},isAllowNull:function(){return l},getTypeName:function(){return i},setTypeName:function(m){i=m},setEncoder:function(m){j=m},getEncoder:function(){return j},assertValid:function(m,n){this.getValid(m,n)},getValid:function(m,p,r){var q=null;try{q=this.getValidInput(m,p)}catch(n){return this.sanitize(m,p)}return q},getValidInput:function(m,n){return n},getSafe:function(m,p){var q=null;try{q=this.getValidInput(m,p)}catch(n){return this.sanitize(m,p)}return q},sanitize:function(m,n){return n},isValid:function(m,p){var q=false;try{this.getValidInput(m,p);q=true}catch(n){return false}return q},whitelist:function(n,p){var q="";for(var m=0;m<n.length;m++){var r=n.charAt(m);if(p.contains(r)){q+=r}}return q},getUserMessage:function(p,m,n){return this.getMessage(p+".Usr",m+".Usr",n)},getLogMessage:function(p,m,n){return this.getMessage(p+".Log",m+".Log",n)},getMessage:function(p,m,n){return d.getString(p,n)?d.getString(p,n):d.getString(m,n)},validationException:function(p,m,q,n){throw new org.owasp.esapi.reference.validation.ValidationException(this.getUserMessage(p+"."+q,m+"."+q,n),this.getLogMessage(p+"."+q,m+"."+q,n),p)}}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.CreditCardValidationRule=function(b,f,a){var j=new org.owasp.esapi.reference.validation.BaseValidationRule(b,f,a);var h="CreditCard";var d=19;var g;var e=function(){var l=new RegExp($ESAPI.properties.validation.CreditCard);var k=new org.owasp.esapi.reference.validation.StringValidationRule("ccrule",j.getEncoder(),a,l);k.setMaxLength(d);k.setAllowNull(false);return k};ccRule=e();var i=function(k){var s="";var q;for(var n=0;o<k.length;n++){q=k.charAt(n);if(q.match(/[0-9]/)){s+=q}}var p=0,r=0,l=0,t=false;for(var m=s.length-1;m>=0;m--){r=parseInt(s.substring(m,n+1));if(t){l=r*2;if(l>9){l-=9}}else{l=r}p+=l;t=!t}return p%10==0};return{getMaxCardLength:function(){return d},setMaxCardLength:function(k){d=k},setAllowNull:j.setAllowNull,isAllowNull:j.isAllowNull,getTypeName:j.getTypeName,setTypeName:j.setTypeName,setEncoder:j.setEncoder,getEncoder:j.getEncoder,assertValid:j.assertValid,getValid:j.getValid,getValidInput:function(l,m){if(!m||m.trim()==""){if(this.isAllowNull()){return null}j.validationException(l,h,"Required",{context:l,input:m})}var k=g.getValid(l,m);if(!i(k)){j.validationException(l,h,"Invalid",{context:l,input:m})}return k},getSafe:j.getSafe,sanitize:function(k,l){return this.whitelist(l,org.owasp.esapi.EncoderConstants.CHAR_DIGITS)},isValid:j.isValid,whitelist:j.whitelist}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.DateValidationRule=function(a,d,b){var f=new org.owasp.esapi.reference.validation.BaseValidationRule(a,d,b);var h="Date";var g=DateFormat.getDateInstance();var e=function(j,k){if(!j||j.trim()==""){if(f.isAllowNull()){return null}f.validationException(j,h,"Required",{context:j,input:k,format:g})}var i=f.getEncoder().cananicalize(k);try{return g.parse(i)}catch(l){f.validationException(j,h,"Invalid",{context:j,input:k,format:g})}};return{setDateFormat:function(i){if(!i){throw new IllegalArgumentException("DateValidationRule.setDateFormat requires a non-null DateFormat")}g=i},setAllowNull:f.setAllowNull,isAllowNull:f.isAllowNull,getTypeName:f.getTypeName,setTypeName:f.setTypeName,setEncoder:f.setEncoder,getEncoder:f.getEncoder,assertValid:f.assertValid,getValid:f.getValid,getValidInput:function(i,j){return e(i,j)},getSafe:f.getSafe,sanitize:function(i,k){var j=new Date(0);try{j=e(i,k)}catch(l){}return j},isValid:f.isValid,whitelist:f.whitelist}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.DefaultValidator=function(e,b){var g=Array();var d=e?e:$ESAPI.encoder();var a=b?b:org.owasp.esapi.i18n.Locale.getDefault();var f=org.owasp.esapi.reference.validation;return{addRule:function(h){g[h.getName()]=h},getRule:function(h){return g[h]},isValidInput:function(h,k,m,j,i){try{this.getValidInput(h,k,m,j,i);return true}catch(l){return false}},getValidInput:function(i,q,h,l,k,r){var n=new org.owasp.esapi.reference.validation.StringValidationRule(h,d,a);var j=new RegExp($ESAPI.properties.validation[h]);if(j&&j instanceof RegExp){n.addWhitelistPattern(j)}else{throw new IllegalArgumentException("Invalid Type: "+h+" not found.")}n.setMaxLength(l);n.setAllowNull(k);try{return n.getValid(i,q)}catch(m){if(m instanceof j.ValidationErrorList&&r){r.addError(i,m)}throw m}},isValidDate:function(i,k,h,j){try{this.getValidDate(i,k,h,j);return true}catch(l){return false}},getValidDate:function(i,k,h,j,n){var l=new f.DateValidationRule(i,d,a);l.setAllowNull(j);l.setDateFormat(h);try{return l.getValid(i,k)}catch(m){if(m instanceof f.ValidationErrorList&&n){n.addError(i,m)
|
10
|
+
}throw m}},getValidCreditCard:function(h,j,i,m){var k=new f.CreditCardValidationRule(h,d,a);k.setAllowNull(i);try{return k.getValid(h,j)}catch(l){if(l instanceof f.ValidationErrorList&&m){m.addError(h,l)}throw l}},isValidCreditCard:function(h,j,i){try{this.getValidCreditCard(h,j,i);return true}catch(k){return false}},getValidNumber:function(i,k,j,n,p,m){var h=new f.NumberValidationRule(i,d,a,n,p);h.setAllowNull(j);try{return h.getValid(i,k)}catch(l){if(l instanceof f.ValidationErrorList&&m){m.addError(i,l)}throw l}},isValidNumber:function(h,j,i,l,m){try{this.getValidNumber(h,j,i,l,m);return true}catch(k){return false}},getValidInteger:function(i,k,j,n,p,m){var h=new f.IntegerValidationRule(i,d,a,n,p);h.setAllowNull(j);try{return h.getValid(i,k)}catch(l){if(l instanceof f.ValidationErrorList&&m){m.addError(i,l)}throw l}},isValidInteger:function(h,j,i,l,m){try{this.getValidInteger(h,j,i,l,m);return true}catch(k){return false}}}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.IntegerValidationRule=function(b,e,a,k,h){var j=new org.owasp.esapi.reference.validation.BaseValidationRule(b,e,a);var d="Integer";var i=k?k:Number.MIN_VALUE;var f=h?h:Number.MAX_VALUE;if(i>=f){throw new IllegalArgumentException("minValue must be less than maxValue")}var g=function(m,p){if(!p||p.trim()==""){if(j.allowNull()){return null}j.validationException(m,d,"Required",{context:m,input:p,minValue:i,maxValue:f})}var l=j.getEncoder().cananicalize(p);var q=parseInt(l);if(q=="NaN"){j.validationException(m,d,"NaN",{context:m,input:p,minValue:i,maxValue:f})}if(q<i){j.validationException(m,d,"MinValue",{context:m,input:p,minValue:i,maxValue:f})}if(q>f){j.validationException(m,d,"MaxValue",{context:m,input:p,minValue:i,maxValue:f})}return q};return{setMinValue:function(l){i=l},getMinValue:function(){return i},setMaxValue:function(l){f=l},getMaxValue:function(){return f},setAllowNull:j.setAllowNull,isAllowNull:j.isAllowNull,getTypeName:j.getTypeName,setTypeName:j.setTypeName,setEncoder:j.setEncoder,getEncoder:j.getEncoder,assertValid:j.assertValid,getValid:j.getValid,getValidInput:function(l,m){return g(l,m)},getSafe:j.getSafe,sanitize:function(l,m){var q=0;try{q=g(l,m)}catch(p){}return q},isValid:j.isValid,whitelist:j.whitelist}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.NumberValidationRule=function(b,f,a,h,e){var k=new org.owasp.esapi.reference.validation.BaseValidationRule(b,f,a);var d="Number";var j=h?h:Number.MIN_VALUE;var g=e?e:Number.MAX_VALUE;if(j>=g){throw new IllegalArgumentException("MinValue must be less that MaxValue")}var i=function(m,n){if(!n||n.trim()==""){if(k.isAllowNull()){return null}k.validationException(m,d,"Required",{context:m,input:n,minValue:j,maxValue:g})}var l=k.getEncoder().cananicalize(n);var p=0;try{p=parseFloat(l)}catch(q){k.validationException(m,d,"Invalid",{context:m,input:n,minValue:j,maxValue:g})}if(p=="NaN"){k.validationException(m,d,"NaN",{context:m,input:n,minValue:j,maxValue:g})}if(p<j){k.validationException(m,d,"MinValue",{context:m,input:n,minValue:j,maxValue:g})}if(p>g){k.validationException(m,d,"MaxValue",{context:m,input:n,minValue:j,maxValue:g})}return p};return{setMinValue:function(l){j=l},getMinValue:function(){return j},setMaxValue:function(l){g=l},getMaxValue:function(){return g},setAllowNull:k.setAllowNull,isAllowNull:k.isAllowNull,getTypeName:k.getTypeName,setTypeName:k.setTypeName,setEncoder:k.setEncoder,getEncoder:k.getEncoder,assertValid:k.assertValid,getValid:k.getValid,getValidInput:function(l,m){return i(l,m)},getSafe:k.getSafe,sanitize:function(l,m){var q=0;try{q=i(l,m)}catch(p){}return q},isValid:k.isValid,whitelist:k.whitelist}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.StringValidationRule=function(g,l,a,p){var q=new org.owasp.esapi.reference.validation.BaseValidationRule(g,l,a);var h="String";var n=Array();var f=Array();var e=0;var b=Number.MAX_VALUE;var m=true;if(p){if(p instanceof String){n.push(new RegExp(p))}else{if(p instanceof RegExp){n.push(p)}else{throw new IllegalArgumentException("sWhiteListPattern must be a string containing RegExp or a RegExp Object")}}}var k=function(r,t,s){n.each(function(u){if(t.match(u)){q.validationException(r,h,"Whitelist",{context:r,input:t,orig:s,pattern:u.toString(),minLength:e,maxLength:b,validateInputAndCanonical:m})}})};var j=function(r,t,s){f.each(function(u){if(t.match(u)){q.validationException(r,h,"Blacklist",{context:r,input:t,orig:s,pattern:u.toString(),minLength:e,maxLength:b,validateInputAndCanonical:m})}})};var d=function(r,t,s){if(t.length<e){q.validationException(r,h,"MinLength",{context:r,input:t,orig:s,minLength:e,maxLength:b,validateInputAndCanonical:m})}if(t.length>b){q.validationException(r,h,"MaxLength",{context:r,input:t,orig:s,minLength:e,maxLength:b,validateInputAndCanonical:m})}return t};var i=function(r,t,s){if(!t||t.trim()==""){if(q.isAllowNull()){return null}q.validationException(r,h,"Required",{context:r,input:t,orig:s,minLength:e,maxLength:b,validateInputAndCanonical:m})
|
11
|
+
}};return{addWhitelistPattern:function(r){if(r instanceof String){n.push(new RegExp(r))}else{if(r instanceof RegExp){n.push(r)}else{throw new IllegalArgumentException("p must be a string containing RegExp or a RegExp Object")}}},addBlacklistPattern:function(r){if(r instanceof String){f.push(new RegExp(r))}else{if(r instanceof RegExp){f.push(r)}else{throw new IllegalArgumentException("p must be a string containing RegExp or a RegExp Object")}}},setMinLength:function(r){e=r},getMinLength:function(){return e},setMaxLength:function(r){b=r},getMaxLength:function(){return b},setValidateInputAndCanonical:function(r){m=r},isValidateInputAndCanonical:function(){return m},setAllowNull:q.setAllowNull,isAllowNull:q.isAllowNull,getTypeName:q.getTypeName,setTypeName:q.setTypeName,setEncoder:q.setEncoder,getEncoder:q.getEncoder,assertValid:q.assertValid,getValid:q.getValid,getValidInput:function(s,t){var r=null;if(i(s,t)==null){return null}if(m){d(s,t);k(s,t);j(s,t)}r=this.getEncoder().cananicalize(t);if(i(s,r,t)==null){return null}d(s,r,t);k(s,r,t);j(s,r,t);return r},getSafe:q.getSafe,sanitize:function(r,s){return this.whitelist(s,org.owasp.esapi.EncoderConstants.CHAR_ALNUM)},isValid:q.isValid,whitelist:q.whitelist}};$namespace("org.owasp.esapi.reference.validation");org.owasp.esapi.reference.validation.ValidationException=function(d,b){var f,a;if(arguments[2]&&arguments[2] instanceof Exception){f=arguments[2];if(arguments[3]&&arguments[3] instanceof String){a=arguments[3]}}else{if(arguments[2]&&arguments[2] instanceof String){a=arguments[2]}}var e=new org.owasp.esapi.EnterpriseSecurityException(d,b,f);return{setContext:function(g){a=g},getContext:function(){return a},getMessage:e.getMessage,getUserMessage:e.getMessage,getLogMessage:e.getLogMessage,getStackTrace:e.getStackTrace,printStackTrace:e.printStackTrace}};
|
@@ -0,0 +1 @@
|
|
1
|
+
var Log4js={version:"1.0",applicationStartDate:new Date(),loggers:{},getLogger:function(categoryName){if(!(typeof categoryName=="string")){categoryName="[default]";}if(!Log4js.loggers[categoryName]){Log4js.loggers[categoryName]=new Log4js.Logger(categoryName);}return Log4js.loggers[categoryName];},getDefaultLogger:function(){return Log4js.getLogger("[default]");},attachEvent:function(element,name,observer){if(element.addEventListener){element.addEventListener(name,observer,false);}else if(element.attachEvent){element.attachEvent('on'+name,observer);}}};Log4js.extend=function(destination,source){for(property in source){destination[property]=source[property];}return destination;}Log4js.bind=function(fn,object){return function(){return fn.apply(object,arguments);};};Log4js.Level=function(level,levelStr){this.level=level;this.levelStr=levelStr;};Log4js.Level.prototype={toLevel:function(sArg,defaultLevel){if(sArg===null){return defaultLevel;}if(typeof sArg=="string"){var s=sArg.toUpperCase();if(s=="ALL"){return Log4js.Level.ALL;}if(s=="DEBUG"){return Log4js.Level.DEBUG;}if(s=="INFO"){return Log4js.Level.INFO;}if(s=="WARN"){return Log4js.Level.WARN;}if(s=="ERROR"){return Log4js.Level.ERROR;}if(s=="FATAL"){return Log4js.Level.FATAL;}if(s=="OFF"){return Log4js.Level.OFF;}if(s=="TRACE"){return Log4js.Level.TRACE;}return defaultLevel;}else if(typeof sArg=="number"){switch(sArg){case ALL_INT:return Log4js.Level.ALL;case DEBUG_INT:return Log4js.Level.DEBUG;case INFO_INT:return Log4js.Level.INFO;case WARN_INT:return Log4js.Level.WARN;case ERROR_INT:return Log4js.Level.ERROR;case FATAL_INT:return Log4js.Level.FATAL;case OFF_INT:return Log4js.Level.OFF;case TRACE_INT:return Log4js.Level.TRACE;default:return defaultLevel;}}else{return defaultLevel;}},toString:function(){return this.levelStr;},valueOf:function(){return this.level;}};Log4js.Level.OFF_INT=Number.MAX_VALUE;Log4js.Level.FATAL_INT=50000;Log4js.Level.ERROR_INT=40000;Log4js.Level.WARN_INT=30000;Log4js.Level.INFO_INT=20000;Log4js.Level.DEBUG_INT=10000;Log4js.Level.TRACE_INT=5000;Log4js.Level.ALL_INT=Number.MIN_VALUE;Log4js.Level.OFF=new Log4js.Level(Log4js.Level.OFF_INT,"OFF");Log4js.Level.FATAL=new Log4js.Level(Log4js.Level.FATAL_INT,"FATAL");Log4js.Level.ERROR=new Log4js.Level(Log4js.Level.ERROR_INT,"ERROR");Log4js.Level.WARN=new Log4js.Level(Log4js.Level.WARN_INT,"WARN");Log4js.Level.INFO=new Log4js.Level(Log4js.Level.INFO_INT,"INFO");Log4js.Level.DEBUG=new Log4js.Level(Log4js.Level.DEBUG_INT,"DEBUG");Log4js.Level.TRACE=new Log4js.Level(Log4js.Level.TRACE_INT,"TRACE");Log4js.Level.ALL=new Log4js.Level(Log4js.Level.ALL_INT,"ALL");Log4js.CustomEvent=function(){this.listeners=[];};Log4js.CustomEvent.prototype={addListener:function(method){this.listeners.push(method);},removeListener:function(method){var foundIndexes=this.findListenerIndexes(method);for(var i=0;i<foundIndexes.length;i++){this.listeners.splice(foundIndexes[i],1);}},dispatch:function(handler){for(var i=0;i<this.listeners.length;i++){try{this.listeners[i](handler);}catch(e){log4jsLogger.warn("Could not run the listener "+this.listeners[i]+". \n"+e);}}},findListenerIndexes:function(method){var indexes=[];for(var i=0;i<this.listeners.length;i++){if(this.listeners[i]==method){indexes.push(i);}}return indexes;}};Log4js.LoggingEvent=function(categoryName,level,message,exception,logger){this.startTime=new Date();this.categoryName=categoryName;this.message=message;this.exception=exception;this.level=level;this.logger=logger;};Log4js.LoggingEvent.prototype={getFormattedTimestamp:function(){if(this.logger){return this.logger.getFormattedTimestamp(this.startTime);}else{return this.startTime.toGMTString();}}};Log4js.Logger=function(name){this.loggingEvents=[];this.appenders=[];this.category=name||"";this.level=Log4js.Level.FATAL;this.dateformat=Log4js.DateFormatter.DEFAULT_DATE_FORMAT;this.dateformatter=new Log4js.DateFormatter();this.onlog=new Log4js.CustomEvent();this.onclear=new Log4js.CustomEvent();this.appenders.push(new Log4js.Appender(this));try{window.onerror=this.windowError.bind(this);}catch(e){}};Log4js.Logger.prototype={addAppender:function(appender){if(appender instanceof Log4js.Appender){appender.setLogger(this);this.appenders.push(appender);}else{throw "Not instance of an Appender: "+appender;}},setAppenders:function(appenders){for(var i=0;i<this.appenders.length;i++){this.appenders[i].doClear();}this.appenders=appenders;for(var j=0;j<this.appenders.length;j++){this.appenders[j].setLogger(this);}},setLevel:function(level){this.level=level;},log:function(logLevel,message,exception){var loggingEvent=new Log4js.LoggingEvent(this.category,logLevel,message,exception,this);this.loggingEvents.push(loggingEvent);this.onlog.dispatch(loggingEvent);},clear:function(){try{this.loggingEvents=[];this.onclear.dispatch();}catch(e){}},isTraceEnabled:function(){if(this.level.valueOf()<=Log4js.Level.TRACE.valueOf()){return true;}return false;},trace:function(message){if(this.isTraceEnabled()){this.log(Log4js.Level.TRACE,message,null);}},isDebugEnabled:function(){if(this.level.valueOf()<=Log4js.Level.DEBUG.valueOf()){return true;}return false;},debug:function(message){if(this.isDebugEnabled()){this.log(Log4js.Level.DEBUG,message,null);}},debug:function(message,throwable){if(this.isDebugEnabled()){this.log(Log4js.Level.DEBUG,message,throwable);}},isInfoEnabled:function(){if(this.level.valueOf()<=Log4js.Level.INFO.valueOf()){return true;}return false;},info:function(message){if(this.isInfoEnabled()){this.log(Log4js.Level.INFO,message,null);}},info:function(message,throwable){if(this.isInfoEnabled()){this.log(Log4js.Level.INFO,message,throwable);}},isWarnEnabled:function(){if(this.level.valueOf()<=Log4js.Level.WARN.valueOf()){return true;}return false;},warn:function(message){if(this.isWarnEnabled()){this.log(Log4js.Level.WARN,message,null);}},warn:function(message,throwable){if(this.isWarnEnabled()){this.log(Log4js.Level.WARN,message,throwable);}},isErrorEnabled:function(){if(this.level.valueOf()<=Log4js.Level.ERROR.valueOf()){return true;}return false;},error:function(message){if(this.isErrorEnabled()){this.log(Log4js.Level.ERROR,message,null);}},error:function(message,throwable){if(this.isErrorEnabled()){this.log(Log4js.Level.ERROR,message,throwable);}},isFatalEnabled:function(){if(this.level.valueOf()<=Log4js.Level.FATAL.valueOf()){return true;}return false;},fatal:function(message){if(this.isFatalEnabled()){this.log(Log4js.Level.FATAL,message,null);}},fatal:function(message,throwable){if(this.isFatalEnabled()){this.log(Log4js.Level.FATAL,message,throwable);}},windowError:function(msg,url,line){var message="Error in ("+(url||window.location)+") on line "+line+" with message ("+msg+")";this.log(Log4js.Level.FATAL,message,null);},setDateFormat:function(format){this.dateformat=format;},getFormattedTimestamp:function(date){return this.dateformatter.formatDate(date,this.dateformat);}};Log4js.Appender=function(){this.logger=null;};Log4js.Appender.prototype={doAppend:function(loggingEvent){return;},doClear:function(){return;},setLayout:function(layout){this.layout=layout;},setLogger:function(logger){logger.onlog.addListener(Log4js.bind(this.doAppend,this));logger.onclear.addListener(Log4js.bind(this.doClear,this));this.logger=logger;}};Log4js.Layout=function(){return;};Log4js.Layout.prototype={format:function(loggingEvent){return "";},getContentType:function(){return "text/plain";},getHeader:function(){return null;},getFooter:function(){return null;},getSeparator:function(){return "";}};Log4js.ConsoleAppender=function(isInline){this.layout=new Log4js.PatternLayout(Log4js.PatternLayout.TTCC_CONVERSION_PATTERN);this.inline=isInline;this.accesskey="d";this.tagPattern=null;this.commandHistory=[];this.commandIndex=0;this.popupBlocker=false;this.outputElement=null;this.docReference=null;this.winReference=null;if(this.inline){Log4js.attachEvent(window,'load',Log4js.bind(this.initialize,this));}};Log4js.ConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{setAccessKey:function(key){this.accesskey=key;},initialize:function(){if(!this.inline){var doc=null;var win=null;window.top.consoleWindow=window.open("",this.logger.category,"left=0,top=0,width=700,height=700,scrollbars=no,status=no,resizable=yes;toolbar=no");window.top.consoleWindow.opener=self;win=window.top.consoleWindow;if(!win){this.popupBlocker=true;alert("Popup window manager blocking the Log4js popup window to bedisplayed.\n\n"+"Please disabled this to properly see logged events.");}else{doc=win.document;doc.open();doc.write("<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN ");doc.write(" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>\n\n");doc.write("<html><head><title>Log4js - "+this.logger.category+"</title>\n");doc.write("</head><body style=\"background-color:darkgray\"></body>\n");win.blur();win.focus();}this.docReference=doc;this.winReference=win;}else{this.docReference=document;this.winReference=window;}this.outputCount=0;this.tagPattern=".*";this.logElement=this.docReference.createElement('div');this.docReference.body.appendChild(this.logElement);this.logElement.style.display='none';this.logElement.style.position="absolute";this.logElement.style.left='0px';this.logElement.style.width='100%';this.logElement.style.textAlign="left";this.logElement.style.fontFamily="lucida console";this.logElement.style.fontSize="100%";this.logElement.style.backgroundColor='darkgray';this.logElement.style.opacity=0.9;this.logElement.style.zIndex=2000;this.toolbarElement=this.docReference.createElement('div');this.logElement.appendChild(this.toolbarElement);this.toolbarElement.style.padding="0 0 0 2px";this.buttonsContainerElement=this.docReference.createElement('span');this.toolbarElement.appendChild(this.buttonsContainerElement);if(this.inline){var closeButton=this.docReference.createElement('button');closeButton.style.cssFloat="right";closeButton.style.styleFloat="right";closeButton.style.color="black";closeButton.innerHTML="close";closeButton.onclick=Log4js.bind(this.toggle,this);this.buttonsContainerElement.appendChild(closeButton);}var clearButton=this.docReference.createElement('button');clearButton.style.cssFloat="right";clearButton.style.styleFloat="right";clearButton.style.color="black";clearButton.innerHTML="clear";clearButton.onclick=Log4js.bind(this.logger.clear,this.logger);this.buttonsContainerElement.appendChild(clearButton);this.tagFilterContainerElement=this.docReference.createElement('span');this.toolbarElement.appendChild(this.tagFilterContainerElement);this.tagFilterContainerElement.style.cssFloat='left';this.tagFilterContainerElement.appendChild(this.docReference.createTextNode("Log4js - "+this.logger.category));this.tagFilterContainerElement.appendChild(this.docReference.createTextNode(" | Level Filter: "));this.tagFilterElement=this.docReference.createElement('input');this.tagFilterContainerElement.appendChild(this.tagFilterElement);this.tagFilterElement.style.width='200px';this.tagFilterElement.value=this.tagPattern;this.tagFilterElement.setAttribute('autocomplete','off');Log4js.attachEvent(this.tagFilterElement,'keyup',Log4js.bind(this.updateTags,this));Log4js.attachEvent(this.tagFilterElement,'click',Log4js.bind(function(){this.tagFilterElement.select();},this));this.outputElement=this.docReference.createElement('div');this.logElement.appendChild(this.outputElement);this.outputElement.style.overflow="auto";this.outputElement.style.clear="both";this.outputElement.style.height=(this.inline)?("200px"):("650px");this.outputElement.style.width="100%";this.outputElement.style.backgroundColor='black';this.inputContainerElement=this.docReference.createElement('div');this.inputContainerElement.style.width="100%";this.logElement.appendChild(this.inputContainerElement);this.inputElement=this.docReference.createElement('input');this.inputContainerElement.appendChild(this.inputElement);this.inputElement.style.width='100%';this.inputElement.style.borderWidth='0px';this.inputElement.style.margin='0px';this.inputElement.style.padding='0px';this.inputElement.value='Type command here';this.inputElement.setAttribute('autocomplete','off');Log4js.attachEvent(this.inputElement,'keyup',Log4js.bind(this.handleInput,this));Log4js.attachEvent(this.inputElement,'click',Log4js.bind(function(){this.inputElement.select();},this));if(this.inline){window.setInterval(Log4js.bind(this.repositionWindow,this),500);this.repositionWindow();var accessElement=this.docReference.createElement('button');accessElement.style.position="absolute";accessElement.style.top="-100px";accessElement.accessKey=this.accesskey;accessElement.onclick=Log4js.bind(this.toggle,this);this.docReference.body.appendChild(accessElement);}else{this.show();}},toggle:function(){if(this.logElement.style.display=='none'){this.show();return true;}else{this.hide();return false;}},show:function(){this.logElement.style.display='';this.outputElement.scrollTop=this.outputElement.scrollHeight;this.inputElement.select();},hide:function(){this.logElement.style.display='none';},output:function(message,style){var shouldScroll=(this.outputElement.scrollTop+(2*this.outputElement.clientHeight))>=this.outputElement.scrollHeight;this.outputCount++;style=(style?style+=';':'');style+='padding:1px;margin:0 0 5px 0';if(this.outputCount%2===0){style+=";background-color:#101010";}message=message||"undefined";message=message.toString();this.outputElement.innerHTML+="<pre style='"+style+"'>"+message+"</pre>";if(shouldScroll){this.outputElement.scrollTop=this.outputElement.scrollHeight;}},updateTags:function(){var pattern=this.tagFilterElement.value;if(this.tagPattern==pattern){return;}try{new RegExp(pattern);}catch(e){return;}this.tagPattern=pattern;this.outputElement.innerHTML="";this.outputCount=0;for(var i=0;i<this.logger.loggingEvents.length;i++){this.doAppend(this.logger.loggingEvents[i]);}},repositionWindow:function(){var offset=window.pageYOffset||this.docReference.documentElement.scrollTop||this.docReference.body.scrollTop;var pageHeight=self.innerHeight||this.docReference.documentElement.clientHeight||this.docReference.body.clientHeight;this.logElement.style.top=(offset+pageHeight-this.logElement.offsetHeight)+"px";},doAppend:function(loggingEvent){if(this.popupBlocker){return;}if((!this.inline)&&(!this.winReference||this.winReference.closed)){this.initialize();}if(this.tagPattern!==null&&loggingEvent.level.toString().search(new RegExp(this.tagPattern,'igm'))==-1){return;}var style='';if(loggingEvent.level.toString().search(/ERROR/)!=-1){style+='color:red';}else if(loggingEvent.level.toString().search(/FATAL/)!=-1){style+='color:red';}else if(loggingEvent.level.toString().search(/WARN/)!=-1){style+='color:orange';}else if(loggingEvent.level.toString().search(/DEBUG/)!=-1){style+='color:green';}else if(loggingEvent.level.toString().search(/INFO/)!=-1){style+='color:white';}else{style+='color:yellow';}this.output(this.layout.format(loggingEvent),style);},doClear:function(){this.outputElement.innerHTML="";},handleInput:function(e){if(e.keyCode==13){var command=this.inputElement.value;switch(command){case "clear":this.logger.clear();break;default:var consoleOutput="";try{consoleOutput=eval(this.inputElement.value);}catch(e){this.logger.error("Problem parsing input <"+command+">"+e.message);break;}this.logger.trace(consoleOutput);break;}if(this.inputElement.value!==""&&this.inputElement.value!==this.commandHistory[0]){this.commandHistory.unshift(this.inputElement.value);}this.commandIndex=0;this.inputElement.value="";}else if(e.keyCode==38&&this.commandHistory.length>0){this.inputElement.value=this.commandHistory[this.commandIndex];if(this.commandIndex<this.commandHistory.length-1){this.commandIndex+=1;}}else if(e.keyCode==40&&this.commandHistory.length>0){if(this.commandIndex>0){this.commandIndex-=1;}this.inputElement.value=this.commandHistory[this.commandIndex];}else{this.commandIndex=0;}},toString:function(){return "Log4js.ConsoleAppender[inline="+this.inline+"]";}});Log4js.MetatagAppender=function(){this.currentLine=0;};Log4js.MetatagAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){var now=new Date();var lines=loggingEvent.message.split("\n");var headTag=document.getElementsByTagName("head")[0];for(var i=1;i<=lines.length;i++){var value=lines[i-1];if(i==1){value=loggingEvent.level.toString()+": "+value;}else{value="> "+value;}var metaTag=document.createElement("meta");metaTag.setAttribute("name","X-log4js:"+this.currentLine);metaTag.setAttribute("content",value);headTag.appendChild(metaTag);this.currentLine+=1;}},toString:function(){return "Log4js.MetatagAppender";}});Log4js.AjaxAppender=function(loggingUrl){this.isInProgress=false;this.loggingUrl=loggingUrl||"logging.log4js";this.threshold=1;this.timeout=2000;this.loggingEventMap=new Log4js.FifoBuffer();this.layout=new Log4js.XMLLayout();this.httpRequest=null;};Log4js.AjaxAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){log4jsLogger.trace("> AjaxAppender.append");if(this.loggingEventMap.length()<=this.threshold||this.isInProgress===true){this.loggingEventMap.push(loggingEvent);}if(this.loggingEventMap.length()>=this.threshold&&this.isInProgress===false){this.send();}log4jsLogger.trace("< AjaxAppender.append");},doClear:function(){log4jsLogger.trace("> AjaxAppender.doClear");if(this.loggingEventMap.length()>0){this.send();}log4jsLogger.trace("< AjaxAppender.doClear");},setThreshold:function(threshold){log4jsLogger.trace("> AjaxAppender.setThreshold: "+threshold);this.threshold=threshold;log4jsLogger.trace("< AjaxAppender.setThreshold");},setTimeout:function(milliseconds){this.timeout=milliseconds;},send:function(){if(this.loggingEventMap.length()>0){log4jsLogger.trace("> AjaxAppender.send");this.isInProgress=true;var a=[];for(var i=0;i<this.loggingEventMap.length()&&i<this.threshold;i++){a.push(this.layout.format(this.loggingEventMap.pull()));}var content=this.layout.getHeader();content+=a.join(this.layout.getSeparator());content+=this.layout.getFooter();var appender=this;if(this.httpRequest===null){this.httpRequest=this.getXmlHttpRequest();}this.httpRequest.onreadystatechange=function(){appender.onReadyStateChanged.call(appender);};this.httpRequest.open("POST",this.loggingUrl,true);this.httpRequest.setRequestHeader("Content-type",this.layout.getContentType());this.httpRequest.setRequestHeader("REFERER",location.href);this.httpRequest.setRequestHeader("Content-length",content.length);this.httpRequest.setRequestHeader("Connection","close");this.httpRequest.send(content);appender=this;try{window.setTimeout(function(){log4jsLogger.trace("> AjaxAppender.timeout");appender.httpRequest.onreadystatechange=function(){return;};appender.httpRequest.abort();appender.isInProgress=false;if(appender.loggingEventMap.length()>0){appender.send();}log4jsLogger.trace("< AjaxAppender.timeout");},this.timeout);}catch(e){log4jsLogger.fatal(e);}log4jsLogger.trace("> AjaxAppender.send");}},onReadyStateChanged:function(){log4jsLogger.trace("> AjaxAppender.onReadyStateChanged");var req=this.httpRequest;if(this.httpRequest.readyState!=4){log4jsLogger.trace("< AjaxAppender.onReadyStateChanged: readyState "+req.readyState+" != 4");return;}var success=((typeof req.status==="undefined")||req.status===0||(req.status>=200&&req.status<300));if(success){log4jsLogger.trace(" AjaxAppender.onReadyStateChanged: success");this.isInProgress=false;}else{var msg=" AjaxAppender.onReadyStateChanged: XMLHttpRequest request to URL "+this.loggingUrl+" returned status code "+this.httpRequest.status;log4jsLogger.error(msg);}log4jsLogger.trace("< AjaxAppender.onReadyStateChanged: readyState == 4");},getXmlHttpRequest:function(){log4jsLogger.trace("> AjaxAppender.getXmlHttpRequest");var httpRequest=false;try{if(window.XMLHttpRequest){httpRequest=new XMLHttpRequest();if(httpRequest.overrideMimeType){httpRequest.overrideMimeType(this.layout.getContentType());}}else if(window.ActiveXObject){try{httpRequest=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){httpRequest=new ActiveXObject("Microsoft.XMLHTTP");}}}catch(e){httpRequest=false;}if(!httpRequest){log4jsLogger.fatal("Unfortunatelly your browser does not support AjaxAppender for log4js!");}log4jsLogger.trace("< AjaxAppender.getXmlHttpRequest");return httpRequest;},toString:function(){return "Log4js.AjaxAppender[loggingUrl="+this.loggingUrl+", threshold="+this.threshold+"]";}});Log4js.FileAppender=function(file){this.layout=new Log4js.SimpleLayout();this.isIE='undefined';this.file=file||"log4js.log";try{this.fso=new ActiveXObject("Scripting.FileSystemObject");this.isIE=true;}catch(e){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");this.fso=Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);this.isIE=false;}catch(e){log4jsLogger.error(e);}}};Log4js.FileAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){try{var fileHandle=null;if(this.isIE==='undefined'){log4jsLogger.error("Unsupported ")}else if(this.isIE){fileHandle=this.fso.OpenTextFile(this.file,8,true);fileHandle.WriteLine(this.layout.format(loggingEvent));fileHandle.close();}else{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");this.fso.initWithPath(this.file);if(!this.fso.exists()){this.fso.create(0x00,0600);}fileHandle=Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);fileHandle.init(this.fso,0x04|0x08|0x10,064,0);var line=this.layout.format(loggingEvent);fileHandle.write(line,line.length);fileHandle.close();}}catch(e){log4jsLogger.error(e);}},doClear:function(){try{if(this.isIE){var fileHandle=this.fso.GetFile(this.file);fileHandle.Delete();}else{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");this.fso.initWithPath(this.file);if(this.fso.exists()){this.fso.remove(false);}}}catch(e){log4jsLogger.error(e);}},toString:function(){return "Log4js.FileAppender[file="+this.file+"]";}});Log4js.WindowsEventAppender=function(){this.layout=new Log4js.SimpleLayout();try{this.shell=new ActiveXObject("WScript.Shell");}catch(e){log4jsLogger.error(e);}};Log4js.WindowsEventAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){var winLevel=4;switch(loggingEvent.level){case Log4js.Level.FATAL:winLevel=1;break;case Log4js.Level.ERROR:winLevel=1;break;case Log4js.Level.WARN:winLevel=2;break;default:winLevel=4;break;}try{this.shell.LogEvent(winLevel,this.level.format(loggingEvent));}catch(e){log4jsLogger.error(e);}},toString:function(){return "Log4js.WindowsEventAppender";}});Log4js.JSAlertAppender=function(){this.layout=new Log4js.SimpleLayout();};Log4js.JSAlertAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){alert(this.layout.getHeader()+this.layout.format(loggingEvent)+this.layout.getFooter());},toString:function(){return "Log4js.JSAlertAppender";}});Log4js.MozillaJSConsoleAppender=function(){this.layout=new Log4js.SimpleLayout();try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");this.jsConsole=Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);this.scriptError=Components.classes["@mozilla.org/scripterror;1"].createInstance(Components.interfaces.nsIScriptError);}catch(e){log4jsLogger.error(e);}};Log4js.MozillaJSConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){try{netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");this.scriptError.init(this.layout.format(loggingEvent),null,null,null,null,this.getFlag(loggingEvent),loggingEvent.categoryName);this.jsConsole.logMessage(this.scriptError);}catch(e){log4jsLogger.error(e);}},toString:function(){return "Log4js.MozillaJSConsoleAppender";},getFlag:function(loggingEvent){var retval;switch(loggingEvent.level){case Log4js.Level.FATAL:retval=2;break;case Log4js.Level.ERROR:retval=0;break;case Log4js.Level.WARN:retval=1;break;default:retval=1;break;}return retval;}});Log4js.OperaJSConsoleAppender=function(){this.layout=new Log4js.SimpleLayout();};Log4js.OperaJSConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){opera.postError(this.layout.format(loggingEvent));},toString:function(){return "Log4js.OperaJSConsoleAppender";}});Log4js.SafariJSConsoleAppender=function(){this.layout=new Log4js.SimpleLayout();};Log4js.SafariJSConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){window.console.log(this.layout.format(loggingEvent));},toString:function(){return "Log4js.SafariJSConsoleAppender";}});Log4js.BrowserConsoleAppender=function(){this.consoleDelegate=null;if(window.console){this.consoleDelegate=new Log4js.SafariJSConsoleAppender();}else if(window.opera){this.consoleDelegate=new Log4js.OperaJSConsoleAppender();}else if(netscape){this.consoleDelegate=new Log4js.MozJSConsoleAppender();}else{log4jsLogger.error("Unsupported Browser");}};Log4js.BrowserConsoleAppender.prototype=Log4js.extend(new Log4js.Appender(),{doAppend:function(loggingEvent){this.consoleDelegate.doAppend(loggingEvent);},doClear:function(){this.consoleDelegate.doClear();},setLayout:function(layout){this.consoleDelegate.setLayout(layout);},toString:function(){return "Log4js.BrowserConsoleAppender: "+this.consoleDelegate.toString();}});Log4js.SimpleLayout=function(){this.LINE_SEP="\n";this.LINE_SEP_LEN=1;};Log4js.SimpleLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){return loggingEvent.level.toString()+" - "+loggingEvent.message+this.LINE_SEP;},getContentType:function(){return "text/plain";},getHeader:function(){return "";},getFooter:function(){return "";}});Log4js.BasicLayout=function(){this.LINE_SEP="\n";};Log4js.BasicLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){return loggingEvent.categoryName+"~"+loggingEvent.startTime.toLocaleString()+" ["+loggingEvent.level.toString()+"] "+loggingEvent.message+this.LINE_SEP;},getContentType:function(){return "text/plain";},getHeader:function(){return "";},getFooter:function(){return "";}});Log4js.HtmlLayout=function(){return;};Log4js.HtmlLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){return "<div style=\""+this.getStyle(loggingEvent)+"\">"+loggingEvent.getFormattedTimestamp()+" - "+loggingEvent.level.toString()+" - "+loggingEvent.message+"</div>\n";},getContentType:function(){return "text/html";},getHeader:function(){return "<html><head><title>log4js</head><body>";},getFooter:function(){return "</body></html>";},getStyle:function(loggingEvent){var style;if(loggingEvent.level.toString().search(/ERROR/)!=-1){style='color:red';}else if(loggingEvent.level.toString().search(/FATAL/)!=-1){style='color:red';}else if(loggingEvent.level.toString().search(/WARN/)!=-1){style='color:orange';}else if(loggingEvent.level.toString().search(/DEBUG/)!=-1){style='color:green';}else if(loggingEvent.level.toString().search(/INFO/)!=-1){style='color:white';}else{style='color:yellow';}return style;}});Log4js.XMLLayout=function(){return;};Log4js.XMLLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){var useragent="unknown";try{useragent=navigator.userAgent;}catch(e){useragent="unknown";}var referer="unknown";try{referer=location.href;}catch(e){referer="unknown";}var content="<log4js:event logger=\"";content+=loggingEvent.categoryName+"\" level=\"";content+=loggingEvent.level.toString()+"\" useragent=\"";content+=useragent+"\" referer=\"";content+=referer.replace(/&/g,"&")+"\" timestamp=\"";content+=loggingEvent.getFormattedTimestamp()+"\">\n";content+="\t<log4js:message><![CDATA["+this.escapeCdata(loggingEvent.message)+"]]></log4js:message>\n";if(loggingEvent.exception){content+=this.formatException(loggingEvent.exception);}content+="</log4js:event>\n";return content;},getContentType:function(){return "text/xml";},getHeader:function(){return "<log4js:eventSet version=\""+Log4js.version+"\" xmlns:log4js=\"http://log4js.berlios.de/2007/log4js/\">\n";},getFooter:function(){return "</log4js:eventSet>\n";},getSeparator:function(){return "\n";},formatException:function(ex){if(ex){var exStr="\t<log4js:throwable>";if(ex.message){exStr+="\t\t<log4js:message><![CDATA["+this.escapeCdata(ex.message)+"]]></log4js:message>\n";}if(ex.description){exStr+="\t\t<log4js:description><![CDATA["+this.escapeCdata(ex.description)+"]]></log4js:description>\n";}exStr+="\t\t<log4js:stacktrace>";exStr+="\t\t\t<log4js:location fileName=\""+ex.fileName+"\" lineNumber=\""+ex.lineNumber+"\" />";exStr+="\t\t</log4js:stacktrace>";exStr="\t</log4js:throwable>";return exStr;}return null;},escapeCdata:function(str){return str.replace(/\]\]>/,"]]>]]><![CDATA[");}});Log4js.JSONLayout=function(){this.df=new Log4js.DateFormatter();};Log4js.JSONLayout.prototype=Log4js.extend(new Log4js.Layout(),{format:function(loggingEvent){var useragent="unknown";try{useragent=navigator.userAgent;}catch(e){useragent="unknown";}var referer="unknown";try{referer=location.href;}catch(e){referer="unknown";}var jsonString="{\n \"LoggingEvent\": {\n";jsonString+="\t\"logger\": \""+loggingEvent.categoryName+"\",\n";jsonString+="\t\"level\": \""+loggingEvent.level.toString()+"\",\n";jsonString+="\t\"message\": \""+loggingEvent.message+"\",\n";jsonString+="\t\"referer\": \""+referer+"\",\n";jsonString+="\t\"useragent\": \""+useragent+"\",\n";jsonString+="\t\"timestamp\": \""+this.df.formatDate(loggingEvent.startTime,"yyyy-MM-ddThh:mm:ssZ")+"\",\n";jsonString+="\t\"exception\": \""+loggingEvent.exception+"\"\n";jsonString+="}}";return jsonString;},getContentType:function(){return "text/json";},getHeader:function(){return "{\"Log4js\": [\n";},getFooter:function(){return "\n]}";},getSeparator:function(){return ",\n";}});Log4js.PatternLayout=function(pattern){if(pattern){this.pattern=pattern;}else{this.pattern=Log4js.PatternLayout.DEFAULT_CONVERSION_PATTERN;}};Log4js.PatternLayout.TTCC_CONVERSION_PATTERN="%r %p %c - %m%n";Log4js.PatternLayout.DEFAULT_CONVERSION_PATTERN="%m%n";Log4js.PatternLayout.ISO8601_DATEFORMAT="yyyy-MM-dd HH:mm:ss,SSS";Log4js.PatternLayout.DATETIME_DATEFORMAT="dd MMM YYYY HH:mm:ss,SSS";Log4js.PatternLayout.ABSOLUTETIME_DATEFORMAT="HH:mm:ss,SSS";Log4js.PatternLayout.prototype=Log4js.extend(new Log4js.Layout(),{getContentType:function(){return "text/plain";},getHeader:function(){return null;},getFooter:function(){return null;},format:function(loggingEvent){var regex= /%(-?[0-9]+)?(\.?[0-9]+)?([cdmnpr%])(\{([^\}]+)\})?|([^%]+)/;var formattedString="";var result;var searchString=this.pattern;while((result=regex.exec(searchString))){var matchedString=result[0];var padding=result[1];var truncation=result[2];var conversionCharacter=result[3];var specifier=result[5];var text=result[6];if(text){formattedString+=""+text;}else{var replacement="";switch(conversionCharacter){case "c":var loggerName=loggingEvent.categoryName;if(specifier){var precision=parseInt(specifier,10);var loggerNameBits=loggingEvent.categoryName.split(".");if(precision>=loggerNameBits.length){replacement=loggerName;}else{replacement=loggerNameBits.slice(loggerNameBits.length-precision).join(".");}}else{replacement=loggerName;}break;case "d":var dateFormat=Log4js.PatternLayout.ISO8601_DATEFORMAT;if(specifier){dateFormat=specifier;if(dateFormat=="ISO8601"){dateFormat=Log4js.PatternLayout.ISO8601_DATEFORMAT;}else if(dateFormat=="ABSOLUTE"){dateFormat=Log4js.PatternLayout.ABSOLUTETIME_DATEFORMAT;}else if(dateFormat=="DATE"){dateFormat=Log4js.PatternLayout.DATETIME_DATEFORMAT;}}replacement=(new Log4js.SimpleDateFormat(dateFormat)).format(loggingEvent.startTime);break;case "m":replacement=loggingEvent.message;break;case "n":replacement="\n";break;case "p":replacement=loggingEvent.level.toString();break;case "r":replacement=""+loggingEvent.startTime.toLocaleTimeString();break;case "%":replacement="%";break;default:replacement=matchedString;break;}var len;if(truncation){len=parseInt(truncation.substr(1),10);replacement=replacement.substring(0,len);}if(padding){if(padding.charAt(0)=="-"){len=parseInt(padding.substr(1),10);while(replacement.length<len){replacement+=" ";}}else{len=parseInt(padding,10);while(replacement.length<len){replacement=" "+replacement;}}}formattedString+=replacement;}searchString=searchString.substr(result.index+result[0].length);}return formattedString;}});if(!Array.prototype.push){Array.prototype.push=function(){var startLength=this.length;for(var i=0;i<arguments.length;i++){this[startLength+i]=arguments[i];}return this.length;};}Log4js.FifoBuffer=function(){this.array=new Array();};Log4js.FifoBuffer.prototype={push:function(obj){this.array[this.array.length]=obj;return this.array.length;},pull:function(){if(this.array.length>0){var firstItem=this.array[0];for(var i=0;i<this.array.length-1;i++){this.array[i]=this.array[i+1];}this.array.length=this.array.length-1;return firstItem;}return null;},length:function(){return this.array.length;}};Log4js.DateFormatter=function(){return;};Log4js.DateFormatter.DEFAULT_DATE_FORMAT="yyyy-MM-ddThh:mm:ssO";Log4js.DateFormatter.prototype={formatDate:function(vDate,vFormat){var vDay=this.addZero(vDate.getDate());var vMonth=this.addZero(vDate.getMonth()+1);var vYearLong=this.addZero(vDate.getFullYear());var vYearShort=this.addZero(vDate.getFullYear().toString().substring(3,4));var vYear=(vFormat.indexOf("yyyy")>-1?vYearLong:vYearShort);var vHour=this.addZero(vDate.getHours());var vMinute=this.addZero(vDate.getMinutes());var vSecond=this.addZero(vDate.getSeconds());var vTimeZone=this.O(vDate);var vDateString=vFormat.replace(/dd/g,vDay).replace(/MM/g,vMonth).replace(/y{1,4}/g,vYear);vDateString=vDateString.replace(/hh/g,vHour).replace(/mm/g,vMinute).replace(/ss/g,vSecond);vDateString=vDateString.replace(/O/g,vTimeZone);return vDateString;},addZero:function(vNumber){return((vNumber<10)?"0":"")+vNumber;},O:function(date){var os=Math.abs(date.getTimezoneOffset());var h=String(Math.floor(os/60));var m=String(os%60);h.length==1?h="0"+h:1;m.length==1?m="0"+m:1;return date.getTimezoneOffset()<0?"+"+h+m:"-"+h+m;}};var log4jsLogger=Log4js.getLogger("Log4js");log4jsLogger.addAppender(new Log4js.ConsoleAppender());log4jsLogger.setLevel(Log4js.Level.ALL);
|
@@ -0,0 +1,2501 @@
|
|
1
|
+
/*
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
+
* you may not use this file except in compliance with the License.
|
4
|
+
* You may obtain a copy of the License at
|
5
|
+
*
|
6
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
*
|
8
|
+
* Unless required by applicable law or agreed to in writing, software
|
9
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
* See the License for the specific language governing permissions and
|
12
|
+
* limitations under the License.
|
13
|
+
*/
|
14
|
+
|
15
|
+
/*jsl:option explicit*/
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @fileoverview log4js is a library to log in JavaScript in similar manner
|
19
|
+
* than in log4j for Java. The API should be nearly the same.
|
20
|
+
*
|
21
|
+
* This file contains all log4js code and is the only file required for logging.
|
22
|
+
*
|
23
|
+
* <h3>Example:</h3>
|
24
|
+
* <pre>
|
25
|
+
* var log = new Log4js.getLogger("some-category-name"); //create logger instance
|
26
|
+
* log.setLevel(Log4js.Level.TRACE); //set the Level
|
27
|
+
* log.addAppender(new ConsoleAppender(log, false)); // console that launches in new window
|
28
|
+
|
29
|
+
* // if multiple appenders are set all will log
|
30
|
+
* log.addAppender(new ConsoleAppender(log, true)); // console that is in-line in the page
|
31
|
+
* log.addAppender(new FileAppender("C:\\somefile.log")); // file appender logs to C:\\somefile.log
|
32
|
+
*
|
33
|
+
* ...
|
34
|
+
*
|
35
|
+
* //call the log
|
36
|
+
* log.trace("trace me" );
|
37
|
+
* </pre>
|
38
|
+
*
|
39
|
+
* @version 0.3
|
40
|
+
* @author Stephan Strittmatter - http://jroller.com/page/stritti
|
41
|
+
* @author Seth Chisamore - http://www.chisamore.com
|
42
|
+
* @since 2005-05-20
|
43
|
+
* Website: http://log4js.berlios.de
|
44
|
+
*/
|
45
|
+
var Log4js = {
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Current version of log4js.
|
49
|
+
* @static
|
50
|
+
* @final
|
51
|
+
*/
|
52
|
+
version: "1.0",
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Date of logger initialized.
|
56
|
+
* @static
|
57
|
+
* @final
|
58
|
+
*/
|
59
|
+
applicationStartDate: new Date(),
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Hashtable of loggers.
|
63
|
+
* @static
|
64
|
+
* @final
|
65
|
+
* @private
|
66
|
+
*/
|
67
|
+
loggers: {},
|
68
|
+
|
69
|
+
/**
|
70
|
+
* Get a logger instance. Instance is cached on categoryName level.
|
71
|
+
* @param {String} categoryName name of category to log to.
|
72
|
+
* @return {Logger} instance of logger for the category
|
73
|
+
* @static
|
74
|
+
*/
|
75
|
+
getLogger: function(categoryName) {
|
76
|
+
|
77
|
+
// Use default logger if categoryName is not specified or invalid
|
78
|
+
if (!(typeof categoryName == "string")) {
|
79
|
+
categoryName = "[default]";
|
80
|
+
}
|
81
|
+
|
82
|
+
if (!Log4js.loggers[categoryName]) {
|
83
|
+
// Create the logger for this name if it doesn't already exist
|
84
|
+
Log4js.loggers[categoryName] = new Log4js.Logger(categoryName);
|
85
|
+
}
|
86
|
+
|
87
|
+
return Log4js.loggers[categoryName];
|
88
|
+
},
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Get the default logger instance.
|
92
|
+
* @return {Logger} instance of default logger
|
93
|
+
* @static
|
94
|
+
*/
|
95
|
+
getDefaultLogger: function() {
|
96
|
+
return Log4js.getLogger("[default]");
|
97
|
+
},
|
98
|
+
|
99
|
+
/**
|
100
|
+
* Atatch an observer function to an elements event browser independent.
|
101
|
+
*
|
102
|
+
* @param element element to attach event
|
103
|
+
* @param name name of event
|
104
|
+
* @param observer observer method to be called
|
105
|
+
* @private
|
106
|
+
*/
|
107
|
+
attachEvent: function (element, name, observer) {
|
108
|
+
if (element.addEventListener) { //DOM event model
|
109
|
+
element.addEventListener(name, observer, false);
|
110
|
+
} else if (element.attachEvent) { //M$ event model
|
111
|
+
element.attachEvent('on' + name, observer);
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
/**
|
116
|
+
* Load a JS-script dynamically.
|
117
|
+
* @param {String} src
|
118
|
+
*/
|
119
|
+
/* $import: function (src) {
|
120
|
+
var documentScripts = document.getElementsByTagName("script");
|
121
|
+
|
122
|
+
for (index = 0; index < documentScripts.length; ++index)
|
123
|
+
{
|
124
|
+
var documentScript = documentScripts[index];
|
125
|
+
if (documentScript.src == src) {
|
126
|
+
return false;
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
var script = document.createElement('script');
|
131
|
+
script.type = 'text/javascript';
|
132
|
+
script.src = src;
|
133
|
+
document.getElementsByTagName('head')[0].appendChild(script);
|
134
|
+
|
135
|
+
return true;
|
136
|
+
}
|
137
|
+
*/
|
138
|
+
};
|
139
|
+
|
140
|
+
/**
|
141
|
+
* Internal object extension (OO) methods.
|
142
|
+
*
|
143
|
+
* @private
|
144
|
+
* @ignore
|
145
|
+
*/
|
146
|
+
Log4js.extend = function(destination, source) {
|
147
|
+
for (property in source) {
|
148
|
+
destination[property] = source[property];
|
149
|
+
}
|
150
|
+
return destination;
|
151
|
+
}
|
152
|
+
|
153
|
+
/**
|
154
|
+
* Functions taken from Prototype library,
|
155
|
+
* didn't want to require for just few functions.
|
156
|
+
* More info at {@link http://prototype.conio.net/}
|
157
|
+
* @private
|
158
|
+
*/
|
159
|
+
Log4js.bind = function(fn, object) {
|
160
|
+
return function() {
|
161
|
+
return fn.apply(object, arguments);
|
162
|
+
};
|
163
|
+
};
|
164
|
+
|
165
|
+
/**
|
166
|
+
* Log4js.Level Enumeration. Do not use directly. Use static objects instead.
|
167
|
+
* @constructor
|
168
|
+
* @param {Number} level number of level
|
169
|
+
* @param {String} levelString String representation of level
|
170
|
+
* @private
|
171
|
+
*/
|
172
|
+
Log4js.Level = function(level, levelStr) {
|
173
|
+
this.level = level;
|
174
|
+
this.levelStr = levelStr;
|
175
|
+
};
|
176
|
+
|
177
|
+
Log4js.Level.prototype = {
|
178
|
+
/**
|
179
|
+
* converts given String to corresponding Level
|
180
|
+
* @param {String} sArg String value of Level
|
181
|
+
* @param {Log4js.Level} defaultLevel default Level, if no String representation
|
182
|
+
* @return Level object
|
183
|
+
* @type Log4js.Level
|
184
|
+
*/
|
185
|
+
toLevel: function(sArg, defaultLevel) {
|
186
|
+
|
187
|
+
if(sArg === null) {
|
188
|
+
return defaultLevel;
|
189
|
+
}
|
190
|
+
|
191
|
+
if(typeof sArg == "string") {
|
192
|
+
var s = sArg.toUpperCase();
|
193
|
+
if(s == "ALL") {return Log4js.Level.ALL;}
|
194
|
+
if(s == "DEBUG") {return Log4js.Level.DEBUG;}
|
195
|
+
if(s == "INFO") {return Log4js.Level.INFO;}
|
196
|
+
if(s == "WARN") {return Log4js.Level.WARN;}
|
197
|
+
if(s == "ERROR") {return Log4js.Level.ERROR;}
|
198
|
+
if(s == "FATAL") {return Log4js.Level.FATAL;}
|
199
|
+
if(s == "OFF") {return Log4js.Level.OFF;}
|
200
|
+
if(s == "TRACE") {return Log4js.Level.TRACE;}
|
201
|
+
return defaultLevel;
|
202
|
+
} else if(typeof sArg == "number") {
|
203
|
+
switch(sArg) {
|
204
|
+
case ALL_INT: return Log4js.Level.ALL;
|
205
|
+
case DEBUG_INT: return Log4js.Level.DEBUG;
|
206
|
+
case INFO_INT: return Log4js.Level.INFO;
|
207
|
+
case WARN_INT: return Log4js.Level.WARN;
|
208
|
+
case ERROR_INT: return Log4js.Level.ERROR;
|
209
|
+
case FATAL_INT: return Log4js.Level.FATAL;
|
210
|
+
case OFF_INT: return Log4js.Level.OFF;
|
211
|
+
case TRACE_INT: return Log4js.Level.TRACE;
|
212
|
+
default: return defaultLevel;
|
213
|
+
}
|
214
|
+
} else {
|
215
|
+
return defaultLevel;
|
216
|
+
}
|
217
|
+
},
|
218
|
+
/**
|
219
|
+
* @return converted Level to String
|
220
|
+
* @type String
|
221
|
+
*/
|
222
|
+
toString: function() {
|
223
|
+
return this.levelStr;
|
224
|
+
},
|
225
|
+
/**
|
226
|
+
* @return internal Number value of Level
|
227
|
+
* @type Number
|
228
|
+
*/
|
229
|
+
valueOf: function() {
|
230
|
+
return this.level;
|
231
|
+
}
|
232
|
+
};
|
233
|
+
|
234
|
+
// Static variables
|
235
|
+
/**
|
236
|
+
* @private
|
237
|
+
*/
|
238
|
+
Log4js.Level.OFF_INT = Number.MAX_VALUE;
|
239
|
+
/**
|
240
|
+
* @private
|
241
|
+
*/
|
242
|
+
Log4js.Level.FATAL_INT = 50000;
|
243
|
+
/**
|
244
|
+
* @private
|
245
|
+
*/
|
246
|
+
Log4js.Level.ERROR_INT = 40000;
|
247
|
+
/**
|
248
|
+
* @private
|
249
|
+
*/
|
250
|
+
Log4js.Level.WARN_INT = 30000;
|
251
|
+
/**
|
252
|
+
* @private
|
253
|
+
*/
|
254
|
+
Log4js.Level.INFO_INT = 20000;
|
255
|
+
/**
|
256
|
+
* @private
|
257
|
+
*/
|
258
|
+
Log4js.Level.DEBUG_INT = 10000;
|
259
|
+
/**
|
260
|
+
* @private
|
261
|
+
*/
|
262
|
+
Log4js.Level.TRACE_INT = 5000;
|
263
|
+
/**
|
264
|
+
* @private
|
265
|
+
*/
|
266
|
+
Log4js.Level.ALL_INT = Number.MIN_VALUE;
|
267
|
+
|
268
|
+
/**
|
269
|
+
* Logging Level OFF - all disabled
|
270
|
+
* @type Log4js.Level
|
271
|
+
* @static
|
272
|
+
*/
|
273
|
+
Log4js.Level.OFF = new Log4js.Level(Log4js.Level.OFF_INT, "OFF");
|
274
|
+
/**
|
275
|
+
* Logging Level Fatal
|
276
|
+
* @type Log4js.Level
|
277
|
+
* @static
|
278
|
+
*/
|
279
|
+
Log4js.Level.FATAL = new Log4js.Level(Log4js.Level.FATAL_INT, "FATAL");
|
280
|
+
/**
|
281
|
+
* Logging Level Error
|
282
|
+
* @type Log4js.Level
|
283
|
+
* @static
|
284
|
+
*/
|
285
|
+
Log4js.Level.ERROR = new Log4js.Level(Log4js.Level.ERROR_INT, "ERROR");
|
286
|
+
/**
|
287
|
+
* Logging Level Warn
|
288
|
+
* @type Log4js.Level
|
289
|
+
* @static
|
290
|
+
*/
|
291
|
+
Log4js.Level.WARN = new Log4js.Level(Log4js.Level.WARN_INT, "WARN");
|
292
|
+
/**
|
293
|
+
* Logging Level Info
|
294
|
+
* @type Log4js.Level
|
295
|
+
* @static
|
296
|
+
*/
|
297
|
+
Log4js.Level.INFO = new Log4js.Level(Log4js.Level.INFO_INT, "INFO");
|
298
|
+
/**
|
299
|
+
* Logging Level Debug
|
300
|
+
* @type Log4js.Level
|
301
|
+
* @static
|
302
|
+
*/
|
303
|
+
Log4js.Level.DEBUG = new Log4js.Level(Log4js.Level.DEBUG_INT, "DEBUG");
|
304
|
+
/**
|
305
|
+
* Logging Level Trace
|
306
|
+
* @type Log4js.Level
|
307
|
+
* @static
|
308
|
+
*/
|
309
|
+
Log4js.Level.TRACE = new Log4js.Level(Log4js.Level.TRACE_INT, "TRACE");
|
310
|
+
/**
|
311
|
+
* Logging Level All - All traces are enabled
|
312
|
+
* @type Log4js.Level
|
313
|
+
* @static
|
314
|
+
*/
|
315
|
+
Log4js.Level.ALL = new Log4js.Level(Log4js.Level.ALL_INT, "ALL");
|
316
|
+
|
317
|
+
/**
|
318
|
+
* Log4js CustomEvent
|
319
|
+
* @constructor
|
320
|
+
* @author Corey Johnson - original code in Lumberjack (http://gleepglop.com/javascripts/logger/)
|
321
|
+
* @author Seth Chisamore - adapted for Log4js
|
322
|
+
* @private
|
323
|
+
*/
|
324
|
+
Log4js.CustomEvent = function() {
|
325
|
+
this.listeners = [];
|
326
|
+
};
|
327
|
+
|
328
|
+
Log4js.CustomEvent.prototype = {
|
329
|
+
|
330
|
+
/**
|
331
|
+
* @param method method to be added
|
332
|
+
*/
|
333
|
+
addListener : function(method) {
|
334
|
+
this.listeners.push(method);
|
335
|
+
},
|
336
|
+
|
337
|
+
/**
|
338
|
+
* @param method method to be removed
|
339
|
+
*/
|
340
|
+
removeListener : function(method) {
|
341
|
+
var foundIndexes = this.findListenerIndexes(method);
|
342
|
+
|
343
|
+
for(var i = 0; i < foundIndexes.length; i++) {
|
344
|
+
this.listeners.splice(foundIndexes[i], 1);
|
345
|
+
}
|
346
|
+
},
|
347
|
+
|
348
|
+
/**
|
349
|
+
* @param handler
|
350
|
+
*/
|
351
|
+
dispatch : function(handler) {
|
352
|
+
for(var i = 0; i < this.listeners.length; i++) {
|
353
|
+
try {
|
354
|
+
this.listeners[i](handler);
|
355
|
+
}
|
356
|
+
catch (e) {
|
357
|
+
log4jsLogger.warn("Could not run the listener " + this.listeners[i] + ". \n" + e);
|
358
|
+
}
|
359
|
+
}
|
360
|
+
},
|
361
|
+
|
362
|
+
/**
|
363
|
+
* @private
|
364
|
+
* @param method
|
365
|
+
*/
|
366
|
+
findListenerIndexes : function(method) {
|
367
|
+
var indexes = [];
|
368
|
+
for(var i = 0; i < this.listeners.length; i++) {
|
369
|
+
if (this.listeners[i] == method) {
|
370
|
+
indexes.push(i);
|
371
|
+
}
|
372
|
+
}
|
373
|
+
|
374
|
+
return indexes;
|
375
|
+
}
|
376
|
+
};
|
377
|
+
|
378
|
+
/**
|
379
|
+
* Models a logging event.
|
380
|
+
* @constructor
|
381
|
+
* @param {String} categoryName name of category
|
382
|
+
* @param {Log4js.Level} level level of message
|
383
|
+
* @param {String} message message to log
|
384
|
+
* @param {Log4js.Logger} logger the associated logger
|
385
|
+
* @author Seth Chisamore
|
386
|
+
*/
|
387
|
+
Log4js.LoggingEvent = function(categoryName, level, message, exception, logger) {
|
388
|
+
/**
|
389
|
+
* the timestamp of the Logging Event
|
390
|
+
* @type Date
|
391
|
+
* @private
|
392
|
+
*/
|
393
|
+
this.startTime = new Date();
|
394
|
+
/**
|
395
|
+
* category of event
|
396
|
+
* @type String
|
397
|
+
* @private
|
398
|
+
*/
|
399
|
+
this.categoryName = categoryName;
|
400
|
+
/**
|
401
|
+
* the logging message
|
402
|
+
* @type String
|
403
|
+
* @private
|
404
|
+
*/
|
405
|
+
this.message = message;
|
406
|
+
/**
|
407
|
+
* the logging exception
|
408
|
+
* @type Exception
|
409
|
+
* @private
|
410
|
+
*/
|
411
|
+
this.exception = exception;
|
412
|
+
/**
|
413
|
+
* level of log
|
414
|
+
* @type Log4js.Level
|
415
|
+
* @private
|
416
|
+
*/
|
417
|
+
this.level = level;
|
418
|
+
/**
|
419
|
+
* reference to logger
|
420
|
+
* @type Log4js.Logger
|
421
|
+
* @private
|
422
|
+
*/
|
423
|
+
this.logger = logger;
|
424
|
+
};
|
425
|
+
|
426
|
+
Log4js.LoggingEvent.prototype = {
|
427
|
+
/**
|
428
|
+
* get the timestamp formatted as String.
|
429
|
+
* @return {String} formatted timestamp
|
430
|
+
* @see Log4js#setDateFormat()
|
431
|
+
*/
|
432
|
+
getFormattedTimestamp: function() {
|
433
|
+
if(this.logger) {
|
434
|
+
return this.logger.getFormattedTimestamp(this.startTime);
|
435
|
+
} else {
|
436
|
+
return this.startTime.toGMTString();
|
437
|
+
}
|
438
|
+
}
|
439
|
+
};
|
440
|
+
|
441
|
+
/**
|
442
|
+
* Logger to log messages to the defined appender.</p>
|
443
|
+
* Default appender is Appender, which is ignoring all messages. Please
|
444
|
+
* use setAppender() to set a specific appender (e.g. WindowAppender).
|
445
|
+
* use {@see Log4js#getLogger(String)} to get an instance.
|
446
|
+
* @constructor
|
447
|
+
* @param name name of category to log to
|
448
|
+
* @author Stephan Strittmatter
|
449
|
+
*/
|
450
|
+
Log4js.Logger = function(name) {
|
451
|
+
this.loggingEvents = [];
|
452
|
+
this.appenders = [];
|
453
|
+
/** category of logger */
|
454
|
+
this.category = name || "";
|
455
|
+
/** level to be logged */
|
456
|
+
this.level = Log4js.Level.FATAL;
|
457
|
+
|
458
|
+
this.dateformat = Log4js.DateFormatter.DEFAULT_DATE_FORMAT;
|
459
|
+
this.dateformatter = new Log4js.DateFormatter();
|
460
|
+
|
461
|
+
this.onlog = new Log4js.CustomEvent();
|
462
|
+
this.onclear = new Log4js.CustomEvent();
|
463
|
+
|
464
|
+
/** appender to write in */
|
465
|
+
this.appenders.push(new Log4js.Appender(this));
|
466
|
+
|
467
|
+
// if multiple log objects are instantiated this will only log to the log
|
468
|
+
// object that is declared last can't seem to get the attachEvent method to
|
469
|
+
// work correctly
|
470
|
+
try {
|
471
|
+
window.onerror = this.windowError.bind(this);
|
472
|
+
} catch (e) {
|
473
|
+
//log4jsLogger.fatal(e);
|
474
|
+
}
|
475
|
+
};
|
476
|
+
|
477
|
+
Log4js.Logger.prototype = {
|
478
|
+
|
479
|
+
/**
|
480
|
+
* add additional appender. DefaultAppender always is there.
|
481
|
+
* @param appender additional wanted appender
|
482
|
+
*/
|
483
|
+
addAppender: function(appender) {
|
484
|
+
if (appender instanceof Log4js.Appender) {
|
485
|
+
appender.setLogger(this);
|
486
|
+
this.appenders.push(appender);
|
487
|
+
} else {
|
488
|
+
throw "Not instance of an Appender: " + appender;
|
489
|
+
}
|
490
|
+
},
|
491
|
+
|
492
|
+
/**
|
493
|
+
* set Array of appenders. Previous Appenders are cleared and removed.
|
494
|
+
* @param {Array} appenders Array of Appenders
|
495
|
+
*/
|
496
|
+
setAppenders: function(appenders) {
|
497
|
+
//clear first all existing appenders
|
498
|
+
for(var i = 0; i < this.appenders.length; i++) {
|
499
|
+
this.appenders[i].doClear();
|
500
|
+
}
|
501
|
+
|
502
|
+
this.appenders = appenders;
|
503
|
+
|
504
|
+
for(var j = 0; j < this.appenders.length; j++) {
|
505
|
+
this.appenders[j].setLogger(this);
|
506
|
+
}
|
507
|
+
},
|
508
|
+
|
509
|
+
/**
|
510
|
+
* Set the Loglevel default is LogLEvel.TRACE
|
511
|
+
* @param level wanted logging level
|
512
|
+
*/
|
513
|
+
setLevel: function(level) {
|
514
|
+
this.level = level;
|
515
|
+
},
|
516
|
+
|
517
|
+
/**
|
518
|
+
* main log method logging to all available appenders
|
519
|
+
* @private
|
520
|
+
*/
|
521
|
+
log: function(logLevel, message, exception) {
|
522
|
+
var loggingEvent = new Log4js.LoggingEvent(this.category, logLevel,
|
523
|
+
message, exception, this);
|
524
|
+
this.loggingEvents.push(loggingEvent);
|
525
|
+
this.onlog.dispatch(loggingEvent);
|
526
|
+
},
|
527
|
+
|
528
|
+
/** clear logging */
|
529
|
+
clear : function () {
|
530
|
+
try{
|
531
|
+
this.loggingEvents = [];
|
532
|
+
this.onclear.dispatch();
|
533
|
+
} catch(e){}
|
534
|
+
},
|
535
|
+
/** checks if Level Trace is enabled */
|
536
|
+
isTraceEnabled: function() {
|
537
|
+
if (this.level.valueOf() <= Log4js.Level.TRACE.valueOf()) {
|
538
|
+
return true;
|
539
|
+
}
|
540
|
+
return false;
|
541
|
+
},
|
542
|
+
/**
|
543
|
+
* Trace messages
|
544
|
+
* @param message {Object} message to be logged
|
545
|
+
*/
|
546
|
+
trace: function(message) {
|
547
|
+
if (this.isTraceEnabled()) {
|
548
|
+
this.log(Log4js.Level.TRACE, message, null);
|
549
|
+
}
|
550
|
+
},
|
551
|
+
/** checks if Level Debug is enabled */
|
552
|
+
isDebugEnabled: function() {
|
553
|
+
if (this.level.valueOf() <= Log4js.Level.DEBUG.valueOf()) {
|
554
|
+
return true;
|
555
|
+
}
|
556
|
+
return false;
|
557
|
+
},
|
558
|
+
/**
|
559
|
+
* Debug messages
|
560
|
+
* @param message {Object} message to be logged
|
561
|
+
*/
|
562
|
+
debug: function(message) {
|
563
|
+
if (this.isDebugEnabled()) {
|
564
|
+
this.log(Log4js.Level.DEBUG, message, null);
|
565
|
+
}
|
566
|
+
},
|
567
|
+
/**
|
568
|
+
* Debug messages
|
569
|
+
* @param {Object} message message to be logged
|
570
|
+
* @param {Throwable} throwable
|
571
|
+
*/
|
572
|
+
debug: function(message, throwable) {
|
573
|
+
if (this.isDebugEnabled()) {
|
574
|
+
this.log(Log4js.Level.DEBUG, message, throwable);
|
575
|
+
}
|
576
|
+
},
|
577
|
+
/** checks if Level Info is enabled */
|
578
|
+
isInfoEnabled: function() {
|
579
|
+
if (this.level.valueOf() <= Log4js.Level.INFO.valueOf()) {
|
580
|
+
return true;
|
581
|
+
}
|
582
|
+
return false;
|
583
|
+
},
|
584
|
+
/**
|
585
|
+
* logging info messages
|
586
|
+
* @param {Object} message message to be logged
|
587
|
+
*/
|
588
|
+
info: function(message) {
|
589
|
+
if (this.isInfoEnabled()) {
|
590
|
+
this.log(Log4js.Level.INFO, message, null);
|
591
|
+
}
|
592
|
+
},
|
593
|
+
/**
|
594
|
+
* logging info messages
|
595
|
+
* @param {Object} message message to be logged
|
596
|
+
* @param {Throwable} throwable
|
597
|
+
*/
|
598
|
+
info: function(message, throwable) {
|
599
|
+
if (this.isInfoEnabled()) {
|
600
|
+
this.log(Log4js.Level.INFO, message, throwable);
|
601
|
+
}
|
602
|
+
},
|
603
|
+
/** checks if Level Warn is enabled */
|
604
|
+
isWarnEnabled: function() {
|
605
|
+
if (this.level.valueOf() <= Log4js.Level.WARN.valueOf()) {
|
606
|
+
return true;
|
607
|
+
}
|
608
|
+
return false;
|
609
|
+
},
|
610
|
+
|
611
|
+
/** logging warn messages */
|
612
|
+
warn: function(message) {
|
613
|
+
if (this.isWarnEnabled()) {
|
614
|
+
this.log(Log4js.Level.WARN, message, null);
|
615
|
+
}
|
616
|
+
},
|
617
|
+
/** logging warn messages */
|
618
|
+
warn: function(message, throwable) {
|
619
|
+
if (this.isWarnEnabled()) {
|
620
|
+
this.log(Log4js.Level.WARN, message, throwable);
|
621
|
+
}
|
622
|
+
},
|
623
|
+
/** checks if Level Error is enabled */
|
624
|
+
isErrorEnabled: function() {
|
625
|
+
if (this.level.valueOf() <= Log4js.Level.ERROR.valueOf()) {
|
626
|
+
return true;
|
627
|
+
}
|
628
|
+
return false;
|
629
|
+
},
|
630
|
+
/** logging error messages */
|
631
|
+
error: function(message) {
|
632
|
+
if (this.isErrorEnabled()) {
|
633
|
+
this.log(Log4js.Level.ERROR, message, null);
|
634
|
+
}
|
635
|
+
},
|
636
|
+
/** logging error messages */
|
637
|
+
error: function(message, throwable) {
|
638
|
+
if (this.isErrorEnabled()) {
|
639
|
+
this.log(Log4js.Level.ERROR, message, throwable);
|
640
|
+
}
|
641
|
+
},
|
642
|
+
/** checks if Level Fatal is enabled */
|
643
|
+
isFatalEnabled: function() {
|
644
|
+
if (this.level.valueOf() <= Log4js.Level.FATAL.valueOf()) {
|
645
|
+
return true;
|
646
|
+
}
|
647
|
+
return false;
|
648
|
+
},
|
649
|
+
/** logging fatal messages */
|
650
|
+
fatal: function(message) {
|
651
|
+
if (this.isFatalEnabled()) {
|
652
|
+
this.log(Log4js.Level.FATAL, message, null);
|
653
|
+
}
|
654
|
+
},
|
655
|
+
/** logging fatal messages */
|
656
|
+
fatal: function(message, throwable) {
|
657
|
+
if (this.isFatalEnabled()) {
|
658
|
+
this.log(Log4js.Level.FATAL, message, throwable);
|
659
|
+
}
|
660
|
+
},
|
661
|
+
/**
|
662
|
+
* Capture main window errors and log as fatal.
|
663
|
+
* @private
|
664
|
+
*/
|
665
|
+
windowError: function(msg, url, line){
|
666
|
+
var message = "Error in (" + (url || window.location) + ") on line "+ line +" with message (" + msg + ")";
|
667
|
+
this.log(Log4js.Level.FATAL, message, null);
|
668
|
+
},
|
669
|
+
|
670
|
+
/**
|
671
|
+
* Set the date format of logger. Following switches are supported:
|
672
|
+
* <ul>
|
673
|
+
* <li>yyyy - The year</li>
|
674
|
+
* <li>MM - the month</li>
|
675
|
+
* <li>dd - the day of month<li>
|
676
|
+
* <li>hh - the hour<li>
|
677
|
+
* <li>mm - minutes</li>
|
678
|
+
* <li>O - timezone offset</li>
|
679
|
+
* </ul>
|
680
|
+
* @param {String} format format String for the date
|
681
|
+
* @see #getTimestamp
|
682
|
+
*/
|
683
|
+
setDateFormat: function(format) {
|
684
|
+
this.dateformat = format;
|
685
|
+
},
|
686
|
+
|
687
|
+
/**
|
688
|
+
* Generates a timestamp using the format set in {Log4js.setDateFormat}.
|
689
|
+
* @param {Date} date the date to format
|
690
|
+
* @see #setDateFormat
|
691
|
+
* @return A formatted timestamp with the current date and time.
|
692
|
+
*/
|
693
|
+
getFormattedTimestamp: function(date) {
|
694
|
+
return this.dateformatter.formatDate(date, this.dateformat);
|
695
|
+
}
|
696
|
+
};
|
697
|
+
|
698
|
+
/**
|
699
|
+
* Abstract base class for other appenders.
|
700
|
+
* It is doing nothing.
|
701
|
+
*
|
702
|
+
* @constructor
|
703
|
+
* @param {Log4js.Logger} logger log4js instance this appender is attached to
|
704
|
+
* @author Stephan Strittmatter
|
705
|
+
*/
|
706
|
+
Log4js.Appender = function () {
|
707
|
+
/**
|
708
|
+
* Reference to calling logger
|
709
|
+
* @type Log4js.Logger
|
710
|
+
* @private
|
711
|
+
*/
|
712
|
+
this.logger = null;
|
713
|
+
};
|
714
|
+
|
715
|
+
Log4js.Appender.prototype = {
|
716
|
+
/**
|
717
|
+
* appends the given loggingEvent appender specific
|
718
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to append
|
719
|
+
*/
|
720
|
+
doAppend: function(loggingEvent) {
|
721
|
+
return;
|
722
|
+
},
|
723
|
+
/**
|
724
|
+
* clears the Appender
|
725
|
+
*/
|
726
|
+
doClear: function() {
|
727
|
+
return;
|
728
|
+
},
|
729
|
+
|
730
|
+
/**
|
731
|
+
* Set the Layout for this appender.
|
732
|
+
* @param {Log4js.Layout} layout Layout for formatting loggingEvent
|
733
|
+
*/
|
734
|
+
setLayout: function(layout){
|
735
|
+
this.layout = layout;
|
736
|
+
},
|
737
|
+
/**
|
738
|
+
* Set reference to the logger.
|
739
|
+
* @param {Log4js.Logger} the invoking logger
|
740
|
+
*/
|
741
|
+
setLogger: function(logger){
|
742
|
+
// add listener to the logger methods
|
743
|
+
logger.onlog.addListener(Log4js.bind(this.doAppend, this));
|
744
|
+
logger.onclear.addListener(Log4js.bind(this.doClear, this));
|
745
|
+
|
746
|
+
this.logger = logger;
|
747
|
+
}
|
748
|
+
};
|
749
|
+
|
750
|
+
/**
|
751
|
+
* Interface for Layouts.
|
752
|
+
* Use this Layout as "interface" for other Layouts. It is doing nothing.
|
753
|
+
*
|
754
|
+
* @constructor
|
755
|
+
* @author Stephan Strittmatter
|
756
|
+
*/
|
757
|
+
Log4js.Layout = function(){return;};
|
758
|
+
Log4js.Layout.prototype = {
|
759
|
+
/**
|
760
|
+
* Implement this method to create your own layout format.
|
761
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to format
|
762
|
+
* @return formatted String
|
763
|
+
* @type String
|
764
|
+
*/
|
765
|
+
format: function(loggingEvent) {
|
766
|
+
return "";
|
767
|
+
},
|
768
|
+
/**
|
769
|
+
* Returns the content type output by this layout.
|
770
|
+
* @return The base class returns "text/plain".
|
771
|
+
* @type String
|
772
|
+
*/
|
773
|
+
getContentType: function() {
|
774
|
+
return "text/plain";
|
775
|
+
},
|
776
|
+
/**
|
777
|
+
* @return Returns the header for the layout format. The base class returns null.
|
778
|
+
* @type String
|
779
|
+
*/
|
780
|
+
getHeader: function() {
|
781
|
+
return null;
|
782
|
+
},
|
783
|
+
/**
|
784
|
+
* @return Returns the footer for the layout format. The base class returns null.
|
785
|
+
* @type String
|
786
|
+
*/
|
787
|
+
getFooter: function() {
|
788
|
+
return null;
|
789
|
+
},
|
790
|
+
|
791
|
+
/**
|
792
|
+
* @return Separator between events
|
793
|
+
* @type String
|
794
|
+
*/
|
795
|
+
getSeparator: function() {
|
796
|
+
return "";
|
797
|
+
}
|
798
|
+
};
|
799
|
+
|
800
|
+
/**
|
801
|
+
* Console Appender writes the logs to a console. If "inline" is
|
802
|
+
* set to "false" the console launches in another window otherwise
|
803
|
+
* the window is inline on the page and toggled on and off with "Alt-D".
|
804
|
+
* Note: At FireFox &gb; 2.0 the keystroke is little different now: "SHIFT+ALT+D".
|
805
|
+
*
|
806
|
+
* @constructor
|
807
|
+
* @extends Log4js.Appender
|
808
|
+
* @param {boolean} isInline boolean value that indicates whether the console be placed inline, default is to launch in new window
|
809
|
+
*
|
810
|
+
* @author Corey Johnson - original console code in Lumberjack (http://gleepglop.com/javascripts/logger/)
|
811
|
+
* @author Seth Chisamore - adapted for use as a log4js appender
|
812
|
+
*/
|
813
|
+
Log4js.ConsoleAppender = function(isInline) {
|
814
|
+
|
815
|
+
/**
|
816
|
+
* @type Log4js.Layout
|
817
|
+
* @private
|
818
|
+
*/
|
819
|
+
this.layout = new Log4js.PatternLayout(Log4js.PatternLayout.TTCC_CONVERSION_PATTERN);
|
820
|
+
/**
|
821
|
+
* @type boolean
|
822
|
+
* @private
|
823
|
+
*/
|
824
|
+
this.inline = isInline;
|
825
|
+
|
826
|
+
/**
|
827
|
+
* @type String
|
828
|
+
* @private
|
829
|
+
*/
|
830
|
+
this.accesskey = "d";
|
831
|
+
|
832
|
+
/**
|
833
|
+
* @private
|
834
|
+
*/
|
835
|
+
this.tagPattern = null;
|
836
|
+
|
837
|
+
this.commandHistory = [];
|
838
|
+
this.commandIndex = 0;
|
839
|
+
|
840
|
+
/**
|
841
|
+
* true if popup is blocked.
|
842
|
+
*/
|
843
|
+
this.popupBlocker = false;
|
844
|
+
|
845
|
+
/**
|
846
|
+
* current output div-element.
|
847
|
+
*/
|
848
|
+
this.outputElement = null;
|
849
|
+
|
850
|
+
this.docReference = null;
|
851
|
+
this.winReference = null;
|
852
|
+
|
853
|
+
if(this.inline) {
|
854
|
+
Log4js.attachEvent(window, 'load', Log4js.bind(this.initialize, this));
|
855
|
+
}
|
856
|
+
};
|
857
|
+
|
858
|
+
Log4js.ConsoleAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
859
|
+
|
860
|
+
/**
|
861
|
+
* Set the access key to show/hide the inline console (default "e;d"e;)
|
862
|
+
* @param key access key to show/hide the inline console
|
863
|
+
*/
|
864
|
+
setAccessKey : function(key) {
|
865
|
+
this.accesskey = key;
|
866
|
+
},
|
867
|
+
|
868
|
+
/**
|
869
|
+
* @private
|
870
|
+
*/
|
871
|
+
initialize : function() {
|
872
|
+
|
873
|
+
if(!this.inline) {
|
874
|
+
var doc = null;
|
875
|
+
var win = null;
|
876
|
+
window.top.consoleWindow = window.open("", this.logger.category,
|
877
|
+
"left=0,top=0,width=700,height=700,scrollbars=no,status=no,resizable=yes;toolbar=no");
|
878
|
+
window.top.consoleWindow.opener = self;
|
879
|
+
win = window.top.consoleWindow;
|
880
|
+
|
881
|
+
if (!win) {
|
882
|
+
this.popupBlocker=true;
|
883
|
+
alert("Popup window manager blocking the Log4js popup window to bedisplayed.\n\n"
|
884
|
+
+ "Please disabled this to properly see logged events.");
|
885
|
+
} else {
|
886
|
+
|
887
|
+
doc = win.document;
|
888
|
+
doc.open();
|
889
|
+
doc.write("<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN ");
|
890
|
+
doc.write(" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>\n\n");
|
891
|
+
doc.write("<html><head><title>Log4js - " + this.logger.category + "</title>\n");
|
892
|
+
doc.write("</head><body style=\"background-color:darkgray\"></body>\n");
|
893
|
+
win.blur();
|
894
|
+
win.focus();
|
895
|
+
}
|
896
|
+
|
897
|
+
this.docReference = doc;
|
898
|
+
this.winReference = win;
|
899
|
+
} else {
|
900
|
+
this.docReference = document;
|
901
|
+
this.winReference = window;
|
902
|
+
}
|
903
|
+
|
904
|
+
this.outputCount = 0;
|
905
|
+
this.tagPattern = ".*";
|
906
|
+
|
907
|
+
// I hate writing javascript in HTML... but what's a better alternative
|
908
|
+
this.logElement = this.docReference.createElement('div');
|
909
|
+
this.docReference.body.appendChild(this.logElement);
|
910
|
+
this.logElement.style.display = 'none';
|
911
|
+
|
912
|
+
this.logElement.style.position = "absolute";
|
913
|
+
this.logElement.style.left = '0px';
|
914
|
+
this.logElement.style.width = '100%';
|
915
|
+
|
916
|
+
this.logElement.style.textAlign = "left";
|
917
|
+
this.logElement.style.fontFamily = "lucida console";
|
918
|
+
this.logElement.style.fontSize = "100%";
|
919
|
+
this.logElement.style.backgroundColor = 'darkgray';
|
920
|
+
this.logElement.style.opacity = 0.9;
|
921
|
+
this.logElement.style.zIndex = 2000;
|
922
|
+
|
923
|
+
// Add toolbarElement
|
924
|
+
this.toolbarElement = this.docReference.createElement('div');
|
925
|
+
this.logElement.appendChild(this.toolbarElement);
|
926
|
+
this.toolbarElement.style.padding = "0 0 0 2px";
|
927
|
+
|
928
|
+
// Add buttons
|
929
|
+
this.buttonsContainerElement = this.docReference.createElement('span');
|
930
|
+
this.toolbarElement.appendChild(this.buttonsContainerElement);
|
931
|
+
|
932
|
+
if(this.inline) {
|
933
|
+
var closeButton = this.docReference.createElement('button');
|
934
|
+
closeButton.style.cssFloat = "right";
|
935
|
+
closeButton.style.styleFloat = "right"; // IE dom bug...doesn't understand cssFloat
|
936
|
+
closeButton.style.color = "black";
|
937
|
+
closeButton.innerHTML = "close";
|
938
|
+
closeButton.onclick = Log4js.bind(this.toggle, this);
|
939
|
+
this.buttonsContainerElement.appendChild(closeButton);
|
940
|
+
}
|
941
|
+
|
942
|
+
var clearButton = this.docReference.createElement('button');
|
943
|
+
clearButton.style.cssFloat = "right";
|
944
|
+
clearButton.style.styleFloat = "right"; // IE dom bug...doesn't understand cssFloat
|
945
|
+
clearButton.style.color = "black";
|
946
|
+
clearButton.innerHTML = "clear";
|
947
|
+
clearButton.onclick = Log4js.bind(this.logger.clear, this.logger);
|
948
|
+
this.buttonsContainerElement.appendChild(clearButton);
|
949
|
+
|
950
|
+
|
951
|
+
//Add CategoryName and Level Filter
|
952
|
+
this.tagFilterContainerElement = this.docReference.createElement('span');
|
953
|
+
this.toolbarElement.appendChild(this.tagFilterContainerElement);
|
954
|
+
this.tagFilterContainerElement.style.cssFloat = 'left';
|
955
|
+
|
956
|
+
this.tagFilterContainerElement.appendChild(this.docReference.createTextNode("Log4js - " + this.logger.category));
|
957
|
+
this.tagFilterContainerElement.appendChild(this.docReference.createTextNode(" | Level Filter: "));
|
958
|
+
|
959
|
+
this.tagFilterElement = this.docReference.createElement('input');
|
960
|
+
this.tagFilterContainerElement.appendChild(this.tagFilterElement);
|
961
|
+
this.tagFilterElement.style.width = '200px';
|
962
|
+
this.tagFilterElement.value = this.tagPattern;
|
963
|
+
this.tagFilterElement.setAttribute('autocomplete', 'off'); // So Firefox doesn't flip out
|
964
|
+
|
965
|
+
Log4js.attachEvent(this.tagFilterElement, 'keyup', Log4js.bind(this.updateTags, this));
|
966
|
+
Log4js.attachEvent(this.tagFilterElement, 'click', Log4js.bind( function() {this.tagFilterElement.select();}, this));
|
967
|
+
|
968
|
+
// Add outputElement
|
969
|
+
this.outputElement = this.docReference.createElement('div');
|
970
|
+
this.logElement.appendChild(this.outputElement);
|
971
|
+
this.outputElement.style.overflow = "auto";
|
972
|
+
this.outputElement.style.clear = "both";
|
973
|
+
this.outputElement.style.height = (this.inline) ? ("200px"):("650px");
|
974
|
+
this.outputElement.style.width = "100%";
|
975
|
+
this.outputElement.style.backgroundColor = 'black';
|
976
|
+
|
977
|
+
this.inputContainerElement = this.docReference.createElement('div');
|
978
|
+
this.inputContainerElement.style.width = "100%";
|
979
|
+
this.logElement.appendChild(this.inputContainerElement);
|
980
|
+
|
981
|
+
this.inputElement = this.docReference.createElement('input');
|
982
|
+
this.inputContainerElement.appendChild(this.inputElement);
|
983
|
+
this.inputElement.style.width = '100%';
|
984
|
+
this.inputElement.style.borderWidth = '0px'; // Inputs with 100% width always seem to be too large (I HATE THEM) they only work if the border, margin and padding are 0
|
985
|
+
this.inputElement.style.margin = '0px';
|
986
|
+
this.inputElement.style.padding = '0px';
|
987
|
+
this.inputElement.value = 'Type command here';
|
988
|
+
this.inputElement.setAttribute('autocomplete', 'off'); // So Firefox doesn't flip out
|
989
|
+
|
990
|
+
Log4js.attachEvent(this.inputElement, 'keyup', Log4js.bind(this.handleInput, this));
|
991
|
+
Log4js.attachEvent(this.inputElement, 'click', Log4js.bind( function() {this.inputElement.select();}, this));
|
992
|
+
|
993
|
+
if(this.inline){
|
994
|
+
window.setInterval(Log4js.bind(this.repositionWindow, this), 500);
|
995
|
+
this.repositionWindow();
|
996
|
+
// Allow acess key link
|
997
|
+
var accessElement = this.docReference.createElement('button');
|
998
|
+
accessElement.style.position = "absolute";
|
999
|
+
accessElement.style.top = "-100px";
|
1000
|
+
accessElement.accessKey = this.accesskey;
|
1001
|
+
accessElement.onclick = Log4js.bind(this.toggle, this);
|
1002
|
+
this.docReference.body.appendChild(accessElement);
|
1003
|
+
} else {
|
1004
|
+
this.show();
|
1005
|
+
}
|
1006
|
+
},
|
1007
|
+
/**
|
1008
|
+
* shows/hide an element
|
1009
|
+
* @private
|
1010
|
+
* @return true if shown
|
1011
|
+
*/
|
1012
|
+
toggle : function() {
|
1013
|
+
if (this.logElement.style.display == 'none') {
|
1014
|
+
this.show();
|
1015
|
+
return true;
|
1016
|
+
} else {
|
1017
|
+
this.hide();
|
1018
|
+
return false;
|
1019
|
+
}
|
1020
|
+
},
|
1021
|
+
/**
|
1022
|
+
* @private
|
1023
|
+
*/
|
1024
|
+
show : function() {
|
1025
|
+
this.logElement.style.display = '';
|
1026
|
+
this.outputElement.scrollTop = this.outputElement.scrollHeight; // Scroll to bottom when toggled
|
1027
|
+
this.inputElement.select();
|
1028
|
+
},
|
1029
|
+
/**
|
1030
|
+
* @private
|
1031
|
+
*/
|
1032
|
+
hide : function() {
|
1033
|
+
this.logElement.style.display = 'none';
|
1034
|
+
},
|
1035
|
+
/**
|
1036
|
+
* @private
|
1037
|
+
* @param message
|
1038
|
+
* @style
|
1039
|
+
*/
|
1040
|
+
output : function(message, style) {
|
1041
|
+
|
1042
|
+
// If we are at the bottom of the window, then keep scrolling with the output
|
1043
|
+
var shouldScroll = (this.outputElement.scrollTop + (2 * this.outputElement.clientHeight)) >= this.outputElement.scrollHeight;
|
1044
|
+
|
1045
|
+
this.outputCount++;
|
1046
|
+
style = (style ? style += ';' : '');
|
1047
|
+
style += 'padding:1px;margin:0 0 5px 0';
|
1048
|
+
|
1049
|
+
if (this.outputCount % 2 === 0) {
|
1050
|
+
style += ";background-color:#101010";
|
1051
|
+
}
|
1052
|
+
|
1053
|
+
message = message || "undefined";
|
1054
|
+
message = message.toString();
|
1055
|
+
|
1056
|
+
this.outputElement.innerHTML += "<pre style='" + style + "'>" + message + "</pre>";
|
1057
|
+
|
1058
|
+
if (shouldScroll) {
|
1059
|
+
this.outputElement.scrollTop = this.outputElement.scrollHeight;
|
1060
|
+
}
|
1061
|
+
},
|
1062
|
+
|
1063
|
+
/**
|
1064
|
+
* @private
|
1065
|
+
*/
|
1066
|
+
updateTags : function() {
|
1067
|
+
|
1068
|
+
var pattern = this.tagFilterElement.value;
|
1069
|
+
|
1070
|
+
if (this.tagPattern == pattern) {
|
1071
|
+
return;
|
1072
|
+
}
|
1073
|
+
|
1074
|
+
try {
|
1075
|
+
new RegExp(pattern);
|
1076
|
+
} catch (e) {
|
1077
|
+
return;
|
1078
|
+
}
|
1079
|
+
|
1080
|
+
this.tagPattern = pattern;
|
1081
|
+
|
1082
|
+
this.outputElement.innerHTML = "";
|
1083
|
+
|
1084
|
+
// Go through each log entry again
|
1085
|
+
this.outputCount = 0;
|
1086
|
+
for (var i = 0; i < this.logger.loggingEvents.length; i++) {
|
1087
|
+
this.doAppend(this.logger.loggingEvents[i]);
|
1088
|
+
}
|
1089
|
+
},
|
1090
|
+
|
1091
|
+
/**
|
1092
|
+
* @private
|
1093
|
+
*/
|
1094
|
+
repositionWindow : function() {
|
1095
|
+
var offset = window.pageYOffset || this.docReference.documentElement.scrollTop || this.docReference.body.scrollTop;
|
1096
|
+
var pageHeight = self.innerHeight || this.docReference.documentElement.clientHeight || this.docReference.body.clientHeight;
|
1097
|
+
this.logElement.style.top = (offset + pageHeight - this.logElement.offsetHeight) + "px";
|
1098
|
+
},
|
1099
|
+
|
1100
|
+
/**
|
1101
|
+
* @param loggingEvent event to be logged
|
1102
|
+
* @see Log4js.Appender#doAppend
|
1103
|
+
*/
|
1104
|
+
doAppend : function(loggingEvent) {
|
1105
|
+
|
1106
|
+
if(this.popupBlocker) {
|
1107
|
+
//popup blocked, we return in this case
|
1108
|
+
return;
|
1109
|
+
}
|
1110
|
+
|
1111
|
+
if ((!this.inline) && (!this.winReference || this.winReference.closed)) {
|
1112
|
+
this.initialize();
|
1113
|
+
}
|
1114
|
+
|
1115
|
+
if (this.tagPattern !== null &&
|
1116
|
+
loggingEvent.level.toString().search(new RegExp(this.tagPattern, 'igm')) == -1) {
|
1117
|
+
return;
|
1118
|
+
}
|
1119
|
+
|
1120
|
+
var style = '';
|
1121
|
+
|
1122
|
+
if (loggingEvent.level.toString().search(/ERROR/) != -1) {
|
1123
|
+
style += 'color:red';
|
1124
|
+
} else if (loggingEvent.level.toString().search(/FATAL/) != -1) {
|
1125
|
+
style += 'color:red';
|
1126
|
+
} else if (loggingEvent.level.toString().search(/WARN/) != -1) {
|
1127
|
+
style += 'color:orange';
|
1128
|
+
} else if (loggingEvent.level.toString().search(/DEBUG/) != -1) {
|
1129
|
+
style += 'color:green';
|
1130
|
+
} else if (loggingEvent.level.toString().search(/INFO/) != -1) {
|
1131
|
+
style += 'color:white';
|
1132
|
+
} else {
|
1133
|
+
style += 'color:yellow';
|
1134
|
+
}
|
1135
|
+
|
1136
|
+
this.output(this.layout.format(loggingEvent), style);
|
1137
|
+
},
|
1138
|
+
|
1139
|
+
/**
|
1140
|
+
* @see Log4js.Appender#doClear
|
1141
|
+
*/
|
1142
|
+
doClear : function() {
|
1143
|
+
this.outputElement.innerHTML = "";
|
1144
|
+
},
|
1145
|
+
/**
|
1146
|
+
* @private
|
1147
|
+
* @param e
|
1148
|
+
*/
|
1149
|
+
handleInput : function(e) {
|
1150
|
+
if (e.keyCode == 13 ) {
|
1151
|
+
var command = this.inputElement.value;
|
1152
|
+
|
1153
|
+
switch(command) {
|
1154
|
+
case "clear":
|
1155
|
+
this.logger.clear();
|
1156
|
+
break;
|
1157
|
+
|
1158
|
+
default:
|
1159
|
+
var consoleOutput = "";
|
1160
|
+
|
1161
|
+
try {
|
1162
|
+
consoleOutput = eval(this.inputElement.value);
|
1163
|
+
} catch (e) {
|
1164
|
+
this.logger.error("Problem parsing input <" + command + ">" + e.message);
|
1165
|
+
break;
|
1166
|
+
}
|
1167
|
+
|
1168
|
+
this.logger.trace(consoleOutput);
|
1169
|
+
break;
|
1170
|
+
}
|
1171
|
+
|
1172
|
+
if (this.inputElement.value !== "" && this.inputElement.value !== this.commandHistory[0]) {
|
1173
|
+
this.commandHistory.unshift(this.inputElement.value);
|
1174
|
+
}
|
1175
|
+
|
1176
|
+
this.commandIndex = 0;
|
1177
|
+
this.inputElement.value = "";
|
1178
|
+
} else if (e.keyCode == 38 && this.commandHistory.length > 0) {
|
1179
|
+
this.inputElement.value = this.commandHistory[this.commandIndex];
|
1180
|
+
|
1181
|
+
if (this.commandIndex < this.commandHistory.length - 1) {
|
1182
|
+
this.commandIndex += 1;
|
1183
|
+
}
|
1184
|
+
} else if (e.keyCode == 40 && this.commandHistory.length > 0) {
|
1185
|
+
if (this.commandIndex > 0) {
|
1186
|
+
this.commandIndex -= 1;
|
1187
|
+
}
|
1188
|
+
|
1189
|
+
this.inputElement.value = this.commandHistory[this.commandIndex];
|
1190
|
+
} else {
|
1191
|
+
this.commandIndex = 0;
|
1192
|
+
}
|
1193
|
+
},
|
1194
|
+
|
1195
|
+
/**
|
1196
|
+
* toString
|
1197
|
+
*/
|
1198
|
+
toString: function() {
|
1199
|
+
return "Log4js.ConsoleAppender[inline=" + this.inline + "]";
|
1200
|
+
}
|
1201
|
+
});
|
1202
|
+
|
1203
|
+
/**
|
1204
|
+
* Metatag Appender writing the logs to meta tags
|
1205
|
+
*
|
1206
|
+
* @extends Log4js.Appender
|
1207
|
+
* @constructor
|
1208
|
+
* @param logger log4js instance this appender is attached to
|
1209
|
+
* @author Stephan Strittmatter
|
1210
|
+
*/
|
1211
|
+
Log4js.MetatagAppender = function() {
|
1212
|
+
this.currentLine = 0;
|
1213
|
+
};
|
1214
|
+
Log4js.MetatagAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1215
|
+
/**
|
1216
|
+
* @param loggingEvent event to be logged
|
1217
|
+
* @see Log4js.Appender#doAppend
|
1218
|
+
*/
|
1219
|
+
doAppend: function(loggingEvent) {
|
1220
|
+
var now = new Date();
|
1221
|
+
var lines = loggingEvent.message.split("\n");
|
1222
|
+
var headTag = document.getElementsByTagName("head")[0];
|
1223
|
+
|
1224
|
+
for (var i = 1; i <= lines.length; i++) {
|
1225
|
+
var value = lines[i - 1];
|
1226
|
+
if (i == 1) {
|
1227
|
+
value = loggingEvent.level.toString() + ": " + value;
|
1228
|
+
} else {
|
1229
|
+
value = "> " + value;
|
1230
|
+
}
|
1231
|
+
|
1232
|
+
var metaTag = document.createElement("meta");
|
1233
|
+
metaTag.setAttribute("name", "X-log4js:" + this.currentLine);
|
1234
|
+
metaTag.setAttribute("content", value);
|
1235
|
+
headTag.appendChild(metaTag);
|
1236
|
+
this.currentLine += 1;
|
1237
|
+
}
|
1238
|
+
},
|
1239
|
+
|
1240
|
+
/**
|
1241
|
+
* toString
|
1242
|
+
*/
|
1243
|
+
toString: function() {
|
1244
|
+
return "Log4js.MetatagAppender";
|
1245
|
+
}
|
1246
|
+
});
|
1247
|
+
|
1248
|
+
/**
|
1249
|
+
* AJAX Appender sending {@link Log4js.LoggingEvent}s asynchron via
|
1250
|
+
* <code>XMLHttpRequest</code> to server.<br />
|
1251
|
+
* The {@link Log4js.LoggingEvent} is POSTed as response content and is
|
1252
|
+
* formatted by the accociated layout. Default layout is {@link Log4js.XMLLayout}.
|
1253
|
+
* The <code>threshold</code> defines when the logs
|
1254
|
+
* should be send to the server. By default every event is sent on its
|
1255
|
+
* own (threshold=1). If it is set to 10, then the events are send in groups of
|
1256
|
+
* 10 events.
|
1257
|
+
*
|
1258
|
+
* @extends Log4js.Appender
|
1259
|
+
* @constructor
|
1260
|
+
* @param {Log4js.Logger} logger log4js instance this appender is attached to
|
1261
|
+
* @param {String} loggingUrl url where appender will post log messages to
|
1262
|
+
* @author Stephan Strittmatter
|
1263
|
+
*/
|
1264
|
+
Log4js.AjaxAppender = function(loggingUrl) {
|
1265
|
+
|
1266
|
+
/**
|
1267
|
+
* is still esnding data to server
|
1268
|
+
* @type boolean
|
1269
|
+
* @private
|
1270
|
+
*/
|
1271
|
+
this.isInProgress = false;
|
1272
|
+
|
1273
|
+
/**
|
1274
|
+
* @type String
|
1275
|
+
* @private
|
1276
|
+
*/
|
1277
|
+
this.loggingUrl = loggingUrl || "logging.log4js";
|
1278
|
+
|
1279
|
+
/**
|
1280
|
+
* @type Integer
|
1281
|
+
* @private
|
1282
|
+
*/
|
1283
|
+
this.threshold = 1;
|
1284
|
+
|
1285
|
+
/**
|
1286
|
+
* timeout when request is aborted.
|
1287
|
+
* @private
|
1288
|
+
*/
|
1289
|
+
this.timeout = 2000;
|
1290
|
+
|
1291
|
+
/**
|
1292
|
+
* List of LoggingEvents which should be send after threshold is reached.
|
1293
|
+
* @type Map
|
1294
|
+
* @private
|
1295
|
+
*/
|
1296
|
+
this.loggingEventMap = new Log4js.FifoBuffer();
|
1297
|
+
|
1298
|
+
/**
|
1299
|
+
* @type Log4js.Layout
|
1300
|
+
* @private
|
1301
|
+
*/
|
1302
|
+
this.layout = new Log4js.XMLLayout();
|
1303
|
+
/**
|
1304
|
+
* @type XMLHttpRequest
|
1305
|
+
* @private
|
1306
|
+
*/
|
1307
|
+
this.httpRequest = null;
|
1308
|
+
};
|
1309
|
+
|
1310
|
+
Log4js.AjaxAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1311
|
+
/**
|
1312
|
+
* sends the logs to the server
|
1313
|
+
* @param loggingEvent event to be logged
|
1314
|
+
* @see Log4js.Appender#doAppend
|
1315
|
+
*/
|
1316
|
+
doAppend: function(loggingEvent) {
|
1317
|
+
log4jsLogger.trace("> AjaxAppender.append");
|
1318
|
+
|
1319
|
+
if (this.loggingEventMap.length() <= this.threshold || this.isInProgress === true) {
|
1320
|
+
this.loggingEventMap.push(loggingEvent);
|
1321
|
+
}
|
1322
|
+
|
1323
|
+
if(this.loggingEventMap.length() >= this.threshold && this.isInProgress === false) {
|
1324
|
+
//if threshold is reached send the events and reset current threshold
|
1325
|
+
this.send();
|
1326
|
+
}
|
1327
|
+
|
1328
|
+
log4jsLogger.trace("< AjaxAppender.append");
|
1329
|
+
},
|
1330
|
+
|
1331
|
+
/** @see Appender#doClear */
|
1332
|
+
doClear: function() {
|
1333
|
+
log4jsLogger.trace("> AjaxAppender.doClear" );
|
1334
|
+
if(this.loggingEventMap.length() > 0) {
|
1335
|
+
this.send();
|
1336
|
+
}
|
1337
|
+
log4jsLogger.trace("< AjaxAppender.doClear" );
|
1338
|
+
},
|
1339
|
+
|
1340
|
+
/**
|
1341
|
+
* Set the threshold when logs have to be send. Default threshold is 1.
|
1342
|
+
* @praram {int} threshold new threshold
|
1343
|
+
*/
|
1344
|
+
setThreshold: function(threshold) {
|
1345
|
+
log4jsLogger.trace("> AjaxAppender.setThreshold: " + threshold );
|
1346
|
+
this.threshold = threshold;
|
1347
|
+
log4jsLogger.trace("< AjaxAppender.setThreshold" );
|
1348
|
+
},
|
1349
|
+
|
1350
|
+
/**
|
1351
|
+
* Set the timeout in milli seconds until sending request is aborted.
|
1352
|
+
* Default is 2000 ms.
|
1353
|
+
* @param {int} milliseconds the new timeout
|
1354
|
+
*/
|
1355
|
+
setTimeout: function(milliseconds) {
|
1356
|
+
this.timeout = milliseconds;
|
1357
|
+
},
|
1358
|
+
|
1359
|
+
/**
|
1360
|
+
* send the request.
|
1361
|
+
*/
|
1362
|
+
send: function() {
|
1363
|
+
if(this.loggingEventMap.length() >0) {
|
1364
|
+
|
1365
|
+
log4jsLogger.trace("> AjaxAppender.send");
|
1366
|
+
|
1367
|
+
|
1368
|
+
this.isInProgress = true;
|
1369
|
+
var a = [];
|
1370
|
+
|
1371
|
+
for(var i = 0; i < this.loggingEventMap.length() && i < this.threshold; i++) {
|
1372
|
+
a.push(this.layout.format(this.loggingEventMap.pull()));
|
1373
|
+
}
|
1374
|
+
|
1375
|
+
var content = this.layout.getHeader();
|
1376
|
+
content += a.join(this.layout.getSeparator());
|
1377
|
+
content += this.layout.getFooter();
|
1378
|
+
|
1379
|
+
var appender = this;
|
1380
|
+
if(this.httpRequest === null){
|
1381
|
+
this.httpRequest = this.getXmlHttpRequest();
|
1382
|
+
}
|
1383
|
+
this.httpRequest.onreadystatechange = function() {
|
1384
|
+
appender.onReadyStateChanged.call(appender);
|
1385
|
+
};
|
1386
|
+
|
1387
|
+
this.httpRequest.open("POST", this.loggingUrl, true);
|
1388
|
+
// set the request headers.
|
1389
|
+
//this.httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
|
1390
|
+
this.httpRequest.setRequestHeader("Content-type", this.layout.getContentType());
|
1391
|
+
//REFERER will be the top-level
|
1392
|
+
// URI which may differ from the location of the error if
|
1393
|
+
// it occurs in an included .js file
|
1394
|
+
this.httpRequest.setRequestHeader("REFERER", location.href);
|
1395
|
+
this.httpRequest.setRequestHeader("Content-length", content.length);
|
1396
|
+
this.httpRequest.setRequestHeader("Connection", "close");
|
1397
|
+
this.httpRequest.send( content );
|
1398
|
+
|
1399
|
+
appender = this;
|
1400
|
+
|
1401
|
+
try {
|
1402
|
+
window.setTimeout(function(){
|
1403
|
+
log4jsLogger.trace("> AjaxAppender.timeout");
|
1404
|
+
appender.httpRequest.onreadystatechange = function(){return;};
|
1405
|
+
appender.httpRequest.abort();
|
1406
|
+
//this.httpRequest = null;
|
1407
|
+
appender.isInProgress = false;
|
1408
|
+
|
1409
|
+
if(appender.loggingEventMap.length() > 0) {
|
1410
|
+
appender.send();
|
1411
|
+
}
|
1412
|
+
log4jsLogger.trace("< AjaxAppender.timeout");
|
1413
|
+
}, this.timeout);
|
1414
|
+
} catch (e) {
|
1415
|
+
log4jsLogger.fatal(e);
|
1416
|
+
}
|
1417
|
+
log4jsLogger.trace("> AjaxAppender.send");
|
1418
|
+
}
|
1419
|
+
},
|
1420
|
+
|
1421
|
+
/**
|
1422
|
+
* @private
|
1423
|
+
*/
|
1424
|
+
onReadyStateChanged: function() {
|
1425
|
+
log4jsLogger.trace("> AjaxAppender.onReadyStateChanged");
|
1426
|
+
var req = this.httpRequest;
|
1427
|
+
if (this.httpRequest.readyState != 4) {
|
1428
|
+
log4jsLogger.trace("< AjaxAppender.onReadyStateChanged: readyState " + req.readyState + " != 4");
|
1429
|
+
return;
|
1430
|
+
}
|
1431
|
+
|
1432
|
+
var success = ((typeof req.status === "undefined") || req.status === 0 || (req.status >= 200 && req.status < 300));
|
1433
|
+
|
1434
|
+
if (success) {
|
1435
|
+
log4jsLogger.trace(" AjaxAppender.onReadyStateChanged: success");
|
1436
|
+
|
1437
|
+
//ready sending data
|
1438
|
+
this.isInProgress = false;
|
1439
|
+
|
1440
|
+
} else {
|
1441
|
+
var msg = " AjaxAppender.onReadyStateChanged: XMLHttpRequest request to URL " + this.loggingUrl + " returned status code " + this.httpRequest.status;
|
1442
|
+
log4jsLogger.error(msg);
|
1443
|
+
}
|
1444
|
+
|
1445
|
+
log4jsLogger.trace("< AjaxAppender.onReadyStateChanged: readyState == 4");
|
1446
|
+
},
|
1447
|
+
/**
|
1448
|
+
* Get the XMLHttpRequest object independent of browser.
|
1449
|
+
* @private
|
1450
|
+
*/
|
1451
|
+
getXmlHttpRequest: function() {
|
1452
|
+
log4jsLogger.trace("> AjaxAppender.getXmlHttpRequest");
|
1453
|
+
|
1454
|
+
var httpRequest = false;
|
1455
|
+
|
1456
|
+
try {
|
1457
|
+
if (window.XMLHttpRequest) { // Mozilla, Safari, IE7...
|
1458
|
+
httpRequest = new XMLHttpRequest();
|
1459
|
+
if (httpRequest.overrideMimeType) {
|
1460
|
+
httpRequest.overrideMimeType(this.layout.getContentType());
|
1461
|
+
}
|
1462
|
+
} else if (window.ActiveXObject) { // IE
|
1463
|
+
try {
|
1464
|
+
httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
|
1465
|
+
} catch (e) {
|
1466
|
+
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
|
1467
|
+
}
|
1468
|
+
}
|
1469
|
+
} catch (e) {
|
1470
|
+
httpRequest = false;
|
1471
|
+
}
|
1472
|
+
|
1473
|
+
if (!httpRequest) {
|
1474
|
+
log4jsLogger.fatal("Unfortunatelly your browser does not support AjaxAppender for log4js!");
|
1475
|
+
}
|
1476
|
+
|
1477
|
+
log4jsLogger.trace("< AjaxAppender.getXmlHttpRequest");
|
1478
|
+
return httpRequest;
|
1479
|
+
},
|
1480
|
+
|
1481
|
+
/**
|
1482
|
+
* toString
|
1483
|
+
*/
|
1484
|
+
toString: function() {
|
1485
|
+
return "Log4js.AjaxAppender[loggingUrl=" + this.loggingUrl + ", threshold=" + this.threshold + "]";
|
1486
|
+
}
|
1487
|
+
});
|
1488
|
+
|
1489
|
+
/**
|
1490
|
+
* File Appender writing the logs to a text file.
|
1491
|
+
* PLEASE NOTE - Only works in IE and Mozilla
|
1492
|
+
* use ActiveX to write file on IE
|
1493
|
+
* use XPCom components to write file on Mozilla
|
1494
|
+
*
|
1495
|
+
* @extends Log4js.Appender
|
1496
|
+
* @constructor
|
1497
|
+
* @param logger log4js instance this appender is attached to
|
1498
|
+
* @param file file log messages will be written to
|
1499
|
+
* @author Seth Chisamore
|
1500
|
+
* @author Nicolas Justin njustin@idealx.com
|
1501
|
+
* @author Gregory Kokanosky gkokanosky@idealx.com
|
1502
|
+
*/
|
1503
|
+
Log4js.FileAppender = function(file) {
|
1504
|
+
|
1505
|
+
this.layout = new Log4js.SimpleLayout();
|
1506
|
+
this.isIE = 'undefined';
|
1507
|
+
|
1508
|
+
this.file = file || "log4js.log";
|
1509
|
+
|
1510
|
+
try{
|
1511
|
+
this.fso = new ActiveXObject("Scripting.FileSystemObject");
|
1512
|
+
this.isIE = true;
|
1513
|
+
} catch(e){
|
1514
|
+
try {
|
1515
|
+
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
1516
|
+
this.fso = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
|
1517
|
+
this.isIE = false; //mozilla & co
|
1518
|
+
} catch (e) {
|
1519
|
+
log4jsLogger.error(e);
|
1520
|
+
}
|
1521
|
+
}
|
1522
|
+
};
|
1523
|
+
|
1524
|
+
Log4js.FileAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1525
|
+
/**
|
1526
|
+
* @param loggingEvent event to be logged
|
1527
|
+
* @see Log4js.Appender#doAppend
|
1528
|
+
*/
|
1529
|
+
doAppend: function(loggingEvent) {
|
1530
|
+
try {
|
1531
|
+
var fileHandle = null;
|
1532
|
+
|
1533
|
+
if( this.isIE === 'undefined') {
|
1534
|
+
log4jsLogger.error("Unsupported ")
|
1535
|
+
}
|
1536
|
+
else if( this.isIE ){
|
1537
|
+
// try opening existing file, create if needed
|
1538
|
+
fileHandle = this.fso.OpenTextFile(this.file, 8, true);
|
1539
|
+
// write out our data
|
1540
|
+
fileHandle.WriteLine(this.layout.format(loggingEvent));
|
1541
|
+
fileHandle.close();
|
1542
|
+
} else {
|
1543
|
+
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
1544
|
+
this.fso.initWithPath(this.file);
|
1545
|
+
if(!this.fso.exists()) {
|
1546
|
+
//create file if needed
|
1547
|
+
this.fso.create(0x00, 0600);
|
1548
|
+
}
|
1549
|
+
|
1550
|
+
fileHandle = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
|
1551
|
+
fileHandle.init( this.fso, 0x04 | 0x08 | 0x10, 064, 0);
|
1552
|
+
var line = this.layout.format(loggingEvent);
|
1553
|
+
fileHandle.write(line, line.length); //write data
|
1554
|
+
fileHandle.close();
|
1555
|
+
}
|
1556
|
+
} catch (e) {
|
1557
|
+
log4jsLogger.error(e);
|
1558
|
+
}
|
1559
|
+
},
|
1560
|
+
/*
|
1561
|
+
* @see Log4js.Appender#doClear
|
1562
|
+
*/
|
1563
|
+
doClear: function() {
|
1564
|
+
try {
|
1565
|
+
if( this.isIE ){
|
1566
|
+
var fileHandle = this.fso.GetFile(this.file);
|
1567
|
+
fileHandle.Delete();
|
1568
|
+
} else {
|
1569
|
+
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
1570
|
+
this.fso.initWithPath(this.file);
|
1571
|
+
if(this.fso.exists()) {
|
1572
|
+
this.fso.remove(false);
|
1573
|
+
}
|
1574
|
+
}
|
1575
|
+
} catch (e) {
|
1576
|
+
log4jsLogger.error(e);
|
1577
|
+
}
|
1578
|
+
},
|
1579
|
+
|
1580
|
+
/**
|
1581
|
+
* toString
|
1582
|
+
*/
|
1583
|
+
toString: function() {
|
1584
|
+
return "Log4js.FileAppender[file=" + this.file + "]";
|
1585
|
+
}
|
1586
|
+
});
|
1587
|
+
|
1588
|
+
/**
|
1589
|
+
* Windows Event Appender writes the logs to the Windows Event log.
|
1590
|
+
* PLEASE NOTE - Only works in IE..uses ActiveX to write to Windows Event log
|
1591
|
+
*
|
1592
|
+
* @extends Log4js.Appender
|
1593
|
+
* @constructor
|
1594
|
+
* @param logger log4js instance this appender is attached to
|
1595
|
+
* @author Seth Chisamore
|
1596
|
+
*/
|
1597
|
+
Log4js.WindowsEventAppender = function() {
|
1598
|
+
|
1599
|
+
this.layout = new Log4js.SimpleLayout();
|
1600
|
+
|
1601
|
+
try {
|
1602
|
+
this.shell = new ActiveXObject("WScript.Shell");
|
1603
|
+
} catch(e) {
|
1604
|
+
log4jsLogger.error(e);
|
1605
|
+
}
|
1606
|
+
};
|
1607
|
+
|
1608
|
+
Log4js.WindowsEventAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1609
|
+
/**
|
1610
|
+
* @param loggingEvent event to be logged
|
1611
|
+
* @see Log4js.Appender#doAppend
|
1612
|
+
*/
|
1613
|
+
doAppend: function(loggingEvent) {
|
1614
|
+
var winLevel = 4;
|
1615
|
+
|
1616
|
+
// Map log level to windows event log level.
|
1617
|
+
// Windows events: - SUCCESS: 0, ERROR: 1, WARNING: 2, INFORMATION: 4, AUDIT_SUCCESS: 8, AUDIT_FAILURE: 16
|
1618
|
+
switch (loggingEvent.level) {
|
1619
|
+
case Log4js.Level.FATAL:
|
1620
|
+
winLevel = 1;
|
1621
|
+
break;
|
1622
|
+
case Log4js.Level.ERROR:
|
1623
|
+
winLevel = 1;
|
1624
|
+
break;
|
1625
|
+
case Log4js.Level.WARN:
|
1626
|
+
winLevel = 2;
|
1627
|
+
break;
|
1628
|
+
default:
|
1629
|
+
winLevel = 4;
|
1630
|
+
break;
|
1631
|
+
}
|
1632
|
+
|
1633
|
+
try {
|
1634
|
+
this.shell.LogEvent(winLevel, this.level.format(loggingEvent));
|
1635
|
+
} catch(e) {
|
1636
|
+
log4jsLogger.error(e);
|
1637
|
+
}
|
1638
|
+
},
|
1639
|
+
|
1640
|
+
/**
|
1641
|
+
* toString
|
1642
|
+
*/
|
1643
|
+
toString: function() {
|
1644
|
+
return "Log4js.WindowsEventAppender";
|
1645
|
+
}
|
1646
|
+
});
|
1647
|
+
|
1648
|
+
/**
|
1649
|
+
* JS Alert Appender writes the logs to the JavaScript alert dialog box
|
1650
|
+
* @constructor
|
1651
|
+
* @extends Log4js.Appender
|
1652
|
+
* @param logger log4js instance this appender is attached to
|
1653
|
+
* @author Sébastien LECACHEUR
|
1654
|
+
*/
|
1655
|
+
Log4js.JSAlertAppender = function() {
|
1656
|
+
|
1657
|
+
this.layout = new Log4js.SimpleLayout();
|
1658
|
+
};
|
1659
|
+
|
1660
|
+
Log4js.JSAlertAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1661
|
+
/**
|
1662
|
+
* @see Log4js.Appender#doAppend
|
1663
|
+
*/
|
1664
|
+
doAppend: function(loggingEvent) {
|
1665
|
+
alert(this.layout.getHeader() + this.layout.format(loggingEvent) + this.layout.getFooter());
|
1666
|
+
},
|
1667
|
+
|
1668
|
+
/**
|
1669
|
+
* toString
|
1670
|
+
*/
|
1671
|
+
toString: function() {
|
1672
|
+
return "Log4js.JSAlertAppender";
|
1673
|
+
}
|
1674
|
+
});
|
1675
|
+
|
1676
|
+
/**
|
1677
|
+
* Appender writes the logs to the JavaScript console of Mozilla browser
|
1678
|
+
* More infos: http://kb.mozillazine.org/index.php?title=JavaScript_Console&redirect=no
|
1679
|
+
* PLEASE NOTE - Only works in Mozilla browser
|
1680
|
+
* @constructor
|
1681
|
+
* @extends Log4js.Appender
|
1682
|
+
* @param logger log4js instance this appender is attached to
|
1683
|
+
* @author Stephan Strittmatter
|
1684
|
+
*/
|
1685
|
+
Log4js.MozillaJSConsoleAppender = function() {
|
1686
|
+
this.layout = new Log4js.SimpleLayout();
|
1687
|
+
try {
|
1688
|
+
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
1689
|
+
this.jsConsole = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
|
1690
|
+
this.scriptError = Components.classes["@mozilla.org/scripterror;1"].createInstance(Components.interfaces.nsIScriptError);
|
1691
|
+
} catch (e) {
|
1692
|
+
log4jsLogger.error(e);
|
1693
|
+
}
|
1694
|
+
};
|
1695
|
+
|
1696
|
+
Log4js.MozillaJSConsoleAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1697
|
+
/**
|
1698
|
+
* @see Log4js.Appender#doAppend
|
1699
|
+
*/
|
1700
|
+
doAppend: function(loggingEvent) {
|
1701
|
+
try {
|
1702
|
+
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
1703
|
+
this.scriptError.init(this.layout.format(loggingEvent), null, null, null, null, this.getFlag(loggingEvent), loggingEvent.categoryName);
|
1704
|
+
this.jsConsole.logMessage(this.scriptError);
|
1705
|
+
} catch (e) {
|
1706
|
+
log4jsLogger.error(e);
|
1707
|
+
}
|
1708
|
+
},
|
1709
|
+
|
1710
|
+
/**
|
1711
|
+
* toString
|
1712
|
+
*/
|
1713
|
+
toString: function() {
|
1714
|
+
return "Log4js.MozillaJSConsoleAppender";
|
1715
|
+
},
|
1716
|
+
|
1717
|
+
/**
|
1718
|
+
* Map Log4js.Level to jsConsole Flags:
|
1719
|
+
* <ul>
|
1720
|
+
* <li>nsIScriptError.errorFlag (0) = Level.Error</li>
|
1721
|
+
* <li>nsIScriptError.warningFlag (1)= Log4js.Level.WARN</li>
|
1722
|
+
* <li>nsIScriptError.exceptionFlag (2) = Log4js.Level.FATAL</li>
|
1723
|
+
* <li>nsIScriptError.strictFlag (4) = unused</li>
|
1724
|
+
* </ul>
|
1725
|
+
* @private
|
1726
|
+
*/
|
1727
|
+
getFlag: function(loggingEvent)
|
1728
|
+
{
|
1729
|
+
var retval;
|
1730
|
+
switch (loggingEvent.level) {
|
1731
|
+
case Log4js.Level.FATAL:
|
1732
|
+
retval = 2;//nsIScriptError.exceptionFlag = 2
|
1733
|
+
break;
|
1734
|
+
case Log4js.Level.ERROR:
|
1735
|
+
retval = 0;//nsIScriptError.errorFlag
|
1736
|
+
break;
|
1737
|
+
case Log4js.Level.WARN:
|
1738
|
+
retval = 1;//nsIScriptError.warningFlag = 1
|
1739
|
+
break;
|
1740
|
+
default:
|
1741
|
+
retval = 1;//nsIScriptError.warningFlag = 1
|
1742
|
+
break;
|
1743
|
+
}
|
1744
|
+
|
1745
|
+
return retval;
|
1746
|
+
}
|
1747
|
+
});
|
1748
|
+
|
1749
|
+
/**
|
1750
|
+
* Appender writes the logs to the JavaScript console of Opera browser
|
1751
|
+
* PLEASE NOTE - Only works in Opera browser
|
1752
|
+
* @constructor
|
1753
|
+
* @extends Log4js.Appender
|
1754
|
+
* @param logger log4js instance this appender is attached to
|
1755
|
+
* @author Stephan Strittmatter
|
1756
|
+
*/
|
1757
|
+
Log4js.OperaJSConsoleAppender = function() {
|
1758
|
+
this.layout = new Log4js.SimpleLayout();
|
1759
|
+
};
|
1760
|
+
|
1761
|
+
Log4js.OperaJSConsoleAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1762
|
+
/**
|
1763
|
+
* @see Log4js.Appender#doAppend
|
1764
|
+
*/
|
1765
|
+
doAppend: function(loggingEvent) {
|
1766
|
+
opera.postError(this.layout.format(loggingEvent));
|
1767
|
+
},
|
1768
|
+
|
1769
|
+
/**
|
1770
|
+
* toString
|
1771
|
+
*/
|
1772
|
+
toString: function() {
|
1773
|
+
return "Log4js.OperaJSConsoleAppender";
|
1774
|
+
}
|
1775
|
+
});
|
1776
|
+
|
1777
|
+
/**
|
1778
|
+
* Appender writes the logs to the JavaScript console of Safari browser
|
1779
|
+
* PLEASE NOTE - Only works in Safari browser
|
1780
|
+
* @constructor
|
1781
|
+
* @extends Log4js.Appender
|
1782
|
+
* @param logger log4js instance this appender is attached to
|
1783
|
+
* @author Stephan Strittmatter
|
1784
|
+
*/
|
1785
|
+
Log4js.SafariJSConsoleAppender = function() {
|
1786
|
+
this.layout = new Log4js.SimpleLayout();
|
1787
|
+
};
|
1788
|
+
|
1789
|
+
Log4js.SafariJSConsoleAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1790
|
+
/**
|
1791
|
+
* @see Log4js.Appender#doAppend
|
1792
|
+
*/
|
1793
|
+
doAppend: function(loggingEvent) {
|
1794
|
+
window.console.log(this.layout.format(loggingEvent));
|
1795
|
+
},
|
1796
|
+
|
1797
|
+
/**
|
1798
|
+
* toString
|
1799
|
+
*/
|
1800
|
+
toString: function() {
|
1801
|
+
return "Log4js.SafariJSConsoleAppender";
|
1802
|
+
}
|
1803
|
+
});
|
1804
|
+
|
1805
|
+
/**
|
1806
|
+
* JavaScript Console Appender which is browser independent.
|
1807
|
+
* It checks internally for the current browser and adds delegate to
|
1808
|
+
* specific JavaScript Console Appender of the browser.
|
1809
|
+
*
|
1810
|
+
* @author Stephan Strittmatter
|
1811
|
+
* @since 1.0
|
1812
|
+
*/
|
1813
|
+
Log4js.BrowserConsoleAppender = function() {
|
1814
|
+
/**
|
1815
|
+
* Delegate for browser specific implementation
|
1816
|
+
* @type Log4js.Appender
|
1817
|
+
* @private
|
1818
|
+
*/
|
1819
|
+
this.consoleDelegate = null;
|
1820
|
+
|
1821
|
+
if (window.console) {
|
1822
|
+
this.consoleDelegate = new Log4js.SafariJSConsoleAppender();
|
1823
|
+
}
|
1824
|
+
else if (window.opera) {
|
1825
|
+
this.consoleDelegate = new Log4js.OperaJSConsoleAppender();
|
1826
|
+
}
|
1827
|
+
else if(netscape) {
|
1828
|
+
this.consoleDelegate = new Log4js.MozJSConsoleAppender();
|
1829
|
+
}
|
1830
|
+
else {
|
1831
|
+
//@todo
|
1832
|
+
log4jsLogger.error("Unsupported Browser");
|
1833
|
+
}
|
1834
|
+
};
|
1835
|
+
|
1836
|
+
Log4js.BrowserConsoleAppender.prototype = Log4js.extend(new Log4js.Appender(), {
|
1837
|
+
/**
|
1838
|
+
* @see Log4js.Appender#doAppend
|
1839
|
+
*/
|
1840
|
+
doAppend: function(loggingEvent) {
|
1841
|
+
this.consoleDelegate.doAppend(loggingEvent);
|
1842
|
+
},
|
1843
|
+
/**
|
1844
|
+
* @see Log4js.Appender#doClear
|
1845
|
+
*/
|
1846
|
+
doClear: function() {
|
1847
|
+
this.consoleDelegate.doClear();
|
1848
|
+
},
|
1849
|
+
/**
|
1850
|
+
* @see Log4js.Appender#setLayout
|
1851
|
+
*/
|
1852
|
+
setLayout: function(layout){
|
1853
|
+
this.consoleDelegate.setLayout(layout);
|
1854
|
+
},
|
1855
|
+
|
1856
|
+
/**
|
1857
|
+
* toString
|
1858
|
+
*/
|
1859
|
+
toString: function() {
|
1860
|
+
return "Log4js.BrowserConsoleAppender: " + this.consoleDelegate.toString();
|
1861
|
+
}
|
1862
|
+
});
|
1863
|
+
|
1864
|
+
/**
|
1865
|
+
* SimpleLayout consists of the level of the log statement, followed by " - "
|
1866
|
+
* and then the log message itself. For example,
|
1867
|
+
* <code>DEBUG - Hello world</code>
|
1868
|
+
*
|
1869
|
+
* @constructor
|
1870
|
+
* @extends Log4js.Layout
|
1871
|
+
* @extends Layout
|
1872
|
+
* @author Stephan Strittmatter
|
1873
|
+
*/
|
1874
|
+
Log4js.SimpleLayout = function() {
|
1875
|
+
this.LINE_SEP = "\n";
|
1876
|
+
this.LINE_SEP_LEN = 1;
|
1877
|
+
};
|
1878
|
+
|
1879
|
+
Log4js.SimpleLayout.prototype = Log4js.extend(new Log4js.Layout(), {
|
1880
|
+
/**
|
1881
|
+
* Implement this method to create your own layout format.
|
1882
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to format
|
1883
|
+
* @return formatted String
|
1884
|
+
* @type String
|
1885
|
+
*/
|
1886
|
+
format: function(loggingEvent) {
|
1887
|
+
return loggingEvent.level.toString() + " - " + loggingEvent.message + this.LINE_SEP;
|
1888
|
+
},
|
1889
|
+
/**
|
1890
|
+
* Returns the content type output by this layout.
|
1891
|
+
* @return The base class returns "text/plain".
|
1892
|
+
* @type String
|
1893
|
+
*/
|
1894
|
+
getContentType: function() {
|
1895
|
+
return "text/plain";
|
1896
|
+
},
|
1897
|
+
/**
|
1898
|
+
* @return Returns the header for the layout format. The base class returns null.
|
1899
|
+
* @type String
|
1900
|
+
*/
|
1901
|
+
getHeader: function() {
|
1902
|
+
return "";
|
1903
|
+
},
|
1904
|
+
/**
|
1905
|
+
* @return Returns the footer for the layout format. The base class returns null.
|
1906
|
+
* @type String
|
1907
|
+
*/
|
1908
|
+
getFooter: function() {
|
1909
|
+
return "";
|
1910
|
+
}
|
1911
|
+
});
|
1912
|
+
|
1913
|
+
/**
|
1914
|
+
* BasicLayout is a simple layout for storing the loggs. The loggs are stored
|
1915
|
+
* in following format:
|
1916
|
+
* <pre>
|
1917
|
+
* categoryName~startTime [logLevel] message\n
|
1918
|
+
* </pre>
|
1919
|
+
*
|
1920
|
+
* @constructor
|
1921
|
+
* @extends Log4js.Layout
|
1922
|
+
* @author Stephan Strittmatter
|
1923
|
+
*/
|
1924
|
+
Log4js.BasicLayout = function() {
|
1925
|
+
this.LINE_SEP = "\n";
|
1926
|
+
};
|
1927
|
+
|
1928
|
+
Log4js.BasicLayout.prototype = Log4js.extend(new Log4js.Layout(), {
|
1929
|
+
/**
|
1930
|
+
* Implement this method to create your own layout format.
|
1931
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to format
|
1932
|
+
* @return formatted String
|
1933
|
+
* @type String
|
1934
|
+
*/
|
1935
|
+
format: function(loggingEvent) {
|
1936
|
+
return loggingEvent.categoryName + "~" + loggingEvent.startTime.toLocaleString() + " [" + loggingEvent.level.toString() + "] " + loggingEvent.message + this.LINE_SEP;
|
1937
|
+
},
|
1938
|
+
/**
|
1939
|
+
* Returns the content type output by this layout.
|
1940
|
+
* @return The base class returns "text/plain".
|
1941
|
+
* @type String
|
1942
|
+
*/
|
1943
|
+
getContentType: function() {
|
1944
|
+
return "text/plain";
|
1945
|
+
},
|
1946
|
+
/**
|
1947
|
+
* @return Returns the header for the layout format. The base class returns null.
|
1948
|
+
* @type String
|
1949
|
+
*/
|
1950
|
+
getHeader: function() {
|
1951
|
+
return "";
|
1952
|
+
},
|
1953
|
+
/**
|
1954
|
+
* @return Returns the footer for the layout format. The base class returns null.
|
1955
|
+
* @type String
|
1956
|
+
*/
|
1957
|
+
getFooter: function() {
|
1958
|
+
return "";
|
1959
|
+
}
|
1960
|
+
});
|
1961
|
+
|
1962
|
+
/**
|
1963
|
+
* HtmlLayout write the logs in Html format.
|
1964
|
+
*
|
1965
|
+
* @constructor
|
1966
|
+
* @extends Log4js.Layout
|
1967
|
+
* @author Stephan Strittmatter
|
1968
|
+
*/
|
1969
|
+
Log4js.HtmlLayout = function() {return;};
|
1970
|
+
|
1971
|
+
Log4js.HtmlLayout.prototype = Log4js.extend(new Log4js.Layout(), {
|
1972
|
+
/**
|
1973
|
+
* Implement this method to create your own layout format.
|
1974
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to format
|
1975
|
+
* @return formatted String
|
1976
|
+
* @type String
|
1977
|
+
*/
|
1978
|
+
format: function(loggingEvent) {
|
1979
|
+
return "<div style=\"" + this.getStyle(loggingEvent) + "\">" + loggingEvent.getFormattedTimestamp() + " - " + loggingEvent.level.toString() + " - " + loggingEvent.message + "</div>\n";
|
1980
|
+
},
|
1981
|
+
/**
|
1982
|
+
* Returns the content type output by this layout.
|
1983
|
+
* @return The base class returns "text/html".
|
1984
|
+
* @type String
|
1985
|
+
*/
|
1986
|
+
getContentType: function() {
|
1987
|
+
return "text/html";
|
1988
|
+
},
|
1989
|
+
/**
|
1990
|
+
* @return Returns the header for the layout format. The base class returns null.
|
1991
|
+
* @type String
|
1992
|
+
*/
|
1993
|
+
getHeader: function() {
|
1994
|
+
return "<html><head><title>log4js</head><body>";
|
1995
|
+
},
|
1996
|
+
/**
|
1997
|
+
* @return Returns the footer for the layout format. The base class returns null.
|
1998
|
+
* @type String
|
1999
|
+
*/
|
2000
|
+
getFooter: function() {
|
2001
|
+
return "</body></html>";
|
2002
|
+
},
|
2003
|
+
|
2004
|
+
getStyle: function(loggingEvent)
|
2005
|
+
{
|
2006
|
+
var style;
|
2007
|
+
if (loggingEvent.level.toString().search(/ERROR/) != -1) {
|
2008
|
+
style = 'color:red';
|
2009
|
+
} else if (loggingEvent.level.toString().search(/FATAL/) != -1) {
|
2010
|
+
style = 'color:red';
|
2011
|
+
} else if (loggingEvent.level.toString().search(/WARN/) != -1) {
|
2012
|
+
style = 'color:orange';
|
2013
|
+
} else if (loggingEvent.level.toString().search(/DEBUG/) != -1) {
|
2014
|
+
style = 'color:green';
|
2015
|
+
} else if (loggingEvent.level.toString().search(/INFO/) != -1) {
|
2016
|
+
style = 'color:white';
|
2017
|
+
} else {
|
2018
|
+
style = 'color:yellow';
|
2019
|
+
}
|
2020
|
+
return style;
|
2021
|
+
}
|
2022
|
+
});
|
2023
|
+
|
2024
|
+
/**
|
2025
|
+
* XMLLayout write the logs in XML format.
|
2026
|
+
* Layout is simmilar to log4j's XMLLayout:
|
2027
|
+
* <pre>
|
2028
|
+
* <log4js:event category="category" level="Level" client="Client" referer="ref" timestam="Date">
|
2029
|
+
* <log4js:message>Logged message</log4js:message>
|
2030
|
+
* </log4js:event>
|
2031
|
+
* </pre>
|
2032
|
+
* @constructor
|
2033
|
+
* @extends Layout
|
2034
|
+
* @author Stephan Strittmatter
|
2035
|
+
*/
|
2036
|
+
Log4js.XMLLayout = function(){return;};
|
2037
|
+
Log4js.XMLLayout.prototype = Log4js.extend(new Log4js.Layout(), {
|
2038
|
+
/**
|
2039
|
+
* Implement this method to create your own layout format.
|
2040
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to format
|
2041
|
+
* @return formatted String
|
2042
|
+
* @type String
|
2043
|
+
*/
|
2044
|
+
format: function(loggingEvent) {
|
2045
|
+
var useragent = "unknown";
|
2046
|
+
try {
|
2047
|
+
useragent = navigator.userAgent;
|
2048
|
+
} catch(e){
|
2049
|
+
useragent = "unknown";
|
2050
|
+
}
|
2051
|
+
|
2052
|
+
var referer = "unknown";
|
2053
|
+
try {
|
2054
|
+
referer = location.href;
|
2055
|
+
} catch(e){
|
2056
|
+
referer = "unknown";
|
2057
|
+
}
|
2058
|
+
|
2059
|
+
var content = "<log4js:event logger=\"";
|
2060
|
+
content += loggingEvent.categoryName + "\" level=\"";
|
2061
|
+
content += loggingEvent.level.toString() + "\" useragent=\"";
|
2062
|
+
content += useragent + "\" referer=\"";
|
2063
|
+
content += referer.replace(/&/g, "&") + "\" timestamp=\"";
|
2064
|
+
content += loggingEvent.getFormattedTimestamp() + "\">\n";
|
2065
|
+
content += "\t<log4js:message><![CDATA[" + this.escapeCdata(loggingEvent.message) + "]]></log4js:message>\n";
|
2066
|
+
|
2067
|
+
if (loggingEvent.exception) {
|
2068
|
+
content += this.formatException(loggingEvent.exception) ;
|
2069
|
+
}
|
2070
|
+
content += "</log4js:event>\n";
|
2071
|
+
|
2072
|
+
return content;
|
2073
|
+
},
|
2074
|
+
/**
|
2075
|
+
* Returns the content type output by this layout.
|
2076
|
+
* @return The base class returns "text/xml".
|
2077
|
+
* @type String
|
2078
|
+
*/
|
2079
|
+
getContentType: function() {
|
2080
|
+
return "text/xml";
|
2081
|
+
},
|
2082
|
+
/**
|
2083
|
+
* @return Returns the header for the layout format. The base class returns null.
|
2084
|
+
* @type String
|
2085
|
+
*/
|
2086
|
+
getHeader: function() {
|
2087
|
+
return "<log4js:eventSet version=\"" + Log4js.version +
|
2088
|
+
"\" xmlns:log4js=\"http://log4js.berlios.de/2007/log4js/\">\n";
|
2089
|
+
},
|
2090
|
+
/**
|
2091
|
+
* @return Returns the footer for the layout format. The base class returns null.
|
2092
|
+
* @type String
|
2093
|
+
*/
|
2094
|
+
getFooter: function() {
|
2095
|
+
return "</log4js:eventSet>\n";
|
2096
|
+
},
|
2097
|
+
|
2098
|
+
getSeparator: function() {
|
2099
|
+
return "\n";
|
2100
|
+
},
|
2101
|
+
|
2102
|
+
/**
|
2103
|
+
* better readable formatted Exceptions.
|
2104
|
+
* @param ex {Exception} the exception to be formatted.
|
2105
|
+
* @return {String} the formatted String representation of the exception.
|
2106
|
+
* @private
|
2107
|
+
*/
|
2108
|
+
formatException: function(ex) {
|
2109
|
+
if (ex) {
|
2110
|
+
var exStr = "\t<log4js:throwable>";
|
2111
|
+
if (ex.message) {
|
2112
|
+
exStr += "\t\t<log4js:message><![CDATA[" + this.escapeCdata(ex.message) + "]]></log4js:message>\n";
|
2113
|
+
}
|
2114
|
+
if (ex.description) {
|
2115
|
+
exStr += "\t\t<log4js:description><![CDATA[" + this.escapeCdata(ex.description) + "]]></log4js:description>\n";
|
2116
|
+
}
|
2117
|
+
|
2118
|
+
exStr += "\t\t<log4js:stacktrace>";
|
2119
|
+
exStr += "\t\t\t<log4js:location fileName=\""+ex.fileName+"\" lineNumber=\""+ex.lineNumber+"\" />";
|
2120
|
+
exStr += "\t\t</log4js:stacktrace>";
|
2121
|
+
exStr = "\t</log4js:throwable>";
|
2122
|
+
return exStr;
|
2123
|
+
}
|
2124
|
+
return null;
|
2125
|
+
},
|
2126
|
+
/**
|
2127
|
+
* Escape Cdata messages
|
2128
|
+
* @param str {String} message to escape
|
2129
|
+
* @return {String} the escaped message
|
2130
|
+
* @private
|
2131
|
+
*/
|
2132
|
+
escapeCdata: function(str) {
|
2133
|
+
return str.replace(/\]\]>/, "]]>]]><![CDATA[");
|
2134
|
+
}
|
2135
|
+
});
|
2136
|
+
|
2137
|
+
/**
|
2138
|
+
* JSONLayout write the logs in JSON format.
|
2139
|
+
* JSON library is required to use this Layout. See also {@link http://www.json.org}
|
2140
|
+
* @constructor
|
2141
|
+
* @extends Log4js.Layout
|
2142
|
+
* @author Stephan Strittmatter
|
2143
|
+
*/
|
2144
|
+
Log4js.JSONLayout = function() {
|
2145
|
+
this.df = new Log4js.DateFormatter();
|
2146
|
+
};
|
2147
|
+
Log4js.JSONLayout.prototype = Log4js.extend(new Log4js.Layout(), {
|
2148
|
+
/**
|
2149
|
+
* Implement this method to create your own layout format.
|
2150
|
+
* @param {Log4js.LoggingEvent} loggingEvent loggingEvent to format
|
2151
|
+
* @return formatted String
|
2152
|
+
* @type String
|
2153
|
+
*/
|
2154
|
+
format: function(loggingEvent) {
|
2155
|
+
|
2156
|
+
var useragent = "unknown";
|
2157
|
+
try {
|
2158
|
+
useragent = navigator.userAgent;
|
2159
|
+
} catch(e){
|
2160
|
+
useragent = "unknown";
|
2161
|
+
}
|
2162
|
+
|
2163
|
+
var referer = "unknown";
|
2164
|
+
try {
|
2165
|
+
referer = location.href;
|
2166
|
+
} catch(e){
|
2167
|
+
referer = "unknown";
|
2168
|
+
}
|
2169
|
+
|
2170
|
+
var jsonString = "{\n \"LoggingEvent\": {\n";
|
2171
|
+
|
2172
|
+
jsonString += "\t\"logger\": \"" + loggingEvent.categoryName + "\",\n";
|
2173
|
+
jsonString += "\t\"level\": \"" + loggingEvent.level.toString() + "\",\n";
|
2174
|
+
jsonString += "\t\"message\": \"" + loggingEvent.message + "\",\n";
|
2175
|
+
jsonString += "\t\"referer\": \"" + referer + "\",\n";
|
2176
|
+
jsonString += "\t\"useragent\": \"" + useragent + "\",\n";
|
2177
|
+
jsonString += "\t\"timestamp\": \"" + this.df.formatDate(loggingEvent.startTime, "yyyy-MM-ddThh:mm:ssZ") + "\",\n";
|
2178
|
+
jsonString += "\t\"exception\": \"" + loggingEvent.exception + "\"\n";
|
2179
|
+
jsonString += "}}";
|
2180
|
+
|
2181
|
+
return jsonString;
|
2182
|
+
},
|
2183
|
+
/**
|
2184
|
+
* Returns the content type output by this layout.
|
2185
|
+
* @return The base class returns "text/xml".
|
2186
|
+
* @type String
|
2187
|
+
*/
|
2188
|
+
getContentType: function() {
|
2189
|
+
return "text/json";
|
2190
|
+
},
|
2191
|
+
/**
|
2192
|
+
* @return Returns the header for the layout format. The base class returns null.
|
2193
|
+
* @type String
|
2194
|
+
*/
|
2195
|
+
getHeader: function() {
|
2196
|
+
return "{\"Log4js\": [\n";
|
2197
|
+
},
|
2198
|
+
/**
|
2199
|
+
* @return Returns the footer for the layout format. The base class returns null.
|
2200
|
+
* @type String
|
2201
|
+
*/
|
2202
|
+
getFooter: function() {
|
2203
|
+
return "\n]}";
|
2204
|
+
},
|
2205
|
+
|
2206
|
+
getSeparator: function() {
|
2207
|
+
return ",\n";
|
2208
|
+
}
|
2209
|
+
});
|
2210
|
+
|
2211
|
+
/**
|
2212
|
+
* PatternLayout
|
2213
|
+
*/
|
2214
|
+
Log4js.PatternLayout = function(pattern) {
|
2215
|
+
if (pattern) {
|
2216
|
+
this.pattern = pattern;
|
2217
|
+
} else {
|
2218
|
+
this.pattern = Log4js.PatternLayout.DEFAULT_CONVERSION_PATTERN;
|
2219
|
+
}
|
2220
|
+
};
|
2221
|
+
|
2222
|
+
Log4js.PatternLayout.TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n";
|
2223
|
+
Log4js.PatternLayout.DEFAULT_CONVERSION_PATTERN = "%m%n";
|
2224
|
+
Log4js.PatternLayout.ISO8601_DATEFORMAT = "yyyy-MM-dd HH:mm:ss,SSS";
|
2225
|
+
Log4js.PatternLayout.DATETIME_DATEFORMAT = "dd MMM YYYY HH:mm:ss,SSS";
|
2226
|
+
Log4js.PatternLayout.ABSOLUTETIME_DATEFORMAT = "HH:mm:ss,SSS";
|
2227
|
+
|
2228
|
+
Log4js.PatternLayout.prototype = Log4js.extend(new Log4js.Layout(), {
|
2229
|
+
/**
|
2230
|
+
* Returns the content type output by this layout.
|
2231
|
+
* @return "text/plain".
|
2232
|
+
* @type String
|
2233
|
+
*/
|
2234
|
+
getContentType: function() {
|
2235
|
+
return "text/plain";
|
2236
|
+
},
|
2237
|
+
/**
|
2238
|
+
* @return Returns the header for the layout format.
|
2239
|
+
* @type String
|
2240
|
+
*/
|
2241
|
+
getHeader: function() {
|
2242
|
+
return null;
|
2243
|
+
},
|
2244
|
+
/**
|
2245
|
+
* @return Returns the footer for the layout format.
|
2246
|
+
* @type String
|
2247
|
+
*/
|
2248
|
+
getFooter: function() {
|
2249
|
+
return null;
|
2250
|
+
},
|
2251
|
+
|
2252
|
+
format: function(loggingEvent) {
|
2253
|
+
var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([cdmnpr%])(\{([^\}]+)\})?|([^%]+)/;
|
2254
|
+
var formattedString = "";
|
2255
|
+
var result;
|
2256
|
+
var searchString = this.pattern;
|
2257
|
+
|
2258
|
+
// Cannot use regex global flag since it doesn't work in IE5
|
2259
|
+
while ((result = regex.exec(searchString))) {
|
2260
|
+
var matchedString = result[0];
|
2261
|
+
var padding = result[1];
|
2262
|
+
var truncation = result[2];
|
2263
|
+
var conversionCharacter = result[3];
|
2264
|
+
var specifier = result[5];
|
2265
|
+
var text = result[6];
|
2266
|
+
|
2267
|
+
// Check if the pattern matched was just normal text
|
2268
|
+
if (text) {
|
2269
|
+
formattedString += "" + text;
|
2270
|
+
} else {
|
2271
|
+
// Create a raw replacement string based on the conversion
|
2272
|
+
// character and specifier
|
2273
|
+
var replacement = "";
|
2274
|
+
switch(conversionCharacter) {
|
2275
|
+
case "c":
|
2276
|
+
var loggerName = loggingEvent.categoryName;
|
2277
|
+
if (specifier) {
|
2278
|
+
var precision = parseInt(specifier, 10);
|
2279
|
+
var loggerNameBits = loggingEvent.categoryName.split(".");
|
2280
|
+
if (precision >= loggerNameBits.length) {
|
2281
|
+
replacement = loggerName;
|
2282
|
+
} else {
|
2283
|
+
replacement = loggerNameBits.slice(loggerNameBits.length - precision).join(".");
|
2284
|
+
}
|
2285
|
+
} else {
|
2286
|
+
replacement = loggerName;
|
2287
|
+
}
|
2288
|
+
break;
|
2289
|
+
case "d":
|
2290
|
+
var dateFormat = Log4js.PatternLayout.ISO8601_DATEFORMAT;
|
2291
|
+
if (specifier) {
|
2292
|
+
dateFormat = specifier;
|
2293
|
+
// Pick up special cases
|
2294
|
+
if (dateFormat == "ISO8601") {
|
2295
|
+
dateFormat = Log4js.PatternLayout.ISO8601_DATEFORMAT;
|
2296
|
+
} else if (dateFormat == "ABSOLUTE") {
|
2297
|
+
dateFormat = Log4js.PatternLayout.ABSOLUTETIME_DATEFORMAT;
|
2298
|
+
} else if (dateFormat == "DATE") {
|
2299
|
+
dateFormat = Log4js.PatternLayout.DATETIME_DATEFORMAT;
|
2300
|
+
}
|
2301
|
+
}
|
2302
|
+
// Format the date
|
2303
|
+
replacement = (new Log4js.SimpleDateFormat(dateFormat)).format(loggingEvent.startTime);
|
2304
|
+
break;
|
2305
|
+
case "m":
|
2306
|
+
replacement = loggingEvent.message;
|
2307
|
+
break;
|
2308
|
+
case "n":
|
2309
|
+
replacement = "\n";
|
2310
|
+
break;
|
2311
|
+
case "p":
|
2312
|
+
replacement = loggingEvent.level.toString();
|
2313
|
+
break;
|
2314
|
+
case "r":
|
2315
|
+
replacement = "" + loggingEvent.startTime.toLocaleTimeString(); //TODO: .getDifference(Log4js.applicationStartDate);
|
2316
|
+
break;
|
2317
|
+
case "%":
|
2318
|
+
replacement = "%";
|
2319
|
+
break;
|
2320
|
+
default:
|
2321
|
+
replacement = matchedString;
|
2322
|
+
break;
|
2323
|
+
}
|
2324
|
+
// Format the replacement according to any padding or
|
2325
|
+
// truncation specified
|
2326
|
+
|
2327
|
+
var len;
|
2328
|
+
|
2329
|
+
// First, truncation
|
2330
|
+
if (truncation) {
|
2331
|
+
len = parseInt(truncation.substr(1), 10);
|
2332
|
+
replacement = replacement.substring(0, len);
|
2333
|
+
}
|
2334
|
+
// Next, padding
|
2335
|
+
if (padding) {
|
2336
|
+
if (padding.charAt(0) == "-") {
|
2337
|
+
len = parseInt(padding.substr(1), 10);
|
2338
|
+
// Right pad with spaces
|
2339
|
+
while (replacement.length < len) {
|
2340
|
+
replacement += " ";
|
2341
|
+
}
|
2342
|
+
} else {
|
2343
|
+
len = parseInt(padding, 10);
|
2344
|
+
// Left pad with spaces
|
2345
|
+
while (replacement.length < len) {
|
2346
|
+
replacement = " " + replacement;
|
2347
|
+
}
|
2348
|
+
}
|
2349
|
+
}
|
2350
|
+
formattedString += replacement;
|
2351
|
+
}
|
2352
|
+
searchString = searchString.substr(result.index + result[0].length);
|
2353
|
+
}
|
2354
|
+
return formattedString;
|
2355
|
+
}
|
2356
|
+
});
|
2357
|
+
|
2358
|
+
/**
|
2359
|
+
* @private
|
2360
|
+
* @ignore
|
2361
|
+
*/
|
2362
|
+
if (!Array.prototype.push) {
|
2363
|
+
/**
|
2364
|
+
* Functions taken from Prototype library, didn't want to require for just few
|
2365
|
+
* functions.
|
2366
|
+
* More info at {@link http://
|
2367
|
+
* prototype.conio.net/}
|
2368
|
+
* @private
|
2369
|
+
*/
|
2370
|
+
Array.prototype.push = function() {
|
2371
|
+
var startLength = this.length;
|
2372
|
+
for (var i = 0; i < arguments.length; i++) {
|
2373
|
+
this[startLength + i] = arguments[i];
|
2374
|
+
}
|
2375
|
+
return this.length;
|
2376
|
+
};
|
2377
|
+
}
|
2378
|
+
|
2379
|
+
/**
|
2380
|
+
* FIFO buffer
|
2381
|
+
* @private
|
2382
|
+
*/
|
2383
|
+
Log4js.FifoBuffer = function()
|
2384
|
+
{
|
2385
|
+
this.array = new Array();
|
2386
|
+
};
|
2387
|
+
|
2388
|
+
Log4js.FifoBuffer.prototype = {
|
2389
|
+
|
2390
|
+
/**
|
2391
|
+
* @param {Object} obj any object added to buffer
|
2392
|
+
*/
|
2393
|
+
push : function(obj) {
|
2394
|
+
this.array[this.array.length] = obj;
|
2395
|
+
return this.array.length;
|
2396
|
+
},
|
2397
|
+
|
2398
|
+
/**
|
2399
|
+
* @return first putted in Object
|
2400
|
+
*/
|
2401
|
+
pull : function() {
|
2402
|
+
if (this.array.length > 0) {
|
2403
|
+
var firstItem = this.array[0];
|
2404
|
+
for (var i = 0; i < this.array.length - 1; i++) {
|
2405
|
+
this.array[i] = this.array[i + 1];
|
2406
|
+
}
|
2407
|
+
this.array.length = this.array.length - 1;
|
2408
|
+
return firstItem;
|
2409
|
+
}
|
2410
|
+
return null;
|
2411
|
+
},
|
2412
|
+
|
2413
|
+
length : function() {
|
2414
|
+
return this.array.length;
|
2415
|
+
}
|
2416
|
+
};
|
2417
|
+
|
2418
|
+
|
2419
|
+
|
2420
|
+
/**
|
2421
|
+
* Date Formatter
|
2422
|
+
* addZero() and formatDate() are courtesy of Mike Golding:
|
2423
|
+
* http://www.mikezilla.com/exp0015.html
|
2424
|
+
* @private
|
2425
|
+
*/
|
2426
|
+
Log4js.DateFormatter = function() {
|
2427
|
+
return;
|
2428
|
+
};
|
2429
|
+
/**
|
2430
|
+
* default format of date (ISO-8601)
|
2431
|
+
* @static
|
2432
|
+
* @final
|
2433
|
+
*/
|
2434
|
+
Log4js.DateFormatter.DEFAULT_DATE_FORMAT = "yyyy-MM-ddThh:mm:ssO";
|
2435
|
+
|
2436
|
+
|
2437
|
+
Log4js.DateFormatter.prototype = {
|
2438
|
+
/**
|
2439
|
+
* Formats the given date by the given pattern.<br />
|
2440
|
+
* Following switches are supported:
|
2441
|
+
* <ul>
|
2442
|
+
* <li>yyyy: The year</li>
|
2443
|
+
* <li>MM: the month</li>
|
2444
|
+
* <li>dd: the day of month<li>
|
2445
|
+
* <li>hh: the hour<li>
|
2446
|
+
* <li>mm: minutes</li>
|
2447
|
+
* <li>O: timezone offset</li>
|
2448
|
+
* </ul>
|
2449
|
+
* @param {Date} vDate the date to format
|
2450
|
+
* @param {String} vFormat the format pattern
|
2451
|
+
* @return {String} formatted date string
|
2452
|
+
* @static
|
2453
|
+
*/
|
2454
|
+
formatDate : function(vDate, vFormat) {
|
2455
|
+
var vDay = this.addZero(vDate.getDate());
|
2456
|
+
var vMonth = this.addZero(vDate.getMonth()+1);
|
2457
|
+
var vYearLong = this.addZero(vDate.getFullYear());
|
2458
|
+
var vYearShort = this.addZero(vDate.getFullYear().toString().substring(3,4));
|
2459
|
+
var vYear = (vFormat.indexOf("yyyy")>-1?vYearLong:vYearShort);
|
2460
|
+
var vHour = this.addZero(vDate.getHours());
|
2461
|
+
var vMinute = this.addZero(vDate.getMinutes());
|
2462
|
+
var vSecond = this.addZero(vDate.getSeconds());
|
2463
|
+
var vTimeZone = this.O(vDate);
|
2464
|
+
var vDateString = vFormat.replace(/dd/g, vDay).replace(/MM/g, vMonth).replace(/y{1,4}/g, vYear);
|
2465
|
+
vDateString = vDateString.replace(/hh/g, vHour).replace(/mm/g, vMinute).replace(/ss/g, vSecond);
|
2466
|
+
vDateString = vDateString.replace(/O/g, vTimeZone);
|
2467
|
+
return vDateString;
|
2468
|
+
},
|
2469
|
+
|
2470
|
+
/**
|
2471
|
+
* @private
|
2472
|
+
* @static
|
2473
|
+
*/
|
2474
|
+
addZero : function(vNumber) {
|
2475
|
+
return ((vNumber < 10) ? "0" : "") + vNumber;
|
2476
|
+
},
|
2477
|
+
|
2478
|
+
/**
|
2479
|
+
* Formates the TimeOffest
|
2480
|
+
* Thanks to http://www.svendtofte.com/code/date_format/
|
2481
|
+
* @private
|
2482
|
+
*/
|
2483
|
+
O : function (date) {
|
2484
|
+
// Difference to Greenwich time (GMT) in hours
|
2485
|
+
var os = Math.abs(date.getTimezoneOffset());
|
2486
|
+
var h = String(Math.floor(os/60));
|
2487
|
+
var m = String(os%60);
|
2488
|
+
h.length == 1? h = "0"+h:1;
|
2489
|
+
m.length == 1? m = "0"+m:1;
|
2490
|
+
return date.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m;
|
2491
|
+
}
|
2492
|
+
};
|
2493
|
+
|
2494
|
+
|
2495
|
+
/**
|
2496
|
+
* internal Logger to be used
|
2497
|
+
* @private
|
2498
|
+
*/
|
2499
|
+
var log4jsLogger = Log4js.getLogger("Log4js");
|
2500
|
+
log4jsLogger.addAppender(new Log4js.ConsoleAppender());
|
2501
|
+
log4jsLogger.setLevel(Log4js.Level.ALL);
|