アスペクト指向なのかぁん?

例えば、「リクエストをどこかに送ると、相手が答えを返してくれる。」という複数のオブジェクトが関わって生じる現象(というか様相?アスペクト?)をこんな感じにひと場所にまとめて書けて、「けどたまに無視されることもあるかもしれないので監視してみたい。」というような野望をもこうしてかなえることができるのかな?

注:abstractしか書いてないので物凄く抽象的です。


public class ProtocolInfo
{
public Object addrDestination;
public Object addrSource;
public int protocolId;
public java.rmi.server.UID guid;
public int extra;
}


import java.io.Serializable;
import java.rmi.server.UID;
import java.util.Hashtable;

import org.aspectj.lang.Signature;

public abstract aspect RequestRespond
{
protected abstract pointcut initiate(ProtocolInfo info, Serializable arg);
protected abstract pointcut requestArrival(ProtocolInfo info, Serializable arg);
protected abstract pointcut responseArrival(ProtocolInfo info, Serializable arg);

private final int ID_REQUEST = 1;
private final int ID_RESPONSE = -1;
private final int ID_RESPONSE_INVALID = -2;

public class OngoingRequest
{
public Signature signature;
public long time;
}

private Hashtable ongoingRequests = new Hashtable();

// 誰かがリクエストしたくなったとき
void around(ProtocolInfo info, Serializable arg) : initiate(info, arg)
{
UID guid = new UID();
info.guid = guid;
info.extra = ID_REQUEST;

proceed(info, arg); // 処理本体

if(ongoingRequests.size() > /*max size*/ 64)
{
System.err.println("ongoing request list is full.");
return;
}

OngoingRequest req = new OngoingRequest();
req.signature = thisJoinPoint.getSignature();
req.time = System.currentTimeMillis();
ongoingRequests.put(guid,req);
}

// 誰かがどこかからリクエストを受け取ったとき
before(ProtocolInfo info, Serializable arg) : requestArrival(info, arg)
{
// 宛先と送り主をswap
Object tmp = info.addrSource;
info.addrSource = info.addrDestination;
info.addrDestination = tmp;

info.extra = ID_RESPONSE;
}

// 誰かが返ってきたレスポンスを受け取ったとき
void around(ProtocolInfo info, Serializable arg) : responseArrival(info, arg)
{
if(!ongoingRequests.containsKey(info.guid))
{
// 身に覚えのないレスポンスだけどいくらなんでも
// return // しちゃうとヤバそうなので
info.extra = ID_RESPONSE_INVALID;
}

proceed(info, arg); // 処理本体

// セッションが終わったので進行中リストから情報を消す
ongoingRequests.remove(info.guid);
}

public Hashtable getOngoingRequests()
{
// 多分 [実装先aspect].aspectOf().getOngoingRequests(); で取れるはず
return ongoingRequests;
}
}