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 }