@Override public Iterable<Iterable<StreamsEntry>> apply(RepositoryHandle repository, Iterable<Iterable<StreamsEntry>> acc) { if (cancelled.get()) { throw new CancelledException(); } Iterable<StreamsEntry> changesets = finder.getChangesets(baseUri, repository, request, cancelled); return concat(acc, ImmutableList.of(changesets)); } };
@Override public Option<StreamsEntry> apply(Pair<Pair<StreamsCrucibleActivityItem, ActivityVerb>, ActivityRequest> activityEntry) { // getting entry properties may be expensive, so check for interrupts here CancelledException.throwIfInterrupted(); return crucibleEntryFactory.getEntryFromActivityItem(activityEntry, activityRequest.getContextUri()); } })));
/** * Throws a CancelledException if the current thread's interrupt state is set. * This also clears the current thread's interrupt state. * <p> * See {@link StreamsActivityProvider#getActivityFeed(com.atlassian.streams.api.ActivityRequest)} * for more about the circumstances in which interrupt checking is needed. */ public static void throwIfInterrupted() throws CancelledException { if (Thread.interrupted()) { CancelledException e = new CancelledException(); if (log.isDebugEnabled()) { log.debug("detected thread interrupt", e); } throw e; } } }
CancelledException.throwIfInterrupted(); CancelledException.throwIfInterrupted();
public Iterable<ChangesetDataFE> apply(String username) { if (isNotEmpty(username)) { if (cancelled.get()) { throw new CancelledException(); } final Builder queryBuilder = getQueryParametersBuilder(request).committer(username); return listChangesets(repositoryName, queryBuilder.build()); } return ImmutableList.of(); } };
/** * Transform the given Builds to StreamEntries * * @param builds the Builds to transform * @param cancelled cancelled flag * @return the stream entries */ private Iterable<StreamsEntry> transformEntries(Iterable<Build> builds, AtomicBoolean cancelled) { Set<Build> processed = Sets.newHashSet(); List<StreamsEntry> entries = Lists.newArrayList(); for (Build build : builds) { if (cancelled.get()) { throw new CancelledException(); } if (!processed.contains(build)) { try { entries.add(toStreamEntry(build)); } catch (Exception e) { LOGGER.warn("Unable to get Streams Entry for build {}: {}", build, e.getMessage()); LOGGER.debug("toStreamEntry error", e); } processed.add(build); } } return entries; }
private Function<ActivityItem, Option<StreamsEntry>> toStreamsEntry(final URI baseUri, final Supplier<Boolean> cancelled) { return activityItem -> { try { // getting item properties may be expensive, so check for cancellation here if (cancelled.get()) { throw new CancelledException(); } return some(entryFactory.buildStreamsEntry(baseUri, activityItem)); } catch (Exception e) { log.warn("Error creating streams entry", e); return none(); } }; } }
@Override public StreamsFeed call() throws Exception { Iterable<StreamsEntry> entries = Lists.newArrayList(); if (!filter.getInProjectKeys().isEmpty() && filter.getInUsers().isEmpty()) { Iterable<Build> builds = buildService.getLatestBuildsByFilter(activityRequest.getMaxResults(), filter); if (cancelled.get()) { throw new CancelledException(); } LOGGER.debug("Found build entries for stream: " + builds); entries = transformEntries(builds, cancelled); } return new StreamsFeed(i18nResolver.getText("jenkins.streams.feed.title"), entries, Option.<String>none()); }
/** * Extracts activity from the given list of issues */ private List<JiraActivityItem> extractActivity(final Iterable<Issue> issues, final ActivityRequest request, Supplier<Boolean> cancelled) { final ApplicationUser user = authenticationContext.getUser(); Predicate<String> inUsers = inUsers(request); Predicate<Date> containsDate = inDateRange(request); Predicate<Option<Pair<ActivityObjectType, ActivityVerb>>> hasActivity = isDefined(); Predicate<Pair<ActivityObjectType, ActivityVerb>> inJiraActivities = inActivities(request); ImmutableList.Builder<JiraActivityItem> builder = ImmutableList.builder(); // map the change histories by issue so we can look them up from inside the loop ChangeHistoryQuery changeHistories = new ChangeHistoryQuery(issueHistoryReader, issues, user); IssueActivityExtractor issueActivityExtractor = new IssueActivityExtractor(user, commentManager, helper, builder, changeHistories, inUsers, containsDate, inJiraActivities); for (final Issue issue : issues) { // Check for cancellation each time through this loop, since we may be pulling // quite a bit of change history for each issue if (cancelled.get()) { throw new CancelledException(); } issueActivityExtractor.extract(issue); } return builder.build(); }
filter); if (cancelled.get()) { throw new CancelledException();