SlideShare a Scribd company logo
1 of 42
Download to read offline
Smart Use of Annotation
              Processing - APT

                  @gdigugli
                  @dbaeli



Mars JUG 2013
Speakers
@dbaeli - Dimitri BAELI             @gdigugli - Gilles Di Guglielmo
• Java developer since 1999         • Java developer since 1999
• R&D Team Mentor at                • Software architect at



• Coder, DevOps, Agile Coach        • ILOG - IBM
    – From idea to production           2D graphic toolkit
• eXo Platform                          Rule engine
    • VP Quality                    • Prima-Solutions
                                        Services platform for J2EE
                                        Domain models code generators




Mars JUG 2013                                                            2
Content Display Management




Mars JUG 2013
The story
Effective Content Display                using APT Tooling
• Content Management                     • APT Engine
    Labels                              • APT Processors
    Layout & images
                                             Generate technical code
• Clean code                                 Generate reports
    Strong Quality                          Generate patterns
    Easy Maintenance       based on i18n
                               • @Message
                               • @MessageBundle
                               • Dedicated APT Processors

                https://github.com/lesfurets/ez18n


Mars JUG 2013
Improved i18n
                for text display




Mars JUG 2013
Java i18n pattern
• The JDK default tooling to:
     Dynamically bind the content
     Usable for Texts, but also CSS and images (urls)
• Tooling :
     java.util.ResourceBundle : for .properties reading
     java.util.MessageFormat : tiny templating
     .properties files with naming pattern


Mars JUG 2013
java.util.ResourceBundle
• The .properties loader for a given Locale
• Key / Value in .properties
• Naming convention for the storage
    Messages_en_EN.properties

           Language   Country




Mars JUG 2013
java.util.MessageFormat




•    Tiny templating
•    format(“<pattern>”, args)
•    Date, numbers are formatted according to the Locale
•    Options, conditional values easy to use

    Mars JUG 2013
.properties issues
• Low quality control
    – Keys are strings in the code
    – Poor IDE support
         • No warning on unused or wrong keys
    – Encoding Hell
         • use uxxxx or you’re in trouble
• Forces you to maintain two files in sync
    – key declaration / value in .properties
    – Key usage in the .java files


Mars JUG 2013
Improved i18n




Mars JUG 2013
Ez18n : improved i18n
• Interfaces representing each .properties
• The methods acts as keys




           Messages.java         Messages.properties


Mars JUG 2013
Annotations and Code generation
• Same pattern as in GWT, but for J2SE
• New Annotations in the code :
     @MessageBundle to mark interfaces
          represents a ResourceBundle
     @Message to mark methods
         represents a localization key
• Generate :
     .properties file (for ‘default’)
     A ResourceBundle for each .properties
     Manage other languages out-side your code

Mars JUG 2013
Improved i18n benefits
• Now you can
     Refactor your keys
     Maintain the ‘default’ in Java
     Never change a .properties file for default locale
• And use it with other libs:
     GWT (done on GitHub)
     Even JQuery, Dojo, CoffeeScript (planned)
 We called that ez18n

Mars JUG 2013
APT to generate
  .properties and ResourceBundle
      classes from annotations



Mars JUG 2013
Behind the scene
                 How APT works




Mars JUG 2013
APT basics
•   APT - Annotation Processing Tool
•   Kind of old-school pre-processing
•   Standard in JDK6+ (JSR 269)
•   No runtime overload
•   Based on annotations in source code
•   Standard since JDK 1.6 (available in Sun JDK
    1.5)

Mars JUG 2013
APT annotations
• Use @Retention, @Target




Mars JUG 2013
APT Processors
• javax.annotation.processing.Processor
• Code parsing similar to Reflection
     No need of compiled code
     Some limitations
• 2 key elements :
     @SupportedAnnotationTypes to declare the
      matching annotations
     FileObject : the future generated file

Mars JUG 2013
Similarities with java.lang.reflect
Java.lang.reflect            Javax.annotation.processing
java.lang.Class              TypeElement
Constructor                  ExecutableElement
Field, Parameter             VariableElement
Method                       ExecutableElement
java.lang.Package            PackageElement


