Git Product home page Git Product logo

rades-annotations's Introduction

Maven Central download Build Status Codacy code quality badge Waffle.io - Columns and their card count

rades-annotations

Stellt im Rahmen von Rades Annotationen zur Automatisierung bereit. Die angebotenen Annotationen können zur Generierung folgender Pattern genutzt werden:

Noch ein Lombok?

Ja dieses Projekt erscheint wie eine Kopie von Lombok, dennoch erhebt es weder den Anspruch so umfangreich zu sein noch will es mit lombok in Konkurrenz treten. Auch wird eine andere Technologie zur Umsetzung verwendet. Lombok modifiziert den AST (abstract syntax tree - abstrakten Syntaxbaum) des Java Compilers. Im Gegensatz dazu wird das vorliegende Projekt rein auf der Basis von Annotationsprozessoren realisiert, unter möglichst geringer Verwendung von Reflection (Ganz bin ich leider nicht dran vorbei gekommen.).

Dieses Projekt besitzt nur ganz wenige Lösungen (aktuell Erstellung von Builder und Accessor einer Domainklasse). Wer mehr Funktionalität benötigt dem möchte ich tatsächlich die Nutzung von Lombok empfehlen.

Generell besteht auf Grund der im vorliegenden Projekt gewählten Technologie die Einschränkung, dass nur neue Artifakte (z.B. Klassen) generiert werden können. Es besteht für Annotationsprozessoren leider keine saubere Möglichkeit bestehenden Kode zu modifizieren. Daher entfallen auch Builder in Form von inneren Klassen. Wer so etwas sucht, sollte Lombok nutzen. Dort können solche Anpassungen mit der verwendeten Technologie realisiert werden.

Quellen im Internet

Danksagung

Dieses Projekt wäre ohne die Dienste, welche Open-Source-Projekte großzügig unterstützen, nicht möglich gewesen:

  • GitHub, welches kostenfrei ermöglicht in der Cloud gemeinsam am Code zu arbeiten und das Beitragen zu Open Source Projekten vereinfacht.

  • Travis CI welches kostenfrei cloudbasierte Build-Services bereitstellt, die sich einfach in GitHub integrieren lassen.

  • Codacy welches kostenfrei die Programmquellen von Open Source Projekten auf Einhaltung von Programmierregeln untersucht.

  • Codev welches kostenfrei die erreichte Codecoverage der Testfälle ermittelt.

  • Waffle.io welches für die agile Abarbeitung von Bugs und Features genutzt wird.

  • JFrog welches für die Bereitstellung von Bintray, der Distributionsplattform, die verwendet wird, um mögliche Downloads anzubieten. Bintray war wirklich von unschätzbarem Wert, da es nicht nur kostenloses Hosting und Traffic für die Software bietet, sondern es auch sehr einfach macht, ein Repository für benutzerdefinierte Binärformate einzurichten und die Metadaten der Downloads zu verwalten. Dank der einfach zu verwendenden REST-API ist es möglich einen automatisierten Workflow mit GitHub und Travis CI einzurichten, um die Software in kürzester Zeit zu erstellen, hochzuladen und zu katalogisieren.

rades-annotations's People

Contributors

dependabot[bot] avatar huluvu424242 avatar

Watchers

 avatar

Forkers

piugroup

rades-annotations's Issues

Builder Konstruktor für optionale Felder bereitstellen

Der Konstruktor nimmt als einziges Argument eine Klasse auf welche der Builder baut.
Diese kann dann mit dem Builder beliebig modifiziert werden.
Gedacht ist das Vorgehen für Klassen mit Null Feldern. Diese werden irgendwann später nach der Erzeugung gesetzt und hierzu wird wieder ein Builder benötigt.

@RadesReadOnly

child of #109
Für Attribute wie Listen die nicht modifiziert werden sollen - hier kann stattdessen .stream() generiert werden.

MetaAnnotation Support hinzufügen

Wenn die Rades Annotationen in anderen Annotationen verwendet werden, dann müssen alle Klassen an denen die anderen Annotationen hängen mit in die Liste zu bauender Builder aufgenommen werden.

Readme ergänzen - Warum nicht lombok

Da lombok eine sehr gute und weit verbreitete Lösung bietet sollten gleich am Anfang der README die Gründe stehen warum bzw. wann man dieses Projekt nutzen sollte oder warum es entstand:

  • gedacht für Einzelfälle wenn nur mal schnell Builder gebaut werden sollen aber nicht die volle Mächtigkeit von lombok benötigt wird
  • Teil einer Toolchain für RADES - sollte also genutzt werden, wenn man ein RADES Projekt oder ein Projekt nach RADES Prinzipien bearbeitet
  • Dieses Projekt bietet eine simple und deutlich eingeschränktere Lösung in Bezug auf lombok. Es schränkt den Entwickler ein um später die Einhaltung von RADES Konzepten zu erleichtern.

