package org.wildfly.swarm.spi.api.config; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Map; /** */ public class Builder<T> implements Resolver<T> { public Builder(ConfigView view, ConfigKey key) { this.view = view; this.key = key; } @SuppressWarnings("unchecked") public <N> Resolver<N> as(Class<N> clazz) { targetType = clazz; return (Resolver<N>) this; } @SuppressWarnings("unchecked") @Override public <N> Resolver<N> as(Class<N> clazz, Converter<N> converter) { targetType = clazz; this.converter = converter; return (Resolver<N>) this; } @Override public ConfigKey getKey() { return key; } @SuppressWarnings("unchecked") @Override public T getValue() { Object originalValue = this.view.valueOf(this.key); if (originalValue instanceof ConfigTree) { if (List.class.isAssignableFrom(this.targetType)) { return (T) ((ConfigTree) originalValue).asList(); } else if (Map.class.isAssignableFrom(this.targetType)) { return (T) ((ConfigTree) originalValue).asMap(); } else { return null; } } else { String valueStr = (originalValue != null ? originalValue.toString() : null); try { T value = convert(valueStr); if (null == value) { throw new RuntimeException("Stage config '" + key + "' is missing"); } return value; } catch (Throwable t) { throw new RuntimeException(t); } } } @Override public boolean hasValue() { Object originalValue = this.view.valueOf(this.key); return originalValue != null; } public Resolver<T> withDefault(T value) { defaultValue = value; return this; } @SuppressWarnings("unchecked") private T convert(String value) throws MalformedURLException { if (value == null) { if (defaultValue != null) { if (defaultValue instanceof String) { value = (String) defaultValue; } else { return defaultValue; } } else { return null; } } Object result = null; if (this.converter != null) { try { result = converter.convert(value); } catch (Exception e) { throw new RuntimeException(e); } } else if (String.class.equals(targetType)) { result = value; } else if (Boolean.class.equals(targetType)) { Boolean isTrue = "TRUE".equalsIgnoreCase(value); isTrue |= "1".equalsIgnoreCase(value); result = isTrue; } else if (Integer.class.equals(targetType)) { result = Integer.parseInt(value); } else if (Long.class.equals(targetType)) { result = Long.parseLong(value); } else if (Float.class.equals(targetType)) { result = Float.parseFloat(value); } else if (Double.class.equals(targetType)) { result = Double.parseDouble(value); } else if (URL.class.equals(targetType)) { result = new URL(value); } return (T) result; } private ConfigView view; private final ConfigKey key; private Class<?> targetType; private T defaultValue; private Converter<?> converter; }