SlideShare uma empresa Scribd logo
1 de 65
Baixar para ler offline
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Java	EE	8	–	What’s	coming?	
	
	
	
	
	
February	2017	
David	Delabassee	
@delabassee	
Oracle
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Safe	Harbor	Statement	
The	following	is	intended	to	outline	our	general	product	direcPon.	It	is	intended	for	
informaPon	purposes	only,	and	may	not	be	incorporated	into	any	contract.	It	is	not	a	
commitment	to	deliver	any	material,	code,	or	funcPonality,	and	should	not	be	relied	upon	
in	making	purchasing	decisions.	The	development,	release,	and	Pming	of	any	features	or	
funcPonality	described	for	Oracle’s	products	remains	at	the	sole	discrePon	of	Oracle.	
2
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Java	EE	APIs	-	Backbone	of	Leading	Open	Source	Projects	
3	
Java	EE		
Containers	
Microservices	 Web	
Containers	
Web	
Frameworks	
PaaS	REST
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 4	
The	 reports	 of	 my	 death		
are		greatly		exaggerated.	
Java	EE	
“
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 5	
Life	is	not	a	quiet	river...		
“	 Charles	Regimbeau
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 6	
Community	Survey	
h`ps://blogs.oracle.com/theaquarium/entry/java_ee_8_community_survey2
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Java	EE	8	
	
7
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JAX-RS	2.1	
•  ReacPve	Client	API	
•  Server-sent	events	
•  Non-blocking	I/O	in	providers	(filters,	interceptors…)	
•  Hypermedia	API	enhancements	
•  IntegraPon	with	other	JSRs	and	frameworks	
8
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 9	
JAX-RS	2.0	
Client	client	=	ClientBuilder.newClient();	
	
String	name	=	client.target("http://example.com/api/hello")	
																				.request(MediaType.TEXT_PLAIN)	
																				.get(String.class);	
//...	
	
client.close();
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 10	
JAX-RS	2.0	
	
//	http://example.com/api/read/doe?dpt=1									
	
WebTarget	myResource	=	client.target("http://example.com/api/read")	
																													.path("{user}")	
																													.resolveTemplate("user",	"joe")	
																													.queryParam("dpt",	"1");	
									
Response	response	=	myResource.request(...).get();	
	
//	...
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 11	
JAX-RS	2.0	
Client	client	=	ClientBuilder.newClient();	
	
WebTarget	myResource	=	client.target("http://example.com/api/read");	
	
Future<String>	response	=	myResource.request(MediaType.TEXT_PLAIN)	
																																				.async()	
																																				.get(String.class);	
	
//	...
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 12	
JAX-RS	2.0	
WebTarget	myResource	=	client.target("http://example.com/api/read");	
	
Future<Customer>	fCustomer	=	myResource.request(MediaType.TEXT_PLAIN)	
								.async()	
								.get(new	InvocationCallback<Customer>()	{														
												@Override	
												public	void	completed(Customer	customer)	{	
												//	work	on	the	customer	
												}	
	
												@Override	
												public	void	failed(Throwable	throwable)	{	
												//	Oops!	
												}		
				});
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 13	
JAX-RS	2.0
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 14	
JAX-RS	2.0	
destination.path("recommended").request()	
					.header("Rx-User",	"Async")	
					.async()	
					.get(new	InvocationCallback<List<Destination>>()	{	
									@Override	
									public	void	completed(final	List<Destination>	recommended)	{	
												final	CountDownLatch	innerLatch	=	new	CountDownLatch(recommended.size());	
												final	Map<String,	Forecast>	forecasts	=		
																																								Collections.synchronizedMap(new	HashMap<>());	
												for	(final	Destination	dest	:	recommended)	{	
																forecast.resolveTemplate("dest",	dest.getDestination()).request()	
																								.async()	
																								.get(new	InvocationCallback<Forecast>()	{	
																													@Override	
																													public	void	completed(final	Forecast	forecast)	{	
																																	forecasts.put(dest.getDestination(),	forecast);	
																																	innerLatch.countDown();	
																													}
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 15	
JAX-RS	2.0	
																																																																			…	
																											@Override	
																											public	void	failed(final	Throwable	throwable)	{	
																																		innerLatch.countDown();	
																															}	
																											});	
																}	
	
																try	{	
																				if	(!innerLatch.await(10,	TimeUnit.SECONDS))	{	//	timeout	}	
																}	catch	(final	InterruptedException	e)	{	//	Ooops,	interrupted!	}	
		
																//	Continue	with	processing…	
												}		
												@Override	
												public	void	failed(final	Throwable	throwable)	{	//	Recommendation	error	}	
									});
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 16	
JAX-RS	2.1	
//	JAX-RS	2.1	
CompletionStage<Response>	csResponse	=	ClientBuilder.newClient()	
								.target("http://example.com/api")	
								.request()	
								.rx()	
								.get();	
Future<Response>	fResponse	=	ClientBuilder.newClient()	
								.target("http://example.com/api")	
								.request()	
								.async()	
								.get();	
Response	response	=	ClientBuilder.newClient()	
								.target("http://example.com/api")	
								.request()	
								.get();
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 17	
JAX-RS	2.1	
CompletionStage<String>	cs1	=	client.target("http://partner.us/api")	
																																				.request()	
																																				.rx()	
																																				.get(String.class);															
															
CompletionStage<String>	cs2	=	client.target("http://supplier.be/api")	
																																				.request()	
																																				.rx()	
																																				.get(String.class);															
															
//	get	both	responses	in	a	List	(when	they	are	available)	
CompletionStage<List<String>>	listCompletionStage	=	cs1.thenCombine(cs2,	List::of);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JAX-RS	2.1	
•  Server-Sent	Events	
– Persistent,	one-way	communicaPon	channel	
– Text	protocol,	special	media	type	"text/event-stream"	
– Server	can	send	mulPple	messages	(events)	to	a	client	
– Can	contain	id,	name,	comment	retry	interval	
– Supported	in	all	modern	browsers	
18
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JAX-RS	2.1	
19	
SSE	–	Server	side	classes	
•  OutboundSseEvent	
– Outbound	SSE	representaPon	
•  SseEventOutput	extends	Flow.Subscriber<OutboundSseEvent>	
– Outbound	SSE	stream	
– ApplicaPon	can	write	events	to	it,	check	its	state	and	close	it	
•  SseBroadcaster	extends	Flow.Publisher<OutboundSseEvent>	
– Used	to	work	with	mulPple	SseEventOutput	instances	
•  SseContext	
– Injectable	factory	for	the	above	classes
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JAX-RS	2.1	
20	
SSE	–	Client	side	classes	
•  InboundSseEvent	
– Inbound	Server	Sent	Event	
– Similar	to	OutboundSseEvent	
•  SseEventInput	
– Low-level	way	for	accessing	Server	Sent	Events	stream	
•  SseEventSource	extends	Flow.Publisher<InboundSseEvent>	
– Used	for	subscribing	to	Server	Sent	Event	streams
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 21	
JAX-RS	2.1	
//	server-side	init	
@Inject	
SseContext	sseContext;		
SseBroadcaster	sseBroadcaster	=	sseContext.newBroadcaster();		
sseBroadcaster.onException(	(o,	e)	->	{	e.printStackTrace();	}	);		
sseBroadcaster.onClose(...);	
@GET	
@Path	("sse")	
@Produces	(MediaTypes.SERVER_SENT_EVENTS)	
public	SseEventOutput	itemEvents(...)	{	
				SseEventOutput	eventOutput	=	sseContext.newOutput();	
				//...	
				return	eventOutput;	
}
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 22	
JAX-RS	2.1	
//...	
final	OutboundSseEvent	=	ose	sseContext.newEvent()	
																																	.id(...)	
																																	.data(...)	
																																	.comment(...)	
																																	.build();	
	
	
eventOutput.write(ose);	
	
	
	
	
					
sseBroadcaster.subscribe(eventOutput);	
sseBroadcaster.broadcast(ose);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 23	
JAX-RS	2.1	
private	final	WebTarget	target	=	ClientBuilder.newClient().target("http://host/sse");	
private	SseEventSource	eventSource;	
	
public	void	connect(Consumer<String>	dataConsumer)	{	
								eventSource	=	SseEventSource.target(target)	
													.open(es	->	es.subscribe(new	Flow.Subscriber<InboundSseEvent>()	{	
	
																		@Override	
																		public	void	onNext(final	InboundSseEvent	item)	{	
																						dataConsumer.accept(item.readData());	
																		}	
	
																		//	onSubscribe,	onError,	onComplete	
	
													}));	
}		
//...		
eventSource.close();
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-P	1.1	
•  Update	JSON-P	spec	to	stay	current	with	emerging	standards	
– RFC	7159	-	The	JavaScript	Object	NotaPon	(JSON)	Data	Interchange	Format	
– RFC	6901	–	JSON	Pointer	
– RFC	6902	–	JSON	Patch	
– RFC	7396	–	JSON	Merge	Patch	
•  Add	ediPng/transformaPon	operaPons	to	JsonObject	and	JsonArray	
•  Add	JSON	Collectors	
•  Big	JSON	support	
24
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-P	1.1	
•  JSON-Pointer	–	IETF	RFC	6901	
•  String	syntax	for	referencing	a	JSON	value	
	E.g.	"/0/user/address"	
25
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-P	1.1	
26	
	
[	
			{	
					"name":"Duke",	
					"gender":"M",	
					"phones":{	
								"home":"555-123-456",	
								"mobile":"555-321-456"}},	
		{	
					"name":"Jane",	
					"gender":"F",	
					"phones":{	
								"mobile":"555-999-111"}}	
]	
	
		
JsonArray	contacts	=	…	
JsonPointer	pointer	=	new	JsonPointer("/0/name");	
JsonValue	value	=	pointer.getValue(contacts);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-P	1.1	
•  JSON-Pointer	–	IETF	RFC	6901	
•  String	syntax	for	referencing	a	JSON	value	
– E.g.	"/0/user/address”	
•  Methods	
– getValue(),	add(),	replace(),	remove()	
	
27	
JsonPointer	pointer	=	new	JsonPointer("/0/name");	
JsonArray	result	=	pointer.replace(contacts,	Json.createValue("Joe"));
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-P	1.1	
•  JSON-Patch	–	IETF	RFC	6902	
•  Patch	is	a	JSON	document	
– Array	of	objects	/	operaPons	for	modifying	a	JSON	document	
– Add,	replace,	remove,	move,	copy,	test	
28
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 29	
JSON-P	1.1	
[	
				{		
							"op"	:	"replace",	
							"path"	:	"/0/phones/mobile",	
							"value"	:	"650-111-2222"	
				}	,	
				{	
							"op"	:	"remove",	
							"path"	:	"/1"	
				}	
]	
	
[	
			{	
							"name"	:	"Duke",	
							"gender"	:	"M",	
							"phones"	:	{	
											"home"	:	"650-123-4567",	
											"mobile"	:	"650-234-5678"	}	
				}	,	
				{	
							"name"	:	"Jane",	
							"gender"	:	"F",	
							"phones"	:	{	
											"mobile"	:	"707-555-9999“		}	
				}	
]
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 30	
JSON-P	1.1	
[	
				{		
							"op"	:	"replace",	
							"path"	:	"/0/phones/mobile",	
							"value"	:	"650-111-2222"	
				}	,	
				{	
							"op"	:	"remove",	
							"path"	:	"/1"	
				}	
]	
	
[	
			{	
							"name"	:	"Duke",	
							"gender"	:	"M",	
							"phones"	:	{	
											"home"	:	"650-123-4567",	
											"mobile"	:	"650-234-5678"	}	
				}	,	
				{	
							"name"	:	"Jane",	
							"gender"	:	"F",	
							"phones"	:	{	
											"mobile"	:	"707-555-9999“		}	
				}	
]
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 31	
JSON-P	1.1	
[	
				{		
							"op"	:	"replace",	
							"path"	:	"/0/phones/mobile",	
							"value"	:	"650-111-2222"	
				}	,	
				{	
							"op"	:	"remove",	
							"path"	:	"/1"	
				}	
]	
	
[	
			{	
							"name"	:	"Duke",	
							"gender"	:	"M",	
							"phones"	:	{	
											"home"	:	"650-123-4567",	
											"mobile"	:	"650-111-2222"	}	
				}	,	
				{	
							"name"	:	"Jane",	
							"gender"	:	"F",	
							"phones"	:	{	
											"mobile"	:	"707-555-9999“		}	
				}	
]
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 32	
JSON-P	1.1	
[	
				{		
							"op"	:	"replace",	
							"path"	:	"/0/phones/mobile",	
							"value"	:	"650-111-2222"	
				}	,	
				{	
							"op"	:	"remove",	
							"path"	:	"/1"	
				}	
]	
	
[	
			{	
							"name"	:	"Duke",	
							"gender"	:	"M",	
							"phones"	:	{	
											"home"	:	"650-123-4567",	
											"mobile"	:	"650-111-2222"	}	
				}	,	
				{	
							"name"	:	"Jane",	
							"gender"	:	"F",	
							"phones"	:	{	
											"mobile"	:	"707-555-9999“		}	
				}	
]
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 33	
JSON-P	1.1	
[	
				{		
							"op"	:	"replace",	
							"path"	:	"/0/phones/mobile",	
							"value"	:	"650-111-2222"	
				}	,	
				{	
							"op"	:	"remove",	
							"path"	:	"/1"	
				}	
]	
	
[	
			{	
							"name"	:	"Duke",	
							"gender"	:	"M",	
							"phones"	:	{	
											"home"	:	"650-123-4567",	
											"mobile"	:	"650-111-2222"	}	
				}	,	
				{	
							"name"	:	"Jane",	
							"gender"	:	"F",	
							"phones"	:	{	
											"mobile"	:	"707-555-9999“		}	
				}	
]
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 34	
JSON-P	1.1	
[	
				{		
							"op"	:	"replace",	
							"path"	:	"/0/phones/mobile",	
							"value"	:	"650-111-2222"	
				}	,	
				{	
							"op"	:	"remove",	
							"path"	:	"/1"	
				}	
]	
	
[	
			{	
							"name"	:	"Duke",	
							"gender"	:	"M",	
							"phones"	:	{	
											"home"	:	"650-123-4567",	
											"mobile"	:	"650-111-2222"	}	
				}	
]
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 35	
JSON-P	1.1	
JsonArray	target	=	…;	
JsonArray	patch	=	…;	
		
JsonPatch	jsonPatch	=	new	JsonPatch(patch);	
	
JsonArray	result	=	jsonPatch.apply(target);	
JsonPatchBuilder	builder	=	new	JsonPatchBuilder();	
JsonArray	result	=	builder.add("/Joe/phones/office",	"1234-567")	
																										.remove("/Amy/age")	
																										.apply(target);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 36	
JSON-P	1.1	
Orignal																					Patch																							Result	
	
{"a"	:	"b"}															{"a"	:	"c"}																{"a"	:	"c"}	
	
{"a"	:	"b"}															{"b"	:	"c"}																{"a"	:	"b",	
																																																																			"b"	:	"c"}	
	
{"a"	:	"b"}															{"a"	:	null}															{	}	
	
{"a"	:	"b",															{"a"	:	null}															{"b"	:	"c"}	
	"b"	:	"c"}	
	
…	
•  JSON-Merge	Patch	–	IETF	RFC	7386
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 37	
JSON-P	1.1	
•  JSON-Merge	Patch	–	IETF	RFC	7386	
	JsonObject	contact	=	…;	//	The	target	to	be	patched	
	JsonObject	patch	=	…;	
		
	JsonValue	output	=	JsonMergePatch.mergePatch(target,	patch);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 38	
JSON-P	1.1	
•  JSON-Patch	&	JSON-Merge	Patch	Diff	
JsonValue	output	=	JsonMergePatch.diff(original,	target);	
JsonArray	diff	=	JsonPatch.diff(original,	target);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 39	
JSON-P	1.1	
JsonArray	cars	=	...;		
JsonArray	audis	=	cars.getValuesAs(JsonObject.class).stream()	
																						.filter(x	->	"Audi".equals(x.getString("brand")))	
																						.map(x	->	(x.getString("serial")))	
																						.collect(	
																											Collector.of(	
																														()	->	Json.createArrayBuilder(),		
																														(builder,	value)	->	builder.add(value),	
																														(builder1,	builder2)	->	builder1.add(builder2),		
																														builder	->	builder.build()	
																										)	
																						);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 40	
JSON-P	1.1	
JsonArray	cars	=	...;		
JsonArray	audis	=	cars.getValuesAs(JsonObject.class).stream()	
																						.filter(	x->"Audi".equals(x.getString("brand"))	)	
																						.map(	x->(	x.getString("serial")	)	
																						.collect(	JsonCollectors.toJsonArray()	);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-B	1.0	
•  JAXB-like	API	to	marshal/unmarshal	Java	objects	to/from	JSON	documents	
•  Default	mapping	between	classes	and	JSON	
•  CustomizaPon	APIs	
– AnnotaPon	(@JsonbProperty,	@JsonbNillable)	
– RunPme	configuraPon	builder	
•  Allows	to	swap	providers	
•  Natural	follow	on	to	JSON-P	–	closes	the	JSON	support	gap		
	
41
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 42	
JSON-B	1.0	
[			
		{			
				"brand"	:	"Apple",	
				"model"	:	"iPhone	7",	
				"stock"	:	1	
		},	
		{			
				"brand"	:	"Samsung",	
				"model"	:	"Galaxy	Note	7",	
				"stock"	:	666	
		}	
]	
Phone	phone1	=	new	Phone();	
phone1.setBrand("Apple");	
phone1.setModel("iPhone	7");	
phone1.setStock(1);	
…	
List<Phone>	inventory	=	new	ArrayList<>();	
inventory.add(phone1);	
inventory.add(phone2);	
	
Jsonb	jsonb	=	JsonBuilder.create();	
String	stock	=	jsonb.toJson(inventory);
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 43	
public	class	Customer	{	
		private	int	id;	
	
		@JsonbProperty("name")	
		private	String	firstName;	
	
}	
	
public	class	Customer	{	
		public	int	id;	
		public	String	firstName;	
	
		@JsonbProperty("name")	
		private	String	getFirstName()	{	
					return	firstName;	
		}	
	
}	
JSON-B	1.0	CustomizaPons
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-B	1.0	CustomizaPons	
•  Naming	strategies	
– IDENTITY	:	myProp	
– LOWER_CASE_WITH_DASHES	:	my-prop	
– LOWER_CASE_WITH_UNDERSCORES	:	my_prop	
– UPPER_CAMEL_CASE	:	MyProp	
– UPPER_CAMEL_CASE_WITH_SPACES	:	My	Prop	
– CASE_INSENSITIVE	:	myprop	
– Or	a	custom	implementaPon	
44	
•  Property	ordering	
– Any,	Lexicographical,	Reverse	
•  Binary	Data	Strategies	
– Base64,	Base64	URL,	Byte
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSON-B	1.0	CustomizaPons	
•  Property	naming	
•  Property	ordering	
•  Property	to	ignore	
•  Null	handling	
•  Custom	instanPaPon	
45	
•  Fields	visibility	
•  Date/Number	Formats	
•  Binary	Encoding	
•  Adapters	
•  ...
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 46	
JSON-B	1.0	CustomizaPons	
Jsonb	jsonb	=	JsonbBuilder.create();	
	
	
//Ordering,	naming	strategy,	encoding,	Locale,	…	
JsonbConfig	config	=	new	JsonbConfig()	
																													.withFormatting(true)	
																													.withAdapters(new	CarAdapter());												
	
Jsonb	jsonb	=	JsonbBuilder.create(config);	
	
	
Jsonb	jsonb	=	JsonBuilder.newBuilder("myProvider");
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Servlet	4.0	
•  Support	for	HTTP/2	
– Request/response	mulPplexing	
– Server	push	
– Upgrade	from	HTTP	1.1	
•  CompaPbility	with	latest	HTTP	1.1	RFCs	
•  Smaller	community-requested	improvements	(JIRA	issues)	
47
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
HTTP/2	
•  Binary	Framing	over	single	TCP	connecPon	
•  Request/Response	mulPplexing	
•  Stream	PrioriPzaPon	
•  Server	Push	
•  Upgrade	from	HTTP	1.1	
•  Header	Compression	
•  Preserve	HTTP	semanPc	
•  Flow	Control	
48
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Servlet	4.0	
49	
PushBuilder	builder	=	baseRequest.getPushBuilder();	
	
builder.addHeader("X-Pusher",	…);	
	
builder.path(aResource)	
							.etag(associated._etag)	
							.lastModified(associated._lastModified)	
							.push();
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
JSF	2.3	
•  Be`er	CDI	IntegraPon	
– Way	more	things	are	injectable	
– Finally	marking	legacy	managed	beans	as	deprecated	
•  Java	Time	support	
•  WebSocket	IntegraPon	
•  Ajax	Method	InvocaPon	
•  Class	Level	Bean	ValidaPon	
•  UIData	and	UIRepeat	improvements	
50
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
CDI	2.0	
•  Define	behavior	of	CDI	outside	of	a	Java	EE	container	
•  API	to	bootstrap	a	CDI	container	in	Java	SE	
•  Spec	split	into	3	parts:	
– CDI	Core	
– CDI	for	Java	SE	
– CDI	for	Java	EE	
•  Apply	Interceptor	on	Producer	
•  Observers	ordering	
•  Asynchronous	events	
51
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
CDI	2.0	
52	
@Inject	
Event<PaymentEvent>	debitEvent;	
	
