Search in sources :

Example 1 with RemoteJobs

use of com.b2international.snowowl.core.jobs.RemoteJobs in project snow-owl by b2ihealthcare.

the class SearchMergeRequest method doExecute.

@Override
public Merges doExecute(RepositoryContext context) {
    final ExpressionBuilder queryBuilder = Expressions.builder();
    // add mergerequest type filter
    queryBuilder.filter(RemoteJobEntry.Expressions.matchRequestType(ImmutableSet.of(BranchRebaseRequest.class.getSimpleName(), BranchMergeRequest.class.getSimpleName())));
    if (containsKey(OptionKey.SOURCE)) {
        queryBuilder.filter(RemoteJobEntry.Expressions.matchParameter(SOURCE_FIELD, getCollection(OptionKey.SOURCE, String.class)));
    }
    if (containsKey(OptionKey.TARGET)) {
        queryBuilder.filter(RemoteJobEntry.Expressions.matchParameter(TARGET_FIELD, getCollection(OptionKey.TARGET, String.class)));
    }
    if (containsKey(OptionKey.STATUS)) {
        queryBuilder.filter(RemoteJobEntry.Expressions.matchParameter(STATUS_FIELD, getCollection(OptionKey.STATUS, String.class)));
    }
    final RemoteJobs jobs = context.service(RemoteJobTracker.class).search(queryBuilder.build(), Integer.MAX_VALUE);
    final ObjectMapper mapper = context.service(ObjectMapper.class);
    final List<Merge> items = jobs.stream().map(job -> createMergefromJobEntry(job, mapper)).collect(Collectors.toList());
    return new Merges(items, jobs.getSearchAfter(), jobs.getLimit(), jobs.getTotal());
}
Also used : RepositoryContext(com.b2international.snowowl.core.domain.RepositoryContext) ImmutableSet(com.google.common.collect.ImmutableSet) Status(com.b2international.snowowl.core.merge.Merge.Status) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Merge(com.b2international.snowowl.core.merge.Merge) RemoteJobEntry(com.b2international.snowowl.core.jobs.RemoteJobEntry) Collectors(java.util.stream.Collectors) SearchResourceRequest(com.b2international.snowowl.core.request.SearchResourceRequest) List(java.util.List) Merges(com.b2international.snowowl.core.merge.Merges) Expressions(com.b2international.index.query.Expressions) AccessControl(com.b2international.snowowl.core.authorization.AccessControl) Map(java.util.Map) ApiError(com.b2international.commons.exceptions.ApiError) RemoteJobs(com.b2international.snowowl.core.jobs.RemoteJobs) ExpressionBuilder(com.b2international.index.query.Expressions.ExpressionBuilder) Permission(com.b2international.snowowl.core.identity.Permission) Builder(com.b2international.snowowl.core.merge.Merge.Builder) NotImplementedException(com.b2international.commons.exceptions.NotImplementedException) RemoteJobTracker(com.b2international.snowowl.core.jobs.RemoteJobTracker) RemoteJobs(com.b2international.snowowl.core.jobs.RemoteJobs) Merges(com.b2international.snowowl.core.merge.Merges) RemoteJobTracker(com.b2international.snowowl.core.jobs.RemoteJobTracker) Merge(com.b2international.snowowl.core.merge.Merge) ExpressionBuilder(com.b2international.index.query.Expressions.ExpressionBuilder) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper)

Example 2 with RemoteJobs

use of com.b2international.snowowl.core.jobs.RemoteJobs in project snow-owl by b2ihealthcare.

the class ClassifyOperation method run.

/**
 * Allocates a reasoner instance, performs the requested operation, then releases the borrowed instance back to the pool.
 * @param monitor an {@link IProgressMonitor} to monitor operation progress
 * @return the value returned by {@link #processResults(IProgressMonitor, long)}
 * @throws OperationCanceledException
 */
