Skip to content

Commit

Permalink
Added CDI @cookie
Browse files Browse the repository at this point in the history
  • Loading branch information
Bauke Scholtz committed Apr 2, 2015
1 parent 3202876 commit 2d640e0
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 0 deletions.
68 changes: 68 additions & 0 deletions src/main/java/org/omnifaces/cdi/Cookie.java
@@ -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 "";

}
47 changes: 47 additions & 0 deletions src/main/java/org/omnifaces/cdi/cookie/RequestCookieProducer.java
@@ -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;
}

}
17 changes: 17 additions & 0 deletions src/main/java/org/omnifaces/util/Beans.java
Expand Up @@ -241,4 +241,21 @@ public static InjectionPoint getCurrentInjectionPoint(CreationalContext<?> creat
return BeansLocal.getCurrentInjectionPoint(getManager(), creationalContext); 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.