/** * Get a graph as {@link SaltProject} of a set of Salt IDs. * * @param saltIDs saltIDs must have at least one saltId, more than one id are separated by + or * space * @param leftRaw left context parameter * @param rightRaw right context parameter * @return the graph of this hit. */ @POST @Path("search/subgraph") @Produces({"application/xml", "application/xmi+xml", "application/xmi+binary"}) public SaltProject subgraph(final SubgraphQuery query) { // some robustness stuff if (query == null) { throw new WebApplicationException( Response.status(Response.Status.BAD_REQUEST) .type(MediaType.TEXT_PLAIN) .entity("missing required request body") .build()); } QueryData data = new QueryData(); data.addExtension( new AnnotateQueryData(query.getLeft(), query.getRight(), query.getSegmentationLayer())); Set<String> corpusNames = new TreeSet<String>(); for (SaltURIGroup singleMatch : query.getMatches().getGroups().values()) { // collect list of used corpora and created pseudo QueryNodes for each URI List<QueryNode> pseudoNodes = new ArrayList<QueryNode>(singleMatch.getUris().size()); for (java.net.URI u : singleMatch.getUris()) { pseudoNodes.add(new QueryNode()); corpusNames.add(CommonHelper.getCorpusPath(u).get(0)); } data.addAlternative(pseudoNodes); } Subject user = SecurityUtils.getSubject(); for (String c : corpusNames) { user.checkPermission("query:subgraph:" + c); } List<String> corpusNamesList = new LinkedList<String>(corpusNames); List<Long> corpusIDs = annisDao.mapCorpusNamesToIds(corpusNamesList); data.setCorpusList(corpusIDs); data.addExtension(query.getMatches()); long start = new Date().getTime(); SaltProject p = annisDao.graph(data); long end = new Date().getTime(); logQuery("SUBGRAPH", "", corpusNamesList, end - start); return p; }