/*-- --------------------------------------------------------------------- * BAADER B O A - Back-Office-Applications * (c) BAADER Wertpapierhandelsbank AG, 2005 * --------------------------------------------------------------------- * Projektleitung: Reinhard Braumandl * Programmierung: Reinhard Braumandl, Arne Hänle, Kornelia Markovic * Frank Richter, Benjamin Schmidt, Hermann Voßeler. * --------------------------------------------------------------------- */ package baag.boa.tool.job; import baag.boa.common.exception.BOARuntimeException; import baag.boa.esn.interfaces.BOAStatus; import baag.boa.esn.server.systemdienst.BOAStatusService; import baag.boa.mvc.KompaktController; import baag.boa.mvc.RufKontext; import baag.boa.mvc.KompaktController.Kommando; import org.quartz.Scheduler; /********************************************************** * Behandelt den Aspekt der Integration zwischen BOAStatus, * dem (Singleton)-JobKommando-Objekt und Web/MVC-Controller. * Leitet dazu alle Versuche, ein JobKommando-Objekt direkt zu * erzeugen um in eine Anfrage an den BOAStatus-Bean. *

* Dieser Umweg ist notwendig, weil (a) intern eine Verbindung * zum Quartz-Scheduler-Objekt hergestellt werden muß und weil * (b) letzteres Objekt direkt im BOA-Server vorliegt, wohingegen * das JobKommando-Objekt zum Client gehört und nur über die * BOA-Fassade nach unten zugreifen darf. *

* Anmerkung 10/09: Ich betrachte das als eine ehr unglückliche, * gewachsene Lösung. Da wir nun ohnehin einen eigenen Scheduler * im ESB betreiben, hoffe ich, das bald durch eine insgesamt * bessere Lösung komplett ablösen zu können (HIV) * * @version $Id$ * @since 3/05 * @author HIV */ public aspect JobKommandoControllerIntegration { pointcut ClientAufrufKontext(RufKontext rK, Class kl) : execution( Kommando+ KompaktController+.instantiiereKommandoObjekt(Class, RufKontext) ) && args(kl,rK) && if( kl.equals(JobKommando.class) ); pointcut JobKommandoZeugung(RufKontext rK) : call( Object Class.newInstance() ) && within( KompaktController+ ) && cflow( ClientAufrufKontext(rK,*) ); Object around(RufKontext rufK) : JobKommandoZeugung(rufK) { BOAStatus bstat = rufK.getAppKonfig() .getServerStatus(); BOAStatusService statusImpl = (BOAStatusService)bstat; JobKommando jobK = statusImpl.getJobKommando(); return jobK; } //----- Policy: niemand sonst darf JobKommando-Objekte erzeugen declare error : call( JobKommando+.new(..) ) && !within(JobKommandoControllerIntegration) : "Nur der BOAStatus-Bean darf JobKommando-Objekte erzeugen"; //----- Verwaltung des JobKommando-Objektes in den BOAStatus-Bean einbauen // /** Verwaltet ein {@link baag.boa.tool.job.JobKommando JobKommando-Objekt} (singleton). Einige Instanz im ganzen BOA-Server, die dies explizit darf. Dies, sowie die Integration mit dem {@link baag.boa.mvc.KompaktController} erfolgt über einen {@link baag.boa.common.job JobKommandoControllerIntegration Aspekt}. @throws BOARuntimeException falls noch kein Scheduler registriert ist @return das (einzige) JobKommando-Objekt @see #registriereScheduler(Scheduler) */ public synchronized JobKommando BOAStatusService.getJobKommando() { assert null!=this.getScheduler(); if ( this.jobKommando==null ) { jobKommando.setBOAStatus(this); this.jobKommando = new JobKommando(); } return this.jobKommando; } private JobKommando BOAStatusService.jobKommando=null; /** Zugangsmethode hierzu auch in die Fasade einfbauen */ public abstract JobKommando BOAStatus.getJobKommando() ; //----- Felder für Zugriff auf den BOAStatus-Bean in das Zielobjekt einfügen private BOAStatus JobKommando.boaStatus=null; private void JobKommando.setBOAStatus(BOAStatus bstat) { boaStatus=bstat; } //----- Zugriffe auf das Scheduler-Objekt im JobKommando umleiten pointcut SchedulerZugriff(JobKommando jK) : call( Scheduler JobKommando+.getSched() ) && target(jK); Scheduler around(JobKommando jK) : SchedulerZugriff(jK) { assert jK.boaStatus!=null; Scheduler theSched = jK.boaStatus.getScheduler(); return theSched; } }