Bean-Variablen als Parameter einer Methode einer anderen Bean

mcdroemmel

Mitglied
Hallo Kollegens,

schreibe gerade an einer Bean zur Migration von Altdaten aus einer SQL-Datenbank auf Maschine A für die neue JEE 5 (EJB3) konforme Anwendung auf Maschine B überträgt.

Ich habe dazu Entity-Objekte im Prinzip für jede zu lesende Tabelle. Dazu passend auch jeweils eine Bean, die ein Entity-Bean mit JPA ließt. In dem Lese-Loop dieser Bean werden dann die Daten mittels einer Bean (speziell für das Zielsystem).

Um das ganze habe ich jetzt noch eine Bean gepackt, damit ich nur einen Aufruf für die gesamte Migration aller Tabellen habe.
Das funktioniert soweit auch ganz gut und ist nicht Gegenstand der Frage.

Vielmehr ist meine Frage, ob ich nicht eine Bean als Parameter an einer Methode meiner großen Migrations-Bean übergeben kann. Damit würde ich mir viel Tipparbeit sparen, da die einzelnen Beans die die Migration einer Tabelle steuern, immer den gleichen Methodennamen verwenden.
Habe es schon mit Interface versucht die einzelnen Beans mit einer zusätzlichen einheitlichen Schnittstelle zu zwingen und in der aufgrufenen Methode dann den Schnittstellenamen zu verwenden.
Ich weiß, vielleicht blöde umschrieben, deshalb hier ein abstraktes Beispiel. Dann wirds vielleicht klarer.

Code:
public class MigrateFC2KallBean implements MigrateFC2KallLocal {

	@EJB CurrenciesFC2KallLocal currenciesBean;
	@EJB LanguagesFC2KallLocal languagesBean;
	@EJB CountryFC2KallLocal countryBean;
	@EJB SdAufartFC2KallLocal sdAufartBean;
	@EJB RefTableFC2KallLocal refTableBean;
	
	@EJB MigrateUtilityLocal migUtilityBean;
	
	Vector<MigrationInfo> vMigInfo;

	public Vector<MigrationInfo> StartMigration(boolean deleteTarget, String tableName)
	{
		vMigInfo = new Vector<MigrationInfo>();
		MigrationInfo tMigInfo;
		if (tableName == null) tableName = "";
		if (deleteTarget)
		{
			migUtilityBean.deleteAllData(tableName);
		}
		
		if (tableName.length()==0 || tableName.equals("ZKALL_CURRENCIES"))
		{
			tMigInfo = new MigrationInfo();
			tMigInfo.setMigrated(currenciesBean.MigrateFC2Kall());
			tMigInfo.setMigClassName("ZKALL_CURRENCIES");
			vMigInfo.add(tMigInfo);
		}
		if (tableName.length()==0 || tableName.equals("ZKALL_LANGUAGE"))
		{
			tMigInfo = new MigrationInfo();
			tMigInfo.setMigrated(languagesBean.MigrateFC2Kall());
			tMigInfo.setMigClassName("ZKALL_LANGUAGE");
			vMigInfo.add(tMigInfo);
		}
		if (tableName.length()==0 || tableName.equals("ZKALL_COUNTRIES"))
		{
			tMigInfo = new MigrationInfo();
			tMigInfo.setMigrated(countryBean.MigrateFC2Kall());
			tMigInfo.setMigClassName("ZKALL_COUNTRIES");
			vMigInfo.add(tMigInfo);
		}
		if (tableName.length()==0 || tableName.equals("ZKALL_SD_AUFART"))
		{
			tMigInfo = new MigrationInfo();
			tMigInfo.setMigrated(sdAufartBean.MigrateFC2Kall());
			tMigInfo.setMigClassName("ZKALL_AD_AUFART");
			vMigInfo.add(tMigInfo);
		}
		if (tableName.length()==0 || tableName.equals("ZKALL_REFTABLE"))
		{
			tMigInfo = new MigrationInfo();
			tMigInfo.setMigrated(refTableBean.MigrateFC2Kall());
			tMigInfo.setMigClassName("ZKALL_REFTABLE");
			vMigInfo.add(tMigInfo);
		}
		return vMigInfo;
	}
}

Jede zu migrierende Tabelle wird in meiner Migrationsbean über eine eigenes Bean angesprochen. Jede dieser einzelnen Beans impementiert hierzu eine Methode MigrateFC2Kall(). MigrationInfo dient zur Aufnahme von Informationen zur Rückmeldung über den Verlauf der Migration.
Ich würde jedem if-Block jetzt gern durch Aufruf einer weiteren Methode ersetzten und dieser jetzt gern noch das jeweilige Bean als Parameter übergeben, damit die
Methode dann dort aufgerufen werden kann. Also z.B. folgende Methode verwenden

Code:
	public MigrationInfo migrateTable (String tableName, String targetTableName, MigrateBasicLocal tableBean)
	{
		MigrationInfo tMigInfo = new MigrationInfo();
		if (tableName.length()==0 || tableName.equals(targetTableName))
		{
			tMigInfo.setMigrated(tableBean.MigrateFC2Kall());
			tMigInfo.setMigClassName(tableName);
			return tMigInfo;
		}
		else return null;
	}

um dann nur noch in der Migrations-Bean jeweils statt des if-Blocks
sowas wie
Code:
		tMigInfo = migrateTable ("ZKALL_CURRENCIES", tableName,currrenciesBean);

aufzurufen. In meinem Bespiel hab ich es halt schon mal mit Vererbung und Interface Implementierung der Beans versucht, die alle von MigrateBasicLocal abgeleitet sind. Aber der Compiler meckert immer den Datentype beider Übergabe an.

Wäre toll wenn jemand eine zündende Idee hätte.
Vielen Dank schon mal.
Gruß
McD
 

Neue Beiträge

Zurück