From 7f2b110f0b2ac30fd198cc38bc21d22c157c6d9d Mon Sep 17 00:00:00 2001
From: Radim Hanus <radim.hanus@gmail.com>
Date: Fri, 30 Dec 2016 13:06:44 +0100
Subject: [PATCH] added samples using both cdi alternatives and qualifiers

---
 cdi/alternatives-qualifiers/pom.xml           | 13 +++++
 .../cdi/alternatives/AlternativeGreeting.java | 16 +++++++
 .../AlternativePersonalGreeting.java          | 17 +++++++
 .../cdi/alternatives/DefaultGreeting.java     | 12 +++++
 .../javaee7/cdi/alternatives/Greeting.java    |  9 ++++
 .../javaee7/cdi/alternatives/Personal.java    | 18 +++++++
 .../cdi/alternatives/PersonalGreeting.java    | 13 +++++
 .../alternatives/AlternativeGreetingTest.java | 48 +++++++++++++++++++
 .../AlternativePersonalGreetingTest.java      | 48 +++++++++++++++++++
 .../cdi/alternatives/DefaultGreetingTest.java | 48 +++++++++++++++++++
 .../resources/beans-default-alternative.xml   | 13 +++++
 .../src/test/resources/beans-empty.xml        |  9 ++++
 .../resources/beans-personal-alternative.xml  | 13 +++++
 cdi/pom.xml                                   |  1 +
 14 files changed, 278 insertions(+)
 create mode 100644 cdi/alternatives-qualifiers/pom.xml
 create mode 100644 cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativeGreeting.java
 create mode 100644 cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/AlternativePersonalGreeting.java
 create mode 100644 cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/DefaultGreeting.java
 create mode 100644 cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Greeting.java
 create mode 100644 cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/Personal.java
 create mode 100644 cdi/alternatives-qualifiers/src/main/java/org/javaee7/cdi/alternatives/PersonalGreeting.java
 create mode 100644 cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativeGreetingTest.java
 create mode 100644 cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/AlternativePersonalGreetingTest.java
 create mode 100644 cdi/alternatives-qualifiers/src/test/java/org/javaee7/cdi/alternatives/DefaultGreetingTest.java
 create mode 100644 cdi/alternatives-qualifiers/src/test/resources/beans-default-alternative.xml
 create mode 100644 cdi/alternatives-qualifiers/src/test/resources/beans-empty.xml
 create mode 100644 cdi/alternatives-qualifiers/src/test/resources/beans-personal-alternative.xml

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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.javaee7</groupId>
+        <artifactId>cdi</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>        
+    </parent>
+    <artifactId>cdi-alternatives-qualifiers</artifactId>
+    <name>Java EE 7 Sample: cdi - alternatives-qualifiers</name>
+</project>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       bean-discovery-mode="all"
+       version="1.1">
+
+    <alternatives>
+        <class>org.javaee7.cdi.alternatives.AlternativeGreeting</class>
+    </alternatives>
+
+</beans>
\ 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       bean-discovery-mode="all"
+       version="1.1">
+
+</beans>
\ 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+       bean-discovery-mode="all"
+       version="1.1">
+
+    <alternatives>
+        <class>org.javaee7.cdi.alternatives.AlternativePersonalGreeting</class>
+    </alternatives>
+
+</beans>
\ 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 @@
         <module>scopes</module>
         <module>alternatives</module>
         <module>alternatives-priority</module>
+        <module>alternatives-qualifiers</module>
         <module>nobeans-el-injection</module>
         <module>nobeans-el-injection-flowscoped</module>
         <module>events</module>