Program: 13557
Project: 13557
Buggy source:
@Override public void openRequest(ParticipantId loggedInUser,WaveId waveId,IdFilter waveletIdFilter,Collection<WaveClientRpc.WaveletVersion> knownWavelets,OpenListener openListener){
  LOG.info("String_Node_Str" + loggedInUser + "String_Node_Str"+ waveId+ "String_Node_Str"+ waveletIdFilter+ "String_Node_Str"+ knownWavelets);
  if (loggedInUser == null) {
    openListener.onFailure("String_Node_Str");
    return;
  }
  if (!knownWavelets.isEmpty()) {
    openListener.onFailure("String_Node_Str");
    return;
  }
  try {
    waveletInfo.initialiseWave(waveId);
  }
 catch (  WaveServerException e) {
    LOG.severe("String_Node_Str" + waveId,e);
    openListener.onFailure("String_Node_Str");
    return;
  }
  String channelId=generateChannelID();
  UserManager userManager=waveletInfo.getUserManager(loggedInUser);
synchronized (userManager) {
    WaveViewSubscription subscription=userManager.subscribe(waveId,waveletIdFilter,channelId,openListener);
    LOG.info("String_Node_Str" + loggedInUser + "String_Node_Str"+ waveId+ "String_Node_Str"+ channelId);
    Set<WaveletId> waveletIds;
    try {
      waveletIds=waveletInfo.visibleWaveletsFor(subscription,loggedInUser);
    }
 catch (    WaveServerException e1) {
      waveletIds=Sets.newHashSet();
      LOG.warning("String_Node_Str" + loggedInUser,e1);
    }
    for (    WaveletId waveletId : waveletIds) {
      WaveletName waveletName=WaveletName.of(waveId,waveletId);
      waveletInfo.notifyAddedImplcitParticipant(waveletName,loggedInUser);
      CommittedWaveletSnapshot snapshotToSend;
      try {
        snapshotToSend=waveletProvider.getSnapshot(waveletName);
      }
 catch (      WaveServerException e) {
        LOG.warning("String_Node_Str" + waveletName,e);
        openListener.onFailure("String_Node_Str");
        return;
      }
      LOG.info("String_Node_Str" + (snapshotToSend != null));
      if (snapshotToSend == null) {
        openListener.onUpdate(waveletName,snapshotToSend,DeltaSequence.empty(),null,null,channelId);
      }
 else {
        openListener.onUpdate(waveletName,snapshotToSend,DeltaSequence.empty(),snapshotToSend.committedVersion,null,channelId);
      }
    }
    WaveletName dummyWaveletName=createDummyWaveletName(waveId);
    if (waveletIds.size() == 0) {
      LOG.info("String_Node_Str" + dummyWaveletName);
      openListener.onUpdate(dummyWaveletName,null,DeltaSequence.empty(),null,null,channelId);
    }
    LOG.info("String_Node_Str" + dummyWaveletName);
    openListener.onUpdate(dummyWaveletName,null,DeltaSequence.empty(),null,true,null);
  }
}

Fixed version (ground truth):
@Override public void openRequest(ParticipantId loggedInUser,WaveId waveId,IdFilter waveletIdFilter,Collection<WaveClientRpc.WaveletVersion> knownWavelets,OpenListener openListener){
  LOG.info("String_Node_Str" + loggedInUser + "String_Node_Str"+ waveId+ "String_Node_Str"+ waveletIdFilter+ "String_Node_Str"+ knownWavelets);
  if (loggedInUser == null) {
    openListener.onFailure("String_Node_Str");
    return;
  }
  if (!knownWavelets.isEmpty()) {
    openListener.onFailure("String_Node_Str");
    return;
  }
  try {
    waveletInfo.initialiseWave(waveId);
  }
 catch (  WaveServerException e) {
    LOG.severe("String_Node_Str" + waveId,e);
    openListener.onFailure("String_Node_Str");
    return;
  }
  String channelId=generateChannelID();
  UserManager userManager=waveletInfo.getUserManager(loggedInUser);
  WaveViewSubscription subscription=userManager.subscribe(waveId,waveletIdFilter,channelId,openListener);
  LOG.info("String_Node_Str" + loggedInUser + "String_Node_Str"+ waveId+ "String_Node_Str"+ channelId);
  Set<WaveletId> waveletIds;
  try {
    waveletIds=waveletInfo.visibleWaveletsFor(subscription,loggedInUser);
  }
 catch (  WaveServerException e1) {
    waveletIds=Sets.newHashSet();
    LOG.warning("String_Node_Str" + loggedInUser,e1);
  }
  for (  WaveletId waveletId : waveletIds) {
    WaveletName waveletName=WaveletName.of(waveId,waveletId);
    waveletInfo.notifyAddedImplcitParticipant(waveletName,loggedInUser);
    CommittedWaveletSnapshot snapshotToSend;
    try {
      snapshotToSend=waveletProvider.getSnapshot(waveletName);
    }
 catch (    WaveServerException e) {
      LOG.warning("String_Node_Str" + waveletName,e);
      openListener.onFailure("String_Node_Str");
      return;
    }
    LOG.info("String_Node_Str" + (snapshotToSend != null));
    if (snapshotToSend == null) {
      openListener.onUpdate(waveletName,snapshotToSend,DeltaSequence.empty(),null,null,channelId);
    }
 else {
      openListener.onUpdate(waveletName,snapshotToSend,DeltaSequence.empty(),snapshotToSend.committedVersion,null,channelId);
    }
  }
  WaveletName dummyWaveletName=createDummyWaveletName(waveId);
  if (waveletIds.size() == 0) {
    LOG.info("String_Node_Str" + dummyWaveletName);
    openListener.onUpdate(dummyWaveletName,null,DeltaSequence.empty(),null,null,channelId);
  }
  LOG.info("String_Node_Str" + dummyWaveletName);
  openListener.onUpdate(dummyWaveletName,null,DeltaSequence.empty(),null,true,null);
}