+/*******************************************************************************
+ * Copyright (c) 2019 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ * Semantum Oy - gitlab #313
+ *******************************************************************************/
package org.simantics.databoard.binding.reflection;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
if(request.hasAnnotation(Optional.class))
{
Optional optional = request.getAnnotation(Optional.class);
- Annotation[] newAnnotations = ArrayUtils.dropElements(request.annotations, optional);
- BindingRequest componentRequest = new BindingRequest(request.getClazz(), newAnnotations);
+ BindingRequest componentRequest = request.withAnnotations(ArrayUtils.dropElements(request.annotations, optional));
OptionalType type = new OptionalType();
OptionalBinding binding = new OptionalBindingDefault(type, null);
inprogress.put(request, binding);
type.componentType = binding.componentBinding.type();
inprogress.remove(request);
+ repository.put(request, binding);
return binding;
}
Identifier idAnnotation = componentRequest.getAnnotation( Identifier.class );
if ( idAnnotation!=null ) {
- componentRequest.dropAnnotations(1, idAnnotation);
+ componentRequest = componentRequest.withAnnotations(componentRequest.dropAnnotations(1, idAnnotation));
identifierIndices.add( i );
}
Binding componentBinding = componentBindings[i] = construct( componentRequest );
binding = defaultBinding;
}
- repository.put(request, binding);
-
return binding;
} catch (RangeException e) {
inprogress.remove( request );
Class<?> fieldClass = list.remove(0);
Class<?>[] parameterClasses = list.isEmpty() ? NO_CLASSES : list.toArray( NO_CLASSES );
- if (Set.class.isAssignableFrom(fieldClass) && parameterClasses!=null &¶meterClasses.length==1) {
+ return getTypeAnnotations(annotations, fieldClass, parameterClasses);
+ }
+
+ public static Annotation[] getMethodAnnotations(Method method)
+ {
+ Annotation[] annotations = method.getAnnotations().clone();
+ ArrayList<Class<?>> list = new ArrayList<Class<?>>();
+ getTypes( method.getGenericReturnType(), list );
+ Class<?> valueClass = list.remove(0);
+ Class<?>[] parameterClasses = list.isEmpty() ? NO_CLASSES : list.toArray( NO_CLASSES );
+
+ return getTypeAnnotations(annotations, valueClass, parameterClasses);
+ }
+
+ private static Annotation[] getTypeAnnotations(Annotation[] annotations, Class<?> fieldClass,
+ Class<?>[] parameterClasses) {
+ if (Set.class.isAssignableFrom(fieldClass) && parameterClasses!=null &¶meterClasses.length==1) {
Annotation[] a2 = new Annotation[annotations.length+1];
System.arraycopy(annotations, 0, a2, 0, annotations.length);