czwartek, 25 września 2008

OSGi i SpringSource podcast

Dzisiaj trafiłem na rewelacyjny podcast Ben Hale wraz ze slajdami opowiada o OSGi. Opowiada on w bardzo prosty i przejrzysty sposób dlaczego warto używać OSGi wraz z jego historią. Miejmy nadzieje, że Jacek równie ciekawie przedstawi OSGi podczas JDD.

wtorek, 23 września 2008

Robienie prezentacji Beamer + Latex


Zadanie na dziś zrobić prezentacje szybko i oczywiście przy użyciu ulubionego edytora :) czyli Eclipse + TeXlipse wtyczka. Więc znalazłem jak zainstalować latex + beamer pod mac OS.
Ja zrobiłem to troszkę szybciej, po prostu w konsoli :
lipka$ sudo port install texlive
Potem szybko przestudiowałem dokumentację tex:) i jak używać wtyczki i mogę teraz robić prezentacje:) jeszcze rzuciłem okiem na bardzo fajny artykuł jak szybko stworzyć prezentacje używając Beamera.

piątek, 19 września 2008

OSGi i wielcy gracze

Przeglądając dzisiaj blogi natrafiłem na artykuł SpringSource Team Blog, w którym można było przeczytać, którzy wielcy gracze w dziale IT (SpringSource, IBM, Oracle, RedHat, Sun, SAP, ProSyst and Paremus) używają OSGi i jakie korzyści im to przyniosło. Więc nic więcej nie pozostało jak bliżej przyjrzeć się dokumentacji OSGi i jakiś mały projekt zrobić, żeby zobaczyć jak to działa w praktyce:).

środa, 17 września 2008

Mule z JMS

Zadanie na dzisiaj odebrać z ftp plik o rozszerzeniu xml i na podstawie tego pliku stworzyć odpowiedni obiekt, który będzie wysłany do odpowiednich kolejek w JMS (Apache activemq) (jak to zainstalować było opisane w Apache ActiveMQ instalacja ). Jak pobrać plik z ftp wiemy, należy tylko napisać komponent który po odberaniu pliku z serwisu ftp, będzie go w stanie sparsować. Sztuczka polega na tym, żeby nasz komponent implementował interfejs org.mule.api.lifecycle.Callable i po pobraniu pliku odpowiednio zaimplementować metodę onCall z interfejsu Callable. Więc tworzymy komponent RequestCreator który na podstawie pliku xml (a dokoładnie tagu ) będzie tworzył pdf ->PdfRerquest albo color -> ColorProofingRequest. Przykładowy plik xml:
  1. <span style="color: rgb(255, 0, 0);"><request></span> <span style="color: rgb(255, 0, 0);"><name>pdf</name></span> <span style="color: rgb(255, 0, 0);"><paramter>300dpi</paramter></span> <span style="color: rgb(255, 0, 0);"></request></span>  

