package restx.specs;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import restx.*;
import restx.admin.AdminModule;
import restx.security.PermissionFactory;
import restx.security.RestxSecurityManager;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* User: xavierhanin
* Date: 3/18/13
* Time: 9:37 PM
*/
public class SpecRecorderRoute extends RestxRouter {
public SpecRecorderRoute(final RestxSpecRecorder.Repository recordedSpecsRepository,
final RestxSpec.StorageSettings storageSettings,
final RestxSecurityManager securityManager,
final PermissionFactory permissionFactory) {
super("SpecRecorderRouter",
new ResourcesRoute("RecorderUIRoute", "/@/ui/recorder/", "restx.specs.recorder", ImmutableMap.of("", "index.html")),
new StdRoute("RecorderRoute", new StdRestxRequestMatcher("GET", "/@/recorders")) {
@Override
public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException {
securityManager.check(req, match, permissionFactory.hasRole(AdminModule.RESTX_ADMIN_ROLE));
resp.setContentType("application/json");
List<String> data = Lists.newArrayList();
for (RestxSpecRecorder.RecordedSpec spec : recordedSpecsRepository.getRecordedSpecs()) {
data.add(String.format("{ \"id\": \"%03d\", \"method\": \"%s\", \"path\": \"%s\", \"recordTime\": \"%s\", \"duration\":"
+ " %d, " +
"\"capturedItems\": %d, \"capturedRequestSize\": %d, \"capturedResponseSize\": %d }",
spec.getId(), spec.getMethod(), spec.getPath(), spec.getRecordTime(), spec.getDuration().getMillis(),
spec.getCapturedItems(), spec.getCapturedRequestSize(), spec.getCapturedResponseSize()));
}
resp.getWriter().print("[\n");
Joiner.on(",\n").appendTo(resp.getWriter(), data);
resp.getWriter().print("\n]");
}
},
new StdRoute("RecorderRecord", new StdRestxRequestMatcher("GET", "/@/recorders/{id}")) {
@Override
public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException {
securityManager.check(req, match, permissionFactory.hasRole(AdminModule.RESTX_ADMIN_ROLE));
int id = Integer.parseInt(match.getPathParam("id"));
for (RestxSpecRecorder.RecordedSpec spec : recordedSpecsRepository.getRecordedSpecs()) {
if (spec.getId() == id) {
resp.setContentType("text/yaml");
resp.getWriter().println(spec.getSpec().toString());
return;
}
}
notFound(match, resp);
}
},
new StdRoute("RecorderRecordStorage", new StdRestxRequestMatcher("POST", "/@/recorders/storage/{id}")) {
@Override
public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException {
securityManager.check(req, match, permissionFactory.hasRole(AdminModule.RESTX_ADMIN_ROLE));
int id = Integer.parseInt(match.getPathParam("id"));
for (RestxSpecRecorder.RecordedSpec spec : recordedSpecsRepository.getRecordedSpecs()) {
if (spec.getId() == id) {
Optional<String> path = req.getQueryParam("path");
Optional<String> title = req.getQueryParam("title");
RestxSpec.Storage storage = RestxSpec.Storage.with(storageSettings);
File destFile = storage.store(
spec.getSpec()
.withTitle(title)
.withPath(storage.buildPath(path, title.or(spec.getSpec().getTitle()))));
resp.setContentType("text/plain");
resp.getWriter().println(destFile.getAbsolutePath());
return;
}
}
notFound(match, resp);
}
}
);
}
}