package restx.factory;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import static java.util.Collections.emptySet;
public class SystemPropertyFactoryMachine implements FactoryMachine {
@Override
public boolean canBuild(Name<?> name) {
return name.getClazz() == String.class && System.getProperty(name.getName()) != null;
}
@Override
@SuppressWarnings("unchecked")
public <T> MachineEngine<T> getEngine(final Name<T> name) {
return new NoDepsMachineEngine<T>(name, priority(), BoundlessComponentBox.FACTORY) {
@Override
protected T doNewComponent(SatisfiedBOM satisfiedBOM) {
// in case the system property has been nullified, we return an empty string as value, rather than null
// which would break the component building
return (T) Objects.firstNonNull(System.getProperty(name.getName()), "");
}
};
}
@Override
@SuppressWarnings("unchecked")
public <T> Set<Name<T>> nameBuildableComponents(Class<T> componentClass) {
if (componentClass != String.class) {
return emptySet();
}
Set<Name<T>> names = new LinkedHashSet<>();
for (Map.Entry<Object, Object> entry : System.getProperties().entrySet()) {
names.add((Name<T>) Name.of(String.class, (String) entry.getKey()));
}
return names;
}
@Override
public int priority() {
return -1000;
}
public String toString() {
return getClass().getSimpleName();
}
}