Added array handling to deal with collection listing.

This code should be folded into Stapler but during the initial PoC this should be sufficient
This commit is contained in:
Kohsuke Kawaguchi 2016-02-23 14:54:03 -08:00
parent f1fbf56fc2
commit 9815602191
1 changed files with 39 additions and 1 deletions

View File

@ -4,11 +4,19 @@ import hudson.model.Api;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.export.DataWriter;
import org.kohsuke.stapler.export.ExportConfig;
import org.kohsuke.stapler.export.Flavor;
import org.kohsuke.stapler.export.Model;
import org.kohsuke.stapler.export.ModelBuilder;
import org.kohsuke.stapler.export.NamedPathPruner;
import org.kohsuke.stapler.export.TreePruner;
import org.kohsuke.stapler.interceptor.Interceptor;
import org.kohsuke.stapler.interceptor.InterceptorAnnotation;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.Writer;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
@ -36,9 +44,39 @@ public @interface TreeResponse {
return new HttpResponse() {
@Override
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
new Api(resp).doJson(req,rsp);
if (node instanceof Object[]) {
// TODO: Kohsuke is going to make this array handling a part of Stapler
Flavor flavor = Flavor.JSON;
rsp.setContentType(flavor.contentType);
Writer w = rsp.getCompressedWriter(req);
TreePruner pruner = null;
String tree = req.getParameter("tree");
if (tree != null) {
try {
pruner = new NamedPathPruner(tree);
} catch (IllegalArgumentException x) {
throw new ServletException("Malformed tree expression: " + x, x);
}
}
ExportConfig config = new ExportConfig();
config.prettyPrint = req.hasParameter("pretty");
DataWriter dw = flavor.createDataWriter(node, w, config);
dw.startArray();
for (Object item : (Object[])node) {
Model p = MODEL_BUILDER.get(item.getClass());
p.writeTo(item, pruner, dw);
}
dw.endArray();
w.close();
} else {
new Api(resp).doJson(req, rsp);
}
}
};
}
private static final ModelBuilder MODEL_BUILDER = new ModelBuilder();
}
}