package com.microsoft.live.test.util;
import java.util.concurrent.BlockingQueue;
import org.json.JSONObject;
import com.microsoft.live.LiveConnectClient;
public abstract class AsyncRunnableWithBody<OperationType, ListenerType>
extends AsyncRunnable<OperationType, ListenerType> {
private enum BodyType {
JSON {
@Override
public <OperationType> OperationType calledWithoutUserState(AsyncRunnableWithBody<OperationType, ?> a) {
return a.calledWithoutUserState(a.jsonBody);
}
@Override
public <OperationType> OperationType calledWithUserState(AsyncRunnableWithBody<OperationType, ?> a,
Object userState) {
return a.calledWithUserState(a.jsonBody, userState);
}
},
STRING {
@Override
public <OperationType> OperationType calledWithoutUserState(AsyncRunnableWithBody<OperationType, ?> a) {
return a.calledWithoutUserState(a.stringBody);
}
@Override
public <OperationType> OperationType calledWithUserState(AsyncRunnableWithBody<OperationType, ?> a,
Object userState) {
return a.calledWithUserState(a.stringBody, userState);
}
};
public abstract <OperationType> OperationType calledWithoutUserState(AsyncRunnableWithBody<OperationType, ?> a);
public abstract <OperationType> OperationType calledWithUserState(AsyncRunnableWithBody<OperationType, ?> a,
Object userState);
}
private final BodyType bodyType;
private final JSONObject jsonBody;
private final String stringBody;
public AsyncRunnableWithBody(BlockingQueue<OperationType> queue,
LiveConnectClient connectClient,
String path,
JSONObject body,
ListenerType listener) {
super(queue, connectClient, path, listener);
this.jsonBody = body;
this.stringBody = null;
this.bodyType = BodyType.JSON;
}
public AsyncRunnableWithBody(BlockingQueue<OperationType> queue,
LiveConnectClient connectClient,
String path,
JSONObject body,
ListenerType listener,
Object userState) {
super(queue, connectClient, path, listener, userState);
this.jsonBody = body;
this.stringBody = null;
this.bodyType = BodyType.JSON;
}
public AsyncRunnableWithBody(BlockingQueue<OperationType> queue,
LiveConnectClient connectClient,
String path,
String body,
ListenerType listener) {
super(queue, connectClient, path, listener);
this.jsonBody = null;
this.stringBody = body;
this.bodyType = BodyType.STRING;
}
public AsyncRunnableWithBody(BlockingQueue<OperationType> queue,
LiveConnectClient connectClient,
String path,
String body,
ListenerType listener,
Object userState) {
super(queue, connectClient, path, listener, userState);
this.jsonBody = null;
this.stringBody = body;
this.bodyType = BodyType.STRING;
}
protected abstract OperationType calledWithoutUserState(JSONObject body);
protected abstract OperationType calledWithoutUserState(String body);
protected abstract OperationType calledWithUserState(JSONObject body, Object userState);
protected abstract OperationType calledWithUserState(String body, Object userState);
@Override
protected OperationType calledWithoutUserState() {
return this.bodyType.calledWithoutUserState(this);
}
@Override
protected OperationType calledWithUserState(Object userState) {
return this.bodyType.calledWithUserState(this, userState);
}
}