diff --git a/cdi/alternatives-qualifiers/pom.xml b/cdi/alternatives-qualifiers/pom.xml
new file mode 100644
index 000000000..01b765ae3
--- /dev/null
+++ b/cdi/alternatives-qualifiers/pom.xml
@@ -0,0 +1,13 @@
+
+
+ 4.0.0
+
+
+ org.javaee7
+ cdi
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+ cdi-alternatives-qualifiers
+ Java EE 7 Sample: cdi - alternatives-qualifiers
+
diff --git a/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativeGreeting.java b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativeGreeting.java
new file mode 100644
index 000000000..232e8f6e7
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativeGreeting.java
@@ -0,0 +1,16 @@
+package org.javaee7.cdi.alternatives;
+
+import javax.enterprise.inject.Alternative;
+
+
+/**
+ * @author Radim Hanus
+ */
+@Alternative
+public class AlternativeGreeting implements Greeting {
+ @Override
+ public String greet(String name) {
+ return "Nice to meet you, hello " + name;
+ }
+
+}
diff --git a/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativePersonalGreeting.java b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativePersonalGreeting.java
new file mode 100644
index 000000000..af053fe79
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativePersonalGreeting.java
@@ -0,0 +1,17 @@
+package org.javaee7.cdi.alternatives;
+
+import javax.enterprise.inject.Alternative;
+
+
+/**
+ * @author Radim Hanus
+ */
+@Alternative
+@Personal
+public class AlternativePersonalGreeting implements Greeting {
+ @Override
+ public String greet(String name) {
+ return "Fine to see you, hi " + name;
+ }
+
+}
diff --git a/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/DefaultGreeting.java b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/DefaultGreeting.java
new file mode 100644
index 000000000..5991ffe8f
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/DefaultGreeting.java
@@ -0,0 +1,12 @@
+package org.javaee7.cdi.alternatives;
+
+
+/**
+ * @author Radim Hanus
+ */
+public class DefaultGreeting implements Greeting {
+ @Override
+ public String greet(String name) {
+ return "Hello " + name;
+ }
+}
diff --git a/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Greeting.java b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Greeting.java
new file mode 100644
index 000000000..1f76ee4ca
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Greeting.java
@@ -0,0 +1,9 @@
+package org.javaee7.cdi.alternatives;
+
+
+/**
+ * @author Arun Gupta
+ */
+public interface Greeting {
+ String greet(String name);
+}
diff --git a/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Personal.java b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Personal.java
new file mode 100644
index 000000000..c871916d0
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Personal.java
@@ -0,0 +1,18 @@
+package org.javaee7.cdi.alternatives;
+
+import javax.inject.Qualifier;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+
+/**
+ * @author Radim Hanus
+ */
+@Qualifier
+@Retention(RUNTIME)
+@Target({TYPE, METHOD, FIELD, PARAMETER})
+public @interface Personal {
+}
diff --git a/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/PersonalGreeting.java b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/PersonalGreeting.java
new file mode 100644
index 000000000..1d54eb82b
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/PersonalGreeting.java
@@ -0,0 +1,13 @@
+package org.javaee7.cdi.alternatives;
+
+
+/**
+ * @author Radim Hanus
+ */
+@Personal
+public class PersonalGreeting implements Greeting {
+ @Override
+ public String greet(String name) {
+ return "Hi " + name;
+ }
+}
diff --git a/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativeGreetingTest.java b/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativeGreetingTest.java
new file mode 100644
index 000000000..7c2bd36c7
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativeGreetingTest.java
@@ -0,0 +1,48 @@
+package org.javaee7.cdi.alternatives;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.inject.Inject;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertThat;
+
+
+/**
+ * @author Radim Hanus
+ */
+@RunWith(Arquillian.class)
+public class AlternativeGreetingTest {
+ @Deployment
+ public static Archive> deploy() {
+ return ShrinkWrap.create(JavaArchive.class)
+ .addClasses(Greeting.class, DefaultGreeting.class, AlternativeGreeting.class,
+ Personal.class, PersonalGreeting.class, AlternativePersonalGreeting.class)
+ .addAsManifestResource("beans-default-alternative.xml", "beans.xml");
+ }
+
+ @Inject
+ private Greeting greeting;
+
+ @Inject
+ @Personal
+ private Greeting personalGreeting;
+
+ @Test
+ public void should_greeting_be_alternative() throws Exception {
+ // alternative implementation is defined in beans.xml
+ assertThat(greeting, instanceOf(AlternativeGreeting.class));
+ }
+
+ @Test
+ public void should_personal_greeting_be_default() throws Exception {
+ // qualified implementation because only default alternative is defined in beans.xml
+ assertThat(personalGreeting, instanceOf(PersonalGreeting.class));
+ }
+}
diff --git a/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativePersonalGreetingTest.java b/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativePersonalGreetingTest.java
new file mode 100644
index 000000000..45d5c1796
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativePersonalGreetingTest.java
@@ -0,0 +1,48 @@
+package org.javaee7.cdi.alternatives;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.inject.Inject;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertThat;
+
+
+/**
+ * @author Radim Hanus
+ */
+@RunWith(Arquillian.class)
+public class AlternativePersonalGreetingTest {
+ @Deployment
+ public static Archive> deploy() {
+ return ShrinkWrap.create(JavaArchive.class)
+ .addClasses(Greeting.class, DefaultGreeting.class, AlternativeGreeting.class,
+ Personal.class, PersonalGreeting.class, AlternativePersonalGreeting.class)
+ .addAsManifestResource("beans-personal-alternative.xml", "beans.xml");
+ }
+
+ @Inject
+ private Greeting greeting;
+
+ @Inject
+ @Personal
+ private Greeting personalGreeting;
+
+ @Test
+ public void should_greeting_be_default() throws Exception {
+ // default implementation because qualified alternative is defined in beans.xml
+ assertThat(greeting, instanceOf(DefaultGreeting.class));
+ }
+
+ @Test
+ public void should_personal_greeting_be_alternative() throws Exception {
+ // qualified alternative implementation is defined in beans.xml
+ assertThat(personalGreeting, instanceOf(AlternativePersonalGreeting.class));
+ }
+}
diff --git a/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/DefaultGreetingTest.java b/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/DefaultGreetingTest.java
new file mode 100644
index 000000000..bf15ffbfd
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/DefaultGreetingTest.java
@@ -0,0 +1,48 @@
+package org.javaee7.cdi.alternatives;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.inject.Inject;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertThat;
+
+
+/**
+ * @author Radim Hanus
+ */
+@RunWith(Arquillian.class)
+public class DefaultGreetingTest {
+ @Deployment
+ public static Archive> deploy() {
+ return ShrinkWrap.create(JavaArchive.class)
+ .addClasses(Greeting.class, DefaultGreeting.class, AlternativeGreeting.class,
+ Personal.class, PersonalGreeting.class, AlternativePersonalGreeting.class)
+ .addAsManifestResource("beans-empty.xml", "beans.xml");
+ }
+
+ @Inject
+ private Greeting greeting;
+
+ @Inject
+ @Personal
+ private Greeting personalGreeting;
+
+ @Test
+ public void should_greeting_be_default() throws Exception {
+ // default implementation because of empty beans.xml
+ assertThat(greeting, instanceOf(DefaultGreeting.class));
+ }
+
+ @Test
+ public void should_personal_greeting_be_default() throws Exception {
+ // qualified implementation because of empty beans.xml
+ assertThat(personalGreeting, instanceOf(PersonalGreeting.class));
+ }
+}
diff --git a/cdi/alternatives-qualifiers/src/test/resources/beans-default-alternative.xml b/cdi/alternatives-qualifiers/src/test/resources/beans-default-alternative.xml
new file mode 100644
index 000000000..c954f6819
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/test/resources/beans-default-alternative.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ org.javaee7.cdi.alternatives.AlternativeGreeting
+
+
+
\ No newline at end of file
diff --git a/cdi/alternatives-qualifiers/src/test/resources/beans-empty.xml b/cdi/alternatives-qualifiers/src/test/resources/beans-empty.xml
new file mode 100644
index 000000000..888faa1dd
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/test/resources/beans-empty.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/cdi/alternatives-qualifiers/src/test/resources/beans-personal-alternative.xml b/cdi/alternatives-qualifiers/src/test/resources/beans-personal-alternative.xml
new file mode 100644
index 000000000..50bfae493
--- /dev/null
+++ b/cdi/alternatives-qualifiers/src/test/resources/beans-personal-alternative.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ org.javaee7.cdi.alternatives.AlternativePersonalGreeting
+
+
+
\ No newline at end of file
diff --git a/cdi/pom.xml b/cdi/pom.xml
index cad40efd8..1868f8150 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -32,6 +32,7 @@
scopes
alternatives
alternatives-priority
+ alternatives-qualifiers
nobeans-el-injection
nobeans-el-injection-flowscoped
events