package de.axone.tools; import java.io.File; import java.math.BigDecimal; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; public interface StringValueAccessor<K> extends KeyValueAccessor<K,String> { // == String ===== @Override public String access( K key ); // == Integer ===== public default Integer getInteger( K key ){ String v = get( key ); if( v == null ) return null; return Integer.parseInt( v ); } public default int getInteger( K key, int defaultValue ){ Integer v = getInteger( key ); if( v == null ) return defaultValue; return v; } public default Integer getInteger( K key, Integer defaultValue ){ Integer v = getInteger( key ); if( v == null ) return defaultValue; return v; } public default int getInteger( K key, ValueProvider<Integer> defaultValueProvider ){ Integer v = getInteger( key ); if( v == null ) return defaultValueProvider.get(); return v; } public default int getIntegerRequired( K key ){ Integer v = getInteger( key ); if( v == null ) throw exception( key ); return v; } public default int getIntegerRequired( K key, Integer defaultValue ){ Integer v = getInteger( key ); if( v == null ) v=defaultValue; if( v == null ) throw exception( key ); return v; } public default int getIntegerRequired( K key, ValueProvider<Integer> defaultValueProvider ){ Integer v = getInteger( key ); if( v == null ) v=defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } // == Long ===== public default Long getLong( K key ){ String v = get( key ); if( v == null ) return null; return Long.parseLong( v ); } public default long getLong( K key, long defaultValue ){ Long v = getLong( key ); if( v == null ) return defaultValue; return v; } public default Long getLong( K key, Long defaultValue ){ Long v = getLong( key ); if( v == null ) return defaultValue; return v; } public default long getLong( K key, ValueProvider<Long> defaultValueProvider ){ Long v = getLong( key ); if( v == null ) return defaultValueProvider.get(); return v; } public default long getLongRequired( K key ){ Long v = getLong( key ); if( v == null ) throw exception( key ); return v; } public default long getLongRequired( K key, Long defaultValue ){ Long v = getLong( key ); if( v == null ) v = defaultValue; if( v == null ) throw exception( key ); return v; } public default long getLongRequired( K key, ValueProvider<Long> defaultValueProvider ){ Long v = getLong( key ); if( v == null ) v = defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } // == Double ===== public default Double getDouble( K key ){ String v = get( key ); if( v == null ) return null; return Double.parseDouble( v ); } public default double getDouble( K key, double defaultValue ){ Double v = getDouble( key ); if( v == null ) return defaultValue; return v; } public default Double getDouble( K key, Double defaultValue ){ Double v = getDouble( key ); if( v == null ) return defaultValue; return v; } public default double getDouble( K key, ValueProvider<Double> defaultValueProvider ){ Double v = getDouble( key ); if( v == null ) return defaultValueProvider.get(); return v; } public default double getDoubleRequired( K key ){ Double v = getDouble( key ); if( v == null ) throw exception( key ); return v; } public default double getDoubleRequired( K key, Double defaultValue ){ Double v = getDouble( key ); if( v == null ) v = defaultValue; if( v == null ) throw exception( key ); return v; } public default double getDoubleRequired( K key, ValueProvider<Double> defaultValueProvider ){ Double v = getDouble( key ); if( v == null ) v = defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } // == Boolean ===== @SuppressFBWarnings( value="NP_BOOLEAN_RETURN_NULL", justification="Api" ) public default Boolean getBoolean( K key ){ String v = get( key ); if( v == null ) return null; return EasyParser.yesOrNoOrNull( v ); } public default boolean getBoolean( K key, boolean defaultValue ){ Boolean v = getBoolean( key ); if( v == null ) return defaultValue; return v; } public default Boolean getBoolean( K key, Boolean defaultValue ){ Boolean v = getBoolean( key ); if( v == null ) return defaultValue; return v; } public default boolean getBoolean( K key, ValueProvider<Boolean> defaultValueProvider ){ Boolean v = getBoolean( key ); if( v == null ) return defaultValueProvider.get(); return v; } public default boolean getBooleanRequired( K key ){ Boolean v = getBoolean( key ); if( v == null ) throw exception( key ); return v; } public default boolean getBooleanRequired( K key, Boolean defaultValue ){ Boolean v = getBoolean( key ); if( v == null ) v = defaultValue; if( v == null ) throw exception( key ); return v; } public default boolean getBooleanRequired( K key, ValueProvider<Boolean> defaultValueProvider ){ Boolean v = getBoolean( key ); if( v == null ) v = defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } // == Files == public default File getFile( K key ){ String v = get( key ); if( v == null ) return null; return new File( v ); } public default File getFile( K key, File defaultValue ) { File v = getFile( key ); if( v == null ) return defaultValue; return v; } public default File getFile( K key, ValueProvider<File> defaultValueProvider ) { File v = getFile( key ); if( v == null ) return defaultValueProvider.get(); return v; } public default File getFileRequired( K key ) { File v = getFile( key ); if( v == null ) throw exception( key ); return v; } public default File getFileRequired( K key, File defaultValue ) { File v = getFile( key ); if( v == null ) v = defaultValue; if( v == null ) throw exception( key ); return v; } public default File getFileRequired( K key, ValueProvider<File> defaultValueProvider ) { File v = getFile( key ); if( v == null ) v = defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } public default File absolute( File file, File optionalBasedir ) { if( file == null ) return null; if( file.isAbsolute() ) return file; else { if( optionalBasedir == null ) return file; return new File( optionalBasedir, file.getPath() ); } } public default File absolute( File file, K optionalBasedirKey ) { if( file == null ) return null; if( file.isAbsolute() ) return file; else { File basedir = getFileRequired( optionalBasedirKey ); if( basedir == null ) return file; return new File( basedir, file.getPath() ); } } public default File absolute( File file, ValueProvider<File> optionalBasedirProvider ) { if( file == null ) return null; if( file.isAbsolute() ) return file; else { File basedir = optionalBasedirProvider.get(); if( basedir == null ) return file; return new File( basedir, file.getPath() ); } } public default File absoluteRequired( File file, K optionalBasedirKey ) { File v = absolute( file, optionalBasedirKey ); if( v == null ) return null; if( v.isAbsolute() ) return v; else throw new IllegalArgumentException( "Resulting file '" + file.getPath() + "' is not absolute" ); } public default File absoluteRequired( File file, ValueProvider<File> optionalBasedirProvider ) { File v = absolute( file, optionalBasedirProvider ); if( v == null ) return null; if( v.isAbsolute() ) return v; else throw new IllegalArgumentException( "Resulting file '" + file.getPath() + "' is not absolute" ); } // == BigDecimal ===== public default BigDecimal getBigDecimal( K key ){ String v = get( key ); if( v == null ) return null; return new BigDecimal( v ); } public default BigDecimal getBigDecimal( K key, BigDecimal defaultValue ){ BigDecimal v = getBigDecimal( key ); if( v == null ) return defaultValue; return v; } public default BigDecimal getBigDecimal( K key, ValueProvider<BigDecimal> defaultValueProvider ){ BigDecimal v = getBigDecimal( key ); if( v == null ) return defaultValueProvider.get(); return v; } public default BigDecimal getBigDecimalRequired( K key ){ BigDecimal v = getBigDecimal( key ); if( v == null ) throw exception( key ); return v; } public default BigDecimal getBigDecimalRequired( K key, BigDecimal defaultValue ){ BigDecimal v = getBigDecimal( key ); if( v == null ) v = defaultValue; if( v == null ) throw exception( key ); return v; } public default BigDecimal getBigDecimalRequired( K key, ValueProvider<BigDecimal> defaultValueProvider ){ BigDecimal v = getBigDecimal( key ); if( v == null ) v = defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } // == Enumeration ===== public default <T extends Enum<T>> T getEnum( Class<T> clazz, K key ){ String v = get( key ); if( v == null ) return null; if( v.length() == 0 ) return null; return Enum.valueOf( clazz, v ); } public default <T extends Enum<T>> T getEnum( Class<T> clazz, K key, T defaultValue ){ T v = getEnum( clazz, key ); if( v == null ) return defaultValue; return v; } public default <T extends Enum<T>> T getEnum( Class<T> clazz, K key, ValueProvider<T> defaultValueProvider ){ T v = getEnum( clazz, key ); if( v == null ) return defaultValueProvider.get(); return v; } public default <T extends Enum<T>> T getEnumRequired( Class<T> clazz, K key ){ T v = getEnum( clazz, key ); if( v == null ) throw exception( key ); return v; } public default <T extends Enum<T>> T getEnumRequired( Class<T> clazz, K key, T defaultValue ){ T v = getEnum( clazz, key ); if( v == null ) v = defaultValue; if( v == null ) throw exception( key ); return v; } public default <T extends Enum<T>> T getEnumRequired( Class<T> clazz, K key, ValueProvider<T> defaultValueProvider ){ T v = getEnum( clazz, key ); if( v == null ) v = defaultValueProvider.get(); if( v == null ) throw exception( key ); return v; } // == Object instantiation ===== public default <T, T1 extends T> T getNewInstance( Class<T1> clazz, K key ) throws ReflectiveOperationException { String v = get( key ); if( v == null ) return null; @SuppressWarnings( "unchecked" ) Class<T> vClass = (Class<T>)Class.forName( v ); return vClass.newInstance(); } public default <T, T1 extends T, T2 extends T> T getNewInstance( Class<T1> clazz, K key, Class<T2> defaultValue ) throws ReflectiveOperationException { T v = getNewInstance( clazz, key ); if( v == null ) return defaultValue != null ? defaultValue.newInstance() : null; return v; } public default <T, T1 extends T, T2 extends T> T getNewInstance( Class<T1> clazz, K key, ValueProvider<Class<T2>> defaultValueProvider ) throws ReflectiveOperationException { T v = getNewInstance( clazz, key ); Class<T2> defaultValue = defaultValueProvider.get(); if( v == null ) return defaultValue != null ? defaultValue.newInstance() : null; return v; } public default <T, T1 extends T> T getNewInstanceRequired( Class<T1> clazz, K key ) throws ReflectiveOperationException { T v = getNewInstance( clazz, key ); if( v == null ) throw exception( key ); return v; } public default <T, T1 extends T, T2 extends T> T getNewInstanceRequired( Class<T1> clazz, K key, ValueProvider<Class<T2>> defaultValueProvider ) throws ReflectiveOperationException { T v = getNewInstance( clazz, key ); Class<T2> defaultValue = defaultValueProvider.get(); if( v == null ) v = defaultValue != null ? defaultValue.newInstance() : null; if( v == null ) throw exception( key ); return v; } // == Object instantiation ===== public default <T, T1 extends T> T getNewInstanceUC( Class<T1> clazz, K key ) { try { return getNewInstance( clazz, key ); } catch( ReflectiveOperationException e ) { throw new InstantiationError( key, e ); } } public default <T, T1 extends T, T2 extends T> T getNewInstanceUC( Class<T1> clazz, K key, Class<T2> defaultValue ) { try { return getNewInstance( clazz, key, defaultValue ); } catch( ReflectiveOperationException e ) { throw new InstantiationError( key, e ); } } public default <T, T1 extends T, T2 extends T> T getNewInstanceUC( Class<T1> clazz, K key, ValueProvider<Class<T2>> defaultValueProvider ) { try { return getNewInstance( clazz, key, defaultValueProvider ); } catch( ReflectiveOperationException e ) { throw new InstantiationError( key, e ); } } public default <T, T1 extends T> T getNewInstanceRequiredUC( Class<T1> clazz, K key ) { try { return getNewInstanceRequired( clazz, key ); } catch( ReflectiveOperationException e ) { throw new InstantiationError( key, e ); } } public default <T, T1 extends T, T2 extends T> T getNewInstanceRequiredUC( Class<T1> clazz, K key, ValueProvider<Class<T2>> defaultValueProvider ) { try { return getNewInstanceRequired( clazz, key, defaultValueProvider ); } catch( ReflectiveOperationException e ) { throw new InstantiationError( key, e ); } } public static final class InstantiationError extends Error { public InstantiationError( Object key, Throwable cause ) { super( key.toString(), cause ); } } }