Permalink
Browse files

Added CDI @Cookie

  • Loading branch information...
1 parent 3202876 commit 2d640e0ffd185b036269b10e4cc90b9c5edf4777 @BalusC BalusC committed Apr 2, 2015
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 OmniFaces.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.omnifaces.cdi;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+import org.omnifaces.cdi.cookie.RequestCookieProducer;
+
+/**
+ * <p>
+ * The CDI annotation {@link Cookie} allows you to inject a HTTP request cookie value from the current JSF context in
+ * a CDI managed bean. It's basically like <code>&#64;ManagedProperty("#{cookieName}") private String cookieName;</code>
+ * in a "plain old" JSF managed bean.
+ * <p>
+ * By default the name of the cookie is taken from the name of the variable into which injection takes place.
+ * The example below injects the cookie with name <code>foo</code>.
+ * <pre>
+ * &#64;Inject &#64;Cookie
+ * private String foo;
+ * </pre>
+ * <p>
+ * The name can be optionally specified via the <code>name</code> attribute.
+ * The example below injects the cookie with name <code>foo</code> into a variable named <code>bar</code>.
+ * <pre>
+ * &#64;Inject &#64;Cookie(name="foo")
+ * private String bar;
+ * </pre>
+ * <p>
+ * Validation is by design not supported as cookies are usually beyond enduser's control.
+ * TODO: conversion?
+ *
+ * @since 2.1
+ * @author Bauke Scholtz
+ * @see RequestCookieProducer
+ */
+@Qualifier
+@Retention(RUNTIME)
+@Target({ TYPE, METHOD, FIELD, PARAMETER })
+public @interface Cookie {
+
+ /**
+ * (Optional) The name of the request cookie. If not specified the name of the injection target field will be used.
+ *
+ * @return The name of the request cookie.
+ */
+ @Nonbinding String name() default "";
+
+}
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015 OmniFaces.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.omnifaces.cdi.cookie;
+
+import static org.omnifaces.util.Beans.getQualifier;
+import static org.omnifaces.util.Faces.getRequestCookie;
+
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Inject;
+
+import org.omnifaces.cdi.Cookie;
+
+/**
+ * <p>
+ * Producer for injecting a JSF request cookie as defined by the {@link Cookie} annotation.
+ *
+ * @since 2.1
+ * @author Bauke Scholtz
+ * @see RequestCookieProducer
+ */
+public class RequestCookieProducer {
+
+ @SuppressWarnings("unused") // Workaround for OpenWebBeans not properly passing it as produce() method argument.
+ @Inject
+ private InjectionPoint injectionPoint;
+
+ @Produces
+ @Cookie
+ public String produce(InjectionPoint injectionPoint) {
+ Cookie cookie = getQualifier(injectionPoint, Cookie.class);
+ String name = cookie.name().isEmpty() ? injectionPoint.getMember().getName() : cookie.name();
+ String value = getRequestCookie(name);
+ return value;
+ }
+
+}
@@ -241,4 +241,21 @@ public static InjectionPoint getCurrentInjectionPoint(CreationalContext<?> creat
return BeansLocal.getCurrentInjectionPoint(getManager(), creationalContext);
}
+ /**
+ * Returns the qualifier annotation of the given qualifier class from the given injection point.
+ * @param injectionPoint The injection point to obtain the qualifier annotation of the given qualifier class from.
+ * @param qualifierClass The class of the qualifier annotation to be looked up in the given injection point.
+ * @return The qualifier annotation of the given qualifier class from the given injection point.
+ * @since 2.1
+ */
+ public static <A extends Annotation> A getQualifier(InjectionPoint injectionPoint, Class<A> qualifierClass) {
+ for (Annotation annotation : injectionPoint.getQualifiers()) {
+ if (qualifierClass.isAssignableFrom(annotation.getClass())) {
+ return qualifierClass.cast(annotation);
+ }
+ }
+
+ return null;
+ }
+
}

0 comments on commit 2d640e0

Please sign in to comment.