package controllers; import java.io.InputStream; import org.jcrom.Jcrom; import play.libs.Json; import play.mvc.Result; import play.mvc.With; import providers.CacheableUserProvider; import service.JcrSessionFactory; import service.filestore.FileStore; import service.filestore.FlagStore; import charts.ChartType; import charts.reference.CacheResult; import charts.reference.ChartRefCache; import charts.reference.ChartRefConfig; import com.google.inject.Inject; @With(UncacheableAction.class) public class ChartReferenceController extends SessionAwareController { private final ChartRefConfig config; private final ChartRefCache cache; @Inject public ChartReferenceController(final JcrSessionFactory sessionFactory, final Jcrom jcrom, final CacheableUserProvider sessionHandler, final FileStore fileStoreImpl, final FlagStore flagStoreImpl, final ChartRefConfig config, final ChartRefCache cache) { super(sessionFactory, jcrom, sessionHandler); this.config = config; this.cache = cache; } @SubjectPresent public Result index() { return ok(views.html.Application.chartref.render()).as("text/html; charset=utf-8"); } @SubjectPresent public Result config() { return ok(Json.toJson(config.chartrefs())).as("application/json; charset=utf-8"); } @SubjectPresent public Result chart(final String chartType) { final ChartType type; try { type = ChartType.getChartType(chartType); } catch (IllegalArgumentException e) { return notFound("unknown chart type " + chartType); } CacheResult r = cache.cached(type); if(r != null) { try { if(!modified(r.created())) { return status(NOT_MODIFIED); } } catch(Exception e) {} InputStream content = r.content(); if(content != null) { ctx().response().setHeader("Last-Modified", asHttpDate(r.created())); return ok(content).as("image/svg+xml; charset=utf-8"); } else { return internalServerError(); } } else { return notFound("not in cache"); } } @SubjectPresent public Result datasource(final String chartType) { final ChartType type; try { type = ChartType.getChartType(chartType); } catch (IllegalArgumentException e) { return notFound("unknown chart type " + chartType); } CacheResult r = cache.cached(type); if(r != null) { ctx().response().setHeader("Content-Disposition", ContentDispositionSupport.attachment( String.format("%s.%s", type.name().toLowerCase(), r.datasourceExtension()))); return ok(r.datasource()).as(r.datasourceMimetype()); } else { return notFound("not in cache"); } } }