001package org.maxur.perfmodel.backend.service;
002
003import org.glassfish.hk2.api.Injectee;
004import org.glassfish.hk2.api.InjectionResolver;
005import org.glassfish.hk2.api.ServiceHandle;
006import org.slf4j.Logger;
007import org.slf4j.LoggerFactory;
008
009import javax.inject.Inject;
010import javax.inject.Named;
011import java.lang.reflect.Type;
012
013import static java.lang.String.format;
014
015/**
016 * @author Maxim Yunusov
017 * @version 1.0
018 * @since <pre>9/2/2015</pre>
019 */
020public class ConfigurationInjectionResolver implements InjectionResolver<Named> {
021
022    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationInjectionResolver.class);
023
024    @Inject
025    private PropertiesService propertiesService;
026
027    @Override
028    public Object resolve(Injectee injectee, ServiceHandle<?> root) {
029        Named annotation = injectee.getParent().getAnnotation(Named.class);
030        final String name = annotation.value();
031        final Type type = injectee.getRequiredType();
032        switch (type.getTypeName()) {
033            case "java.lang.String": {
034                return propertiesService.asString(name);
035            }
036            case "java.lang.Integer": {
037                return propertiesService.asInteger(name);
038            }
039            case "java.net.URI": {
040                return propertiesService.asURI(name);
041            }
042            default: {
043                LOGGER.error("Unsupported property type {}", type.getTypeName());
044                throw new IllegalStateException(format("Unsupported property type %s", type.getTypeName()));
045            }
046        }
047    }
048
049    @Override
050    public boolean isConstructorParameterIndicator() { return false; }
051
052    @Override
053    public boolean isMethodParameterIndicator() { return false; }
054}