/**
   * Adds a fragment to the assembler.
   *
   * @param fragment An AIS message fragment
   * @return an assembled message or null if the message is not complete
   */
  public RawMessage addFragment(final Fragment fragment) {

    final int actualFragment = fragment.getCurrentFragment();
    final int totalFragments = fragment.getTotalFragments();
    final int expectedFragment = fragments.size() + 1;

    if (actualFragment == expectedFragment) {
      fragments.add(fragment);
    } else {
      fragments.clear();
      if (actualFragment == 1) {
        fragments.add(fragment);
      }
    }

    RawMessage message = null;
    if (totalFragments == fragments.size()) {
      message = new RawMessage();
      message.setFragments(new ArrayList<Fragment>(fragments));
      message.setBinary(getBinaryPayload());
      fragments.clear();
    }
    return message;
  }