Hi zusammen,
der Threadtitel ist wohl nicht so aussagekräftig, ist mir aber nichts gescheiteres eingefallen.
Ich habe folgende Situation: Ich hab ein Projekt mit generierten Beans und Actions - nennen wir diese GenBeans. Diese leiten alle von einer Klasse ab, nennen wir sie CommonBean. Die GenBeans können für bestimmte Use Cases wiederum von mehreren Klassen reused werden (auch über mehr als ein Vererbungslevel), nennen wir diese ImplBeans.
Ich hab bei 90% der Services, welche ich mit diesen Beans befülle, zwei Felder, welche in all diesen Services gleichnamig sind. Als Beispiel nennen wir ein Feld "ABC". Nun habe ich dank langjähriger Programmierung div. Entwickler folgendes Problem. Der alte Generator generierte die Fields, wie sie im Service definiert wurden, also z.B. Feld "ABC" mit "getABC()" und "setABC()". Die neue Version spuckt aber alles Lower Case (wer kam auf diesen Schwachsinn?) aus, also "abc", "getAbc()", "setAbc()". Damit der Wert im gesamten Projekt rumgereicht werden kann, haben einige Entwickler je nach dem noch 2 ähnliche Methoden hinzugefügt (zu den ImplBeans). Je nach dem zeigen diese wieder auf den Getter/Setter von Feld x, y, oder verwenden ihr eigenes Feld.
Lange Rede, kurzer Sinn: ich will, egal welche von CommonBean vererbten Klassen welche Setter und Getter überschreiben (oder selbst erstellen) - welche diesem Muster ensprechen, also 4 Stück - immer auf das gleiche Feld zugegriffen wird. Somit soll ein "setABC()" vor einem "getabc()" den dem Setter übergebenen Wert zurückgeben.
- in CommonBean alle Methoden implementieren und das gleiche Feld verwenden - funktioniert natürlich nicht
- in allen ImplBeans alle diese Methoden implementieren - macht weder Sinn noch kann man davon ausgehen, dass immer ein ImplBean unter dem GenBean hängt
- im CommonBean Konstruktor die Methoden per Reflection überschreiben, das geht aber IMHO nicht
- im CommonBean alle Methoden implemenentieren, da drin per Reflection in allen Subklassen nach den Feldern suchen, bei den Settern alle Felder füllen, bei den Gettern ein Feld mit Inhalt zurückgeben. Als Fallback - wenn kein Feld gefunden wurde - das eigene verwenden. Dies könnte IMHO aber vom SecurityManager gesperrt sein, denn ich müsste ein [c]setAccessible(true)[/c] machen.
- CommonBean is irgendwann mal eine Ableitung von org.apache.struts.validator.ValidatorForm (Struts 1.1...) - kann man da was machen?
- im Framework schauen (wie erwähnt, basiert auf Struts 1.1), ob ich irgendwie die Instanzierungsmethode der Beans überschreiben kann, welche dann die Methoden ohne Reflection implementiert/überschreibt - das hab ich aber bis anhin noch nicht geschafft.
Einige fragen sich vielleicht, warum ich das so machen will. 1. Natürlich will ich zumindest die von Hand eingefügten Getter und Setter raus aus dem Projekt haben, aber das benötigt seine Zeit. Damit alles immer sauber funktioniert, sollen diese bis zum Abschluss meiner Änderungen verfügbar sein. 2. Diese verfi***en Generatoren, welche plötzlich alles Lower Case generieren. Ich kann leider nicht das ganze Projekt neu generieren...
Ich hab mir die Überlegungen schon ein paar Mal gemacht, bin allerdings nie zu einer Lösung gekommen. Kann sein, dass es wirklich keine Lösung gibt. Vielleicht gibts aber eine schöne Lösung, welche mir nicht einfällt? Oder eine fancy Lösung
Bin offen für alles 
Gruess, faetzminator
der Threadtitel ist wohl nicht so aussagekräftig, ist mir aber nichts gescheiteres eingefallen.
Ich habe folgende Situation: Ich hab ein Projekt mit generierten Beans und Actions - nennen wir diese GenBeans. Diese leiten alle von einer Klasse ab, nennen wir sie CommonBean. Die GenBeans können für bestimmte Use Cases wiederum von mehreren Klassen reused werden (auch über mehr als ein Vererbungslevel), nennen wir diese ImplBeans.
Ich hab bei 90% der Services, welche ich mit diesen Beans befülle, zwei Felder, welche in all diesen Services gleichnamig sind. Als Beispiel nennen wir ein Feld "ABC". Nun habe ich dank langjähriger Programmierung div. Entwickler folgendes Problem. Der alte Generator generierte die Fields, wie sie im Service definiert wurden, also z.B. Feld "ABC" mit "getABC()" und "setABC()". Die neue Version spuckt aber alles Lower Case (wer kam auf diesen Schwachsinn?) aus, also "abc", "getAbc()", "setAbc()". Damit der Wert im gesamten Projekt rumgereicht werden kann, haben einige Entwickler je nach dem noch 2 ähnliche Methoden hinzugefügt (zu den ImplBeans). Je nach dem zeigen diese wieder auf den Getter/Setter von Feld x, y, oder verwenden ihr eigenes Feld.
Lange Rede, kurzer Sinn: ich will, egal welche von CommonBean vererbten Klassen welche Setter und Getter überschreiben (oder selbst erstellen) - welche diesem Muster ensprechen, also 4 Stück - immer auf das gleiche Feld zugegriffen wird. Somit soll ein "setABC()" vor einem "getabc()" den dem Setter übergebenen Wert zurückgeben.
- in CommonBean alle Methoden implementieren und das gleiche Feld verwenden - funktioniert natürlich nicht
- in allen ImplBeans alle diese Methoden implementieren - macht weder Sinn noch kann man davon ausgehen, dass immer ein ImplBean unter dem GenBean hängt
- im CommonBean Konstruktor die Methoden per Reflection überschreiben, das geht aber IMHO nicht
- im CommonBean alle Methoden implemenentieren, da drin per Reflection in allen Subklassen nach den Feldern suchen, bei den Settern alle Felder füllen, bei den Gettern ein Feld mit Inhalt zurückgeben. Als Fallback - wenn kein Feld gefunden wurde - das eigene verwenden. Dies könnte IMHO aber vom SecurityManager gesperrt sein, denn ich müsste ein [c]setAccessible(true)[/c] machen.
- CommonBean is irgendwann mal eine Ableitung von org.apache.struts.validator.ValidatorForm (Struts 1.1...) - kann man da was machen?
- im Framework schauen (wie erwähnt, basiert auf Struts 1.1), ob ich irgendwie die Instanzierungsmethode der Beans überschreiben kann, welche dann die Methoden ohne Reflection implementiert/überschreibt - das hab ich aber bis anhin noch nicht geschafft.
Einige fragen sich vielleicht, warum ich das so machen will. 1. Natürlich will ich zumindest die von Hand eingefügten Getter und Setter raus aus dem Projekt haben, aber das benötigt seine Zeit. Damit alles immer sauber funktioniert, sollen diese bis zum Abschluss meiner Änderungen verfügbar sein. 2. Diese verfi***en Generatoren, welche plötzlich alles Lower Case generieren. Ich kann leider nicht das ganze Projekt neu generieren...
Ich hab mir die Überlegungen schon ein paar Mal gemacht, bin allerdings nie zu einer Lösung gekommen. Kann sein, dass es wirklich keine Lösung gibt. Vielleicht gibts aber eine schöne Lösung, welche mir nicht einfällt? Oder eine fancy Lösung
Gruess, faetzminator