ThreadLocalContextProvider.java

  1. /*
  2.  * @copyright defined in LICENSE.txt
  3.  */

  4. package hera;

  5. import static org.slf4j.LoggerFactory.getLogger;

  6. import hera.annotation.ApiAudience;
  7. import hera.annotation.ApiStability;
  8. import org.slf4j.Logger;

  9. @ApiAudience.Private
  10. @ApiStability.Unstable
  11. public class ThreadLocalContextProvider implements ContextProvider {

  12.   protected final Logger logger = getLogger(getClass());

  13.   protected final Object cabinetKey;

  14.   protected Context baseContext;

  15.   public ThreadLocalContextProvider(final Context baseContext, final Object cabinetKey) {
  16.     this.baseContext = baseContext;
  17.     this.cabinetKey = cabinetKey;
  18.   }

  19.   @Override
  20.   public Context get() {
  21.     final Context context = ContextHolder.get(cabinetKey);
  22.     if (context.equals(EmptyContext.getInstance())) {
  23.       logger.debug("Context in current thread is empty. Set context from base: {}",
  24.           this.baseContext);
  25.       ContextHolder.set(cabinetKey, this.baseContext);
  26.     }
  27.     return ContextHolder.get(cabinetKey);
  28.   }

  29.   @Override
  30.   public void put(final Context context) {
  31.     this.baseContext = context;
  32.     ContextHolder.set(cabinetKey, context);
  33.   }

  34. }