//	producer	
debitEvent.fire(somePayload);	
	
	
//	consumer	
public	void	anObesrver(@Observes	Payload	p)	{	
…	
}
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
CDI	2.0	
53	
	
	
//	consumer	A	
public	void	anObesrver(@Observes	Payload	p)	{	
…	
}	
	
//	consumer	B	
public	void	anotherObesrver(@Observes	Payload	p)	{	
…	
}
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
CDI	2.0	
54	
	
	
//	consumer	A	
public	void	anObesrver(@Observes	@Priority(10)	Payload	p)	{	
…	
}	
	
//	consumer	B	
public	void	anotherObesrver(@Observes	@Priority(20)	Payload	p)	{	
…	
}
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
CDI	2.0	
55	
@Inject	
Event<PaymentEvent>	debitEvent;	
	
//	async	producer	
debitEvent.fireAsync(somePayload);	
	
	
//	async	consumer	
public	void	anObesrver(@ObservesAsync	Payload	p)	{	
…	
}
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Bean	ValidaPon	2.0	
•  Embrace	Java	SE	8	
– Support	for	new	Date/Time	API	
– Constraints	applied	to	collecPon	elements	
– OpPonal	wrappers	
– Repeatable	annotaPons	
•  Introduce	new	constraints	
– E.g.	@NotEmpty,	@NotBlank		
•  AddiPonal	features	requested	from	community	
56
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Bean	ValidaPon	2.0	
57	
List<@NotNull @Email String> emails;	
String @NotNull @Email[] emails;	
Map<@Valid Customer, @Valid Address> primaryAddressByCustomer;	
Optional<@Past LocalDate> getRegistrationDate();	
@ZipCode(countryCode = "fr", groups = Default.class, message = "unvalid zip")!
@ZipCode(countryCode = "fr", groups = SuperUser.class, message = "zip nok…")!
private String zipCode;
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Security	API	for	Java	EE	
•  IdenPty	Store	
– Standardize	applicaPon-accessible	IdenPty	Store 		
– Validate	Caller's	credenPals	and	accessing	related	idenPty	a`ributes	
•  Used	by	an	authenPcaPon	mechanism	(e.g.	JASPIC)	
•  AuthenPcaPon	Mechanism	
– Simplify	applicaPon-accessible	authenPcaPon	mechanisms	
•  Security	Context	
– Standardize	a	pla{orm-wide	Security	Context 		
•  ProgrammaPc	access	point	
58
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Wrap-up		
	
59
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Java	EE	8	
60	
Connector	 JAXB	JSP	Debugging	
Managed	Beans	JSP	Concurrency	EE	 Interceptors	 JAX-WS	 WebSocket	
Bean	ValidaPon	 JASPIC	 Servlet	JMS	 JTA	Deployment	
Batch	 JACC	
Dependency	
InjecPon	 JAXR	 JSTL	 Management	
CDI	 EJB	 JAX-RPC	 Web	Services	JSF	 JPA	
Common	
AnnotaPons	 EL	 JAX-RS	
Web	Services	
Metadata	JavaMail	
CDI	
JSON-B	 Security	
Bean	ValidaPon	
JSF	
JAX-RS	 JSON-P	
Servlet	
JSP	
(*)	MRs	Releases	not	listed
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 61	
Java	EE	8	-	Status	
SpecificaKons	 Early	DraM	 Public	DraM	
CDI	2.0	–	JSR	365	 Ongoing	
Java	EE	8	–	JSR	366	 2nd	dra}	
JSON-B	1.0	–	JSR	367	 Done!	
Servlet	4.0	–	JSR	369	 Ongoing	
JAX-RS	2.1	–	JSR	370	 Expected	Q1	 Expected	Q2	
JSF	2.3	–	JSR	372	 Ongoing	
JSON-P	1.1	–	JSR	374	 Ongoing	
Security	1.0	–	JSR	375	 Expected	Q1	
Beans	ValidaPon	2.0	–	JSR	380	 Expected	Q1	
MVC	–	JSR	371	:	Spec	Lead	transfer	in	progress
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	
Java	EE	8	-	Summary	
•  Work	in	progress	
– H2	2017	Final	Release	
•  Contribute!	
– Adopt	A	JSR	
•  h`ps://community.oracle.com/community/java/jcp/adopt-a-jsr	
•  Open	Source	Reference	ImplementaPons	
– GlassFish	5,	Jersey	…	
•  h`p://glassfish.org	
62
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 63	
SomePmes	you	have	to	take	
a	step	back	to	move	forward.	“	
Erika	Taylor
Copyright	©	2017,	Oracle	and/or	its	affiliates.	All	rights	reserved.		|	 64	
Tack!
Java EE 8 - February 2017 update

