1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.commons.ihe.core.payload;
17
18 import org.apache.commons.io.FileUtils;
19 import org.apache.commons.io.IOUtils;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import java.io.*;
24 import java.util.concurrent.atomic.AtomicInteger;
25 import java.util.concurrent.atomic.AtomicLong;
26 import java.util.stream.Collectors;
27 import java.util.stream.Stream;
28
29 import static java.util.Objects.requireNonNull;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 abstract public class PayloadLoggerBase<T extends PayloadLoggingContext> {
71 private static final transient Logger LOG = LoggerFactory.getLogger(PayloadLoggerBase.class);
72
73 private static final AtomicLong SEQUENCE_ID_GENERATOR = new AtomicLong(0L);
74
75
76 public static final String SEQUENCE_ID_PROPERTY_NAME =
77 PayloadLoggerBase.class.getName() + ".sequence.id";
78
79
80 public static final String PROPERTY_CONSOLE = PayloadLoggerBase.class.getName() + ".CONSOLE";
81 public static final String PROPERTY_DISABLED = PayloadLoggerBase.class.getName() + ".DISABLED";
82
83 private boolean enabled = true;
84
85 private int errorCountLimit = -1;
86 private AtomicInteger errorCount = new AtomicInteger(0);
87
88 private ExpressionResolver resolver;
89
90 protected static Long getNextSequenceId() {
91 return SEQUENCE_ID_GENERATOR.getAndIncrement();
92 }
93
94 protected void doLogPayload(T context, String charsetName, String... payloadPieces) {
95
96 if (!canProcess()) {
97 return;
98 }
99 if ((errorCountLimit >= 0) && (errorCount.get() >= errorCountLimit)) {
100 LOG.warn("Error count limit has bean reached, reset the counter to enable further trials");
101 return;
102 }
103
104 if (Boolean.getBoolean(PROPERTY_CONSOLE)) {
105
106 if (LOG.isDebugEnabled()) {
107 String output = Stream.of(payloadPieces).collect(Collectors.joining());
108 LOG.debug(output);
109 }
110 } else {
111
112 String path = resolver.resolveExpression(context);
113 Writer writer = null;
114 try {
115 FileOutputStream outputStream = FileUtils.openOutputStream(new File(path), true);
116 writer = (charsetName != null) ?
117 new OutputStreamWriter(outputStream, charsetName) :
118 new OutputStreamWriter(outputStream);
119 for (String payloadPiece : payloadPieces) {
120 writer.write(payloadPiece);
121 }
122 errorCount.set(0);
123 } catch (IOException e) {
124 errorCount.incrementAndGet();
125 LOG.warn("Cannot write into " + path, e);
126 } finally {
127 IOUtils.closeQuietly(writer);
128 }
129 }
130 }
131
132
133 public boolean canProcess() {
134 if ((!enabled) || Boolean.getBoolean(PROPERTY_DISABLED)) {
135 LOG.trace("Message payload logging is disabled");
136 return false;
137 }
138 return true;
139 }
140
141
142
143
144
145 public void resetErrorCount() {
146 errorCount.set(0);
147 }
148
149
150
151
152 public boolean isEnabled() {
153 return enabled;
154 }
155
156
157
158
159 public void setEnabled(boolean enabled) {
160 this.enabled = enabled;
161 }
162
163
164
165
166
167 @Deprecated
168 public boolean isLocallyEnabled() {
169 return isEnabled();
170 }
171
172
173
174
175
176 @Deprecated
177 public void setLocallyEnabled(boolean locallyEnabled) {
178 setEnabled(locallyEnabled);
179 }
180
181
182
183
184
185
186 public static boolean isGloballyEnabled() {
187 return !Boolean.getBoolean(PROPERTY_DISABLED);
188 }
189
190
191
192
193
194
195 public static void setGloballyEnabled(boolean globallyEnabled) {
196 System.setProperty(PROPERTY_DISABLED, Boolean.toString(!globallyEnabled));
197 }
198
199
200
201
202
203 public int getErrorCountLimit() {
204 return errorCountLimit;
205 }
206
207
208
209
210
211
212
213 public void setErrorCountLimit(int errorCountLimit) {
214 this.errorCountLimit = errorCountLimit;
215 }
216
217 public ExpressionResolver getExpressionResolver() {
218 return resolver;
219 }
220
221 public void setExpressionResolver(ExpressionResolver resolver) {
222 this.resolver = requireNonNull(resolver);
223 }
224 }