•   NO Class.newInstance()
•   NO instanceOf, NO isAssignable()
•   NO getConstructor, getMethod, …
•   Weak inheritance support

Mars JUG 2013
Processor code sample
 Processor declaration




 Use a FileObject to generate the content




Mars JUG 2013
APT command line
javac
    -cp $CLASSPATH
    -proc:only                  Or -proc:none
    -encoding UTF-8
    -processor $PROCESSOR         processors fqcn list
    -d $PROJECT_HOMEtargetclasses
    -s $PROJECT_HOMEtargetgenerated-sourcesapt
    -sourcepath $SOURCE_PATH
    -verbose
    $FILES                              optional




Mars JUG 2013
APT tooling
• Maven integration
     maven-processor-plugin (google-code)
• Ant integration
     javac
• IDE integration
     Extend the JDK compilation options




Mars JUG 2013
APT usages
• Generate required repetitive code :
     Not always possible at runtime
     Unit tests, JMX declarations
     Utility code with coverage and debug
• Build your reports on your code
     Your metrics without runtime overload
     Even fail the build if you want !



Mars JUG 2013
One or Two phase compilation
• One phase :
     APT runs during the compilation
     Generated code is directly produced as bytecode
      (.class)
     Harder to debug (no .java created)
 Two phases : “proc:only”
     javac with proc:only then with proc:none
     Creates .java files in the sourcepath


Mars JUG 2013
Problems with APT
• Beware of the “Generate” golden hammer
     generate needed code
• APT Processors can be tricky:
     hard to test / maintain
     bad error management (hidden errors !)
     Not really (well) documented
• No built-in templating mechanism
• Enforced file path creation
• Beware of maven parallel builds
     Because javac is not thread safe

Mars JUG 2013
It’s time to convince your team
• APT parses the source code to generate
     Java Files & .class, Reports (.csv, …)
     Build log information or even build failures
• It allows you to have a source level DSL
     Annotate your code & Generate the plumbing
     Compile / Debug the generated code
• APT framework is compact


Mars JUG 2013
Go deep in APT usage
                     with Ez18n




Mars JUG 2013
Demo
• The Stock-watcher available on
    – http://github.com/lesfurets/ez18n
    – In the ez18n-webapp module
    – Derived from a GWT Sample
• With a desktop browser
• With a mobile browser



Mars JUG 2013
Ez18n - Big picture
                                      Messages
                      +loveMeTender() : String [ 1]
                      +doYouLove( name : String [ 1] ) : S tring [1]




                   MessagesMobile Bundle                                                      MessagesDe sktopBundle

MessagesMobileBundle()                                                       MessagesDesktopBundle()
getMessage( key : String [ 1] , params : Object [1] ) : String [ 1]          getMessage( key : String [ 1] , params : Object [1] ) : String [ 1]
loveMeTender() : String [1]                                                  loveMeTender() : String [1]
doYouLove( name : S tring [1] ) : String [1]                                 doYouLove( name : S tring [1] ) : String [1]




           «annotate»                                                                                                                  «annotate»
                               «inject »                               «inject »

                                                                                        -delegate -delegate 1
                                                                                                   1
    Mobile                             BundleFactory                                           Re sourceBundle                 De sktop

                                <S >get ( service, annotation )




 Mars JUG 2013
Ez18n - APT chaining
                         • 5 APT processors to
                           obtain the default
                           pattern
                         • Optional CSV files for
                           analysis/tooling




Mars JUG 2013
From Messages to DesktopMessages.properties

• One property file per interface with
  @MessageBundle
• One property entry per method with @Message




Mars JUG 2013
From Messages to
            MessagesDesktopBundle.java (1/2)




Mars JUG 2013
From Messages to
            MessagesDesktopBundle.java (2/2)




Mars JUG 2013
From Messages to
     META-INF/services/org.ez18n.sample.Messages




                    • Using META-INF/services to inject the
                      mobile & desktop implementation
                    • The two implementations could be
                      filtered at runtime using annotations
                      and java.util.ServiceLoader
                        @Mobile
                        @Desktop



