Skip to content

Commit d80ac71

Browse files
committed
Add fancy parsing of exceptions in background jobs
1 parent a85503d commit d80ac71

File tree

5 files changed

+420
-4
lines changed

5 files changed

+420
-4
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import {Component} from 'react';
2+
import {TraceLine} from './TraceLine.js';
3+
4+
import style from './Exception.less';
5+
6+
export class BackgroundException extends Component {
7+
state = {
8+
expanded: false
9+
};
10+
11+
clickHandler = () => {
12+
this.setState({
13+
expanded: !this.state.expanded
14+
});
15+
};
16+
17+
render () {
18+
var traceElements;
19+
let jobArguments;
20+
if (this.state.expanded) {
21+
traceElements = this.props.Trace.map((trace, i) => {
22+
return (
23+
<TraceLine key={i} {...trace}/>
24+
);
25+
});
26+
if (this.props.jobArguments.substr) {
27+
jobArguments = this.props.jobArguments;
28+
} else {
29+
jobArguments = '{\n' + Object.keys(this.props.jobArguments).map(key => {
30+
return `\t${key}: ${JSON.stringify(this.props.jobArguments[key])}`;
31+
}).join(',\n') + '\n}';
32+
}
33+
traceElements = (
34+
<span>
35+
<pre>
36+
<span
37+
className={style.exception}>{this.props.jobClass}</span> {jobArguments}
38+
</pre>
39+
<ol className={style.trace} start="0">
40+
{traceElements}
41+
</ol>
42+
</span>
43+
)
44+
} else {
45+
traceElements = [];
46+
}
47+
return (
48+
<span
49+
className={style.exceptionRow + ' ' + (this.state.expanded ? style.expanded:style.retracted)}
50+
onClick={this.clickHandler}>
51+
Error while running background job&nbsp;
52+
<span
53+
className={style.exception}>({this.props.Exception})</span>:
54+
<span className={style.messsage}> {this.props.Message}</span>
55+
{traceElements}
56+
</span>
57+
);
58+
}
59+
}

js/Components/LogEntry.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {Component} from 'react';
22

3-
import {ExceptionParser} from '../ExceptionParser.js';
4-
import {Exception} from './Exception.js';
3+
import {ExceptionParser} from '../ExceptionParser';
4+
import {Exception} from './Exception';
5+
import {BackgroundException} from './BackgroundException';
56

67
export class LogEntry extends Component {
78
constructor () {
@@ -10,7 +11,9 @@ export class LogEntry extends Component {
1011
}
1112

1213
render () {
13-
if (this.isException()) {
14+
if (this.isBackgroundJobException()) {
15+
return this.renderBackgroundException();
16+
}else if (this.isException()) {
1417
return this.renderException();
1518
} else {
1619
return this.renderBasic();
@@ -30,6 +33,17 @@ export class LogEntry extends Component {
3033
);
3134
}
3235

36+
renderBackgroundException () {
37+
var exceptionData = this.exceptionParser.parse(this.props.message);
38+
return (
39+
<BackgroundException {...exceptionData}/>
40+
);
41+
}
42+
43+
isBackgroundJobException () {
44+
return this.exceptionParser.isBackgroundJobException(this.props.message);
45+
}
46+
3347
isException () {
3448
return this.exceptionParser.isException(this.props.message);
3549
}

js/ExceptionParser.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,50 @@
1+
import unserialize from './unserialize';
2+
3+
window.unserialize = unserialize;
4+
15
export class ExceptionParser {
26
isException (logMessage) {
7+
return this.isRegularException(logMessage) || this.isBackgroundJobException(logMessage);
8+
}
9+
10+
isRegularException (logMessage) {
311
return logMessage.substr(0, 12) === 'Exception: {';
412
}
513

14+
isBackgroundJobException (logMessage) {
15+
return logMessage.substr(0, 34) === 'Error while running background job' && logMessage.indexOf('{"Exception":') !== -1;
16+
}
17+
618
parse (logMessage) {
7-
let data = JSON.parse(logMessage.substr(10));
19+
let data;
20+
if (this.isRegularException(logMessage)) {
21+
data = JSON.parse(logMessage.substr(10));
22+
} else {
23+
data = JSON.parse(logMessage.substr(logMessage.indexOf('{"Exception":')));
24+
const messageHead = logMessage.substr(0, logMessage.indexOf('{"Exception":'));
25+
const jobDataString = messageHead.split('(', 2)[1];
26+
const jobDataParts = jobDataString.split(',', 2).map(part=>part.trim());
27+
data.jobClass = jobDataParts[0].split(':', 2)[1].trim();
28+
data.jobArguments = jobDataParts[1].substr(10).trim();
29+
window.s = jobDataParts[1].substr(10).trim();
30+
if (data.jobClass === 'OC\\Command\\CommandJob') {
31+
try {
32+
[data.jobClass, data.jobArguments] = this.parseCommandJob(data.jobArguments);
33+
} catch (e) {
34+
35+
}
36+
}
37+
}
838
let traceLines = data.Trace.split('\n');
939
data.Trace = traceLines.map(this.parseTraceLine);
1040
return data;
1141
}
1242

43+
parseCommandJob (data) {
44+
const parsed = unserialize(data);
45+
return [parsed['class'], parsed.properties];
46+
}
47+
1348
parseTraceLine (line) {
1449
let parts = line.split(' ');
1550
let number = parts.shift();

0 commit comments

Comments
 (0)