Mais conteúdo relacionado

Mais procurados

Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
David Delabassee
 

Mais procurados (20)

Java EE 8 Overview (Japanese)
Java EE 8 Overview (Japanese)Java EE 8 Overview (Japanese)
Java EE 8 Overview (Japanese)
 
Oracle Database features every developer should know about
Oracle Database features every developer should know aboutOracle Database features every developer should know about
Oracle Database features every developer should know about
 
Java EE 8 - Work in progress
Java EE 8 - Work in progressJava EE 8 - Work in progress
Java EE 8 - Work in progress
 
Another compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilationAnother compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilation
 
Migrating your infrastructure to OpenStack - Avi Miller, Oracle
Migrating your infrastructure to OpenStack - Avi Miller, OracleMigrating your infrastructure to OpenStack - Avi Miller, Oracle
Migrating your infrastructure to OpenStack - Avi Miller, Oracle
 
Related OSS Projects - Peter Rowe, Flexera Software
Related OSS Projects - Peter Rowe, Flexera SoftwareRelated OSS Projects - Peter Rowe, Flexera Software
Related OSS Projects - Peter Rowe, Flexera Software
 
Adopt-a-JSR for JSON Processing 1.1, JSR 374
Adopt-a-JSR for JSON Processing 1.1, JSR 374Adopt-a-JSR for JSON Processing 1.1, JSR 374
Adopt-a-JSR for JSON Processing 1.1, JSR 374
 
