001    package com.hammurapi.review;
002    
003    import java.util.ArrayList;
004    import java.util.Iterator;
005    import java.util.List;
006    
007    import com.hammurapi.config.ObjectDefinition;
008    import com.hammurapi.config.bootstrap.ConfigurationException;
009    import com.hammurapi.config.runtime.Component;
010    import com.hammurapi.config.runtime.ConfigurationContext;
011    import com.hammurapi.util.Context;
012    
013    /**
014     * Delegates method invocations to reporters found in context.
015     * @author Pavel Vlasov
016     *
017     */
018    public class ContextReporter implements Reporter<Object>, Component<ObjectDefinition> {
019            
020            private Context context;
021            
022            @SuppressWarnings("unchecked")
023            Iterator<Reporter> reporters() {
024                    return context.lookupAll(Reporter.class);
025            }
026    
027            @SuppressWarnings("unchecked")
028            @Override
029            public void close() throws ReviewException {
030                    Iterator<Reporter> it = reporters();
031                    while (it.hasNext()) {
032                            it.next().close();
033                    }
034            }
035    
036            @SuppressWarnings("unchecked")
037            @Override
038            public ObservationSink createObservationSink(Module module) throws ReviewException {
039                    final List<ObservationSink> observationSinks = new ArrayList<ObservationSink>();
040                    Iterator<Reporter> it = reporters();
041                    while (it.hasNext()) {
042                            observationSinks.add(it.next().createObservationSink(module));
043                    }
044                    return new ObservationSink() {
045                            
046                            @Override
047                            public void consumeObservation(Observation observation) throws ReviewException {
048                                    for (ObservationSink sink: observationSinks) {
049                                            sink.consumeObservation(observation);
050                                    }                               
051                            }
052                            
053                            @Override
054                            public void close() throws ReviewException {
055                                    for (ObservationSink sink: observationSinks) {
056                                            sink.close();
057                                    }                               
058                            }
059                    };
060            }
061    
062            @SuppressWarnings("unchecked")
063            @Override
064            public void onException(Exception e) {
065                    Iterator<Reporter> it = reporters();
066                    while (it.hasNext()) {
067                            it.next().onException(e);
068                    }
069            }
070    
071            @Override
072            public void init(ConfigurationContext<ObjectDefinition> context) throws ConfigurationException {
073                    this.context = context;         
074            }
075    
076    }