Mars JUG 2013
A factory for the Messages implementations
  • Using java.util.ServiceLoader to inject the interface with
    @MessageBundle
  • @Desktop and @Mobile used to filter the injection result




Mars JUG 2013
Client code sample with JUnit
• Some basic JUnit test using the API

                                          The unit tests are
                                          generated using APT
                                          too 



                         BundleFactory.get(…) usage in the test
                         @Before to retrieve the bundle
                         implementation




Mars JUG 2013
Ez18n - Summary




                    Maven, javac
                   Injection & APT




Mars JUG 2013
If you’d like
                a JSR for ez18n
                please tell us !

                                   Ez18n =
                                   @Message
                                   @MessageBundle
                                   Set of Processors




Mars JUG 2013
APT Adoption
“As the lead engineer on JSR 269 in JDK 6, I'd be
heartened to see greater adoption and use of
annotation processing by Java developers.”
      Joseph D. Darcy (Oracle)




Mars JUG 2013
APT JDK 8
• possibilité d’ajouter une annotation sur les
  types d’objets (JSR 308)
• possibilité de répéter une annotation sur une
  déclaration (JEP 120)
• portage de l’API “javax.lang.model” au
  runtime pour qu’elle ne soit pas disponible
  uniquement à la compilation (JEP 119)
• Voir les notes :
  http://blog.soat.fr/2012/11/devoxx-2012-jsr-
  308-annotations-on-java-types/
Mars JUG 2013
JavaOne 2012
                   APT virtual mini-track
• Sessions
    – Advanced Annotation Processing with JSR 269
         • Jaroslav Tulach
    – Build Your Own Type System for Fun and Profit
         • Werner Dietl and Michael Ernst
    – Annotations and Annotation Processing: What’s New in JDK 8?
         • Joel Borggrén-Franck
    – Hack into Your Compiler!
         • Jaroslav Tulach
    – Writing Annotation Processors to Aid Your Development Process
         • Ian Robertson

• Thanks to
    – Joseph D. Darcy (APT spec lead) - https://blogs.oracle.com/darcy/




Mars JUG 2013
Thank you !


                Ez18n is on GitHub
                   Just fork it !


                https://github.com/lesfurets/ez18n



Mars JUG 2013                                        42

More Related Content

What's hot

Introduction to java
Introduction to java Introduction to java
Introduction to java Sandeep Rawat
 
(ATS3-DEV08) Team Development with Accelrys Enterprise Platform
(ATS3-DEV08) Team Development with Accelrys Enterprise Platform(ATS3-DEV08) Team Development with Accelrys Enterprise Platform
(ATS3-DEV08) Team Development with Accelrys Enterprise PlatformBIOVIA
 
Overview Of .Net 4.0 Sanjay Vyas
Overview Of .Net 4.0   Sanjay VyasOverview Of .Net 4.0   Sanjay Vyas
Overview Of .Net 4.0 Sanjay Vyasrsnarayanan
 
Introduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging APIIntroduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging APIwhite paper
 
1 java programming- introduction
1  java programming- introduction1  java programming- introduction
1 java programming- introductionjyoti_lakhani
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to javaSteve Fort
 
ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!
ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!
ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!panagenda
 
Mapping Java Objects with JPA
Mapping Java Objects with JPAMapping Java Objects with JPA
Mapping Java Objects with JPAAaron Schram
 
Java Programming for Designers
Java Programming for DesignersJava Programming for Designers
Java Programming for DesignersR. Sosa
 
Learn Java with Dr. Rifat Shahriyar
Learn Java with Dr. Rifat ShahriyarLearn Java with Dr. Rifat Shahriyar
Learn Java with Dr. Rifat ShahriyarAbir Mohammad
 

What's hot (14)

1.introduction to java
1.introduction to java1.introduction to java
1.introduction to java
 
Introduction to java
Introduction to java Introduction to java
Introduction to java
 
Introducing Java 7
Introducing Java 7Introducing Java 7
Introducing Java 7
 
