@SuppressWarnings("unchecked") @Override public <TInput, TOutput> CommandResult<TOutput> execute( ServiceLocator locator, Serialization<TInput> input, Serialization<TOutput> output, TInput data, Principal principal) { Argument<TInput> arg; try { arg = input.deserialize(data, Argument.class, data.getClass()); } catch (IOException e) { return CommandResult.badRequest(e.getMessage()); } Optional<Class<?>> manifest = domainModel.find(arg.ReportName); if (!manifest.isPresent()) { return CommandResult.badRequest("Couldn't find report type: " + arg.ReportName); } if (!permissions.canAccess(manifest.get(), principal)) { return CommandResult.forbidden(arg.ReportName); } if (!Report.class.isAssignableFrom(manifest.get())) { return CommandResult.badRequest("Specified type is not a report: " + arg.ReportName); } final Report report; try { report = (Report) input.deserialize(arg.Data, manifest.get()); } catch (IOException e) { return CommandResult.badRequest( "Error deserializing report: " + arg.ReportName + ". Reason: " + e.getMessage()); } final Object result = report.populate(locator); try { return CommandResult.success("Report populated", output.serialize(result)); } catch (IOException e) { return new CommandResult<>(null, "Error serializing result.", 500); } }
@Override public long getProcessedSize(TInput input) { return input.size(); }