docs: @PUT
      @Path("/{ccid: [A-Z,a-z,0-9,_,\\-,\\.]+}")
      public Response recoverChannel(@PathParam("ccid") String ccid,
                                     @QueryParam("bp") String bpId,
                                     @QueryParam("status") ChannelStatusParam statusParam,
                                     @HeaderParam(ChannelServiceConstants.X_ATMOSPHERE_TRACKING_ID) String atmosphereTrackingId) {
  
          if (ccid == null || ccid.isEmpty())
              throw new JoynrHttpException(Status.BAD_REQUEST, JOYNRMESSAGINGERROR_CHANNELNOTSET);
  
          try {
  
              Channel channel = channelService.getChannel(ccid);
  
              if (channel == null) {
  
                  // bounce proxy controller lost data
                  channel = channelService.createChannel(ccid, atmosphereTrackingId);
                  return Response.created(channel.getLocation()).header("bp", channel.getBounceProxy().getId()).build();
  
              } else {
  
                  if (!bpId.equals(channel.getBounceProxy().getId())) {
                      // channel was moved to another bounce proxy
                      return Response.ok()
                                     .header("Location", channel.getLocation().toString())
                                     .header("bp", channel.getBounceProxy().getId())
                                     .build();
                  } else {
                      // bounce proxy exists, but was unreachable for cluster
                      // controllers
  
                      if (statusParam == null) {
                          // we need a status to process how it is going on
                          throw new JoynrHttpException(Status.BAD_REQUEST.getStatusCode(), 0, "No channel status set");
                      } else {
                          ChannelStatus status = statusParam.getStatus();
  
                          if (status.equals(ChannelStatus.REJECTING_LONG_POLLS)) {
  
                              // recover the channel on the previously assigned
                              // bounce proxy
                              channelService.recoverChannel(ccid, atmosphereTrackingId);
  
                              return Response.noContent().build();
  
                          } else if (status.equals(ChannelStatus.UNREACHABLE)) {
  
                              if (channelService.isBounceProxyForChannelResponding(ccid)) {
  
                                  // bounce proxy reachable by bounce proxy
                                  // controller, but possibly not by cluster
                                  // controllers
                                  errorNotifier.alertBounceProxyUnreachable(ccid,
                                                                            bpId,
                                                                            request.getRemoteAddr(),
                                                                            "Bounce Proxy unreachable for Cluster Controller");
  
                                  return Response.noContent().build();
  
                              } else {
  
                                  // bounce proxy dead
                                  errorNotifier.alertBounceProxyUnreachable(ccid,
                                                                            bpId,
                                                                            request.getLocalAddr(),
                                                                            "Bounce Proxy unreachable for Channel Service");
  
                                  // TODO
                                  // channelServiceDelegate.markBounceProxyAsUnreachable(bpId);
  
                                  // create new channel on different bounce proxy
                                  Channel newChannel = channelService.createChannel(ccid, atmosphereTrackingId);
                                  return Response.created(newChannel.getLocation())
                                                 .header("bp", newChannel.getBounceProxy().getId())
                                                 .build();
                              }
                          } else {
                              throw new JoynrHttpException(Status.BAD_REQUEST.getStatusCode(),
                                                           0,
                                                           "Unknown channel status '" + status + "'");
                          }
                      }
                  }
              }
  
          } catch (Exception e) {
              throw new WebApplicationException(e, Status.INTERNAL_SERVER_ERROR);
          }
  
      }