Nasz klasa RequestCreator wygląda tak:
  1. <span style="font-size:85%;">  
  2. package com.itsilesia.jmsexample;  
  3.   
  4. import java.io.StringReader;  
  5.   
  6. import javax.xml.parsers.DocumentBuilder;  
  7. import javax.xml.parsers.DocumentBuilderFactory;  
  8.   
  9. import org.mule.api.MuleEventContext;  
  10. import org.mule.api.MuleMessage;  
  11. import org.mule.api.lifecycle.Callable;  
  12. import org.w3c.dom.Document;  
  13. import org.w3c.dom.Element;  
  14. import org.w3c.dom.Node;  
  15. import org.w3c.dom.NodeList;  
  16. import org.xml.sax.InputSource;  
  17.   
  18. /** 
  19. * @author lipka 
  20. * 
  21. */  
  22. public class RequestCreator implements Callable {  
  23.   
  24. public Object onCall(MuleEventContext context) throws Exception {  
  25. MuleMessage message = context.getMessage();  
  26. String xmlFile = message.getPayloadAsString();  
  27. try {  
  28.     DocumentBuilder documnetBuilder = DocumentBuilderFactory  
  29.             .newInstance().newDocumentBuilder();  
  30.     Document document = documnetBuilder.parse(new InputSource(  
  31.             new StringReader(xmlFile)));  
  32.   
  33.     document.getDocumentElement().normalize();  
  34.   
  35.     NodeList list = document.getElementsByTagName("request");  
  36.   
  37.     for (int i = 0; i < list.getLength(); i++) {  
  38.         Node request = list.item(i);  
  39.         if (request.getNodeType() == Node.ELEMENT_NODE) {  
  40.             Element requestElement = (Element) request;  
  41.             NodeList nameList = requestElement  
  42.                     .getElementsByTagName("name");  
  43.             Element nameElement = (Element) nameList.item(0);  
  44.   
  45.             NodeList textNameList = nameElement.getChildNodes();  
  46.             String name = ((Node) textNameList.item(0)).getNodeValue().trim();  
  47.             p(name);  
  48.   
  49.             NodeList paramterList = requestElement  
  50.                     .getElementsByTagName("paramter");  
  51.             Element paramterElement = (Element) paramterList.item(0);  
  52.   
  53.             NodeList textParamterList = paramterElement.getChildNodes();  
  54.      
  55.             String parameters = ((Node) textParamterList.item(0)).getNodeValue().trim();  
  56.             p(parameters);  
  57.      
  58.             if(name.equals("pdf")){  
  59.                 PdfRequest pdfRequest = new PdfRequest();  
  60.                 pdfRequest.setParamters(parameters);  
  61.                 return pdfRequest;  
  62.             }  
  63.             if(name.equals("color")){  
  64.                 ColorProofingRequest colorProofingRequest = new ColorProofingRequest();  
  65.                 colorProofingRequest.setParamters(parameters);  
  66.                 return colorProofingRequest;  
  67.             }  
  68.         }  
  69.     }  
  70. catch (Exception e2) {  
  71.     p("exception");  
  72.     e2.printStackTrace();  
  73. }  
  74. return false;  
  75. }  
  76.   
  77. void p(String string) {  
  78. System.out.println(string);  
  79. }  
  80. }  
  81. </span>  

Więc mamy klasę która pobiera PayloadAsString czyli przerabia nasz plik xml w String potem jest parsowany i w zależności od nazwy tworzymy klasę PdfRequest albo ColorProofingRequest. Oby dwie klasy wyglądają identycznie, jedna dla przykładu:
  1. <span style="font-size:85%;">  
  2. package com.itsilesia.jmsexample;  
  3.   
  4. import java.io.Serializable;  
  5.   
  6. /** 
  7. * @author lipka 
  8. * 
  9. */  
  10. public class PdfRequest implements Serializable{  
  11. private String paramters;  
  12.   
  13. /** 
  14. * @return the paramters 
  15. */  
  16. public String getParamters() {  
  17. return paramters;  
  18. }  
  19.   
  20. /** 
  21. * @param paramters the paramters to set 
  22. */  
  23. public void setParamters(String paramters) {  
  24. this.paramters = paramters;  
  25. }  
  26. }  
  27. </span>  

Teraz pozostaje nam podłączyć JMS do mule, musimy dodać więc kolejną linie do naszego pliku konfiguracyjnego:
  1. <span style="color: rgb(255, 0, 0);"><jms:activemq-connector name="jmsCon"</span> <span style="color: rgb(255, 0, 0);">        brokerURL="tcp://localhost:61616" /></span>  

później trzeba zdefiniować transformacje, żeby stworzony przez nasz obiekt wsadzić do JMS:
<jms:object-to-jmsmessage-transformer name="ObjectToJMS" />
teraz pozostaje nam jeszcze w zależności od zwróconego przez RequestCreator klasy wrzucić dany obiekt do odpowiedniej kolejki, a w przypadku gdy żaden obiekt nie będzie pasował wrzucamy go do kolejki request.invalid, więc tak wygląda obsługa wrzucenie czegoś do kolejki:
  1. <span style="color: rgb(255, 0, 0);"><forwarding-catch-all-strategy></span>  
  2. <span style="color: rgb(255, 0, 0);">     <jms:outbound-endpoint queue="request.invalid" /></span>  
  3. <span style="color: rgb(255, 0, 0);">    </forwarding-catch-all-strategy></span>  
  4. <span style="color: rgb(255, 0, 0);">    <filtering-router></span>  
  5. <span style="color: rgb(255, 0, 0);">     <jms:outbound-endpoint queue="request.pdf" transformer-refs="ObjectToJMS"/></span>  
  6. <span style="color: rgb(255, 0, 0);">     <payload-type-filter expectedType="com.itsilesia.jmsexample.PdfRequest"/> </span>  
  7. <span style="color: rgb(255, 0, 0);">    </filtering-router></span>  
  8. <span style="color: rgb(255, 0, 0);">    <filtering-router></span>  
  9. <span style="color: rgb(255, 0, 0);">     <jms:outbound-endpoint</span>  
  10. <span style="color: rgb(255, 0, 0);">      queue="request.colorproofing" transformer-refs="ObjectToJMS" /></span>  
  11. <span style="color: rgb(255, 0, 0);">      <payload-type-filter expectedType="com.itsilesia.jmsexample.ColorProofingRequest"/></span>  
  12. <span style="color: rgb(255, 0, 0);">    </filtering-router></span>  

a cały plik konfiguracyjny wygląda tak:
  1. <span style="color: rgb(255, 0, 0);"><?xml version="1.0" encoding="UTF-8"?>  
  2. <mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4. xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.0"  
  5. xmlns:file="http://www.mulesource.org/schema/mule/file/2.0"  
  6. xmlns:xm="http://www.mulesource.org/schema/mule/xml/2.0"  
  7. xmlns:ftp="http://www.mulesource.org/schema/mule/ftp/2.0"  
  8. xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.0"  
  9. xsi:schemaLocation="http://www.mulesource.org/schema/mule/core/2.0  
  10.    http://www.mulesource.org/schema/mule/core/2.0/mule.xsd  
  11.    http://www.mulesource.org/schema/mule/stdio/2.0  
  12.    http://www.mulesource.org/schema/mule/stdio/2.0/mule-stdio.xsd  
  13.    http://www.mulesource.org/schema/mule/file/2.0  
  14.    http://www.mulesource.org/schema/mule/file/2.0/mule-file.xsd  
  15.    http://www.mulesource.org/schema/mule/xml/2.0  
  16.    http://www.mulesource.org/schema/mule/xml/2.0/mule-xml.xsd  
  17.            http://www.mulesource.org/schema/mule/ftp/2.0  
  18.            http://www.mulesource.org/schema/mule/ftp/2.0/mule-ftp.xsd  
  19.            http://www.mulesource.org/schema/mule/jms/2.0 http://www.mulesource.org/schema/mule/jms/2.0/mule-jms.xsd">  
  20.   
  21. <description>JMS connector</description>  
  22.   
  23. <jms:activemq-connector name="jmsCon"  
  24.     brokerURL="tcp://localhost:61616" />  
  25.   
  26. <jms:object-to-jmsmessage-transformer name="ObjectToJMS" />  
  27.   
  28. <model>  
  29.     <service name="jmsService">  
  30.         <inbound>  
  31.             <ftp:inbound-endpoint user="lipka" password="****"  
  32.                 host="localhost" port="21" path="/Users/lipka/in"  
  33.                 pollingFrequency="10000">  
  34.                 <file:filename-wildcard-filter pattern="*.xml" />  
  35.             </ftp:inbound-endpoint>  
  36.         </inbound>  
  37.         <component class="com.itsilesia.jmsexample.RequestCreator" />  
  38.         <outbound>  
  39.             <forwarding-catch-all-strategy>  
  40.                 <jms:outbound-endpoint queue="request.invalid" />  
  41.             </forwarding-catch-all-strategy>  
  42.             <filtering-router>  
  43.                 <jms:outbound-endpoint queue="request.pdf" transformer-refs="ObjectToJMS"/>  
  44.                 <payload-type-filter expectedType="com.itsilesia.jmsexample.PdfRequest"/>  
  45.             </filtering-router>  
  46.             <filtering-router>  
  47.                 <jms:outbound-endpoint  
  48.                     queue="request.colorproofing" transformer-refs="ObjectToJMS" />  
  49.                     <payload-type-filter expectedType="com.itsilesia.jmsexample.ColorProofingRequest"/>  
  50.             </filtering-router>  
  51.         </outbound>  
  52.     </service>  
  53. </model>  
  54. </mule></span><span style="color: rgb(255, 0, 0);">  
  55. <span style="color: rgb(0, 0, 0);"></span></span>  
Uruchamiamy jconsole, żeby śledzić co się dzieje w Active MQ
uruchamiamy mule:
lukasz-lipkas-computer:~/Documents/workspace/JMSRequest lipka$ mule -config conf/jmsticket-config.xml

wrzucamy jakieś pliki xml, prawidłowy lub nie:) i patrzymy jak zapełniają się nasze kolejki w Apache Active MQ
Mule:
Jak widać nasz request zostały umieszczone w kolejkach:) Więc w następnym wpisie trzeba będzie je pobrać i na przykład przekazać jako parametry do jakiegoś programu, chyba, że ktoś ma jakiś inny pomysł:)każdy pomysł mile widziany:)

