1 package org.apache.onami.configuration.variables;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Map;
23
24
25
26
27
28
29
30 final class KeyAppender
31 extends AbstractAppender
32 {
33
34
35 private final Appender key;
36
37
38 private Appender defaultValue;
39
40
41 private Parser parser;
42
43
44
45
46
47
48
49
50 public KeyAppender( final Parser parser, final String chunk, final Appender key )
51 {
52 this( parser, chunk, key, null );
53 }
54
55
56
57
58
59
60
61
62
63 public KeyAppender( final Parser parser, final String chunk, final Appender key, final Appender defaultValue )
64 {
65 super( chunk );
66 this.parser = parser;
67 this.key = key;
68 this.defaultValue = defaultValue;
69 }
70
71
72
73
74 @Override
75 public void doAppend( StringBuilder buffer, Map<String, String> configuration, Tree<Appender> context )
76 {
77
78 StringBuilder keyBuffer = new StringBuilder();
79 key.append( keyBuffer, configuration, context );
80 String resolvedKey = keyBuffer.toString();
81
82 String resolvedValue = configuration.get( resolvedKey );
83 if ( resolvedValue != null )
84 {
85
86
87 Resolver value = parser.parse( resolvedValue );
88 if ( !value.needsResolving() )
89 {
90 buffer.append( resolvedValue );
91
92 }
93
94 else
95 {
96 if ( !( value instanceof Appender ) )
97 {
98 resolvedValue = value.resolve( configuration );
99 }
100 else
101 {
102 StringBuilder resolvedValueBuffer = new StringBuilder();
103 ( (Appender) value ).append( resolvedValueBuffer, configuration, context );
104 resolvedValue = resolvedValueBuffer.toString();
105 }
106
107 buffer.append( resolvedValue );
108
109 configuration.put( resolvedKey, resolvedValue );
110 }
111 }
112
113 else if ( defaultValue != null )
114 {
115 defaultValue.append( buffer, configuration, context );
116 }
117
118
119 else
120 {
121 buffer.append( chunk );
122 }
123 }
124
125 @Override
126 public boolean equals( Object obj )
127 {
128 if ( obj == this )
129 {
130 return true;
131 }
132 if ( obj instanceof KeyAppender )
133 {
134 KeyAppender other = (KeyAppender) obj;
135 return ( key != null ? key.equals( other.key ) : other.key == null )
136 && ( defaultValue != null ? defaultValue.equals( other.defaultValue ) : other.defaultValue == null );
137 }
138 return false;
139 }
140
141 @Override
142 public int hashCode()
143 {
144 return ( key != null ? key.hashCode() : 0 ) + ( defaultValue != null ? defaultValue.hashCode() * 31 : 0 );
145 }
146
147
148
149
150 public boolean needsResolving()
151 {
152 return true;
153 }
154
155 }