Java1
Java1Java1
Java1
 
(ATS3-DEV08) Team Development with Accelrys Enterprise Platform
(ATS3-DEV08) Team Development with Accelrys Enterprise Platform(ATS3-DEV08) Team Development with Accelrys Enterprise Platform
(ATS3-DEV08) Team Development with Accelrys Enterprise Platform
 
Introduction to JAVA
Introduction to JAVAIntroduction to JAVA
Introduction to JAVA
 
Overview Of .Net 4.0 Sanjay Vyas
Overview Of .Net 4.0   Sanjay VyasOverview Of .Net 4.0   Sanjay Vyas
Overview Of .Net 4.0 Sanjay Vyas
 
Introduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging APIIntroduction to the Java(TM) Advanced Imaging API
Introduction to the Java(TM) Advanced Imaging API
 
1 java programming- introduction
1  java programming- introduction1  java programming- introduction
1 java programming- introduction
 
Introduction to java
Introduction to javaIntroduction to java
Introduction to java
 
ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!
ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!
ICON UK '13 - Apache Software: The FREE Java toolbox you didn't know you had !!
 
Mapping Java Objects with JPA
Mapping Java Objects with JPAMapping Java Objects with JPA
Mapping Java Objects with JPA
 
Java Programming for Designers
Java Programming for DesignersJava Programming for Designers
Java Programming for Designers
 
Learn Java with Dr. Rifat Shahriyar
Learn Java with Dr. Rifat ShahriyarLearn Java with Dr. Rifat Shahriyar
Learn Java with Dr. Rifat Shahriyar
 

Similar to Smart Annotation Processing - Marseille JUG

Java Programming concept
Java Programming concept Java Programming concept
Java Programming concept Prakash Poudel
 
Spring MVC framework
Spring MVC frameworkSpring MVC framework
Spring MVC frameworkMohit Gupta
 
ACM Sunnyvale Meetup.pdf
ACM Sunnyvale Meetup.pdfACM Sunnyvale Meetup.pdf
ACM Sunnyvale Meetup.pdfAnyscale
 
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft..."Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...Dataconomy Media
 
Pipeline as code for your infrastructure as Code
Pipeline as code for your infrastructure as CodePipeline as code for your infrastructure as Code
Pipeline as code for your infrastructure as CodeKris Buytaert
 
3 rad extensibility-srilakshmi_s_rajesh_k
3 rad extensibility-srilakshmi_s_rajesh_k3 rad extensibility-srilakshmi_s_rajesh_k
3 rad extensibility-srilakshmi_s_rajesh_kIBM
 
Rad Extensibility - Srilakshmi S Rajesh K
Rad Extensibility - Srilakshmi S Rajesh KRad Extensibility - Srilakshmi S Rajesh K
Rad Extensibility - Srilakshmi S Rajesh KRoopa Nadkarni
 
Java compilation
Java compilationJava compilation
Java compilationMike Kucera
 
Designing Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio ProjectsDesigning Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio ProjectsAVEVA
 
The Java Content Repository
The Java Content RepositoryThe Java Content Repository
The Java Content Repositorynobby
 
What is Google App Engine?
What is Google App Engine?What is Google App Engine?
What is Google App Engine?weschwee
 
Session 02 - Elements of Java Language
Session 02 - Elements of Java LanguageSession 02 - Elements of Java Language
Session 02 - Elements of Java LanguagePawanMM
 

Similar to Smart Annotation Processing - Marseille JUG (20)

java slides
java slidesjava slides
java slides
 
Java Programming concept
Java Programming concept Java Programming concept
Java Programming concept
 
Letest
LetestLetest
Letest
 
Spring MVC framework
Spring MVC frameworkSpring MVC framework
Spring MVC framework
 
ACM Sunnyvale Meetup.pdf
ACM Sunnyvale Meetup.pdfACM Sunnyvale Meetup.pdf
ACM Sunnyvale Meetup.pdf
 
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft..."Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
 
Java-Unit-I.ppt
Java-Unit-I.pptJava-Unit-I.ppt
Java-Unit-I.ppt
 
