use of org.opencastproject.util.data.MultiMap in project opencast by opencast.
the class AbstractAclServiceRestEndpoint method getTransitionsFor.
@GET
@Path("/transitionsfor.json")
@Produces(MediaType.APPLICATION_JSON)
@RestQuery(name = "getTransitionsForAsJson", description = "Get the transitions for a list of episodes and/or series as json. At least one of the lists must not be empty.", returnDescription = "Get the transitions as json", restParameters = { @RestParameter(name = "episodeIds", isRequired = false, description = "A list of comma separated episode IDs", type = STRING), @RestParameter(name = "seriesIds", isRequired = false, description = "A list of comma separated series IDs", type = STRING), @RestParameter(name = "done", isRequired = false, description = "Indicates if already applied transitions should be included", type = BOOLEAN) }, reponses = { @RestResponse(responseCode = SC_OK, description = "The request was processed succesfully"), @RestResponse(responseCode = SC_BAD_REQUEST, description = "Parameter error"), @RestResponse(responseCode = SC_INTERNAL_SERVER_ERROR, description = "Error during processing the request") })
public Response getTransitionsFor(@QueryParam("episodeIds") String episodeIds, @QueryParam("seriesIds") String seriesIds, @DefaultValue("false") @QueryParam("done") final boolean done) {
final Monadics.ListMonadic<String> eIds = splitCommaSeparatedParam(option(episodeIds));
final Monadics.ListMonadic<String> sIds = splitCommaSeparatedParam(option(seriesIds));
if (eIds.value().isEmpty() && sIds.value().isEmpty()) {
return badRequest();
}
final AclService aclService = aclService();
try {
// episodeId -> [transitions]
final Map<String, List<EpisodeACLTransition>> eTs = eIds.foldl(MultiMap.<String, EpisodeACLTransition>multiHashMapWithArrayList(), new Function2.X<MultiMap<String, EpisodeACLTransition>, String, MultiMap<String, EpisodeACLTransition>>() {
@Override
public MultiMap<String, EpisodeACLTransition> xapply(MultiMap<String, EpisodeACLTransition> mmap, String id) throws Exception {
// todo it is quite expensive to query each episode separately
final TransitionQuery q = TransitionQuery.query().withId(id).withScope(AclScope.Episode).withDone(done);
return mmap.putAll(id, aclService.getTransitions(q).getEpisodeTransistions());
}
}).value();
// seriesId -> [transitions]
final Map<String, List<SeriesACLTransition>> sTs = sIds.foldl(MultiMap.<String, SeriesACLTransition>multiHashMapWithArrayList(), new Function2.X<MultiMap<String, SeriesACLTransition>, String, MultiMap<String, SeriesACLTransition>>() {
@Override
public MultiMap<String, SeriesACLTransition> xapply(MultiMap<String, SeriesACLTransition> mmap, String id) throws Exception {
// todo it is quite expensive to query each series separately
final TransitionQuery q = TransitionQuery.query().withId(id).withScope(AclScope.Series).withDone(done);
return mmap.putAll(id, aclService.getTransitions(q).getSeriesTransistions());
}
}).value();
final Jsons.Obj episodesObj = buildEpisodesObj(eTs);
final Jsons.Obj seriesObj = buildSeriesObj(sTs);
return ok(obj(p("episodes", episodesObj), p("series", seriesObj)).toJson());
} catch (Exception e) {
logger.error("Error generating getTransitionsFor response", e);
return serverError();
}
}
Aggregations