private static void getAllReceiveMessages(Source input, List<ReceiveMessage> result) {
   if (input instanceof SimpleSource) {
     result.add(((SimpleSource) input).getMessage());
   } else if (input instanceof SourceComposition) {
     SourceComposition composition = (SourceComposition) input;
     for (Source s : composition.getSources()) {
       getAllReceiveMessages(s, result);
     }
   }
 }
 public static List<SimpleSource> allSimpleSources(Source input) {
   List<SimpleSource> result = new ArrayList<>();
   if (input instanceof SimpleSource) {
     result.add((SimpleSource) input);
   } else if (input instanceof SourceComposition) {
     SourceComposition composition = (SourceComposition) input;
     for (Source s : composition.getSources()) {
       result.addAll(allSimpleSources(s));
     }
   }
   return result;
 }