piątek, 12 września 2008

Mule 2.0.0 i 2.0.2 ftp problem

niestety podczas dłuższego działania poprzednie przykładu Mule ftp bez linijki kodu
okazało się, że lecą jakieś dziwne wyjątki i aplikacja odmawia posłuszeństwa, w nieskończoność rzucając wyjątki. Znalazłem w Mule - JIRA zgłoszenie problemu i okazało się, że nie działa to na Linux'ie, Windows'ie i ja dodałem zgłoszenie, że również nie działa pod Mac OS X. Dla zainteresowanych rozwiązaniem tego problemu, polecam śledzienie wątku http://mule.mulesource.org/jira/browse/MULE-3192

środa, 10 września 2008

Wystartowała grupa Silesia JUG


9.09.2008 odbyło się w Katowicach spotkanie miłośników Javy i nie tylko z Jackiem Laskowski, podzielił on się z nami swoim doświadczeniem jeśli chodzi o jego działalność leadera w JUG Warszawa. No i tak się zaczęło, mamy już teraz grupę dyskusyjną Silesia JUG zarejestrowanych już 24 członków i dostałem parę e-maili od ludzi którzy nie śmiało, ale chętnie mówią o tym, że jak będzie inicjatywa to z chęcią wpadną. Więc moi drodzy proszę wszystkich ze Śląska i nie tylko o opinie na grupie dyskusyjnej z czego byście chcieli wykłady/warsztaty.
Dobra to na tyle, jeszcze tylko wspólne zdjęcie od prawej Damian Łukasik, Marcin Kołoczek, Michał Kroliczek, Łukasz Grzesik, Jacek i ja (mocna ekipa:))
gorąca dyskusja czy EJB3 już jest martwe, i jak Jacek wskazuje palcem, że nie:)

