I'm working on a Java project in which we want to have data collection plugins that collect data to be processed by one or more data aggregation modules. The plugins will all written in-house. Say for example we have data collection plugins A, B and C and data aggegration module X. The modules A, B & C input data into tables that are different but have a few certain fields in common that X cares about. Sometimes the names of the fields are different, but as far as the algorithm is concerned they are "the same".
What's the best way to get X to operate on these different data sources while still allowing for a new data collection plugin D to be integrated, as well as the possibility of a new aggregation module Y that operates on some or all of the data sources?
My main concerns are about dependencies - for example, should the data collection plugins know about the aggregation modules, or the other way round? Or neither? Should the collection plugins implement interfaces that the aggregators can then make use of, and if so then where should be interfaces be defined?