OOW16 - Oracle E-Business Suite: Technology Certification Primer and Roadmap ...
OOW16 - Oracle E-Business Suite: Technology Certification Primer and Roadmap ...OOW16 - Oracle E-Business Suite: Technology Certification Primer and Roadmap ...
OOW16 - Oracle E-Business Suite: Technology Certification Primer and Roadmap ...
 
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)Java EE 7 (Lyon JUG & Alpes JUG  - March 2014)
Java EE 7 (Lyon JUG & Alpes JUG - March 2014)
 
HTTP/2 comes to Java (Dec. 2015 version)
HTTP/2 comes to Java (Dec. 2015 version)HTTP/2 comes to Java (Dec. 2015 version)
HTTP/2 comes to Java (Dec. 2015 version)
 
MySQL as a Document Store
MySQL as a Document StoreMySQL as a Document Store
MySQL as a Document Store
 
No sql from the web’s favourite relational database MySQL
No sql from the web’s favourite relational database MySQLNo sql from the web’s favourite relational database MySQL
No sql from the web’s favourite relational database MySQL
 
CON5898 What Servlet 4.0 Means To You
CON5898 What Servlet 4.0 Means To YouCON5898 What Servlet 4.0 Means To You
CON5898 What Servlet 4.0 Means To You
 
