Search in sources :

Example 1 with LinkkiAspectDefinition

use of org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition in project linkki by linkki-framework.

the class Binder method addFieldBinding.

/**
 * Adds the descriptor and component for the given field to the given map.
 *
 * @param field a Component typed field that is annotated with {@link Bind}
 *
 * @throws IllegalStateException if the field does not hold a component
 * @throws NullPointerException if the component held by the field is {@code null}
 */
private void addFieldBinding(Field field, LinkedHashMap<BindingDescriptor, Component> bindings) {
    Validate.validState(Component.class.isAssignableFrom(field.getType()), "%s is not a Component-typed field and cannot be annotated with @Bind", field);
    try {
        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        Component component = requireNonNull((Component) field.get(view), () -> "Cannot create binding for field " + field + " as it is null");
        @SuppressWarnings("null") @Nonnull Bind bindAnnotation = field.getAnnotation(Bind.class);
        List<LinkkiAspectDefinition> aspectDefinitions = Arrays.asList(field.getAnnotations()).stream().flatMap(a -> AspectAnnotationReader.createAspectDefinitionsFrom(a).stream()).collect(Collectors.toList());
        BindAnnotationDescriptor descriptor = new BindAnnotationDescriptor(bindAnnotation, aspectDefinitions);
        bindings.put(descriptor, component);
    } catch (IllegalArgumentException | IllegalAccessException e) {
        throw new LinkkiRuntimeException(e);
    }
}
Also used : Arrays(java.util.Arrays) LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) AspectAnnotationReader(org.linkki.core.binding.aspect.AspectAnnotationReader) BindingDescriptor(org.linkki.core.ui.section.descriptor.BindingDescriptor) LabelComponentWrapper(org.linkki.core.ui.components.LabelComponentWrapper) Field(java.lang.reflect.Field) Collectors(java.util.stream.Collectors) Bind(org.linkki.core.binding.annotations.Bind) BeanUtils(org.linkki.util.BeanUtils) InvocationTargetException(java.lang.reflect.InvocationTargetException) LinkedHashMap(java.util.LinkedHashMap) BindAnnotationDescriptor(org.linkki.core.ui.section.descriptor.BindAnnotationDescriptor) List(java.util.List) Validate(org.apache.commons.lang3.Validate) Objects.requireNonNull(java.util.Objects.requireNonNull) LinkkiRuntimeException(org.linkki.core.exception.LinkkiRuntimeException) FieldUtils(org.apache.commons.lang3.reflect.FieldUtils) Method(java.lang.reflect.Method) Nonnull(javax.annotation.Nonnull) Component(com.vaadin.ui.Component) Bind(org.linkki.core.binding.annotations.Bind) LinkkiRuntimeException(org.linkki.core.exception.LinkkiRuntimeException) Nonnull(javax.annotation.Nonnull) BindAnnotationDescriptor(org.linkki.core.ui.section.descriptor.BindAnnotationDescriptor) LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) Component(com.vaadin.ui.Component)

Example 2 with LinkkiAspectDefinition

use of org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition in project linkki by linkki-framework.

the class Binder method addMethodBinding.

/**
 * Adds the descriptor and component (returned by the method) for the given method to the given
 * map.
 *
 * @throws IllegalArgumentException if the method does not return a component or requires
 *             parameters
 * @throws NullPointerException if the component returned by the method is {@code null}
 */
private void addMethodBinding(Method method, LinkedHashMap<BindingDescriptor, Component> bindings) {
    Validate.isAssignableFrom(Component.class, method.getReturnType(), "%s does not return a Component and cannot be annotated with @Bind", method);
    Validate.isTrue(method.getParameterCount() == 0, "%s has parameters and cannot be annotated with @Bind", method);
    try {
        Component component = (Component) method.invoke(view);
        if (component == null) {
            throw new NullPointerException("Cannot create binding for method " + method + " as it returned null");
        }
        @SuppressWarnings("null") @Nonnull Bind bindAnnotation = method.getAnnotation(Bind.class);
        List<LinkkiAspectDefinition> aspectDefinitions = Arrays.asList(method.getAnnotations()).stream().flatMap(a -> AspectAnnotationReader.createAspectDefinitionsFrom(a).stream()).collect(Collectors.toList());
        BindAnnotationDescriptor descriptor = new BindAnnotationDescriptor(bindAnnotation, aspectDefinitions);
        bindings.put(descriptor, component);
    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
        throw new LinkkiRuntimeException(e);
    }
}
Also used : Arrays(java.util.Arrays) LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) AspectAnnotationReader(org.linkki.core.binding.aspect.AspectAnnotationReader) BindingDescriptor(org.linkki.core.ui.section.descriptor.BindingDescriptor) LabelComponentWrapper(org.linkki.core.ui.components.LabelComponentWrapper) Field(java.lang.reflect.Field) Collectors(java.util.stream.Collectors) Bind(org.linkki.core.binding.annotations.Bind) BeanUtils(org.linkki.util.BeanUtils) InvocationTargetException(java.lang.reflect.InvocationTargetException) LinkedHashMap(java.util.LinkedHashMap) BindAnnotationDescriptor(org.linkki.core.ui.section.descriptor.BindAnnotationDescriptor) List(java.util.List) Validate(org.apache.commons.lang3.Validate) Objects.requireNonNull(java.util.Objects.requireNonNull) LinkkiRuntimeException(org.linkki.core.exception.LinkkiRuntimeException) FieldUtils(org.apache.commons.lang3.reflect.FieldUtils) Method(java.lang.reflect.Method) Nonnull(javax.annotation.Nonnull) Component(com.vaadin.ui.Component) Bind(org.linkki.core.binding.annotations.Bind) Nonnull(javax.annotation.Nonnull) BindAnnotationDescriptor(org.linkki.core.ui.section.descriptor.BindAnnotationDescriptor) InvocationTargetException(java.lang.reflect.InvocationTargetException) LinkkiRuntimeException(org.linkki.core.exception.LinkkiRuntimeException) LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) Component(com.vaadin.ui.Component)

