package mil.nga.giat.geowave.analytic.param; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapreduce.JobContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.analytic.PropertyManagement; import mil.nga.giat.geowave.analytic.ScopedJobConfiguration; import mil.nga.giat.geowave.core.index.ByteArrayUtils; import mil.nga.giat.geowave.mapreduce.GeoWaveConfiguratorBase; public class BasicParameterHelper implements ParameterHelper<Object> { final static Logger LOGGER = LoggerFactory.getLogger(BasicParameterHelper.class); private final ParameterEnum<?> parent; private final Class<Object> baseClass; private final boolean isClass; public BasicParameterHelper( final ParameterEnum<?> parent, final Class<Object> baseClass, final String name, final String description, final boolean isClass, final boolean hasArg ) { this.baseClass = baseClass; this.parent = parent; this.isClass = isClass; } @Override public Class<Object> getBaseClass() { return baseClass; } @Override public void setValue( final Configuration config, final Class<?> scope, final Object value ) { setParameter( config, scope, value, parent); } private static final void setParameter( final Configuration config, final Class<?> scope, final Object val, final ParameterEnum configItem ) { if (val != null) { if (val instanceof Long) { config.setLong( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), ((Long) val)); } else if (val instanceof Double) { config.setDouble( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), ((Double) val)); } else if (val instanceof Boolean) { config.setBoolean( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), ((Boolean) val)); } else if (val instanceof Integer) { config.setInt( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), ((Integer) val)); } else if (val instanceof Class) { config.setClass( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), ((Class) val), ((Class) val)); } else if (val instanceof byte[]) { config.set( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), ByteArrayUtils.byteArrayToString((byte[]) val)); } else { config.set( GeoWaveConfiguratorBase.enumToConfKey( scope, configItem.self()), val.toString()); } } } @Override public Object getValue( final JobContext context, final Class<?> scope, final Object defaultValue ) { final ScopedJobConfiguration scopedConfig = new ScopedJobConfiguration( context.getConfiguration(), scope); if (baseClass.isAssignableFrom(Integer.class)) { return Integer.valueOf(scopedConfig.getInt( parent.self(), ((Integer) defaultValue).intValue())); } else if (baseClass.isAssignableFrom(String.class)) { return scopedConfig.getString( parent.self(), defaultValue.toString()); } else if (baseClass.isAssignableFrom(Double.class)) { return scopedConfig.getDouble( parent.self(), (Double) defaultValue); } else if (baseClass.isAssignableFrom(byte[].class)) { return scopedConfig.getBytes(parent.self()); } else if ((defaultValue == null) || (defaultValue instanceof Class)) { try { return scopedConfig.getInstance( parent.self(), baseClass, (Class) defaultValue); } catch (InstantiationException | IllegalAccessException e) { LOGGER.error( "Unable to get instance from job context", e); } } return null; } @Override public Object getValue( final PropertyManagement propertyManagement ) { try { return propertyManagement.getProperty(parent); } catch (final Exception e) { LOGGER.error( "Unable to deserialize property '" + parent.toString() + "'", e); return null; } } @Override public void setValue( final PropertyManagement propertyManagement, final Object value ) { Object storeValue = value; if (this.isClass && value instanceof String) { try { storeValue = Class.forName(value.toString()); } catch (ClassNotFoundException e) { LOGGER.error( "Class " + value.toString() + " for property " + parent + " is not found", e); } } propertyManagement.store( parent, storeValue); } }