SlideShare uma empresa Scribd logo
1 de 52
Baixar para ler offline
public	static	void	main(String[]	args)	{
				SeContainer	container	=	SeContainerInitializer.newInstance()	
																																		.disableDiscovery()
																																		.addBeanClasses(MyService.class)
																																		.initialize();
				MyService	service	=	container.select(MyService.class).get();	
				service.sayHello();
				container.close();
}
SeContainerInitializer
SeContainer Instance<Object>
1
2
1
2
public	abstract	class	SeContainerInitializer	{
				public	SeContainerInitializer	addBeanClasses();
				public	SeContainerInitializer	addPackages();
				public	SeContainerInitializer	addExtensions();
				public	SeContainerInitializer	enableInterceptors();
				public	SeContainerInitializer	enableDecorators();
				public	SeContainerInitializer	selectAlternatives();
				public	SeContainerInitializer	selectAlternativeStereotypes();
				public	SeContainerInitializer	addProperty();	
				public	SeContainerInitializer	setProperties();
				public	SeContainerInitializer	disableDiscovery();	
				public	SeContainerInitializer	setClassLoader();	
annotated
addBeanClasses()
1
2
3
1
2
@Postconstruct
@RequestScoped
@ApplicationScopedpublic	class	MyBean	{
				@ActivateRequestContext	
				public	void	doRequest(String	body)	{
								 //	Request	Context	will	be	activated	during	this	invocation
				}
}
@ActivateRequestContext
1
1
@ApplicationScopedpublic	class	MyBean	{
				@Inject
				private	RequestContextController	requestContextController;	
				public	void	doRequest(String	body)	{
								//	activate	request	context
								requestContextController.activate();
								//	do	work	in	a	request	context.
								//	deactivate	the	request	context
								requestContextController.deactivate();
				}
}
RequestContextController
1
1
public	void	observer1(@Observes	@Priority(1)	Payload	p)	{	...	}
public	void	observer2(@Observes	@Priority(2)	Payload	p)	{	...	}
@Priority
public	class	MyExtension	implements	Extension	{
		public	void	firstPat(@Observes	@Priority(1)	ProcessAnnotatedType<?>	pat)	{
		}
		public	void	secondPat(@Observes	@Priority(2)	ProcessAnnotatedType<?>	pat)	{
		}
}
1
1
Event
public	interface	Event<T>	{
					...
				public	void	fire(T	event);	
				public	CompletionStage<T>	fireAsync(T	event);	
				public	CompletionStage<T>	fireAsync(T	event,	NotificationOptions	options);	
					...
}
CompletionStage<T>
CompletableFuture
1
2
3
1
2
3
​
@ApplicationScoped
public	class	MyBean	{
				@Inject
				Event<Payload>	event;	
				public	void	someEvenMoreCriticalBusinessMethod()	{
								event.fireAsync( new	Payload());	
				}
}
Event
fireAsync CompletionStage
1
2
1
2
​
@ObservesAsync
@ApplicationScoped
public	class	MyOtherBean	{
				public	void	callMe(@ObservesAsync	Payload	payload)	{	
								//	I	am	called	in	another	thread
				}
}
1
1
fire() @Observes
fireAsync() @ObservesAsync
@Inject Event
BeanManager	bm	=	CDI.current.getBeanManager();	
bm.fireEvent(myPayload);	
BeanManager
fireEvent
1
2
1
2
getEvent()
fireAsync()
BeanManager	bm	=	CDI.current.getBeanManager();
bm.getEvent().fireAsync(myPayload);	 1
1
ProcessObserverMethod
ObserverMethod
ProcessObserverMethod
				public	void	setObserverMethod(ObserverMethod<T>	observerMethod);	
				public	ObserverMethodConfigurator<T>	configureObserverMethod();	
				public	void	veto();	
ObserverMethod
ObserverMethod
1
2
3
1
2
3
InterceptionFactory
public	interface	InterceptionFactory<T>	{
				InterceptionFactory<T>	ignoreFinalMethods();	
				AnnotatedTypeConfigurator<T>	configure();	
				T	createInterceptedInstance(T	instance);	
}
1
2
3
1
2
3
InterceptionFactory
InterceptionFactory
@Produces
public	MyClass	createMyClass(InterceptionFactory<MyClass>	ify)	{
					ify.configure().addAnnotation( new	AnnotationLiteral<Transactional>()	
{};
				return	ify.createInterceptedInstance(new	MyClass());
}
BeanManager.createInterceptionFactory()
@Produces
public	MyClass	createMyClass(InterceptionFactory<MyClass>	ify)	{
				AnnotatedTypeConfigurator<MyClass>	atc	=	ify.configure();
				atc.filterMethods(m	->	m.getJavaMember().getName().equals("doSomething"))	
								.findFirst()
								.ifPresent(m	->	m.add(new	AnnotationLiteral<Transactional>()	{	}));	
				return	ify.createInterceptedInstance(new	MyClass());	
}
doSomething() MyClass
@Literal
MyClass doSomething()
1
2
3
1
2
3
@Inject
@Qualifier @Alternative
@Specializes@Typed
@Vetoed@NonBinding
@New
ApplicationScoped	apsl	=	ApplicationScoped.Literal.INSTANCE;	
Named	myNamed	=	NamedLiteral.of("myName");	
javax.enterprise.inject.literal
1
1
1
1
AnnotatedType BeanAttributes
Bean InjectionPoint
ObserverMethod Producer
public	class	LegacyClass	{
...
				public	void	setConfig(Map<String,	Object>	config)	{
								this.config	=	config;
				}
...
}
InjectionTargetFactory
public	class	LegacyClass	{
...
				@Inject
				public	void	setConfig(Map<String,	Object>	config)	{
								this.config	=	config;
				}
...
}
public	class	InjectionBean	{
				@Inject
				BeanManager	bm;
				public	LegacyClass	getInjectedLegacy(LegacyClass	component)	{
								AnnotatedType<LegacyClass>	atmc	=	bm.createAnnotatedType(LegacyClass.class);
								bm.getInjectionTargetFactory(new	LegacyAnnotatedType(atmc))	
																.createInjectionTarget(null)
																.inject(component,bm.createCreationalContext(null));
								return	component;
				}
}
1
1
AnnotatedType
public	class	LegacyAnnotatedType	implements	AnnotatedType<LegacyClass>	{
				AnnotatedType<LegacyClass>	delegate;
				Set<AnnotatedMethod<?	super	LegacyClass>>	methods	=	new	HashSet<>();
				public	LegacyAnnotatedType(AnnotatedType<LegacyClass>	atmc)	{
								delegate	=	atmc;
								for	(AnnotatedMethod<?	super	LegacyClass>	am	:	delegate.getMethods())	{
												if(am.getJavaMember().getName().equals("setConfig"))
																methods.add(new	InjectedMethod(am));
												else
																methods.add(am);
								}
				}
				public	Set<AnnotatedMethod<?	super	LegacyClass>>	getMethods()	{
								return	methods;
				}
				//	8	more	methods	calling	delegate
}
AnnotatedMethod
public	class	InjectedMethod<T>	implements	AnnotatedMethod<T>	{
				AnnotatedMethod<T>	delegate;
				Set<Annotation>	annotations;
				public	InjectedMethod(AnnotatedMethod<T>	am)	{
								delegate	=	am;
								annotations	=	new	HashSet<>(delegate.getAnnotations());
								annotations.add(new	AnnotationLiteral<Inject>()	{
								});
				}
				@Override
				public	Set<Annotation>	getAnnotations()	{
								return	annotations;
				}
				@Override
				public	boolean	isAnnotationPresent(Class<?	extends	Annotation>	annotationType)	{
								if(annotationType.equals(Inject.class))
												return	true;
								return	delegate.isAnnotationPresent(annotationType);
				}
				//	8	more	methods	calling	delegate
}
@ApplicationScoped
public	class	InjectionBean	{
				@Inject
				BeanManager	bm;
				public	LegacyClass	getInjectedLegacy(LegacyClass	component)	{
								AnnotatedType<LegacyClass>	atmc	=	bm.createAnnotatedType(LegacyClass.class);
								InjectionTargetFactory<LegacyClass>	itf	=	bm.getInjectionTargetFactory(atmc));
								itf.configure().filterMethods(m	->	m.getJavaMember()
																.getName().equals("setConfig"))
																.findFirst()
																.ifPresent(m	->	m.add(InjectLiteral.INSTANCE));
								itf.createInjectionTarget(null)
																.inject(component,	bm.createCreationalContext(null));
								return	component;
				}
}
pom.xml
<dependency>
				<groupId>org.jboss.weld.se</groupId>
				<artifactId>weld-se-shaded</artifactId>
				<version>3.0.0.CR2</version>
</dependency>
public	class	RunMe	{
				public	static	void	main(String[]	args)	{
								SeContainer	container	=	SeContainerInitializer.newInstance()
																.initialize();
								//	Put	your	code	here
				}
}
$WILDFLY_HOME/bin
$	./jboss-cli.sh	--command="patch	apply	$PATH_TO_PATCH/wildfly-10.1.0.Final-weld-3.0.0.CR2-patch.zip"
What's new in CDI 2.0
What's new in CDI 2.0
What's new in CDI 2.0

Mais conteúdo relacionado

Mais de Antoine Sabot-Durand

Extending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss ForgeExtending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss ForgeAntoine Sabot-Durand
 
Apache Deltaspike the CDI Toolbox (Java One 2015)
Apache Deltaspike the CDI Toolbox (Java One 2015)Apache Deltaspike the CDI Toolbox (Java One 2015)
Apache Deltaspike the CDI Toolbox (Java One 2015)Antoine Sabot-Durand
 
Java EE, un ami qui vous veut du bien
Java EE, un ami qui vous veut du bienJava EE, un ami qui vous veut du bien
Java EE, un ami qui vous veut du bienAntoine Sabot-Durand
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Antoine Sabot-Durand
 
Invoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamicInvoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamicAntoine Sabot-Durand
 
Fais ce que tu veux avec Java EE - Devoxx France 2014
Fais ce que tu veux avec Java EE - Devoxx France 2014Fais ce que tu veux avec Java EE - Devoxx France 2014
Fais ce que tu veux avec Java EE - Devoxx France 2014Antoine Sabot-Durand
 
The Magnificent java EE 7 in Wildfly-O-Rama
The Magnificent java EE 7 in Wildfly-O-RamaThe Magnificent java EE 7 in Wildfly-O-Rama
The Magnificent java EE 7 in Wildfly-O-RamaAntoine Sabot-Durand
 

Mais de Antoine Sabot-Durand (20)

Cdi from monolith to module
Cdi from monolith to moduleCdi from monolith to module
Cdi from monolith to module
 
CDI 2.0 is upon us Devoxx
CDI 2.0 is upon us DevoxxCDI 2.0 is upon us Devoxx
CDI 2.0 is upon us Devoxx
 
CDI 2.0 is coming
CDI 2.0 is comingCDI 2.0 is coming
CDI 2.0 is coming
 
Mute Java EE DNA with CDI
Mute Java EE DNA with CDI Mute Java EE DNA with CDI
Mute Java EE DNA with CDI
 
Extending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss ForgeExtending Java EE with CDI and JBoss Forge
Extending Java EE with CDI and JBoss Forge
 
CDI 2.0 is coming
CDI 2.0 is comingCDI 2.0 is coming
CDI 2.0 is coming
 
Apache Deltaspike the CDI Toolbox (Java One 2015)
Apache Deltaspike the CDI Toolbox (Java One 2015)Apache Deltaspike the CDI Toolbox (Java One 2015)
Apache Deltaspike the CDI Toolbox (Java One 2015)
 
Advanced CDI in live coding
Advanced CDI in live codingAdvanced CDI in live coding
Advanced CDI in live coding
 
Java EE, un ami qui vous veut du bien
Java EE, un ami qui vous veut du bienJava EE, un ami qui vous veut du bien
Java EE, un ami qui vous veut du bien
 
Adopt a JSR: CDI 2.0 at Devoxx UK
Adopt a JSR: CDI 2.0 at Devoxx UKAdopt a JSR: CDI 2.0 at Devoxx UK
Adopt a JSR: CDI 2.0 at Devoxx UK
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Going further with CDI 1.2
Going further with CDI 1.2Going further with CDI 1.2
Going further with CDI 1.2
 
The path to cdi 2.0
The path to cdi 2.0The path to cdi 2.0
The path to cdi 2.0
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
 
Invoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamicInvoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamic
 
CDI 1.1 university
CDI 1.1 universityCDI 1.1 university
CDI 1.1 university
 
Fais ce que tu veux avec Java EE - Devoxx France 2014
Fais ce que tu veux avec Java EE - Devoxx France 2014Fais ce que tu veux avec Java EE - Devoxx France 2014
Fais ce que tu veux avec Java EE - Devoxx France 2014
 
CDI In Real Life
CDI In Real LifeCDI In Real Life
CDI In Real Life
 
The Magnificent java EE 7 in Wildfly-O-Rama
The Magnificent java EE 7 in Wildfly-O-RamaThe Magnificent java EE 7 in Wildfly-O-Rama
The Magnificent java EE 7 in Wildfly-O-Rama
 
Devoxx Java Social and Agorava
Devoxx Java Social and AgoravaDevoxx Java Social and Agorava
Devoxx Java Social and Agorava
 

Último

MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Zilliz
 

Último (20)

MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 

What's new in CDI 2.0