DefaultExecutionContextImpl.java

package net.secodo.jcircuitbreaker.breaker.execution.impl;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import net.secodo.jcircuitbreaker.breaker.execution.ExecutedTask;
import net.secodo.jcircuitbreaker.breaker.execution.ExecutionContext;


public class DefaultExecutionContextImpl<R> implements ExecutionContext<R> {
  private final ConcurrentHashMap<String, ExecutedTask<R>> tasksInProgress;
  private final Object userData;
  private Map<String, Object> contextAttributes;

  public DefaultExecutionContextImpl(ConcurrentHashMap<String, ExecutedTask<R>> tasksInProgress, Object userData) {
    this.tasksInProgress = tasksInProgress;
    this.userData = userData;
  }


  @Override
  public Collection<ExecutedTask<R>> getExecutionsInProgress() {
    return Collections.unmodifiableCollection(tasksInProgress.values());
  }

  @Override
  @SuppressWarnings("unchecked")
  public <U> U getUserData() {
    return (U) userData;
  }

  @Override
  public <T> void setContextAttribute(String name, T value) {
    ensureAttributesInitialized();
    contextAttributes.put(name, value);
  }

  @Override
  public boolean hasContextAttribute(String name) {
    return (contextAttributes != null) ? contextAttributes.containsKey(name) : false;
  }

  @Override
  @SuppressWarnings("unchecked")
  public <T> T getContextAttribute(String name) {
    return (contextAttributes != null) ? (T) contextAttributes.get(name) : null;
  }

  private void ensureAttributesInitialized() {
    if (contextAttributes == null) {
      contextAttributes = new HashMap<String, Object>();
    }
  }
}