Oracle Code in Seoul: Provisioning of Cloud Resource
Oracle Code in Seoul: Provisioning of Cloud ResourceOracle Code in Seoul: Provisioning of Cloud Resource
Oracle Code in Seoul: Provisioning of Cloud Resource
 
How to operate MySQL InnoDB Cluster with MySQL Shell
How to operate MySQL InnoDB Cluster with MySQL ShellHow to operate MySQL InnoDB Cluster with MySQL Shell
How to operate MySQL InnoDB Cluster with MySQL Shell
 
What's coming in Java EE 8
What's coming in Java EE 8What's coming in Java EE 8
What's coming in Java EE 8
 
Oracle cmg15
Oracle cmg15Oracle cmg15
Oracle cmg15
 
TLV - Whats new in MySQL 8
TLV - Whats new in MySQL 8TLV - Whats new in MySQL 8
TLV - Whats new in MySQL 8
 
HTML5 based PivotViewer for Visualizing LInked Data
HTML5 based PivotViewer for Visualizing LInked Data HTML5 based PivotViewer for Visualizing LInked Data
HTML5 based PivotViewer for Visualizing LInked Data
 
Cloud Native Java:GraalVM
Cloud Native Java:GraalVMCloud Native Java:GraalVM
Cloud Native Java:GraalVM
 