Pipeline as code for your infrastructure as Code
Pipeline as code for your infrastructure as CodePipeline as code for your infrastructure as Code
Pipeline as code for your infrastructure as Code
 
desktop_resume
desktop_resumedesktop_resume
desktop_resume
 
MichaelLutherResume60
MichaelLutherResume60MichaelLutherResume60
MichaelLutherResume60
 
Java
Java Java
Java
 
3 rad extensibility-srilakshmi_s_rajesh_k
3 rad extensibility-srilakshmi_s_rajesh_k3 rad extensibility-srilakshmi_s_rajesh_k
3 rad extensibility-srilakshmi_s_rajesh_k
 
Rad Extensibility - Srilakshmi S Rajesh K
Rad Extensibility - Srilakshmi S Rajesh KRad Extensibility - Srilakshmi S Rajesh K
Rad Extensibility - Srilakshmi S Rajesh K
 
Java compilation
Java compilationJava compilation
Java compilation
 
Unit 1(sem-iv)
Unit 1(sem-iv)Unit 1(sem-iv)
Unit 1(sem-iv)
 
Designing Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio ProjectsDesigning Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio Projects
 
The Java Content Repository
The Java Content RepositoryThe Java Content Repository
The Java Content Repository
 
What is Google App Engine?
What is Google App Engine?What is Google App Engine?
What is Google App Engine?
 
Core java slides
Core java slidesCore java slides
Core java slides
 
Session 02 - Elements of Java Language
Session 02 - Elements of Java LanguageSession 02 - Elements of Java Language
Session 02 - Elements of Java Language
 

More from gdigugli

SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()gdigugli
 
Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013gdigugli
 
Ez18n crowdsourcing
Ez18n crowdsourcingEz18n crowdsourcing
Ez18n crowdsourcinggdigugli
 
Ez18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exempleEz18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exemplegdigugli
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernancegdigugli
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellgdigugli
 
DevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationDevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationgdigugli
 

More from gdigugli (7)

SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()SoftShake 2015 - DomainModel.stream()
SoftShake 2015 - DomainModel.stream()
 
Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013Rock solid UI modeling using annotation processing - CodeGeneration 2013
Rock solid UI modeling using annotation processing - CodeGeneration 2013
 
Ez18n crowdsourcing
Ez18n crowdsourcingEz18n crowdsourcing
Ez18n crowdsourcing
 
Ez18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exempleEz18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exemple
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernance
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshell
 
DevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationDevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une application
 

Recently uploaded

How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 

Recently uploaded (20)

How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 

