Rapid Development Tools for
Java EE 8
Mert Çalışkan, Gaurav Gupta
JavaOne 2017
Mert Çalışkan
Payara Developer
Java EE / Spring Consultant
Author of PrimeFaces Cookbook
Author of Beginning Spring book
Part-time Lecturer
@mertcal
Gaurav Gupta
Payara Developer
NetBeans Dream Team
Jeddict Creator ( jeddict.github.io )
@jGauravGupta , @ImJeddict
React to the talk
Join at
slido.com
#EE8
Agenda
- What’s new with Java EE 8? : Quick overview
- Java EE 8 application generation w/ Jeddict
- Java EE Tools : In depth
- Q&A
@jGauravGupta
What’s new with Java EE 8?
Java EE 8 is released on Sep 06, 2017.
● JAX-RS 2.1 (Jersey 2.26)
● CDI 2.0 (Weld 3.0.0.Final)
● Bean Validation 2.0 (Hibernate Validator 6.0.2.Final)
● JSON-B (Yasson 1.0)
● JPA 2.2 (EclipseLink 2.7.0)
● Java Security API 1.0 (Soteria 1.0)
Checkout https://github.com/javaee-samples/javaee8-samples for details on the
examples
@mertcal
● Reactive Client API
● JSON-B support
● Server Sent Events (SSE)
JAX-RS 2.1 (JSR 370)
@mertcal
● With JAX-RS 2.0, we had asynchronous invoker approach as:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
Future<MyClass> futureResult = builder.async().get(MyClass.class);
System.out.println(futureResult.get());
client.close();
JAX-RS 2.1
@mertcal
● Previous scenario can also be implemented with InvocationCallback<T>
but…
Client client = ClientBuilder. newClient();
WebTarget target = client.target( "http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
builder.async().get( new InvocationCallback<MyClass>() {
@Override
public void completed(MyClass t) {}
@Override
public void failed(Throwable throwable) {}
});
JAX-RS 2.1
@mertcal
● Reactive Client API to the rescue.
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
CompletionStage<Response> response = builder.rx().get();
response.thenAcceptAsync(res -> {
MyClass t = res.readEntity(MyClass.class);
System.out.println(t);
});
JerseyCompletionStageRxInvoker
CompletionStage<Response>
JAX-RS 2.1
@mertcal
● 3rd Party Reactive Framework Support
○ RxJava
Client client = ClientBuilder.newClient().register(RxFlowableInvokerProvider.class);
WebTarget target = client.target("http://localhost:8080/service-url");
Invocation.Builder builder = target.request();
Flowable<Response> flowable = builder.rx(RxFlowableInvoker.class).get();
flowable.subscribe(res -> {
MyClass t = res.readEntity(MyClass.class);
System.out.println(t);
});
reactive invoker specialized
for io.reactivex.Flowable
JAX-RS 2.1
@mertcal
Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url")
.request()
.get();
Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url")
.request()
.async()
.get();
Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url")
.request()
.rx()
.get();
JAX-RS 2.1
@mertcal
● Server Sent Events (SSE) is a mechanism that allows server to
asynchronously push data from the server to client once the client-server
connection is established by the client.
● It’s mostly like Long-Pooling but it’s not :) and it’s not WebSockets either.
● Implementations already provided it with JAX-RS 2.0 but there was no standard
API. With JAX-RS 2.1, API is created under javax.ws.rs.sse
JAX-RS 2.1
@mertcal
@Path("/temperature")
public class TemperatureResource {
private final OutboundSseEvent.Builder sseEventBuilder;
public TemperatureResource( @Context Sse sse) {
this.sseEventBuilder = sse.newEventBuilder();
}
@GET
@Path("/{city}")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void getCurrentTemperatureStream( @Context SseEventSink eventSink) {
while (true) {
eventSink.send( sseEventBuilder.data(temperature)
.mediaType(MediaType. APPLICATION_JSON_TYPE).build());
Thread. sleep(1000);
}
}
}
"text/event-stream"
1
2
3
4
JAX-RS 2.1
@mertcal
CDI 2.0 (JSR 365)
- SE Support - It’s possible to use CDI outside of Java EE
- Ordering of CDI events - @Priority helps ordering observers
void receive(@Observes @Priority(APPLICATION + 200) String greet) {
this.greet += greet + "2";
}
void receive2(@Observes @Priority(APPLICATION) String greet) {
this.greet = greet + "1";
}
For send(“Welcome”) output will be:
Welcome1Welcome2
@Inject
private Event<String> event;
public void send(String message) {
event.fire(message);
}
@mertcal
CompletableStage<MyEvent> eventSent = event.fireAsync( new MyEvent(),
NotificationOptions.ofExecutor(executor));
- Exception in async observer doesn’t break the observer invocation chain.
callMe(@Observes payload) callMe(@ObservesAsync payload)
event.fire(payload) Sync call Not Notified
event.fireAsync(payload) Not Notified Async call
- Long awaited Asynchronous Events Support
- Fire Sync → Observer Sync / Fire Async → Observer Async
CDI 2.0
@mertcal
● Java 8 Date and Time API Support
@Past(message = "must be a past date")
private java.time.Year yearOfBirth;
● Type Annotations
private List<@NotNull @Email String> emails;
private String @NotNull @Email[] emails;
private Map<@Valid Employee, @Valid Address> addressMap = new HashMap<>();
@mertcal
Bean Validation 2 (JSR 380)
● java.util.Optional Support
private Optional<@Past LocalDate> marriageAnniversary;
private Optional<@Size(max = 20) String> name;
● Repeating Annotations
@Max(value = 2000, groups = Default.class)
@Max(value = 5000, groups = GoldCustomer.class)
private long withdrawalAmount;
@mertcal
Bean Validation 2
Bean Validation 2
● Introduces new constraints
○ @Email
○ @NotBlank
○ @NotEmpty
○ @PastOrPresent
○ @FutureOrPresent
○ @Negative
○ @NegativeOrZero
○ @Positive
○ @PositiveOrZero
@mertcal
JSON-B (JSR 367)
● Standard solution like JAXB
● Default mapping between classes and JSON
● Customizable
a. Compile time
■ Property naming @JsonbProperty
■ Property ignoring @JsonbTransient
■ Null handling @JsonbNillable
■ Property ordering @JsonbPropertyOrder
■ Date and Number Format @JsonbDateFormat/@JsonbNumberFormat
■ Adapter @JsonbTypeAdapter
b. Runtime configration
■ Configuration builder JsonbConfig
@jGauravGupta
JSON-B - Customizations
class Employee {
private String name;
private String pin;
private String email;
}
{
"name": "Gaurav",
"pin": "J1-Secret",
"email": "gaurav.gupta@payara.fish",
}
@jGauravGupta
JSON-B - Customizations
@JsonbPropertyOrder({"email", "name"})
class Employee {
@JsonbProperty("empName")
private String name;
@JsonbTransient
private String pin;
private String email;
}
{
"email": "gaurav.gupta@payara.fish",
"empName": "Gaurav"
}
@jGauravGupta
JPA 2.2 (JSR 338)
● @Repeatable annotations
● Support Java 8 Date and Time API
● Ability to return stream of query result
● CDI Injection in AttributeConverters
@jGauravGupta
JPA 2.1
Container annotation required
@Entity
@NamedQueries({
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e"),
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name")
})
class Employee {
@Convert(converter=LocalDateConverter.class)
private LocalDate dateOfBirth;
} AttributeConverter
implementation @jGauravGupta
JPA 2.2
Container annotation not required
@Entity
@NamedQueries({
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e"),
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name")
})
class Employee {
@Convert(converter=LocalDateConverter.class)
private LocalDate dateOfBirth;
}
AttributeConverter not required @jGauravGupta
JPA 2.2
@Entity
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e")
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name")
class Employee {
private LocalDate dateOfBirth;
}
@jGauravGupta
JPA 2.2
● Stream query results
Stream<Employee> employees =
em.createQuery(“SELECT e FROM Employee”, Employee.class)
.getResultStream();
@jGauravGupta
Security API 1.0 (JSR 375)
● Simplify the existing solution
● Enhance the portability
● New APIs
○ HTTPAuthenticationMechanism
○ IdentityStore
○ SecurityContext
@jGauravGupta
Security API 1.0 (JSR 375)
● Authentication Mechanism
○ validateRequest(request, response, httpMessageContext)
○ secureResponse(request, response, httpMessageContext)
○ cleanSubject(request, response, httpMessageContext)
● Identity Store
○ validate(credential)
○ getCallerGroups(credentialValidationResult)
● Security Context
○ getCallerPrincipal()
○ isCallerInRole(role)
○ … … …
@jGauravGupta
@ApplicationScoped
public class MyAuthMechanism implements HttpAuthenticationMechanism {
@Override
public AuthenticationStatus validateRequest(HttpServletRequest request,
HttpServletResponse response, HttpMessageContext context) {
}
}
Security API 1.0
@jGauravGupta
@ApplicationScoped
public class MyAuthMechanism implements HttpAuthenticationMechanism {
@Inject
private IdentityStoreHandler identityStoreHandler;
@Override
public AuthenticationStatus validateRequest(HttpServletRequest request,
HttpServletResponse response, HttpMessageContext context) {
………
identityStoreHandler.validate(credential);
………
}
}
Security API 1.0
@jGauravGupta
@ApplicationScoped
public class MyAuthMechanism implements HttpAuthenticationMechanism {
@Inject
private IdentityStoreHandler identityStoreHandler;
@Override
public AuthenticationStatus validateRequest (HttpServletRequest request,
HttpServletResponse response, HttpMessageContext context) {
………
identityStoreHandler.validate(credential);
………
}
}
Security API 1.0
@jGauravGupta
Java EE 8 App generation w/
jeddict.github.io
@Email
@JsonbProperty
("fName")
@JsonbTransient
java.time.LocalDate
@NamedQuery(name = "findAll")
@NamedQuery(name = "findByFirstName")
@NamedQuery(name = "findByEmail")
@JsonbProperty
("number")
@NotEmpty
@JsonbProperty
("lName")
OpenERP Domain model
@jGauravGupta
Building Angular app
Java EE Tools : In depth
● Jeddict modeler
● Dynamic Code Evaluation
● Payara Fish in NetBeans IDE
● Payara CDI Dev Mode
● Payara AsAdmin Recorder
● Maven Plugin
@jGauravGupta
● Supports any relational database (JDBC compliant)
● Relationship mapping
○ JoinColumn to JoinTable converter and vice versa
○ java.util.Collection, java.util.Map
● Embeddable
● Inheritance
● Query Builder / Executor / Generator (JPQL, SQL, Stored Procedure, Entity Graph)
● JAXB / JSON-B
● Bean Validation
● more… Fluent API, java.util.Optional, Reverse Engineering etc.
Jeddict modeler
@jGauravGupta
JPA 2.2 modeler - Relationship
Self reference
Many-to-One
One-to-One
Many-to-Many
@jGauravGupta
JPA 2.2 modeler - Embedded
Nested Embeddable
Embedded Collection Multiple Embedded fields @jGauravGupta
JPA 2.2 modeler - Entity Inheritance
Nested Inheritance
@jGauravGupta
● Supports any relational database (JDBC compliant)
● Relationship mapping
○ JoinColumn to JoinTable converter and vice versa
○ java.util.Collection, java.util.Map
● Embeddable
● Inheritance
● Query Builder / Executor / Generator (JPQL, SQL, Stored Procedure, Entity Graph)
● Bean Validation
● JAXB / JSON-B
● more… Fluent API, java.util.Optional, Reverse Engineering etc.
Jeddict modeler
@jGauravGupta
● JRE Patch
● Update the code instantly
● DCEVM Dynamic Code Evolution VM http://dcevm.github.io/
STEP-1 : Java installation with the DCEVM engine
STEP-2 : Connect with the Payara Server
STEP-3 : Turn off redeployment of the application on save
STEP-4 : Turn on compile and apply code changes on save
Dynamic Code Evolution
@jGauravGupta
● Bean Archives
● Beans and their properties
○ such as qualifiers, stereotypes and name
● Invocation Trees
● Observers and producers declared by beans
● Interceptors and decorators
● Extensions
● Fired events
Payara CDI Dev Mode : to inspect
@jGauravGupta
● Graph of bean dependency
Payara CDI Dev Mode : to inspect
@jGauravGupta
● Graph of bean archives
Payara CDI Dev Mode : to inspect
@jGauravGupta
● Trace the admin console actions
● Create automation scripts easily
● Helps to investigate
Payara AsAdmin Recorder
@jGauravGupta
● payara-micro-maven-plugin incorporates payara-micro with produced
artifact.
● Offers 3 mojos
○ bundle
○ start
○ stop
● Plugin is available on Maven Central
<groupId>fish.payara.maven.plugins</groupId>
<artifactId>payara-micro-maven-plugin</artifactId>
<version>1.0.0</version>
Maven Plugin
@mertcal
<configuration>
<customJars>
<artifactItem>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>6.0</version>
</artifactItem>
</customJars>
</configuration>
<configuration>
<startClass>
my.custom.start.class.Main
</startClass>
<deployArtifacts>
<artifactItem>
<groupId>org.mycompany</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<type>ear</type>
</artifactItem>
</deployArtifacts>
<configuration>
Maven Plugin - bundle mojo config
into MICRO-INF/deploy folder
into MICRO-INF/lib folder
@mertcal
<configuration>
<useUberJar>true</useUberJar>
<daemon>true</daemon>
<javaPath>/path/to/Java/Home</javaPath>
<payaraMicroAbsolutePath>/path/to/payara-micro.jar</payaraMicroAbsolutePath>
<artifactItem>
<groupId>fish.payara.extras</groupId>
<artifactId>payara-micro</artifactId>
<version>4.1.1.171</version>
</artifactItem>
<commandLineOptions>
<option>
<key>--autoBindHttp</key>
<value>true</value>
</option>
</commandLineOptions>
</configuration>
Maven Plugin - start mojo config
@mertcal
Thank you!
Any
Questions?
%50 on ebook - JE8MEK50
%15 on printed - JE8MPK15
valid until October 11

