package com.orhanobut.wasp;
import android.content.Context;
import android.os.Handler;
import android.text.TextUtils;
import com.orhanobut.wasp.utils.MockFactory;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Collections;
/**
* A NetworkStack implementation for delivering offline mock responses.
*/
class MockNetworkStack implements NetworkStack {
private static MockNetworkStack mockNetworkStack;
private Context context;
private MockNetworkStack(Context context) {
this.context = context;
}
static MockNetworkStack getDefault(Context context) {
if (mockNetworkStack == null) {
mockNetworkStack = new MockNetworkStack(context);
}
return mockNetworkStack;
}
@Override
@SuppressWarnings("unchecked")
public void invokeRequest(RequestCreator waspRequest,
final InternalCallback<Response> waspCallback) {
MockHolder mock = waspRequest.getMock();
final int statusCode = mock.getStatusCode();
MethodInfo methodInfo = waspRequest.getMethodInfo();
Type responseType = methodInfo.getResponseObjectType();
String responseString;
Object responseObject;
if (TextUtils.isEmpty(mock.getPath())) {
//Create mock object and return
responseObject = MockFactory.createMockObject(responseType);
responseString = Wasp.getParser().toBody(responseObject);
} else {
responseString = MockFactory.readMockResponse(context, mock.getPath());
try {
responseObject = Wasp.getParser().fromBody(responseString, responseType);
} catch (IOException e) {
throw new RuntimeException("Mock file \"" + mock.getPath()
+ "\" is in an invalid format", e);
}
}
final Response waspResponse = new Response.Builder()
.setUrl(waspRequest.getUrl())
.setStatusCode(statusCode)
.setHeaders(Collections.<String, String>emptyMap())
.setBody(responseString)
.setResponseObject(responseObject)
.setLength(responseString.length())
.setNetworkTime(1000)
.build();
//delay the response 1 second
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (statusCode < 200 || statusCode > 299) {
waspCallback.onError(new WaspError(waspResponse, "Mock error message!"));
return;
}
waspCallback.onSuccess(waspResponse);
}
}, 1000);
}
@Override
public Object invokeRequest(RequestCreator requestCreator) {
MockHolder mock = requestCreator.getMock();
final int statusCode = mock.getStatusCode();
MethodInfo methodInfo = requestCreator.getMethodInfo();
Type responseType = methodInfo.getResponseObjectType();
String responseString;
Object responseObject;
if (TextUtils.isEmpty(mock.getPath())) {
//Create mock object and return
responseObject = MockFactory.createMockObject(responseType);
responseString = Wasp.getParser().toBody(responseObject);
} else {
responseString = MockFactory.readMockResponse(context, mock.getPath());
try {
responseObject = Wasp.getParser().fromBody(responseString, responseType);
} catch (IOException e) {
throw new RuntimeException("Mock file \"" + mock.getPath()
+ "\" is in an invalid format", e);
}
}
final Response waspResponse = new Response.Builder()
.setUrl(requestCreator.getUrl())
.setStatusCode(statusCode)
.setHeaders(Collections.<String, String>emptyMap())
.setBody(responseString)
.setResponseObject(responseObject)
.setLength(responseString.length())
.setNetworkTime(1000)
.build();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Logger.e(e.getMessage());
}
return waspResponse.getResponseObject();
}
}