package com.softwaremill.common.util.dependency; import java.lang.annotation.Annotation; import java.util.List; import java.util.Set; /** * Common class for dependency providers */ public abstract class AbstractDependencyProvider implements DependencyProvider{ public AbstractDependencyProvider() { } protected void loadDeps(List<Object> deps) { for (Object dep : deps) { if (dep instanceof QualifiedDependency) { getDependenciesWithQualifiers().add((QualifiedDependency) dep); } else { getDependencies().add(dep); } } } @SuppressWarnings({"unchecked"}) @Override public <T> T inject(Class<T> cls, Annotation... qualifiers) { if (qualifiers.length > 0) { // check for dependencies with qualifiers Set<Annotation> key = D.createKeyForAnnotations(qualifiers); for (QualifiedDependency qualifiedDependency : getDependenciesWithQualifiers()) { if (qualifiedDependency.qualifiersEqual(key)) { // depednecy has to be right class if (cls.isAssignableFrom(qualifiedDependency.getDep().getClass())) { return (T) qualifiedDependency.getDep(); } } } // none found return null; } for (Object dependency : getDependencies()) { if (cls.isAssignableFrom(dependency.getClass())) { return (T) dependency; } } return null; } @Override public String toString() { return this.getClass().getSimpleName()+"{dependencies=" + getDependencies() + ";qualifiefDependences=" + getDependenciesWithQualifiers() + "}"; } protected abstract List<Object> getDependencies(); protected abstract List<QualifiedDependency> getDependenciesWithQualifiers(); }