TaskScopeContext.java

package io.github.dawidkc.spring.scopes;

import java.io.Closeable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * Context holder object for task scope.
 *
 * @see TaskScopeContext#getContextObject()
 */
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
public class TaskScopeContext<T> implements Closeable {

    private static final AtomicLong COUNTER = new AtomicLong();

    @Getter(AccessLevel.PACKAGE)
    private final Map<String, Object> beans = new ConcurrentHashMap<>();

    @Getter(AccessLevel.PACKAGE)
    private final Map<String, Runnable> destructionCallbacks = new ConcurrentHashMap<>();

    private final T contextObject;

    private final long id = COUNTER.getAndIncrement();

    /**
     * Returns the context object provided when opening scope.
     */
    public T getContextObject() {
        return contextObject;
    }

    /**
     * Returns the unique context ID.
     */
    public long getId() {
        return id;
    }

    @Override
    public void close() {
        TaskScope.delete(this);
    }
}