Logprovider entfernen

Logprovider darf nur für den Test konfiguriert werden. Der Produktion Kode darf nur gegen das api programmiert werden

@Generated mit date="" versehen

TimeUtil erstellen und im Test mocken

Damit im Test immer der gleiche Zeitstempel genutzt werden kann und nicht die Vergleichsdatei anzupassen ist.

SPIKE Distribution Repos von maven central aufnehmen

SPIKE Prüfen ob es Vorteile verschafft die sonatype repos aufzunehmen:

<distributionManagement>
  <snapshotRepository>
   <id>ossrh</id>
   <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
   <id>ossrh</id>
   <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
 </distributionManagement>

Support für RadesNoBuilder und RadesNoAccessor Attribute

Ein Team mit einer Mitgliederliste lässt sich nur modellieren, wenn die mitglieder Liste private ist und die Methoden addMitglied, removeMitglied, getMitglieder:Stream() händisch implementiert werden.
Da die Mitgliederliste aber ein fachliches Attribut ist (im Gegensatz zu einer Id) sollte diese protected setzbar sein ohne, dass ein with im Builder gebaut wird.

Valid Dependencies

Nur Releases als Dependencies nutzen:

ch.qos.logback logback-core 1.2.3 ch.qos.logback logback-classic 1.2.3 test org.slf4j slf4j-api 1.7.25 org.junit.jupiter junit-jupiter-api 5.2.0 test

Ausgabe der pom.xml Anpassungen

Auf der Console oder in einer Textdatei soll ausgegeben werden welche Anpassungen einmalig manuell durchzuführen sind.
(Falls Datei dann ein ausschaltbar)
z.B. Dependencies in pom.xml ergänzen
Je Processor sollte eine solche Datei erstellt werden, damit es keine Probleme gibt.

Erstellung von Compatibillity Tests

Das Verschieben der Annotationsklassen in ein anderes Package verursacht beim Endnutzer Aufwände.
Die Tests sollen solche Änderungen sichtbar machen.
Schlagen die Compatibillity Tests fail, so muss die nächste Version ein Major Release Upgrade sein.

JUnit 5 Umstellung

Nach Implementierung von issue #1 muss alles wieder korrekt mit JUnit 5 laufen.
Die bestehenden Integrationstests sollen erhalten bleiben.

SPIKE rades-cdi

Branch #52_xxx wurde erstellt

SPIKE wurde zurückgestellt weil er zunächst nicht funktioniert hat - weitere Erfahrungen müssen gesammelt werden.

Probieren ob sich @Inject über die java service spi realisieren lassen.
CDI ist in Java SE zwar eingebaut aber man muss selbst einen Container instanzieren, was im Annotation Processor keinen Sinn ergibt, da keine Main Klasse vorhanden ist. Da die Annotationen auch im Container Umfeld genutzt werden sollen (JavaEE, Pico, spring) dürfte die Erzeugung eines neuen Containers auch nur zu Problemen führen. Daher servic spi nutzen.

Delegation für bestehende Methoden

Alle Methoden, welche vom Domainobjekt bereitgestellt werden, müssen auch vom Accessor bereitgestellt und ans Domainobjekt delegiert werden.
Das sichert einen reibungslosen Workflow. Aus dem Builder den Accessor generiert und diesen benutzt als wäre es das Domainobjekt.

@RadesSingular, @Singular

child of #108
Singular baut entsprechend Lombok beim Builder statt setter für Collections add Methoden für Entries
Bearbeitung im branch: #94_collections

Zurückgestellt wegen fachlicher Widersprüche

Implementierung für alle Klassen die das Interface Collection implementieren - add und remove Methoden bereitstellen.

bean validation in builder einbauen

In der build Methode des Builders soll auf der fachlichen Klasse eine Bean Validation durchgeführt werden.
Hiermit wird sichergestellt, dass stets nur fachlich gültige Instanzen gebildet werden können.

Abhängigkeit der Generate als compile definieren

Die generierten Klassen hängen von 3th libs ab.
(apache, validation, ..)
Diese müssen als compile scope im pom.xml definiert werden, da sonst beim Endnutzer eine Meldung "fehlende Abhängigkeit" auftritt.
Das ist zwar richtig und der Endnutzer sollte lieber diese Abhängigkeiten selbst im pom.xml aufnehmen. Dies wird aber nicht jeder Endnutzer verstehen und daher sorgen wir hier für eine implizite Lösung.

Standard Datentypen Support

Standarddatentypen wie Date, Integer, Double, Long sollen unterstützt und per Unittests abgeprüft werden

parent pom nicht erreichbar im maven build

Durch issue #73 und der damit einhergehenden Teilung des pom in parent und pom wurde ein download Problem für den Maven Build erzeugt.

Die Splittung wird daher zurück genommen und das Projekt rades.forge-addon muss sich einen besseren Weg zur Automatisierung suchen.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.