Rapid development tools for java ee 8 [tut2998]

  • 1.
    Rapid Development Toolsfor Java EE 8 Mert Çalışkan, Gaurav Gupta JavaOne 2017
  • 2.
    Mert Çalışkan Payara Developer JavaEE / Spring Consultant Author of PrimeFaces Cookbook Author of Beginning Spring book Part-time Lecturer @mertcal Gaurav Gupta Payara Developer NetBeans Dream Team Jeddict Creator ( jeddict.github.io ) @jGauravGupta , @ImJeddict
  • 3.
    React to thetalk Join at slido.com #EE8
  • 4.
    Agenda - What’s newwith Java EE 8? : Quick overview - Java EE 8 application generation w/ Jeddict - Java EE Tools : In depth - Q&A @jGauravGupta
  • 5.
    What’s new withJava EE 8? Java EE 8 is released on Sep 06, 2017. ● JAX-RS 2.1 (Jersey 2.26) ● CDI 2.0 (Weld 3.0.0.Final) ● Bean Validation 2.0 (Hibernate Validator 6.0.2.Final) ● JSON-B (Yasson 1.0) ● JPA 2.2 (EclipseLink 2.7.0) ● Java Security API 1.0 (Soteria 1.0) Checkout https://github.com/javaee-samples/javaee8-samples for details on the examples @mertcal
  • 6.
    ● Reactive ClientAPI ● JSON-B support ● Server Sent Events (SSE) JAX-RS 2.1 (JSR 370) @mertcal
  • 7.
    ● With JAX-RS2.0, we had asynchronous invoker approach as: Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); Future<MyClass> futureResult = builder.async().get(MyClass.class); System.out.println(futureResult.get()); client.close(); JAX-RS 2.1 @mertcal
  • 8.
    ● Previous scenariocan also be implemented with InvocationCallback<T> but… Client client = ClientBuilder. newClient(); WebTarget target = client.target( "http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); builder.async().get( new InvocationCallback<MyClass>() { @Override public void completed(MyClass t) {} @Override public void failed(Throwable throwable) {} }); JAX-RS 2.1 @mertcal
  • 9.
    ● Reactive ClientAPI to the rescue. Client client = ClientBuilder.newClient(); WebTarget target = client.target("http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); CompletionStage<Response> response = builder.rx().get(); response.thenAcceptAsync(res -> { MyClass t = res.readEntity(MyClass.class); System.out.println(t); }); JerseyCompletionStageRxInvoker CompletionStage<Response> JAX-RS 2.1 @mertcal
  • 10.
    ● 3rd PartyReactive Framework Support ○ RxJava Client client = ClientBuilder.newClient().register(RxFlowableInvokerProvider.class); WebTarget target = client.target("http://localhost:8080/service-url"); Invocation.Builder builder = target.request(); Flowable<Response> flowable = builder.rx(RxFlowableInvoker.class).get(); flowable.subscribe(res -> { MyClass t = res.readEntity(MyClass.class); System.out.println(t); }); reactive invoker specialized for io.reactivex.Flowable JAX-RS 2.1 @mertcal
  • 11.
    Client client =ClientBuilder.newClient().target("http://localhost:8080/service-url") .request() .get(); Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url") .request() .async() .get(); Client client = ClientBuilder.newClient().target("http://localhost:8080/service-url") .request() .rx() .get(); JAX-RS 2.1 @mertcal
  • 12.
    ● Server SentEvents (SSE) is a mechanism that allows server to asynchronously push data from the server to client once the client-server connection is established by the client. ● It’s mostly like Long-Pooling but it’s not :) and it’s not WebSockets either. ● Implementations already provided it with JAX-RS 2.0 but there was no standard API. With JAX-RS 2.1, API is created under javax.ws.rs.sse JAX-RS 2.1 @mertcal
  • 13.
    @Path("/temperature") public class TemperatureResource{ private final OutboundSseEvent.Builder sseEventBuilder; public TemperatureResource( @Context Sse sse) { this.sseEventBuilder = sse.newEventBuilder(); } @GET @Path("/{city}") @Produces(MediaType.SERVER_SENT_EVENTS) public void getCurrentTemperatureStream( @Context SseEventSink eventSink) { while (true) { eventSink.send( sseEventBuilder.data(temperature) .mediaType(MediaType. APPLICATION_JSON_TYPE).build()); Thread. sleep(1000); } } } "text/event-stream" 1 2 3 4 JAX-RS 2.1 @mertcal
  • 14.
    CDI 2.0 (JSR365) - SE Support - It’s possible to use CDI outside of Java EE - Ordering of CDI events - @Priority helps ordering observers void receive(@Observes @Priority(APPLICATION + 200) String greet) { this.greet += greet + "2"; } void receive2(@Observes @Priority(APPLICATION) String greet) { this.greet = greet + "1"; } For send(“Welcome”) output will be: Welcome1Welcome2 @Inject private Event<String> event; public void send(String message) { event.fire(message); } @mertcal
  • 15.
    CompletableStage<MyEvent> eventSent =event.fireAsync( new MyEvent(), NotificationOptions.ofExecutor(executor)); - Exception in async observer doesn’t break the observer invocation chain. callMe(@Observes payload) callMe(@ObservesAsync payload) event.fire(payload) Sync call Not Notified event.fireAsync(payload) Not Notified Async call - Long awaited Asynchronous Events Support - Fire Sync → Observer Sync / Fire Async → Observer Async CDI 2.0 @mertcal
  • 16.
    ● Java 8Date and Time API Support @Past(message = "must be a past date") private java.time.Year yearOfBirth; ● Type Annotations private List<@NotNull @Email String> emails; private String @NotNull @Email[] emails; private Map<@Valid Employee, @Valid Address> addressMap = new HashMap<>(); @mertcal Bean Validation 2 (JSR 380)
  • 17.
    ● java.util.Optional Support privateOptional<@Past LocalDate> marriageAnniversary; private Optional<@Size(max = 20) String> name; ● Repeating Annotations @Max(value = 2000, groups = Default.class) @Max(value = 5000, groups = GoldCustomer.class) private long withdrawalAmount; @mertcal Bean Validation 2
  • 18.
    Bean Validation 2 ●Introduces new constraints ○ @Email ○ @NotBlank ○ @NotEmpty ○ @PastOrPresent ○ @FutureOrPresent ○ @Negative ○ @NegativeOrZero ○ @Positive ○ @PositiveOrZero @mertcal
  • 19.
    JSON-B (JSR 367) ●Standard solution like JAXB ● Default mapping between classes and JSON ● Customizable a. Compile time ■ Property naming @JsonbProperty ■ Property ignoring @JsonbTransient ■ Null handling @JsonbNillable ■ Property ordering @JsonbPropertyOrder ■ Date and Number Format @JsonbDateFormat/@JsonbNumberFormat ■ Adapter @JsonbTypeAdapter b. Runtime configration ■ Configuration builder JsonbConfig @jGauravGupta
  • 20.
    JSON-B - Customizations classEmployee { private String name; private String pin; private String email; } { "name": "Gaurav", "pin": "J1-Secret", "email": "gaurav.gupta@payara.fish", } @jGauravGupta
  • 21.
    JSON-B - Customizations @JsonbPropertyOrder({"email","name"}) class Employee { @JsonbProperty("empName") private String name; @JsonbTransient private String pin; private String email; } { "email": "gaurav.gupta@payara.fish", "empName": "Gaurav" } @jGauravGupta
  • 22.
    JPA 2.2 (JSR338) ● @Repeatable annotations ● Support Java 8 Date and Time API ● Ability to return stream of query result ● CDI Injection in AttributeConverters @jGauravGupta
  • 23.
    JPA 2.1 Container annotationrequired @Entity @NamedQueries({ @NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e"), @NamedQuery(name = "Employee.findByName", query = "SELECT e FROM Employee e WHERE e.name = :name") }) class Employee { @Convert(converter=LocalDateConverter.class) private LocalDate dateOfBirth; } AttributeConverter implementation @jGauravGupta
  • 24.
    JPA 2.2 Container annotationnot required @Entity @NamedQueries({ @NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e"), @NamedQuery(name = "Employee.findByName", query = "SELECT e FROM Employee e WHERE e.name = :name") }) class Employee { @Convert(converter=LocalDateConverter.class) private LocalDate dateOfBirth; } AttributeConverter not required @jGauravGupta
  • 25.
    JPA 2.2 @Entity @NamedQuery(name ="Employee.findAll", query = "SELECT e FROM Employee e") @NamedQuery(name = "Employee.findByName", query = "SELECT e FROM Employee e WHERE e.name = :name") class Employee { private LocalDate dateOfBirth; } @jGauravGupta
  • 26.
    JPA 2.2 ● Streamquery results Stream<Employee> employees = em.createQuery(“SELECT e FROM Employee”, Employee.class) .getResultStream(); @jGauravGupta
  • 27.
    Security API 1.0(JSR 375) ● Simplify the existing solution ● Enhance the portability ● New APIs ○ HTTPAuthenticationMechanism ○ IdentityStore ○ SecurityContext @jGauravGupta
  • 28.
    Security API 1.0(JSR 375) ● Authentication Mechanism ○ validateRequest(request, response, httpMessageContext) ○ secureResponse(request, response, httpMessageContext) ○ cleanSubject(request, response, httpMessageContext) ● Identity Store ○ validate(credential) ○ getCallerGroups(credentialValidationResult) ● Security Context ○ getCallerPrincipal() ○ isCallerInRole(role) ○ … … … @jGauravGupta
  • 29.
    @ApplicationScoped public class MyAuthMechanismimplements HttpAuthenticationMechanism { @Override public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) { } } Security API 1.0 @jGauravGupta
  • 30.
    @ApplicationScoped public class MyAuthMechanismimplements HttpAuthenticationMechanism { @Inject private IdentityStoreHandler identityStoreHandler; @Override public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) { ……… identityStoreHandler.validate(credential); ……… } } Security API 1.0 @jGauravGupta
  • 31.
    @ApplicationScoped public class MyAuthMechanismimplements HttpAuthenticationMechanism { @Inject private IdentityStoreHandler identityStoreHandler; @Override public AuthenticationStatus validateRequest (HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) { ……… identityStoreHandler.validate(credential); ……… } } Security API 1.0 @jGauravGupta
  • 32.
    Java EE 8App generation w/ jeddict.github.io @Email @JsonbProperty ("fName") @JsonbTransient java.time.LocalDate @NamedQuery(name = "findAll") @NamedQuery(name = "findByFirstName") @NamedQuery(name = "findByEmail") @JsonbProperty ("number") @NotEmpty @JsonbProperty ("lName") OpenERP Domain model
  • 33.
  • 34.
    Java EE Tools: In depth ● Jeddict modeler ● Dynamic Code Evaluation ● Payara Fish in NetBeans IDE ● Payara CDI Dev Mode ● Payara AsAdmin Recorder ● Maven Plugin @jGauravGupta
  • 35.
    ● Supports anyrelational database (JDBC compliant) ● Relationship mapping ○ JoinColumn to JoinTable converter and vice versa ○ java.util.Collection, java.util.Map ● Embeddable ● Inheritance ● Query Builder / Executor / Generator (JPQL, SQL, Stored Procedure, Entity Graph) ● JAXB / JSON-B ● Bean Validation ● more… Fluent API, java.util.Optional, Reverse Engineering etc. Jeddict modeler @jGauravGupta
  • 36.
    JPA 2.2 modeler- Relationship Self reference Many-to-One One-to-One Many-to-Many @jGauravGupta
  • 37.
    JPA 2.2 modeler- Embedded Nested Embeddable Embedded Collection Multiple Embedded fields @jGauravGupta
  • 38.
    JPA 2.2 modeler- Entity Inheritance Nested Inheritance @jGauravGupta
  • 39.
    ● Supports anyrelational database (JDBC compliant) ● Relationship mapping ○ JoinColumn to JoinTable converter and vice versa ○ java.util.Collection, java.util.Map ● Embeddable ● Inheritance ● Query Builder / Executor / Generator (JPQL, SQL, Stored Procedure, Entity Graph) ● Bean Validation ● JAXB / JSON-B ● more… Fluent API, java.util.Optional, Reverse Engineering etc. Jeddict modeler @jGauravGupta
  • 40.
    ● JRE Patch ●Update the code instantly ● DCEVM Dynamic Code Evolution VM http://dcevm.github.io/ STEP-1 : Java installation with the DCEVM engine STEP-2 : Connect with the Payara Server STEP-3 : Turn off redeployment of the application on save STEP-4 : Turn on compile and apply code changes on save Dynamic Code Evolution @jGauravGupta
  • 41.
    ● Bean Archives ●Beans and their properties ○ such as qualifiers, stereotypes and name ● Invocation Trees ● Observers and producers declared by beans ● Interceptors and decorators ● Extensions ● Fired events Payara CDI Dev Mode : to inspect @jGauravGupta
  • 42.
    ● Graph ofbean dependency Payara CDI Dev Mode : to inspect @jGauravGupta
  • 43.
    ● Graph ofbean archives Payara CDI Dev Mode : to inspect @jGauravGupta
  • 44.
    ● Trace theadmin console actions ● Create automation scripts easily ● Helps to investigate Payara AsAdmin Recorder @jGauravGupta
  • 45.
    ● payara-micro-maven-plugin incorporatespayara-micro with produced artifact. ● Offers 3 mojos ○ bundle ○ start ○ stop ● Plugin is available on Maven Central <groupId>fish.payara.maven.plugins</groupId> <artifactId>payara-micro-maven-plugin</artifactId> <version>1.0.0</version> Maven Plugin @mertcal
  • 46.
  • 47.
  • 48.
    Thank you! Any Questions? %50 onebook - JE8MEK50 %15 on printed - JE8MPK15 valid until October 11