Smart Annotation Processing - Marseille JUG

  • 1. Smart Use of Annotation Processing - APT @gdigugli @dbaeli Mars JUG 2013
  • 2. Speakers @dbaeli - Dimitri BAELI @gdigugli - Gilles Di Guglielmo • Java developer since 1999 • Java developer since 1999 • R&D Team Mentor at • Software architect at • Coder, DevOps, Agile Coach • ILOG - IBM – From idea to production  2D graphic toolkit • eXo Platform  Rule engine • VP Quality • Prima-Solutions  Services platform for J2EE  Domain models code generators Mars JUG 2013 2
  • 4. The story Effective Content Display using APT Tooling • Content Management • APT Engine  Labels • APT Processors  Layout & images  Generate technical code • Clean code  Generate reports  Strong Quality  Generate patterns  Easy Maintenance based on i18n • @Message • @MessageBundle • Dedicated APT Processors https://github.com/lesfurets/ez18n Mars JUG 2013
  • 5. Improved i18n for text display Mars JUG 2013
  • 6. Java i18n pattern • The JDK default tooling to:  Dynamically bind the content  Usable for Texts, but also CSS and images (urls) • Tooling :  java.util.ResourceBundle : for .properties reading  java.util.MessageFormat : tiny templating  .properties files with naming pattern Mars JUG 2013
  • 7. java.util.ResourceBundle • The .properties loader for a given Locale • Key / Value in .properties • Naming convention for the storage Messages_en_EN.properties Language Country Mars JUG 2013
  • 8. java.util.MessageFormat • Tiny templating • format(“<pattern>”, args) • Date, numbers are formatted according to the Locale • Options, conditional values easy to use Mars JUG 2013
  • 9. .properties issues • Low quality control – Keys are strings in the code – Poor IDE support • No warning on unused or wrong keys – Encoding Hell • use uxxxx or you’re in trouble • Forces you to maintain two files in sync – key declaration / value in .properties – Key usage in the .java files Mars JUG 2013
  • 11. Ez18n : improved i18n • Interfaces representing each .properties • The methods acts as keys Messages.java Messages.properties Mars JUG 2013
  • 12. Annotations and Code generation • Same pattern as in GWT, but for J2SE • New Annotations in the code :  @MessageBundle to mark interfaces  represents a ResourceBundle  @Message to mark methods represents a localization key • Generate :  .properties file (for ‘default’)  A ResourceBundle for each .properties  Manage other languages out-side your code Mars JUG 2013
  • 13. Improved i18n benefits • Now you can  Refactor your keys  Maintain the ‘default’ in Java  Never change a .properties file for default locale • And use it with other libs:  GWT (done on GitHub)  Even JQuery, Dojo, CoffeeScript (planned)  We called that ez18n Mars JUG 2013
  • 14. APT to generate .properties and ResourceBundle classes from annotations Mars JUG 2013
  • 15. Behind the scene How APT works Mars JUG 2013
  • 16. APT basics • APT - Annotation Processing Tool • Kind of old-school pre-processing • Standard in JDK6+ (JSR 269) • No runtime overload • Based on annotations in source code • Standard since JDK 1.6 (available in Sun JDK 1.5) Mars JUG 2013
  • 17. APT annotations • Use @Retention, @Target Mars JUG 2013
  • 18. APT Processors • javax.annotation.processing.Processor • Code parsing similar to Reflection  No need of compiled code  Some limitations • 2 key elements :  @SupportedAnnotationTypes to declare the matching annotations  FileObject : the future generated file Mars JUG 2013
  • 19. Similarities with java.lang.reflect Java.lang.reflect Javax.annotation.processing java.lang.Class TypeElement Constructor ExecutableElement Field, Parameter VariableElement Method ExecutableElement java.lang.Package PackageElement • NO Class.newInstance() • NO instanceOf, NO isAssignable() • NO getConstructor, getMethod, … • Weak inheritance support Mars JUG 2013
  • 20. Processor code sample  Processor declaration  Use a FileObject to generate the content Mars JUG 2013
  • 21. APT command line javac -cp $CLASSPATH -proc:only Or -proc:none -encoding UTF-8 -processor $PROCESSOR processors fqcn list -d $PROJECT_HOMEtargetclasses -s $PROJECT_HOMEtargetgenerated-sourcesapt -sourcepath $SOURCE_PATH -verbose $FILES optional Mars JUG 2013
  • 22. APT tooling • Maven integration  maven-processor-plugin (google-code) • Ant integration  javac • IDE integration  Extend the JDK compilation options Mars JUG 2013
  • 23. APT usages • Generate required repetitive code :  Not always possible at runtime  Unit tests, JMX declarations  Utility code with coverage and debug • Build your reports on your code  Your metrics without runtime overload  Even fail the build if you want ! Mars JUG 2013
  • 24. One or Two phase compilation • One phase :  APT runs during the compilation  Generated code is directly produced as bytecode (.class)  Harder to debug (no .java created)  Two phases : “proc:only”  javac with proc:only then with proc:none  Creates .java files in the sourcepath Mars JUG 2013
  • 25. Problems with APT • Beware of the “Generate” golden hammer  generate needed code • APT Processors can be tricky:  hard to test / maintain  bad error management (hidden errors !)  Not really (well) documented • No built-in templating mechanism • Enforced file path creation • Beware of maven parallel builds  Because javac is not thread safe Mars JUG 2013
  • 26. It’s time to convince your team • APT parses the source code to generate  Java Files & .class, Reports (.csv, …)  Build log information or even build failures • It allows you to have a source level DSL  Annotate your code & Generate the plumbing  Compile / Debug the generated code • APT framework is compact Mars JUG 2013
  • 27. Go deep in APT usage with Ez18n Mars JUG 2013
  • 28. Demo • The Stock-watcher available on – http://github.com/lesfurets/ez18n – In the ez18n-webapp module – Derived from a GWT Sample • With a desktop browser • With a mobile browser Mars JUG 2013
  • 29. Ez18n - Big picture Messages +loveMeTender() : String [ 1] +doYouLove( name : String [ 1] ) : S tring [1] MessagesMobile Bundle MessagesDe sktopBundle MessagesMobileBundle() MessagesDesktopBundle() getMessage( key : String [ 1] , params : Object [1] ) : String [ 1] getMessage( key : String [ 1] , params : Object [1] ) : String [ 1] loveMeTender() : String [1] loveMeTender() : String [1] doYouLove( name : S tring [1] ) : String [1] doYouLove( name : S tring [1] ) : String [1] «annotate» «annotate» «inject » «inject » -delegate -delegate 1 1 Mobile BundleFactory Re sourceBundle De sktop <S >get ( service, annotation ) Mars JUG 2013
  • 30. Ez18n - APT chaining • 5 APT processors to obtain the default pattern • Optional CSV files for analysis/tooling Mars JUG 2013
  • 31. From Messages to DesktopMessages.properties • One property file per interface with @MessageBundle • One property entry per method with @Message Mars JUG 2013
  • 32. From Messages to MessagesDesktopBundle.java (1/2) Mars JUG 2013
  • 33. From Messages to MessagesDesktopBundle.java (2/2) Mars JUG 2013
  • 34. From Messages to META-INF/services/org.ez18n.sample.Messages • Using META-INF/services to inject the mobile & desktop implementation • The two implementations could be filtered at runtime using annotations and java.util.ServiceLoader  @Mobile  @Desktop Mars JUG 2013
  • 35. A factory for the Messages implementations • Using java.util.ServiceLoader to inject the interface with @MessageBundle • @Desktop and @Mobile used to filter the injection result Mars JUG 2013
  • 36. Client code sample with JUnit • Some basic JUnit test using the API The unit tests are generated using APT too  BundleFactory.get(…) usage in the test @Before to retrieve the bundle implementation Mars JUG 2013
  • 37. Ez18n - Summary Maven, javac Injection & APT Mars JUG 2013
  • 38. If you’d like a JSR for ez18n please tell us ! Ez18n = @Message @MessageBundle Set of Processors Mars JUG 2013
  • 39. APT Adoption “As the lead engineer on JSR 269 in JDK 6, I'd be heartened to see greater adoption and use of annotation processing by Java developers.” Joseph D. Darcy (Oracle) Mars JUG 2013
  • 40. APT JDK 8 • possibilité d’ajouter une annotation sur les types d’objets (JSR 308) • possibilité de répéter une annotation sur une déclaration (JEP 120) • portage de l’API “javax.lang.model” au runtime pour qu’elle ne soit pas disponible uniquement à la compilation (JEP 119) • Voir les notes : http://blog.soat.fr/2012/11/devoxx-2012-jsr- 308-annotations-on-java-types/ Mars JUG 2013
  • 41. JavaOne 2012 APT virtual mini-track • Sessions – Advanced Annotation Processing with JSR 269 • Jaroslav Tulach – Build Your Own Type System for Fun and Profit • Werner Dietl and Michael Ernst – Annotations and Annotation Processing: What’s New in JDK 8? • Joel Borggrén-Franck – Hack into Your Compiler! • Jaroslav Tulach – Writing Annotation Processors to Aid Your Development Process • Ian Robertson • Thanks to – Joseph D. Darcy (APT spec lead) - https://blogs.oracle.com/darcy/ Mars JUG 2013
  • 42. Thank you ! Ez18n is on GitHub Just fork it ! https://github.com/lesfurets/ez18n Mars JUG 2013 42