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:

<request> <name>pdf</name> <paramter>300dpi</paramter> </request>

Nasz klasa RequestCreator wygląda tak:


package com.itsilesia.jmsexample;

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.mule.api.MuleEventContext;
import org.mule.api.MuleMessage;
import org.mule.api.lifecycle.Callable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
* @author lipka
*
*/
public class RequestCreator implements Callable {

public Object onCall(MuleEventContext context) throws Exception {
MuleMessage message = context.getMessage();
String xmlFile = message.getPayloadAsString();
try {
DocumentBuilder documnetBuilder = DocumentBuilderFactory
.newInstance().newDocumentBuilder();
Document document = documnetBuilder.parse(new InputSource(
new StringReader(xmlFile)));

document.getDocumentElement().normalize();

NodeList list = document.getElementsByTagName("request");

for (int i = 0; i < list.getLength(); i++) {
Node request = list.item(i);
if (request.getNodeType() == Node.ELEMENT_NODE) {
Element requestElement = (Element) request;
NodeList nameList = requestElement
.getElementsByTagName("name");
Element nameElement = (Element) nameList.item(0);

NodeList textNameList = nameElement.getChildNodes();
String name = ((Node) textNameList.item(0)).getNodeValue().trim();
p(name);

NodeList paramterList = requestElement
.getElementsByTagName("paramter");
Element paramterElement = (Element) paramterList.item(0);

NodeList textParamterList = paramterElement.getChildNodes();

String parameters = ((Node) textParamterList.item(0)).getNodeValue().trim();
p(parameters);

if(name.equals("pdf")){
PdfRequest pdfRequest = new PdfRequest();
pdfRequest.setParamters(parameters);
return pdfRequest;
}
if(name.equals("color")){
ColorProofingRequest colorProofingRequest = new ColorProofingRequest();
colorProofingRequest.setParamters(parameters);
return colorProofingRequest;
}
}
}
} catch (Exception e2) {
p("exception");
e2.printStackTrace();
}
return false;
}

void p(String string) {
System.out.println(string);
}
}


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:


package com.itsilesia.jmsexample;

import java.io.Serializable;

/**
* @author lipka
*
*/
public class PdfRequest implements Serializable{
private String paramters;

/**
* @return the paramters
*/
public String getParamters() {
return paramters;
}

/**
* @param paramters the paramters to set
*/
public void setParamters(String paramters) {
this.paramters = paramters;
}
}


Teraz pozostaje nam podłączyć JMS do mule, musimy dodać więc kolejną linie do naszego pliku konfiguracyjnego:

<jms:activemq-connector name="jmsCon" brokerURL="tcp://localhost:61616" />

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:

<forwarding-catch-all-strategy>
<jms:outbound-endpoint queue="request.invalid" />
</forwarding-catch-all-strategy>
<filtering-router>
<jms:outbound-endpoint queue="request.pdf" transformer-refs="ObjectToJMS"/>
<payload-type-filter expectedType="com.itsilesia.jmsexample.PdfRequest"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint
queue="request.colorproofing" transformer-refs="ObjectToJMS" />
<payload-type-filter expectedType="com.itsilesia.jmsexample.ColorProofingRequest"/>
</filtering-router>

a cały plik konfiguracyjny 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"
xmlns:jms="http://www.mulesource.org/schema/mule/jms/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
http://www.mulesource.org/schema/mule/jms/2.0 http://www.mulesource.org/schema/mule/jms/2.0/mule-jms.xsd">

<description>JMS connector</description>

<jms:activemq-connector name="jmsCon"
brokerURL="tcp://localhost:61616" />

<jms:object-to-jmsmessage-transformer name="ObjectToJMS" />

<model>
<service name="jmsService">
<inbound>
<ftp:inbound-endpoint user="lipka" password="****"
host="localhost" port="21" path="/Users/lipka/in"
pollingFrequency="10000">
<file:filename-wildcard-filter pattern="*.xml" />
</ftp:inbound-endpoint>
</inbound>
<component class="com.itsilesia.jmsexample.RequestCreator" />
<outbound>
<forwarding-catch-all-strategy>
<jms:outbound-endpoint queue="request.invalid" />
</forwarding-catch-all-strategy>
<filtering-router>
<jms:outbound-endpoint queue="request.pdf" transformer-refs="ObjectToJMS"/>
<payload-type-filter expectedType="com.itsilesia.jmsexample.PdfRequest"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint
queue="request.colorproofing" transformer-refs="ObjectToJMS" />
<payload-type-filter expectedType="com.itsilesia.jmsexample.ColorProofingRequest"/>
</filtering-router>
</outbound>
</service>
</model>
</mule>

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ć.