Semelhante a Java EE 8 - February 2017 update

Semelhante a Java EE 8 - February 2017 update (20)

Why MySQL High Availability Matters
Why MySQL High Availability MattersWhy MySQL High Availability Matters
Why MySQL High Availability Matters
 
TDC2018SP | Trilha Arq Java - Crie arquiteturas escalaveis, multi-language e ...
TDC2018SP | Trilha Arq Java - Crie arquiteturas escalaveis, multi-language e ...TDC2018SP | Trilha Arq Java - Crie arquiteturas escalaveis, multi-language e ...
TDC2018SP | Trilha Arq Java - Crie arquiteturas escalaveis, multi-language e ...
 
MySQL Shell - The DevOps Tool for MySQL
MySQL Shell - The DevOps Tool for MySQLMySQL Shell - The DevOps Tool for MySQL
MySQL Shell - The DevOps Tool for MySQL
 
TDC2018SP | Trilha Java Enterprise - O Java EE morreu? EE4J e so um plugin? E...
TDC2018SP | Trilha Java Enterprise - O Java EE morreu? EE4J e so um plugin? E...TDC2018SP | Trilha Java Enterprise - O Java EE morreu? EE4J e so um plugin? E...
TDC2018SP | Trilha Java Enterprise - O Java EE morreu? EE4J e so um plugin? E...
 
