You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2014/12/15 23:16:08 UTC
deltaspike git commit: DELTASPIKE-801 @Nonbinding support for
@SecurityParameterBinding
Repository: deltaspike
Updated Branches:
refs/heads/master 49ea10eec -> 1596f17d1
DELTASPIKE-801 @Nonbinding support for @SecurityParameterBinding
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/1596f17d
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/1596f17d
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/1596f17d
Branch: refs/heads/master
Commit: 1596f17d14ae0a91be6c365b95ecd5e0b904c173
Parents: 49ea10e
Author: gpetracek <gp...@apache.org>
Authored: Mon Dec 15 23:14:22 2014 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Mon Dec 15 23:14:22 2014 +0100
----------------------------------------------------------------------
.../deltaspike/core/util/AnnotationUtils.java | 98 ++++++++++++++++++++
.../SecurityParameterValueRedefiner.java | 19 ++++
2 files changed, 117 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1596f17d/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AnnotationUtils.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AnnotationUtils.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AnnotationUtils.java
index 9d4c8e2..0e3fbe3 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AnnotationUtils.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/AnnotationUtils.java
@@ -21,8 +21,11 @@ package org.apache.deltaspike.core.util;
import javax.enterprise.inject.Typed;
import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.util.Nonbinding;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Arrays;
@Typed()
public abstract class AnnotationUtils
@@ -75,4 +78,99 @@ public abstract class AnnotationUtils
}
return null;
}
+
+ //based on org.apache.webbeans.container.BeanCacheKey#getQualifierHashCode
+ public static int getQualifierHashCode(Annotation annotation)
+ {
+ Class annotationClass = annotation.annotationType();
+
+ int hashCode = getTypeHashCode(annotationClass);
+
+ for (Method member : annotationClass.getDeclaredMethods())
+ {
+ if (member.isAnnotationPresent(Nonbinding.class))
+ {
+ continue;
+ }
+
+ final Object annotationMemberValue;
+ try
+ {
+ annotationMemberValue = ReflectionUtils.invokeMethod(annotation, member, Object.class, true);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw ExceptionUtils.throwAsRuntimeException(e);
+ }
+
+ final int arrayValue;
+ if (annotationMemberValue.getClass().isArray())
+ {
+ Class<?> annotationMemberType = annotationMemberValue.getClass().getComponentType();
+ if (annotationMemberType.isPrimitive())
+ {
+ if (Long.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((long[]) annotationMemberValue);
+ }
+ else if (Integer.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((int[]) annotationMemberValue);
+ }
+ else if (Short.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((short[]) annotationMemberValue);
+ }
+ else if (Double.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((double[]) annotationMemberValue);
+ }
+ else if (Float.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((float[]) annotationMemberValue);
+ }
+ else if (Boolean.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((boolean[]) annotationMemberValue);
+ }
+ else if (Byte.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((byte[]) annotationMemberValue);
+ }
+ else if (Character.TYPE == annotationMemberType)
+ {
+ arrayValue = Arrays.hashCode((char[]) annotationMemberValue);
+ }
+ else
+ {
+ arrayValue = 0;
+ }
+ }
+ else
+ {
+ arrayValue = Arrays.hashCode((Object[]) annotationMemberValue);
+ }
+ }
+ else
+ {
+ arrayValue = annotationMemberValue.hashCode();
+ }
+
+ hashCode = 29 * hashCode + arrayValue;
+ hashCode = 29 * hashCode + member.getName().hashCode();
+ }
+
+ return hashCode;
+ }
+
+ private static int getTypeHashCode(Type type)
+ {
+ int typeHash = type.hashCode();
+ if (typeHash == 0 && type instanceof Class)
+ {
+ return ((Class)type).getName().hashCode();
+ }
+
+ return typeHash;
+ }
}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/1596f17d/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/authorization/SecurityParameterValueRedefiner.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/authorization/SecurityParameterValueRedefiner.java b/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/authorization/SecurityParameterValueRedefiner.java
index 1f83179..9d8cc26 100644
--- a/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/authorization/SecurityParameterValueRedefiner.java
+++ b/deltaspike/modules/security/impl/src/main/java/org/apache/deltaspike/security/impl/authorization/SecurityParameterValueRedefiner.java
@@ -30,6 +30,7 @@ import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.interceptor.InvocationContext;
+import org.apache.deltaspike.core.util.AnnotationUtils;
import org.apache.deltaspike.core.util.metadata.builder.ParameterValueRedefiner;
import org.apache.deltaspike.security.api.authorization.SecuredReturn;
import org.apache.deltaspike.security.api.authorization.SecurityParameterBinding;
@@ -96,6 +97,24 @@ public class SecurityParameterValueRedefiner implements ParameterValueRedefiner
return invocation.getParameters()[i];
}
}
+
+ Set<Integer> hashCodesOfBusinessParameterAnnotations =
+ new HashSet<Integer>(businessParameterAnnotations.size());
+
+ for (Annotation annotation : businessParameterAnnotations)
+ {
+ hashCodesOfBusinessParameterAnnotations.add(
+ AnnotationUtils.getQualifierHashCode(annotation));
+ }
+ //2nd try (detailed check)
+ for (Annotation annotation : requiredBindingAnnotations)
+ {
+ if (hashCodesOfBusinessParameterAnnotations.contains(
+ AnnotationUtils.getQualifierHashCode(annotation)))
+ {
+ return invocation.getParameters()[i];
+ }
+ }
}
throw new IllegalStateException("Missing required security parameter binding "