Pisząc niewielki framework do pewnej gry web’owej (FallenSword) natknąłem się na problem “wyjmowania” z kodu HTML pewnych danych i zapisywania ich jako zwykłych POJO. Przez około miesiąc walczyłem z różnymi koncepcjami realizacji tego zadania, od parserów SAX i DOM, aż to samego XPath.
Na początku był projekt alternatywnego klienta (w technologii grubego klienta, FallenGui) do tej gry, później powstał też projekt statystyk gildii (w cienkim kliencie, FallenGuildStats). Podczas powstawiania koncepcji pierwszego projektu cały kod miał być w jednym projekcie. Przy okazji pojawienia się drugiego projektu zdecydowałem się na rozdzielenie części odpowiedzialnej za pobieranie danych ze stron FS i umieszczenie jej w projekcie biblioteki (FallenFramework). Właśnie na tym etapie starałem się używać parserów najpierw SAX, później DOM do realizacji tego celu.
W trakcie pisania FallenFramework przypomniałem sobie o możliwościach Java’y związanych z implementacją interfejsów w czasie rzeczywistym (podczas działania samej aplikacji) i tak narodziła się koncepcja HTMLBeans.
HTMLBeans jest biblioteką, która wykorzystując możliwości refleksji, połączone z JTidy (sprzątanie kodu Html/XHtml oraz parsowanie do postaci DOM) oraz XPath (wyszukiwanie danych za pomocą ścieżek w konwencji podobnej do ścieżej unix’owych), zapewnia łatwiejszy sposób uzyskiwania obiektów POJO z kodu stron, niż ręczne pisanie obsługi DOM i XPath. Zasady jej działania są proste: na wejściu dostajemy stronę Html/XHtml oraz odpowiedni plik konfiguracyjny w XML’u z definicjami poszczególnych obiektów POJO oraz ścieżkami XPath (lekko zmodyfikowanymi w stosunku do standardowych). Następnie tworzymy sobie instancję klasy HtmlBeansFactory i wywołujemy metodę getImplementation() z odpowiednimi parametrami, na wyjściu otrzymując obiekt POJO wypełniony odpowiednimi danymi.
Bibliotekę udostępnię w najbliższym czasie (jak tylko przeprowadzę nieco więcej testów) na licencji GPL. Po 12 godzinach kodowania i wstępnych testach (i garści problemów związanych z parsowaniem XHtml’a, głównie z uwagi na tag <?xml … ?>, z którym było sporo roboty) rezultaty są obiecujące. O wydaniu poinformuję na stronach tego blog’a.
