/*
* Copyright (C) 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.bus.server;
import java.util.Arrays;
import java.util.Collection;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
public class DeliveryPlan {
private final MessageCallback[] deliverTo;
public DeliveryPlan() {
deliverTo = new MessageCallback[0];
}
private DeliveryPlan(MessageCallback[] deliverTo) {
this.deliverTo = deliverTo;
}
public static DeliveryPlan newDeliveryPlan(final MessageCallback callback) {
if (callback == null) {
throw new NullPointerException("null callback");
}
return new DeliveryPlan(new MessageCallback[]{callback});
}
public void deliver(final Message m) {
for (final MessageCallback callback : deliverTo) {
callback.callback(m);
}
}
public Collection<MessageCallback> getDeliverTo() {
final MessageCallback[] newArray = new MessageCallback[deliverTo.length];
//noinspection ManualArrayCopy
for (int i = 0; i < deliverTo.length; i++) {
newArray[i] = deliverTo[i];
}
return Arrays.asList(newArray);
}
public int getTotalReceivers() {
return deliverTo.length;
}
public DeliveryPlan newDeliveryPlanWith(final MessageCallback callback) {
if (callback == null) {
throw new NullPointerException("null callback");
}
final MessageCallback[] newPlan = new MessageCallback[deliverTo.length + 1];
//noinspection ManualArrayCopy
for (int i = 0; i < deliverTo.length; i++) {
newPlan[i] = deliverTo[i];
}
newPlan[newPlan.length - 1] = callback;
return new DeliveryPlan(newPlan);
}
public DeliveryPlan newDeliveryPlanWithOut(final MessageCallback callback) {
final MessageCallback[] newPlan = new MessageCallback[deliverTo.length - 1];
boolean found = false;
//noinspection ManualArrayCopy
for (int i = 0; i < deliverTo.length; i++) {
if (deliverTo[i] == callback) {
found = true;
continue;
}
newPlan[found ? i - 1 : i] = deliverTo[i];
}
return new DeliveryPlan(newPlan);
}
}