Java @ Rio Meetup #1 - Java @ Oracle Cloud
Java @ Rio Meetup #1 - Java @ Oracle CloudJava @ Rio Meetup #1 - Java @ Oracle Cloud
Java @ Rio Meetup #1 - Java @ Oracle Cloud
 
MOUG17 Keynote: What's New from Oracle Database Development
MOUG17 Keynote: What's New from Oracle Database DevelopmentMOUG17 Keynote: What's New from Oracle Database Development
MOUG17 Keynote: What's New from Oracle Database Development
 
Building Modern Applications Using APIs, Microservices and Chatbots
Building Modern Applications Using APIs, Microservices and ChatbotsBuilding Modern Applications Using APIs, Microservices and Chatbots
Building Modern Applications Using APIs, Microservices and Chatbots
 
Oow MySQL Whats new in security overview sept 2017 v1
Oow MySQL Whats new in security overview sept 2017 v1Oow MySQL Whats new in security overview sept 2017 v1
Oow MySQL Whats new in security overview sept 2017 v1
 
CDI 2.0 (JSR 365) - Java Day Tokyo 2017 (English)
CDI 2.0 (JSR 365) - Java Day Tokyo 2017 (English)CDI 2.0 (JSR 365) - Java Day Tokyo 2017 (English)
CDI 2.0 (JSR 365) - Java Day Tokyo 2017 (English)
 
TDC2018 | Trilha Java - The quest to the Language Graal: One VM to rule them...
TDC2018 | Trilha Java -  The quest to the Language Graal: One VM to rule them...TDC2018 | Trilha Java -  The quest to the Language Graal: One VM to rule them...
TDC2018 | Trilha Java - The quest to the Language Graal: One VM to rule them...
 
Modern Application Development for the Enterprise
Modern Application Development for the EnterpriseModern Application Development for the Enterprise
Modern Application Development for the Enterprise
 
Chicago JUG / GOTO Meetup
Chicago JUG / GOTO MeetupChicago JUG / GOTO Meetup
Chicago JUG / GOTO Meetup
 
The Future of Java and You
The Future of Java and YouThe Future of Java and You
The Future of Java and You
 
Trivadis TechEvent 2017 Leveraging the Oracle Cloud by Kris Bhanushali tech_e...
Trivadis TechEvent 2017 Leveraging the Oracle Cloud by Kris Bhanushali tech_e...Trivadis TechEvent 2017 Leveraging the Oracle Cloud by Kris Bhanushali tech_e...
Trivadis TechEvent 2017 Leveraging the Oracle Cloud by Kris Bhanushali tech_e...
 
Democratizing Serverless—The Open Source Fn Project - Serverless Summit
Democratizing Serverless—The Open Source Fn Project - Serverless SummitDemocratizing Serverless—The Open Source Fn Project - Serverless Summit
Democratizing Serverless—The Open Source Fn Project - Serverless Summit
 
