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 }