Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Hidden Secret of Java Open Source Projects

The Hidden Secret of Java Open Source Projects

Have you ever been intrigued by the magic that some open source projects achieve from a single annotation? How are they able to make our lives so easy? Is there a way to do this on my projects? Yes! This presentation shares the hidden secret many open source projects use to automate repetitive tasks, validate logic at compile time, clean up boilerplate, and make developers’ life easier.

Eder Ignatowicz

October 12, 2017
Tweet

More Decks by Eder Ignatowicz

Other Decks in Technology

Transcript

  1. The Hidden Secret of Java Open Source Projects Eder Ignatowicz

    Senior Software Engineer Red Hat Alex Porcelli Principal Software Engineer Red Hat
  2. @Entity @Table(name = "stock_daily_record", catalog = “ederign", uniqueConstraints = @UniqueConstraint(columnNames

    = "DATE")) public class StockDailyRecord implements java.io.Serializable { @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "RECORD_ID", unique = true, nullable = false) public Integer getRecordId() { return this.recordId; } @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "STOCK_ID", nullable = false) public Stock getStock() { return this.stock; } @Column(name = "PRICE_CHANGE", precision = 6) public Float getPriceChange() { return this.priceChange; } }
  3. Annotation Processing Part of Compilation Process Annotated Sources Scanned Code

    Generation Enhance Compilation Feedback Reduce boilerplate <3
  4. package com.example; // PackageElement public class Foo { // TypeElement

    private int a; // VariableElement private Foo other; // VariableElement public Foo () {} // ExecutableElement public void setA () // ExecutableElement }
  5. //@SupportedAnnotationTypes( {"javax.persistence.Entity", "javax.persistence.OneToMany"}) @SupportedSourceVersion(SourceVersion.RELEASE_7) public class JpaProcessor extends AbstractProcessor {

    @Override public void init(ProcessingEnvironment env) { super.init(env); } @Override public Set<String> getSupportedAnnotationTypes() { return new HashSet<String>() {{ add(PrintMe.class.getCanonicalName()); }}; } @Override public boolean process( Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { //seu processamento return false; // continua processando? } }
  6. @WorkbenchPreference(identifier = "MyPreference", bundleKey = "MyPreference.Label") public class MyPreference implements

    BasePreference<MyPreference> { @Property(bundleKey = "MyPreference.Text", helpBundleKey = "MyPreference.Text.Help", validators = NotEmptyValidator.class, formOptions = PropertyFormOptions.DISABLED) String text; @Property(formType = PropertyFormType.BOOLEAN, bundleKey = "MyPreference.SendReports") boolean sendReports; @Property(formType = PropertyFormType.COLOR, bundleKey = "MyPreference.BackgroundColor") String backgroundColor; @Property(formType = PropertyFormType.NATURAL_NUMBER, bundleKey = "MyPreference.Age") int age; @Property(formType = PropertyFormType.SECRET_TEXT, bundleKey = "MyPreference.Password") String password; @Property(bundleKey = "MyPreference.MyInnerPreference") MyInnerPreference myInnerPreference; @Property(shared = true, bundleKey = "MyPreference.MySharedPreference") MySharedPreference mySharedPreference; @Override public MyPreference defaultValue(final MyPreference defaultValue) { defaultValue.text = "text"; defaultValue.sendReports = true; defaultValue.backgroundColor = "ABCDEF"; defaultValue.age = 27; defaultValue.password = "password"; defaultValue.myInnerPreference.text = "text"; return defaultValue; } }
  7. public class MyServerBean { @Inject private MyPreference myPreference; public void

    load() { // Loads the preference content from the file system myPreference.load(); myPreference.text = "text"; myPreference.sendReports = true; myPreference.backgroundColor = "ABCDEF"; myPreference.age = 27; myPreference.password = "password"; myPreference.myInnerPreference.text = "text"; myPreference.myInheritedPreference.text = "text"; myPreference.myInheritedPreference.myInnerPreference2.text = "text"; myPreference.myInheritedPreference.myInnerPreference2.myInheritedPreference2.text = "text"; // Saves the modified preference content. myPreference.save(); } }
  8. GWT Perspective OLD GWT WIDGET ERRAI UI Perspective Plain HTML

    Errai UI Angular Perspective Angular native Perspective Any JS Perspective Any JS Framework AppFormer Lookup Perspective CDI-Lite CDI BEAN MANAGER Scan all Perspective Activity
  9. @WorkbenchPerspective(identifier = “HomePerspective", isDefault = true) @Templated public class HomePerspective

    implements IsElement { @Inject @DataField @WorkbenchPanel(parts = "MoodScreen?uber=fire&uber1=fire1") Div moodScreen; @Inject @DataField @WorkbenchPanel(parts = "HomeScreen?uber=fire") Div homeScreen; @Inject @DataField @WorkbenchPanel(parts = "AnotherScreen") Div anotherScreen; } @JsType public interface PerspectiveActivity{ PerspectiveDefinition getDefaultPerspectiveLayout(); @Override default String getName() { return getDefaultPerspectiveLayout().getName(); } boolean isDefault(); Menus getMenus(); ToolBar getToolBar(); }
  10. @Dependent @Generated("org.uberfire.annotations.processors.WorkbenchScreenProcessor") @Named("HomeScreen") public class HomeScreenActivity extends AbstractWorkbenchScreenActivity { @Inject

    private HomeScreen realPresenter; @Inject //Constructor injection for testing public HomeScreenActivity(final PlaceManager placeManager) { super( placeManager ); } @Override public void onStartup(final PlaceRequest place) { super.onStartup( place ); realPresenter.onStartup(); } @Override public void onClose() { super.onClose(); realPresenter.onClose(); } @Override public void onShutdown() { super.onShutdown(); realPresenter.onShutdown();
  11. +

  12. +

  13. +