public CededUnderwritingInfo calculateCoverUnderwritingInfo(
     UnderwritingInfo grossUnderwritingInfo, double coveredByReinsurer) {
   CededUnderwritingInfo cededUnderwritingInfo =
       CededUnderwritingInfoPacketFactory.copy(grossUnderwritingInfo);
   if (grossUnderwritingInfo != null) {
     cededUnderwritingInfo.setOriginalUnderwritingInfo(
         grossUnderwritingInfo.getOriginalUnderwritingInfo());
   } else {
     cededUnderwritingInfo.setOriginalUnderwritingInfo(grossUnderwritingInfo);
   }
   cededUnderwritingInfo.setPremium(0);
   cededUnderwritingInfo.setSumInsured(0);
   cededUnderwritingInfo.setMaxSumInsured(0);
   cededUnderwritingInfo.setCommission(0);
   return cededUnderwritingInfo;
 }
  public void doCalculation() {
    if (inUnderwritingInfoGross.isEmpty() && !inUnderwritingInfoCeded.isEmpty()) {
      throw new IllegalStateException("UnderwritingInfoMerger.onlyCededUnderwritingInfo");
    }

    /* The map contains the gross UwInfo as keys and the ceded as values */
    if (anyOutChannelWired()) {
      // Using a LinkedHashMap ensures that all outUwInfo* lists will be sorted according to the
      // inUwInfoGross list.
      Map<UnderwritingInfo, CededUnderwritingInfo> grossMergedCededPairs =
          new LinkedHashMap<UnderwritingInfo, CededUnderwritingInfo>(
              inUnderwritingInfoGross.size());
      for (UnderwritingInfo grossUnderwritingInfo : inUnderwritingInfoGross) {
        if (grossMergedCededPairs.containsKey(
            grossUnderwritingInfo.getOriginalUnderwritingInfo())) {
          throw new IllegalArgumentException("UnderwritingInfoMerger.doubleInformation");
        }
        grossMergedCededPairs.put(grossUnderwritingInfo.getOriginalUnderwritingInfo(), null);
        outUnderwritingInfoGross.add(grossUnderwritingInfo);
      }
      if (isSenderWired(outUnderwritingInfoCeded) || isSenderWired(outUnderwritingInfoNet)) {
        for (CededUnderwritingInfo cededUnderwritingInfo : inUnderwritingInfoCeded) {
          if (grossMergedCededPairs.containsKey(
              cededUnderwritingInfo.getOriginalUnderwritingInfo())) {
            CededUnderwritingInfo aggregateCededUnderwritingInfo =
                grossMergedCededPairs.get(cededUnderwritingInfo.getOriginalUnderwritingInfo());
            if (aggregateCededUnderwritingInfo == null) {
              grossMergedCededPairs.put(
                  cededUnderwritingInfo.getOriginalUnderwritingInfo(),
                  CededUnderwritingInfoPacketFactory.copy(cededUnderwritingInfo));
            } else {
              aggregateCededUnderwritingInfo.plus(cededUnderwritingInfo);
              aggregateCededUnderwritingInfo.setNumberOfPolicies(
                  cededUnderwritingInfo.getNumberOfPolicies());
              aggregateCededUnderwritingInfo.origin = this;
            }
          }
        }

        for (Map.Entry<UnderwritingInfo, CededUnderwritingInfo> entry :
            grossMergedCededPairs.entrySet()) {
          UnderwritingInfo grossUnderwritingInfo = entry.getKey();
          UnderwritingInfo netUnderwritingInfo =
              UnderwritingInfoPacketFactory.copy(grossUnderwritingInfo);
          netUnderwritingInfo.origin = this;
          netUnderwritingInfo.setOriginalUnderwritingInfo(grossUnderwritingInfo);

          CededUnderwritingInfo cededUnderwritingInfo = entry.getValue();
          if (cededUnderwritingInfo == null) {
            cededUnderwritingInfo = CededUnderwritingInfoPacketFactory.copy(netUnderwritingInfo);
            CededUnderwritingInfoUtilities.setZero(cededUnderwritingInfo);
          } else {
            netUnderwritingInfo =
                UnderwritingInfoUtilities.calculateNet(
                    grossUnderwritingInfo, cededUnderwritingInfo);
          }
          outUnderwritingInfoCeded.add(cededUnderwritingInfo);
          outUnderwritingInfoNet.add(netUnderwritingInfo);
        }
      }
      if (isSenderWired(outUnderwritingInfoCededInGrossPackets)
          && outUnderwritingInfoCeded.size() > 0) {
        for (CededUnderwritingInfo cededUnderwritingInfo : outUnderwritingInfoCeded) {
          outUnderwritingInfoCededInGrossPackets.add(
              UnderwritingInfoPacketFactory.copy(cededUnderwritingInfo));
        }
      }
    }
  }