EventSpy

In elke editie zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Apache Maven om meer inzicht te geven in Maven zelf en de vele beschikbare plugins.

Op 14 april 2016 heb ik de IoT TechDay bezocht en tal van presentaties en keynotes bijgewoond. Interessante onderwerpen passeerden de revue. De meesten uiteraard hardware-driven, dus ik zat me af te vragen in hoeverre Maven een rol kan spelen in deze omgeving. Weliswaar zal Maven zelf nooit een hele actieve rol vervullen in IoT aangezien het zelf niet reageert op externe factoren, daar heb je CI-servers voor.

Echter, je kunt Maven wel als een soort sensor beschouwen. Voor een Maven build is de meest simplistische sensor de exit-code: System.exit(0) als het geslaagd is en alle andere waarden als er iets mis is gegaan. Op basis van deze uitkomst kan bijvoorbeeld een CI-applicatie als Jenkins besluiten om mailtjes te versturen.

In een IoT omgeving wil je sneller en meer informatie. Als je informatie tijdens de build wilt hebben, dan kun je uiteraard proberen de logging te analyseren, maar dat zal enerzijds veel werk kosten om de output te parsen en anderzijds garandeert het niks, want met elke nieuwe versie van Maven zelf of van een maven plugin kan een logmelding veranderen.

Het kan ook anders, want Maven beschikt over een passende oplossing: de org.apache.maven.eventspy.EventSpy. Dit is een interface die je zelf kunt implementeren en als extensie aan Maven kunt toevoegen. De interface bevat slechts de onderstaande methodes: init(EventSpy.Context), onEvent(Object) en close(). Het is dusdanig generiek, dat we ongelimiteerd nieuwe Events kunnen toevoegen.

De meest zinvolle Event is waarschijnlijk de ExecutionEvent, die momenteel 17 verschillende types onderscheid van SessionStarted en ProjectSkipped tot MojoFailed. Daarnaast geeft het toegang tot de Session, Project of Mojo (de instantie van de uit te voeren goal) en eventuele Exception. Dat zou voldoende moeten zijn om vervolgacties uit te kunnen voeren.

Hier volgt een klein voorbeeld, weliswaar niet heel erg IoT, maar het geeft wel de mogelijkheden aan van de EventSpy. Het idee achter dit voorbeeld is dat ik soms grote projecten aan het bouwen ben en dat ik ondertussen wat anders doe. Soms kom ik er na een kwartier achter dat het project al na en minuut was gestopt met een fout. Zou het niet handig zijn als ik een geluidje zou horen wanneer Maven klaar is met de build?


@Named
@Singleton
public class BeepAtEnd extends AbstractEventSpy {
 
                @Override
                public void onEvent(Object event) throws Exception {
                               if (event instanceof ExecutionEvent) {
                                               ExecutionEvent executionEvent = (ExecutionEvent) event;
                                              
                                               if (Type.SessionEnded.equals(executionEvent.getType())) {
                                                               Toolkit.getDefaultToolkit().beep();
                                               }
                               }
                }
}

 

Als je van de bovenstaande code een jar maakt en deze onder ${maven.home}/lib/ext plaatst, dan zal je steeds een beep horen als de build klaar is. Ik heb deze extension ondertussen weer verwijderd van mijn Maven installatie, omdat de piepjes behoorlijk irritant werden. Wellicht kan iemand het uitbreiden met echte sound-files met onderscheid tussen success en failure…