15
15
16
16
import java .util .Map ;
17
17
18
- import ch .qos .logback .core .pattern .CompositeConverter ;
19
- import ch .qos .logback .core .pattern .Converter ;
20
- import ch .qos .logback .core .pattern .DynamicConverter ;
21
- import ch .qos .logback .core .pattern .LiteralConverter ;
18
+ import ch .qos .logback .core .pattern .*;
22
19
import ch .qos .logback .core .spi .ContextAwareBase ;
23
20
import ch .qos .logback .core .status .ErrorStatus ;
24
21
import ch .qos .logback .core .util .OptionHelper ;
@@ -29,46 +26,49 @@ class Compiler<E> extends ContextAwareBase {
29
26
Converter <E > tail ;
30
27
final Node top ;
31
28
final Map converterMap ;
29
+ final Map compositeConverterMap ;
32
30
33
- Compiler (final Node top , final Map converterMap ) {
31
+ Compiler (final Node top , final Map converterMap , Map compositeConverterMap ) {
34
32
this .top = top ;
35
33
this .converterMap = converterMap ;
34
+ this .compositeConverterMap = compositeConverterMap ;
36
35
}
37
36
38
37
Converter <E > compile () {
39
38
head = tail = null ;
40
39
for (Node n = top ; n != null ; n = n .next ) {
41
40
switch (n .type ) {
42
- case Node .LITERAL :
43
- addToList (new LiteralConverter <E >((String ) n .getValue ()));
44
- break ;
45
- case Node .COMPOSITE :
46
- CompositeNode cn = (CompositeNode ) n ;
47
- CompositeConverter <E > compositeConverter = new CompositeConverter <E >();
48
- compositeConverter .setFormattingInfo (cn .getFormatInfo ());
49
- Compiler <E > childCompiler = new Compiler <E >(cn .getChildNode (),
50
- converterMap );
51
- childCompiler .setContext (context );
52
- Converter <E > childConverter = childCompiler .compile ();
53
- compositeConverter .setChildConverter (childConverter );
54
- addToList (compositeConverter );
55
- break ;
56
- case Node .KEYWORD :
57
- KeywordNode kn = (KeywordNode ) n ;
58
- DynamicConverter <E > dynaConverter = createConverter (kn );
59
- if (dynaConverter != null ) {
60
- dynaConverter .setFormattingInfo (kn .getFormatInfo ());
61
- dynaConverter .setOptionList (kn .getOptions ());
62
- addToList (dynaConverter );
63
- } else {
64
- // if the appropriate dynaconverter cannot be found, then replace
65
- // it with a dummy LiteralConverter indicating an error.
66
- Converter <E > errConveter = new LiteralConverter <E >("%PARSER_ERROR["
67
- + kn .getValue ()+"]" );
68
- addStatus (new ErrorStatus ("[" + kn .getValue ()
69
- + "] is not a valid conversion word" , this ));
70
- addToList (errConveter );
71
- }
41
+ case Node .LITERAL :
42
+ addToList (new LiteralConverter <E >((String ) n .getValue ()));
43
+ break ;
44
+ case Node .COMPOSITE_KEYWORD :
45
+ CompositeNode cn = (CompositeNode ) n ;
46
+ CompositeConverter <E > compositeConverter = createCompiteConverter (cn );
47
+ compositeConverter .setFormattingInfo (cn .getFormatInfo ());
48
+ compositeConverter .setOptionList (cn .getOptions ());
49
+ Compiler <E > childCompiler = new Compiler <E >(cn .getChildNode (),
50
+ converterMap , compositeConverterMap );
51
+ childCompiler .setContext (context );
52
+ Converter <E > childConverter = childCompiler .compile ();
53
+ compositeConverter .setChildConverter (childConverter );
54
+ addToList (compositeConverter );
55
+ break ;
56
+ case Node .SIMPLE_KEYWORD :
57
+ SimpleKeywordNode kn = (SimpleKeywordNode ) n ;
58
+ DynamicConverter <E > dynaConverter = createConverter (kn );
59
+ if (dynaConverter != null ) {
60
+ dynaConverter .setFormattingInfo (kn .getFormatInfo ());
61
+ dynaConverter .setOptionList (kn .getOptions ());
62
+ addToList (dynaConverter );
63
+ } else {
64
+ // if the appropriate dynaconverter cannot be found, then replace
65
+ // it with a dummy LiteralConverter indicating an error.
66
+ Converter <E > errConveter = new LiteralConverter <E >("%PARSER_ERROR["
67
+ + kn .getValue () + "]" );
68
+ addStatus (new ErrorStatus ("[" + kn .getValue ()
69
+ + "] is not a valid conversion word" , this ));
70
+ addToList (errConveter );
71
+ }
72
72
73
73
}
74
74
}
@@ -87,31 +87,60 @@ private void addToList(Converter<E> c) {
87
87
/**
88
88
* Attempt to create a converter using the information found in
89
89
* 'converterMap'.
90
- *
90
+ *
91
91
* @param kn
92
92
* @return
93
93
*/
94
94
@ SuppressWarnings ("unchecked" )
95
- DynamicConverter <E > createConverter (KeywordNode kn ) {
95
+ DynamicConverter <E > createConverter (SimpleKeywordNode kn ) {
96
96
String keyword = (String ) kn .getValue ();
97
97
String converterClassStr = (String ) converterMap .get (keyword );
98
98
99
99
if (converterClassStr != null ) {
100
100
try {
101
101
return (DynamicConverter ) OptionHelper .instantiateByClassName (
102
- converterClassStr , DynamicConverter .class , context );
102
+ converterClassStr , DynamicConverter .class , context );
103
103
} catch (Exception e ) {
104
104
addError ("Failed to instantiate converter class [" + converterClassStr
105
- + "]" , e );
105
+ + "]" , e );
106
106
return null ;
107
107
}
108
108
} else {
109
109
addError ("There is no conversion class registered for conversion word ["
110
- + keyword + "]" );
110
+ + keyword + "]" );
111
111
return null ;
112
112
}
113
113
}
114
114
115
+ /**
116
+ * Attempt to create a converter using the information found in
117
+ * 'compositeConverterMap'.
118
+ *
119
+ * @param cn
120
+ * @return
121
+ */
122
+ @ SuppressWarnings ("unchecked" )
123
+ CompositeConverter <E > createCompiteConverter (CompositeNode cn ) {
124
+ String keyword = (String ) cn .getValue ();
125
+ String converterClassStr = (String ) compositeConverterMap .get (keyword );
126
+
127
+ if (converterClassStr != null ) {
128
+ try {
129
+ return (CompositeConverter ) OptionHelper .instantiateByClassName (
130
+ converterClassStr , CompositeConverter .class , context );
131
+ } catch (Exception e ) {
132
+ addError ("Failed to instantiate converter class [" + converterClassStr
133
+ + "]" , e );
134
+ return null ;
135
+ }
136
+ } else {
137
+ addError ("There is no conversion class registered for composite conversion word ["
138
+ + keyword + "]" );
139
+ return null ;
140
+ }
141
+ }
142
+
143
+
115
144
// public void setStatusManager(StatusManager statusManager) {
116
145
// this.statusManager = statusManager;
117
146
// }
0 commit comments