i droga powrotna, zabawy z długim czasem naświetlania.

A teraz czas na powrót do Mule.
PS. Może ludzie z SILESIA JUG którzy jadą na JDD wspólnie się wybiorą do Krakowa?

poniedziałek, 8 września 2008

Dlaczego warto czytać blogi :)

Jakiś czas temu czytając wpis Grzegorza Dudy o tytule JDD za darmo . Odpowiedziałem na parę pytań na stronie konferencji Java Developer Day 2008 i dzisiaj dostałem bardzo miłego e-maila o tytule "Wygrana w konkursie Java Developers' Day 2008!". Więc 16 października będę miał okazję wysłuchać wielu ciekawych prezentacji:) Dzięki Grzesiek za wpis i za javapassion z Sang Shin w Krakowie.

czwartek, 4 września 2008

Mule ftp bez linijki kodu

Zadanie na dzisiaj to pobieranie pliku o konkretnym rozszerzeniu "pdf" (przypuśćmy, że to będzie dokument pdf gotowy do wydruku) z serwera ftp i przekopiowanie go do jakiegoś konkretnego katalogu na dysku lokalnym, skąd będzie go można wydrukować. Całość zostanie napisane bez napisania linii kodu w Javie, sama edycja pliku konfiguracyjnego. Więc zaczynamy, najpierw trzeba połączyć się z serwerem ftp:
<ftp:inbound-endpoint user="lipka" password="******"
host="localhost" port="21" path="/Users/lipka/in" pollingFrequency="10000">
<file:filename-wildcard-filter pattern="*.pdf" />
</ftp:inbound-endpoint>

