/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.utils.incubator.configuration; import java.beans.IndexedPropertyDescriptor; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import de.rcenvironment.core.utils.incubator.configuration.annotation.Configurable; /** * The default implementation class for {@link ConfigurationProperty}. * * @author Christian Weiss */ public class ConfigurationPropertyImpl implements ConfigurationProperty { private static final Configurable.LabelProvider DEFAULT_LABEL_PROVIDER = new Configurable.LabelProvider() { @Override public void setObject(final Object object) { // } @Override public String getLabel(final Object object) { return object.toString(); } }; private final PropertyDescriptor descriptor; private final Class<?> type; private final boolean indexed; private final Class<? extends Configurable.ValueProvider> valueProviderType; private final Class<? extends Configurable.LabelProvider> labelProviderType; public ConfigurationPropertyImpl(final PropertyDescriptor descriptor) { this(descriptor, // descriptor.getReadMethod().getAnnotation(Configurable.class).labelProvider(), // descriptor.getReadMethod().getAnnotation(Configurable.class).valueProvider()); } public ConfigurationPropertyImpl(final PropertyDescriptor descriptor, final Class<? extends Configurable.LabelProvider> labelProviderType, final Class<? extends Configurable.ValueProvider> valueProviderType) { this.descriptor = descriptor; this.labelProviderType = labelProviderType; this.valueProviderType = valueProviderType; this.indexed = descriptor instanceof IndexedPropertyDescriptor; if (indexed) { this.type = descriptor.getReadMethod().getReturnType() .getComponentType(); } else { this.type = descriptor.getReadMethod().getReturnType(); } } @Override public Configurable.ValueProvider getValueProvider() { if (valueProviderType == ConfigurationConstants.NO_VALUE_PROVIDER) { return null; } try { final Configurable.ValueProvider choiceProvider = valueProviderType.newInstance(); return choiceProvider; } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @Override public Configurable.LabelProvider getLabelProvider() { if (labelProviderType == ConfigurationConstants.NO_LABEL_PROVIDER) { return DEFAULT_LABEL_PROVIDER; } try { final Configurable.LabelProvider choiceProvider = labelProviderType.newInstance(); return choiceProvider; } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @Override public Class<?> getType() { return type; } @Override public Object getValue(final Object object) throws IllegalArgumentException { try { return descriptor.getReadMethod().invoke(object); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } @Override public void setValue(final Object object, final Object value) throws IllegalArgumentException { try { descriptor.getWriteMethod().invoke(object, value); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } }