Merge pull request #5145 from eelhazati/master
BAEL-1998 cdi portable extensions
This commit is contained in:
commit
bf912b11d8
|
@ -0,0 +1,38 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
<artifactId>flyway-cdi</artifactId>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>cdi-portable-extension</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.enterprise</groupId>
|
||||||
|
<artifactId>cdi-api</artifactId>
|
||||||
|
<version>2.0.SP1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.flywaydb</groupId>
|
||||||
|
<artifactId>flyway-core</artifactId>
|
||||||
|
<version>5.1.4</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
<artifactId>tomcat-jdbc</artifactId>
|
||||||
|
<version>8.5.33</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.annotation</groupId>
|
||||||
|
<artifactId>javax.annotation-api</artifactId>
|
||||||
|
<version>1.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,74 @@
|
||||||
|
package com.baeldung.cdi.extension;
|
||||||
|
|
||||||
|
import org.apache.tomcat.jdbc.pool.DataSource;
|
||||||
|
import org.flywaydb.core.Flyway;
|
||||||
|
|
||||||
|
import javax.annotation.sql.DataSourceDefinition;
|
||||||
|
import javax.enterprise.context.ApplicationScoped;
|
||||||
|
import javax.enterprise.event.Observes;
|
||||||
|
import javax.enterprise.inject.Any;
|
||||||
|
import javax.enterprise.inject.Default;
|
||||||
|
import javax.enterprise.inject.literal.InjectLiteral;
|
||||||
|
import javax.enterprise.inject.spi.*;
|
||||||
|
import javax.enterprise.util.AnnotationLiteral;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flyway is now under CDI container like:
|
||||||
|
*
|
||||||
|
* @ApplicationScoped
|
||||||
|
* @FlywayType public class Flyway{
|
||||||
|
* @Inject setDataSource(DataSource dataSource){
|
||||||
|
* //...
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FlywayExtension implements Extension {
|
||||||
|
|
||||||
|
DataSourceDefinition dataSourceDefinition = null;
|
||||||
|
|
||||||
|
public void registerFlywayType(@Observes BeforeBeanDiscovery bbdEvent) {
|
||||||
|
bbdEvent.addAnnotatedType(Flyway.class, Flyway.class.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void detectDataSourceDefinition(@Observes @WithAnnotations(DataSourceDefinition.class) ProcessAnnotatedType<?> patEvent) {
|
||||||
|
AnnotatedType at = patEvent.getAnnotatedType();
|
||||||
|
dataSourceDefinition = at.getAnnotation(DataSourceDefinition.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void processAnnotatedType(@Observes ProcessAnnotatedType<Flyway> patEvent) {
|
||||||
|
patEvent.configureAnnotatedType()
|
||||||
|
//Add Scope
|
||||||
|
.add(ApplicationScoped.Literal.INSTANCE)
|
||||||
|
//Add Qualifier
|
||||||
|
.add(new AnnotationLiteral<FlywayType>() {
|
||||||
|
})
|
||||||
|
//Decorate setDataSource(DataSource dataSource){} with @Inject
|
||||||
|
.filterMethods(annotatedMethod -> {
|
||||||
|
return annotatedMethod.getParameters().size() == 1 &&
|
||||||
|
annotatedMethod.getParameters().get(0).getBaseType().equals(javax.sql.DataSource.class);
|
||||||
|
})
|
||||||
|
.findFirst().get().add(InjectLiteral.INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void afterBeanDiscovery(@Observes AfterBeanDiscovery abdEvent, BeanManager bm) {
|
||||||
|
abdEvent.addBean()
|
||||||
|
.types(javax.sql.DataSource.class, DataSource.class)
|
||||||
|
.qualifiers(new AnnotationLiteral<Default>() {}, new AnnotationLiteral<Any>() {})
|
||||||
|
.scope(ApplicationScoped.class)
|
||||||
|
.name(DataSource.class.getName())
|
||||||
|
.beanClass(DataSource.class)
|
||||||
|
.createWith(creationalContext -> {
|
||||||
|
DataSource instance = new DataSource();
|
||||||
|
instance.setUrl(dataSourceDefinition.url());
|
||||||
|
instance.setDriverClassName(dataSourceDefinition.className());
|
||||||
|
return instance;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void runFlywayMigration(@Observes AfterDeploymentValidation adv, BeanManager manager) {
|
||||||
|
Flyway flyway = manager.createInstance().select(Flyway.class, new AnnotationLiteral<FlywayType>() {}).get();
|
||||||
|
flyway.migrate();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.baeldung.cdi.extension;
|
||||||
|
|
||||||
|
import javax.inject.Qualifier;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import static java.lang.annotation.ElementType.*;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target({FIELD, METHOD, PARAMETER, TYPE})
|
||||||
|
@Qualifier
|
||||||
|
public @interface FlywayType {
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
<beans version="2.0" 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_2_0.xsd"
|
||||||
|
bean-discovery-mode="annotated">
|
||||||
|
</beans>
|
|
@ -0,0 +1,2 @@
|
||||||
|
com.baeldung.cdi.extension.FlywayExtension
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
<artifactId>main-app</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>cdi-portable-extension</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.enterprise</groupId>
|
||||||
|
<artifactId>cdi-api</artifactId>
|
||||||
|
<version>2.0.SP1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.weld.se</groupId>
|
||||||
|
<artifactId>weld-se-core</artifactId>
|
||||||
|
<version>3.0.5.Final</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>flyway-cdi</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<version>1.4.197</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.annotation</groupId>
|
||||||
|
<artifactId>javax.annotation-api</artifactId>
|
||||||
|
<version>1.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.baeldung.cdi.extension;
|
||||||
|
|
||||||
|
import javax.annotation.sql.DataSourceDefinition;
|
||||||
|
import javax.enterprise.context.ApplicationScoped;
|
||||||
|
import javax.enterprise.inject.se.SeContainer;
|
||||||
|
import javax.enterprise.inject.se.SeContainerInitializer;
|
||||||
|
|
||||||
|
@ApplicationScoped
|
||||||
|
@DataSourceDefinition(name = "ds", className = "org.h2.Driver", url = "jdbc:h2:mem:testdb")
|
||||||
|
public class MainApp {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SeContainerInitializer initializer = SeContainerInitializer.newInstance();
|
||||||
|
try (SeContainer container = initializer.initialize()) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
<beans version="2.0" 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_2_0.xsd"
|
||||||
|
bean-discovery-mode="annotated">
|
||||||
|
</beans>
|
|
@ -0,0 +1,4 @@
|
||||||
|
create table PERSON (
|
||||||
|
ID int not null,
|
||||||
|
NAME varchar(100) not null
|
||||||
|
);
|
|
@ -0,0 +1,3 @@
|
||||||
|
insert into PERSON (ID, NAME) values (1, 'Axel');
|
||||||
|
insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
|
||||||
|
insert into PERSON (ID, NAME) values (3, 'Ms. Bar');
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?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>
|
||||||
|
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>cdi-portable-extension</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>main-app</module>
|
||||||
|
<module>flyway-cdi</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.enterprise</groupId>
|
||||||
|
<artifactId>cdi-api</artifactId>
|
||||||
|
<version>2.0.SP1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
1
pom.xml
1
pom.xml
|
@ -604,6 +604,7 @@
|
||||||
<module>spring-reactive-kotlin</module>
|
<module>spring-reactive-kotlin</module>
|
||||||
<module>jnosql</module>
|
<module>jnosql</module>
|
||||||
<module>spring-boot-angular-ecommerce</module>
|
<module>spring-boot-angular-ecommerce</module>
|
||||||
|
<module>cdi-portable-extension</module>
|
||||||
<module>jta</module>
|
<module>jta</module>
|
||||||
<!--<module>java-dates</module> --> <!-- Commented because we have still not upgraded to java 9 -->
|
<!--<module>java-dates</module> --> <!-- Commented because we have still not upgraded to java 9 -->
|
||||||
<module>java-websocket</module>
|
<module>java-websocket</module>
|
||||||
|
|
Loading…
Reference in New Issue