tutaj chyba nie trzeba niczego tłumaczyć. A potem przesunąć to co przyniesie nam ftp do konkretnego katalogu:
<file:outbound-endpoint path="/Users/lipka/out"
outputPattern="${ORIGINALNAME}">
</file:outbound-endpoint>
skoro mamy już wszystko (${ORIGINALNAME} - oznacza że plik nie zmieni nazwy podczas przenoszenia):) to teraz całość wygląda tak:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.0"
xmlns:file="http://www.mulesource.org/schema/mule/file/2.0"
xmlns:xm="http://www.mulesource.org/schema/mule/xml/2.0"
xmlns:ftp="http://www.mulesource.org/schema/mule/ftp/2.0"
xsi:schemaLocation="http://www.mulesource.org/schema/mule/core/2.0
http://www.mulesource.org/schema/mule/core/2.0/mule.xsd
http://www.mulesource.org/schema/mule/stdio/2.0
http://www.mulesource.org/schema/mule/stdio/2.0/mule-stdio.xsd
http://www.mulesource.org/schema/mule/file/2.0
http://www.mulesource.org/schema/mule/file/2.0/mule-file.xsd
http://www.mulesource.org/schema/mule/xml/2.0
http://www.mulesource.org/schema/mule/xml/2.0/mule-xml.xsd
http://www.mulesource.org/schema/mule/ftp/2.0
http://www.mulesource.org/schema/mule/ftp/2.0/mule-ftp.xsd">

<description>FTP connector</description>
<model>
<service name="ftpService">
<inbound>
<ftp:inbound-endpoint user="lipka" password="****"
host="localhost" port="21" path="/Users/lipka/in" pollingFrequency="10000">
<file:filename-wildcard-filter pattern="*.pdf" />
</ftp:inbound-endpoint>
</inbound>

<outbound>
<outbound-pass-through-router>
<file:outbound-endpoint path="/Users/lipka/out"
outputPattern="${ORIGINALNAME}">
</file:outbound-endpoint>
</outbound-pass-through-router>
</outbound>
</service>
</model>
</mule>

Po uruchomieniu mule:
lukasz-lipkas-computer:~/Documents/workspace/FtpConnector lipka$ mule -config conf/mule-config.xml
wrzucamy do ustalonego folderu na ftp plik o rozszerzeniu .pdf i patrzymy co się dzieje:
INFO 2008-09-04 16:19:21,454 [connector.file.0.dispatcher.1] org.mule.transport.file.FileMessageDispatcher: Connected: FileMessageDispatcher{this=63b8c1, endpoint=file:///Users/lipka/out, disposed=false}
INFO 2008-09-04 16:19:21,456 [connector.file.0.dispatcher.1] org.mule.transport.file.FileConnector: Writing file to: /Users/lipka/out/invoice113397.pdf

Jak widać wszystko działa tak jak chcemy:) można też spróbować wrzucić pliki o innym rozszerzeniu do podanego folderu i zobaczyć co się stanie, w naszym przypadku nic się nie powinno dziać.