GEngine nije „splet legacy koda" nego koherentna arhitektura sastavljena od poznatih obrazaca. Imena su po Fowlerovoj knjizi Patterns of Enterprise Application Architecture (PoEAA) i po Design Patterns (GoF).
| Pattern | Gde u GEngine-u | Šta rešava |
|---|---|---|
| Metadata Mapping | GColumnHeader, GColumnString/Integer/..., GMySqlDatabase.dbtCreate | opis kolone na jednom mestu → DDL, SQL, ekran, štampa, izvoz |
| Table Module | DbtObject, GDataSource2d — jedna instanca pokriva celu tabelu | ponašanje tabele na jednom mestu, bez objekta po redu |
| Record Set | redovi u memoriji + GColumnHeader opisi; getRow(i).getInt("Kolona") | tabelarni podaci nezavisni od izvora (baza ili .txt) |
| Layer Supertype | GDataSourceLevel00 → 05 → 10 → 20 → 30 → 40 → 50 | svaki nivo dodaje jednu odgovornost |
| Bridge / Driver | GDataDriverMySql, GDataDriverMemory, GDataDriverNull; GEngineAccess, GEngineExcel | isti podaci preko drugog skladišta |
| Command + Chain of Responsibility | callback(GCbMessage) sa TRIGGERALWAYS, SETACTION, EDITACTION i pMessage.consume() | jedna ulazna točka za sve događaje, umesto stotine hook metoda |
| Composite | GContainer, GContainerTable, GCell, GRecordPanel | ekran je drvo elemenata, generisano iz kolona |
| Template Method | loadData(), createData(), recreateData() koje potomci dopunjuju | skelet postupka u osnovnoj klasi |
callback (Command)@Override
public GCbMessage callback(GCbMessage pMessage)
{
switch (pMessage.getId()) {
case TRIGGERALWAYS: // pre svakog snimanja
set(ID.getName(), getString(PACKAGE.getName()).trim() + "." + getString(TABLE.getName()).trim());
break;
case SETACTION: // koje akcije ekran nudi
getActionGroup().getActionGroup(GActionGroup.OPCIJE).add(null, mActionCreate, mActionEdit);
return pMessage;
case EDITACTION: // korisnik je pokrenuo akciju
if (lCommand.equalsIgnoreCase("TableCreate")) {
pMessage.consume(); // komanda je pojedena, ne ide dalje
...
}
}
}consume() je ono što ovo čini Chain of Responsibility: ko obradi komandu, zaustavi je.
getInfo().setVersion(1,1,15)) i rekreira se kod klijenta.| Cena | Zašto | Šta se može |
|---|---|---|
| amplifikacija poziva | svaka ćelija ide kroz metapodatke | keširanje kolona po tabeli; meriti Cortiveo tracerom |
| dubina nasleđivanja (7) | ponašanje je razbacano po nivoima | ne diraj kičmu; koristi cortiveo trace da vidiš ko stvarno radi |
| nema migracije šeme | dbtCreate = DROP + CREATE | dodati dbtAlter koji poredi klasu i information_schema |
tok kroz callback | ne vidi se statički | runtime trag je izvor istine |
Linkovi su iz mog znanja, nisu provereni klikom u ovoj sesiji — ako neki ne radi, traži naslov.
MethodEntryRequest (skupo, po pozivu) vs BreakpointRequest (besplatno dok se ne pogodi).src stoji CallTree.aj, tvoj ranij pokušaj istog posla; AspectJ menja bytecode pri kompajliranju, JDI ne menja ništa. https://eclipse.dev/aspectj/xlsx umesto xls: https://poi.apache.org/components/spreadsheet/ — HSSFWorkbook (stari .xls) → XSSFWorkbook / SXSSFWorkbook (novi .xlsx, streaming).char(n), serial), citiranje identifikatora (backtick vs dvostruki navodnici), SHOW KEYS → information_schema.