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 package net.logstash.logback.composite;
15
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
20
21 import ch.qos.logback.access.spi.IAccessEvent;
22 import ch.qos.logback.classic.spi.ILoggingEvent;
23 import ch.qos.logback.core.Context;
24 import ch.qos.logback.core.spi.DeferredProcessingAware;
25
26 import com.fasterxml.jackson.core.JsonFactory;
27 import com.fasterxml.jackson.core.JsonGenerator;
28
29 /**
30  * Contains a collection of {@link JsonProvider}s to be used to write
31  * JSON output for an Event.
32  * 
33  * Subclasses will provide convenience methods for specific provider
34  * implementations, so that they can easily be added via XML configuration.
35  * 
36  * Most methods on this class just delegate to the method of the same
37  * name on each {@link JsonProvider}.
38  *
39  * @param <Event> type of event ({@link ILoggingEvent} or {@link IAccessEvent}).
40  */

41 public class JsonProviders<Event extends DeferredProcessingAware> implements JsonFactoryAware {
42     
43     private final List<JsonProvider<Event>> jsonProviders = new ArrayList<JsonProvider<Event>>();
44
45     public void start() {
46         for (JsonProvider<Event> jsonProvider : jsonProviders) {
47             jsonProvider.start();
48         }
49     }
50
51     public void stop() {
52         for (JsonProvider<Event> jsonProvider : jsonProviders) {
53             jsonProvider.stop();
54         }
55     }
56
57     public void setContext(Context context) {
58         for (JsonProvider<Event> jsonProvider : jsonProviders) {
59             jsonProvider.setContext(context);
60         }
61     }
62     
63     public void addProvider(JsonProvider<Event> provider) {
64         if (provider != null) {
65             this.jsonProviders.add(provider);
66         }
67     }
68
69     public void removeProvider(JsonProvider<Event> provider) {
70         if (provider != null) {
71             this.jsonProviders.remove(provider);
72         }
73     }
74
75     public void writeTo(JsonGenerator generator, Event event) throws IOException {
76         for (JsonProvider<Event> jsonProvider : jsonProviders) {
77             jsonProvider.writeTo(generator, event);
78         }
79     }
80
81     protected void prepareForDeferredProcessing(Event event) {
82         for (JsonProvider<Event> jsonProvider : jsonProviders) {
83             jsonProvider.prepareForDeferredProcessing(event);
84         }
85     }
86     
87     @Override
88     public void setJsonFactory(JsonFactory jsonFactory) {
89         for (JsonProvider<Event> jsonProvider : jsonProviders) {
90             if (jsonProvider instanceof JsonFactoryAware) {
91                 ((JsonFactoryAware) jsonProvider).setJsonFactory(jsonFactory);
92             }
93         }
94     }
95     
96     public List<JsonProvider<Event>> getProviders() {
97         return Collections.unmodifiableList(jsonProviders);
98     }
99 }
100