public T run(final IProgressMonitor monitor) throws OperationCanceledException {
    monitor.beginTask("Classification in progress...", IProgressMonitor.UNKNOWN);
    try {
        final String classificationId = UUID.randomUUID().toString();
        final String jobId = IDs.sha1(classificationId);
        final Notifications notifications = getServiceForClass(Notifications.class);
        final BlockingQueue<RemoteJobEntry> jobQueue = Queues.newArrayBlockingQueue(1);
        final Observable<RemoteJobEntry> jobObservable = notifications.ofType(RemoteJobNotification.class).filter(RemoteJobNotification::isChanged).filter(notification -> notification.getJobIds().contains(jobId)).concatMap(notification -> JobRequests.prepareSearch().one().filterById(jobId).buildAsync().execute(getEventBus())).map(RemoteJobs::first).map(Optional<RemoteJobEntry>::get).filter(RemoteJobEntry::isDone);
        // "One-shot" subscription; it should self-destruct after the first notification
        jobObservable.subscribe(new DisposableObserver<RemoteJobEntry>() {

            @Override
            public void onComplete() {
                dispose();
            }

            @Override
            public void onError(final Throwable t) {
                dispose();
            }

            @Override
            public void onNext(final RemoteJobEntry job) {
                try {
                    jobQueue.put(job);
                } catch (InterruptedException e) {
                    throw new SnowowlRuntimeException("Interrupted while trying to add a remote job entry to the queue.", e);
                } finally {
                    dispose();
                }
            }
        });
        ClassificationRequests.prepareCreateClassification().setClassificationId(classificationId).setReasonerId(reasonerId).setUserId(userId).addAllConcepts(additionalConcepts).setParentLockContext(parentLockContext).build(branch).get(ApplicationContext.getServiceForClass(Environment.class));
        while (true) {
            if (monitor.isCanceled()) {
                throw new OperationCanceledException();
            }
            try {
                final RemoteJobEntry jobEntry = jobQueue.poll(CHECK_JOB_INTERVAL_SECONDS, TimeUnit.SECONDS);
                if (jobEntry == null) {
                    continue;
                }
                switch(jobEntry.getState()) {
                    // $FALL-THROUGH$
                    case SCHEDULED:
                    case RUNNING:
                    case CANCEL_REQUESTED:
                        break;
                    case FINISHED:
                        try {
                            return processResults(classificationId);
                        } finally {
                            deleteEntry(jobId);
                        }
                    case CANCELED:
                        deleteEntry(jobId);
                        throw new OperationCanceledException();
                    case FAILED:
                        deleteEntry(jobId);
                        throw new SnowowlRuntimeException("Failed to retrieve the results of the classification.");
                    default:
                        throw new IllegalStateException("Unexpected state '" + jobEntry.getState() + "'.");
                }
            } catch (final InterruptedException e) {
            // Nothing to do
            }
        }
    } finally {
        monitor.done();
    }
}
Also used : SnomedConcept(com.b2international.snowowl.snomed.core.domain.SnomedConcept) Notifications(com.b2international.snowowl.core.events.Notifications) SnowowlRuntimeException(com.b2international.snowowl.core.api.SnowowlRuntimeException) ClassificationRequests(com.b2international.snowowl.snomed.reasoner.request.ClassificationRequests) BlockingQueue(java.util.concurrent.BlockingQueue) RemoteJobEntry(com.b2international.snowowl.core.jobs.RemoteJobEntry) IEventBus(com.b2international.snowowl.eventbus.IEventBus) UUID(java.util.UUID) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) IDs(com.b2international.snowowl.core.id.IDs) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) OperationCanceledException(org.eclipse.core.runtime.OperationCanceledException) DatastoreLockContextDescriptions(com.b2international.snowowl.core.internal.locks.DatastoreLockContextDescriptions) RemoteJobNotification(com.b2international.snowowl.core.jobs.RemoteJobNotification) Environment(com.b2international.snowowl.core.setup.Environment) Queues(com.google.common.collect.Queues) DisposableObserver(io.reactivex.observers.DisposableObserver) ApplicationContext.getServiceForClass(com.b2international.snowowl.core.ApplicationContext.getServiceForClass) JobRequests(com.b2international.snowowl.core.jobs.JobRequests) RemoteJobs(com.b2international.snowowl.core.jobs.RemoteJobs) Optional(java.util.Optional) Observable(io.reactivex.Observable) ApplicationContext(com.b2international.snowowl.core.ApplicationContext) RemoteJobs(com.b2international.snowowl.core.jobs.RemoteJobs) OperationCanceledException(org.eclipse.core.runtime.OperationCanceledException) RemoteJobEntry(com.b2international.snowowl.core.jobs.RemoteJobEntry) SnowowlRuntimeException(com.b2international.snowowl.core.api.SnowowlRuntimeException) Environment(com.b2international.snowowl.core.setup.Environment) Notifications(com.b2international.snowowl.core.events.Notifications)

Aggregations

RemoteJobEntry (com.b2international.snowowl.core.jobs.RemoteJobEntry)2 RemoteJobs (com.b2international.snowowl.core.jobs.RemoteJobs)2 List (java.util.List)2 ApiError (com.b2international.commons.exceptions.ApiError)1 NotImplementedException (com.b2international.commons.exceptions.NotImplementedException)1 Expressions (com.b2international.index.query.Expressions)1 ExpressionBuilder (com.b2international.index.query.Expressions.ExpressionBuilder)1 ApplicationContext (com.b2international.snowowl.core.ApplicationContext)1 ApplicationContext.getServiceForClass (com.b2international.snowowl.core.ApplicationContext.getServiceForClass)1 SnowowlRuntimeException (com.b2international.snowowl.core.api.SnowowlRuntimeException)1 AccessControl (com.b2international.snowowl.core.authorization.AccessControl)1 RepositoryContext (com.b2international.snowowl.core.domain.RepositoryContext)1 Notifications (com.b2international.snowowl.core.events.Notifications)1 IDs (com.b2international.snowowl.core.id.IDs)1 Permission (com.b2international.snowowl.core.identity.Permission)1 DatastoreLockContextDescriptions (com.b2international.snowowl.core.internal.locks.DatastoreLockContextDescriptions)1 JobRequests (com.b2international.snowowl.core.jobs.JobRequests)1 RemoteJobNotification (com.b2international.snowowl.core.jobs.RemoteJobNotification)1 RemoteJobTracker (com.b2international.snowowl.core.jobs.RemoteJobTracker)1 Merge (com.b2international.snowowl.core.merge.Merge)1