Data Mobility for the Oracle Database by JWilliams and RGonzalez
Data Mobility for the Oracle Database by JWilliams and RGonzalezData Mobility for the Oracle Database by JWilliams and RGonzalez
Data Mobility for the Oracle Database by JWilliams and RGonzalez
 
Building a Serverless State Service for the Cloud
Building a Serverless State Service for the CloudBuilding a Serverless State Service for the Cloud
Building a Serverless State Service for the Cloud
 
Percona Live - Dublin 01 my sql ha-mysql-clusters
Percona Live - Dublin 01 my sql ha-mysql-clustersPercona Live - Dublin 01 my sql ha-mysql-clusters
Percona Live - Dublin 01 my sql ha-mysql-clusters
 
Time-series Analytics using Matrix Profile and SAX
Time-series Analytics using Matrix Profile and SAXTime-series Analytics using Matrix Profile and SAX
Time-series Analytics using Matrix Profile and SAX
 
The Future of Java and You
The Future of Java and YouThe Future of Java and You
The Future of Java and You
 

Mais de David Delabassee

Project Avatar (Lyon JUG & Alpes JUG - March 2014)
Project Avatar (Lyon JUG & Alpes JUG  - March 2014)Project Avatar (Lyon JUG & Alpes JUG  - March 2014)
Project Avatar (Lyon JUG & Alpes JUG - March 2014)
David Delabassee
 
Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur!
Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur! Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur!
Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur!
David Delabassee
 

Mais de David Delabassee (20)

JVMs in Containers - Best Practices
JVMs in Containers - Best PracticesJVMs in Containers - Best Practices
JVMs in Containers - Best Practices
 
JVMs in Containers
JVMs in ContainersJVMs in Containers
JVMs in Containers
 
Serverless Java Challenges & Triumphs
Serverless Java Challenges & TriumphsServerless Java Challenges & Triumphs
Serverless Java Challenges & Triumphs
 
Serverless Java - Challenges and Triumphs
Serverless Java - Challenges and TriumphsServerless Java - Challenges and Triumphs
Serverless Java - Challenges and Triumphs
 
Randstad Docker meetup - Serverless
Randstad Docker meetup - ServerlessRandstad Docker meetup - Serverless
Randstad Docker meetup - Serverless
 
Java Serverless in Action - Voxxed Banff
Java Serverless in Action - Voxxed BanffJava Serverless in Action - Voxxed Banff
Java Serverless in Action - Voxxed Banff
 
Serverless Kotlin
Serverless KotlinServerless Kotlin
Serverless Kotlin
 
EJB and CDI - Alignment and Strategy
EJB and CDI - Alignment and StrategyEJB and CDI - Alignment and Strategy
EJB and CDI - Alignment and Strategy
 
HTTP/2 Comes to Java
HTTP/2 Comes to JavaHTTP/2 Comes to Java
HTTP/2 Comes to Java
 
Java EE 8 - What’s new on the Web front
Java EE 8 - What’s new on the Web frontJava EE 8 - What’s new on the Web front
Java EE 8 - What’s new on the Web front
 
HTTP/2 Comes to Java
HTTP/2 Comes to JavaHTTP/2 Comes to Java
HTTP/2 Comes to Java
 
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
 
MVC 1.0 / JSR 371
MVC 1.0 / JSR 371MVC 1.0 / JSR 371
MVC 1.0 / JSR 371
 
Java EE 8 - An instant snapshot
Java EE 8 - An instant snapshot Java EE 8 - An instant snapshot
Java EE 8 - An instant snapshot
 
Avatar 2.0
Avatar 2.0Avatar 2.0
Avatar 2.0
 
Java EE 8 - An instant snapshot
Java EE 8 - An instant snapshotJava EE 8 - An instant snapshot
Java EE 8 - An instant snapshot
 
HTTP/2 Comes to Java - What Servlet 4.0 Means to You
HTTP/2 Comes to Java - What Servlet 4.0 Means to YouHTTP/2 Comes to Java - What Servlet 4.0 Means to You
HTTP/2 Comes to Java - What Servlet 4.0 Means to You
 
Pushing Java EE outside of the Enterprise - Home Automation
Pushing Java EE outside of the Enterprise - Home AutomationPushing Java EE outside of the Enterprise - Home Automation
Pushing Java EE outside of the Enterprise - Home Automation
 
Project Avatar (Lyon JUG & Alpes JUG - March 2014)
Project Avatar (Lyon JUG & Alpes JUG  - March 2014)Project Avatar (Lyon JUG & Alpes JUG  - March 2014)
Project Avatar (Lyon JUG & Alpes JUG - March 2014)
 
Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur!
Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur! Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur!
Java EE 7 et ensuite pourquoi pas JavaScript sur le serveur!
 

Último

introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 

Último (20)

%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare%in Harare+277-882-255-28 abortion pills for sale in Harare
%in Harare+277-882-255-28 abortion pills for sale in Harare
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 

Java EE 8 - February 2017 update