21 lutego 2010

Eclipse pomocny przy NPE w AtomBindingListenerServlet.doPost() z Apache Tuscany

Siedzę przy Service Component Architecture (SCA) z Apache Tuscany i nie pamiętam już, dlaczego wybrałem na rozpoznanie binding.atom. Nie ma to znaczenia, ani nie ma znaczenia, czym jest SCA i owe (magiczne) binding.atom. Przeczytacie w nadchodzącym artykule, a niektórzy usłyszą na nadchodzących konferencjach - Studenckim Festiwalu Informatycznym (SFI) 11-13. marca w Krakowie oraz 4Developers 26. marca w Poznaniu, na których będę prezentował tę technologię (i liczę na Wasz aktywny udział).

Tym razem przyszło mi rozwiązać problem z NPE w Tuscany. Zaczęło się stworzeniem odpowiednich (tak przynajmniej sądziłem początkowo) klas i podczas uruchomienia wciąż tylko:
java.lang.NullPointerException
at org.apache.tuscany.sca.binding.atom.provider.AtomBindingListenerServlet.doPost(AtomBindingListenerServlet.java:590)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.apache.tuscany.sca.core.work.Work.run(Work.java:63)
at org.apache.tuscany.sca.core.work.ThreadPoolWorkManager$DecoratingWork.run(ThreadPoolWorkManager.java:215)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:637)
Pracuję z Tuscany 1.6, którego źródeł nie ma w repozytorium mavenowym, a wtyczka Eclipse IAM uparcie przy swoim "Nie ma mowy o podłączeniu źródeł do zależności mavenowych!".

Eclipse IAM - Java Source AttachmentKoniecznie potrzebowałem podpiąć źródła modułu tuscany-binding-atom-abdera-1.6.jar, aby namierzyć przyczynę NPE. Mogłem ręcznie, i tak faktycznie początkowo zrobiłem, ale po kwadransie zarzuciłem to, bo nie tylko, że zaczęło zajmować zbyt wiele czasu, ale i zażyczyłem sobie przejrzenie struktur i ich danych na żywo.

Pamiętam, że miałem podobne "chciejstwo" w IDEA i chyba NetBeans, i nie poszło mi z jego realizacją tak prosto, jak w Eclipse. Wystarczyło podpiąć źródła do projektu przez Build Path > Link Source...

Eclipse - Build Path | Link Source..., aby związać zewnętrzny katalog ze źródłami z projektem...

i w końcu uruchomić projekt w trybie śledzenia (ang. debug).

Eclipse - DebugNie długo trwało, abym się przekonał, że obsługa protokołu Atom przez binding.atom w Tuscany (oparta na Apache Abdera) wymaga właściwego komunikatu przy POST, ale to już historia na inną okazję.

Najważniejsze, że użyte narzędzie - Eclipse IDE - pozwoliło mi na namierzenie i rozwiązanie problemu w kilka chwil, bez znajomości niuansów Atoma. Nie obyło się bez ich poznania, ale to było przy okazji i wchodziło samo do głowy, z nieukrywaną przyjemnością.

Jeszcze tylko zgłosić kilka problemów w JIRA dla Apache Tuscany, aby inni nie musieli przechodzić przez to samo ponownie.