1
0
mirror of https://github.com/fabianonline/telegram_backup.git synced 2025-03-12 15:13:47 +00:00

297 lines
7.1 KiB
Java

package com.droidkit.actors;
import com.droidkit.actors.mailbox.Mailbox;
import com.droidkit.actors.messages.DeadLetter;
import com.droidkit.actors.messages.NamedMessage;
import com.droidkit.actors.tasks.*;
import com.droidkit.actors.tasks.messages.TaskError;
import com.droidkit.actors.tasks.messages.TaskResult;
import com.droidkit.actors.tasks.messages.TaskTimeout;
import java.lang.reflect.Array;
import java.util.UUID;
/**
* Actor object
*
* @author Stepan Ex3NDR Korshakov (me@ex3ndr.com)
*/
public class Actor {
private UUID uuid;
private String path;
private ActorContext context;
private Mailbox mailbox;
private ActorAskImpl askPattern;
public Actor() {
}
/**
* <p>INTERNAL API</p>
* Initialization of actor
*
* @param uuid uuid of actor
* @param path path of actor
* @param context context of actor
* @param mailbox mailbox of actor
*/
public final void initActor(UUID uuid, String path, ActorContext context, Mailbox mailbox) {
this.uuid = uuid;
this.path = path;
this.context = context;
this.mailbox = mailbox;
this.askPattern = new ActorAskImpl(self());
}
/**
* Actor System
*
* @return Actor System
*/
public final ActorSystem system() {
return context.getSystem();
}
/**
* Self actor reference
*
* @return self reference
*/
public final ActorRef self() {
return context.getSelf();
}
/**
* Actor context
*
* @return context
*/
protected final ActorContext context() {
return context;
}
/**
* Sender of last received message
*
* @return sender's ActorRef
*/
public final ActorRef sender() {
return context.sender();
}
/**
* Actor UUID
*
* @return uuid
*/
protected final UUID getUuid() {
return uuid;
}
/**
* Actor path
*
* @return path
*/
protected final String getPath() {
return path;
}
/**
* Actor mailbox
*
* @return mailbox
*/
public final Mailbox getMailbox() {
return mailbox;
}
/**
* Called before first message receiving
*/
public void preStart() {
}
public final void onReceiveGlobal(Object message) {
if (message instanceof DeadLetter) {
if (askPattern.onDeadLetter((DeadLetter) message)) {
return;
}
} else if (message instanceof TaskResult) {
if (askPattern.onTaskResult((TaskResult) message)) {
return;
}
} else if (message instanceof TaskTimeout) {
if (askPattern.onTaskTimeout((TaskTimeout) message)) {
return;
}
} else if (message instanceof TaskError) {
if (askPattern.onTaskError((TaskError) message)) {
return;
}
}
onReceive(message);
}
/**
* Receiving of message
*
* @param message message
*/
public void onReceive(Object message) {
}
/**
* Called after actor shutdown
*/
public void postStop() {
}
/**
* Reply message to sender of last message
*
* @param message reply message
*/
public void reply(Object message) {
if (context.sender() != null) {
context.sender().send(message, self());
}
}
public AskFuture combine(AskFuture... futures) {
return askPattern.combine(futures);
}
public AskFuture combine(AskCallback<Object[]> callback, AskFuture... futures) {
AskFuture future = combine(futures);
future.addListener(callback);
return future;
}
public <T> AskFuture combine(final String name, final Class<T> clazz, AskFuture... futures) {
return combine(new AskCallback<Object[]>() {
@Override
public void onResult(Object[] result) {
T[] res = (T[]) Array.newInstance(clazz, result.length);
for (int i = 0; i < result.length; i++) {
res[i] = (T) result[i];
}
self().send(new NamedMessage(name, res));
}
@Override
public void onError(Throwable throwable) {
self().send(new NamedMessage(name, throwable));
}
}, futures);
}
public <T> AskFuture combine(final String name, AskFuture... futures) {
return combine(new AskCallback<Object[]>() {
@Override
public void onResult(Object[] result) {
self().send(new NamedMessage(name, result));
}
@Override
public void onError(Throwable throwable) {
self().send(new NamedMessage(name, throwable));
}
}, futures);
}
/**
* Ask TaskActor for result
*
* @param selection ActorSelection of task
* @return Future
*/
public AskFuture ask(ActorSelection selection) {
return askPattern.ask(system().actorOf(selection), 0, null);
}
/**
* Ask TaskActor for result
*
* @param selection ActorSelection of task
* @param timeout timeout of task
* @return Future
*/
public AskFuture ask(ActorSelection selection, long timeout) {
return askPattern.ask(system().actorOf(selection), timeout, null);
}
/**
* Ask TaskActor for result
*
* @param selection ActorSelection of task
* @param callback callback for ask
* @return Future
*/
public AskFuture ask(ActorSelection selection, AskCallback callback) {
return askPattern.ask(system().actorOf(selection), 0, callback);
}
/**
* Ask TaskActor for result
*
* @param selection ActorSelection of task
* @param timeout timeout of task
* @param callback callback for ask
* @return Future
*/
public AskFuture ask(ActorSelection selection, long timeout, AskCallback callback) {
return askPattern.ask(system().actorOf(selection), timeout, callback);
}
/**
* Ask TaskActor for result
*
* @param ref ActorRef of task
* @return Future
*/
public AskFuture ask(ActorRef ref) {
return askPattern.ask(ref, 0, null);
}
/**
* Ask TaskActor for result
*
* @param ref ActorRef of task
* @param timeout timeout of task
* @return Future
*/
public AskFuture ask(ActorRef ref, long timeout) {
return askPattern.ask(ref, timeout, null);
}
/**
* Ask TaskActor for result
*
* @param ref ActorRef of task
* @param callback callback for ask
* @return Future
*/
public AskFuture ask(ActorRef ref, AskCallback callback) {
return askPattern.ask(ref, 0, callback);
}
/**
* Ask TaskActor for result
*
* @param ref ActorRef of task
* @param timeout timeout of task
* @param callback callback for ask
* @return Future
*/
public AskFuture ask(ActorRef ref, long timeout, AskCallback callback) {
return askPattern.ask(ref, timeout, callback);
}
}