Example 3 with LinkkiAspectDefinition

use of org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition in project linkki by linkki-framework.

the class AspectAnnotationReaderTest method testCreateAspectDefinitionsFrom.

@Test
public void testCreateAspectDefinitionsFrom() throws NoSuchMethodException, SecurityException {
    TestAnnotation annotationToTest = TestClass.class.getMethod("something").getAnnotation(TestAnnotation.class);
    List<LinkkiAspectDefinition> definitions = AspectAnnotationReader.createAspectDefinitionsFrom(annotationToTest);
    assertThat(definitions.size(), is(2));
    LinkkiAspectDefinition definition = definitions.get(0);
    assertThat(definition, instanceOf(TestAspectDefinition.class));
    assertThat(((TestAspectDefinition) definition).initialized, is(true));
    LinkkiAspectDefinition anotherDefinition = definitions.get(1);
    assertThat(anotherDefinition, instanceOf(AnotherTestAspectDefinition.class));
    assertThat(((AnotherTestAspectDefinition) anotherDefinition).anotherInitialized, is(true));
}
Also used : LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) Test(org.junit.Test)

Example 4 with LinkkiAspectDefinition

use of org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition in project linkki by linkki-framework.

the class ComponentBindingTest method testUpdateFromPmo_updateAspect.

@Test
public void testUpdateFromPmo_updateAspect() {
    Handler componentUpdater = mock(Handler.class);
    LinkkiAspectDefinition aspectDefinition = mock(LinkkiAspectDefinition.class);
    when(aspectDefinition.createUiUpdater(any(), any())).thenReturn(componentUpdater);
    ComponentBinding fieldBinding = new ComponentBinding(new LabelComponentWrapper(label, field), propertyDispatcherValue, Handler.NOP_HANDLER, Arrays.asList(aspectDefinition));
    fieldBinding.updateFromPmo();
    verify(componentUpdater).apply();
}
Also used : Handler(org.linkki.util.handler.Handler) LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) LabelComponentWrapper(org.linkki.core.ui.components.LabelComponentWrapper) Test(org.junit.Test)

Example 5 with LinkkiAspectDefinition

use of org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition in project linkki by linkki-framework.

the class UIAnnotationReader method createAndAddDescriptor.

private void createAndAddDescriptor(Annotation annotation, Method method) {
    List<LinkkiAspectDefinition> aspectDefs = AspectAnnotationReader.createAspectDefinitionsFrom(annotation);
    String pmoPropertyName = getPmoPropertyName(method);
    PropertyElementDescriptors elementDescriptors = descriptorsByProperty.computeIfAbsent(pmoPropertyName, PropertyElementDescriptors::new);
    if (BindingDefinition.isLinkkiBindingDefinition(annotation)) {
        BindingDefinition uiElement = BindingDefinition.from(annotation);
        addDescriptor(elementDescriptors, uiElement, pmoPropertyName, annotation, aspectDefs);
    } else {
        elementDescriptors.addAspect(aspectDefs);
        if (annotation instanceof UITableColumn) {
            columnDescriptors.put(elementDescriptors, new TableColumnDescriptor(annotatedClass, method, (UITableColumn) annotation));
        }
    }
}
Also used : UITableColumn(org.linkki.core.ui.section.annotations.UITableColumn) BindingDefinition(org.linkki.core.ui.section.annotations.BindingDefinition) LinkkiAspectDefinition(org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition) TableColumnDescriptor(org.linkki.core.ui.section.annotations.TableColumnDescriptor)

Aggregations

LinkkiAspectDefinition (org.linkki.core.binding.aspect.definition.LinkkiAspectDefinition)5 LabelComponentWrapper (org.linkki.core.ui.components.LabelComponentWrapper)3 Component (com.vaadin.ui.Component)2 Field (java.lang.reflect.Field)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)2 Method (java.lang.reflect.Method)2 Arrays (java.util.Arrays)2 LinkedHashMap (java.util.LinkedHashMap)2 List (java.util.List)2 Objects.requireNonNull (java.util.Objects.requireNonNull)2 Collectors (java.util.stream.Collectors)2 Nonnull (javax.annotation.Nonnull)2 Validate (org.apache.commons.lang3.Validate)2 FieldUtils (org.apache.commons.lang3.reflect.FieldUtils)2 Test (org.junit.Test)2 Bind (org.linkki.core.binding.annotations.Bind)2 AspectAnnotationReader (org.linkki.core.binding.aspect.AspectAnnotationReader)2 LinkkiRuntimeException (org.linkki.core.exception.LinkkiRuntimeException)2 BindAnnotationDescriptor (org.linkki.core.ui.section.descriptor.BindAnnotationDescriptor)2 BindingDescriptor (org.linkki.core.ui.section.descriptor.BindingDescriptor)2