class ChangeLogSet {

   public List<ChangeLog> diff(ChangeLogSet model) {
      for(ChangeLog changeLog : model.changeLogs) {
         ChangeLog myChangeLog = bySource.get(changeLog.getSource());

         if(myChangeLog != null) {
            for(ChangeSet changeSet : changeLog.getChangeSets()) {
               if(!myChangeLog.removeChangeSet(changeSet.getIdentifier())) {
                  myChangeLog.addChangeSet(changeSet);
               }
            }

            if(myChangeLog.getChangeSets().isEmpty()) {
               changeLogs.remove(myChangeLog);
               bySource.remove(myChangeLog.getSource());
            }
         } else {
            changeLogs.add(changeLog);
            bySource.put(changeLog.getSource(), changeLog);
         }
      }

      return changeLogs;
   }

   public  ChangeLogSet(List<ChangeLog> changeLogs);

}