środa, 17 grudnia 2008

Mule wydajność i OSGi

Trochę późno, ale w końcu zebrałem się, żeby podsumować swoją prelekcje. Pierwszą rzeczą która mnie bardzo zaskoczyła była współpraca z MuleSource Inc. Którzy umieścili informacje o moim wykładzie na mule blog (skąd można pobrać moją prezentację :))co niesamowicie mnie zaskoczyło i ucieszyło :) Udało mi się też uzyskać parę ciekawych informacji o które pytaliście po wykładzie (prosto ze źródła od Ross Masona):)
A więc tak firmy które oficjalnie używają Mule:
- LeapFrog, VetSource, OpSource, H&R Block are publically reference-able. (tak naprawdę jest ich dużo więcej, ale nie chcą się tym pochwalić, czytaj nie mogą)
Testy wydajności w linkach poniżej:
Mule ESB datasheet (this details what Mule is and why Mule)
Mule Performance Test Results (a paper detailing performance tests including proper configuration and methodology)
Ciekawe filmy, żeby zacząć pracę z mule 2.0 dostępne pod adresem:
demos
A na koniec dla mnie osobiście bardzo ważna informacja, że Mule jest OSGi ready i w planach jest bardzo duże wsparcie dla "hot deployment using OSGi".
Mam nadzieje, że o niczym nie zapomniałem:)

poniedziałek, 8 grudnia 2008

4. Spotkanie Śląskiej Grupy Użytkowników Technologii Java ( Silesia JUG )

Śląska Grupa Użytkowników Technologii Java (Silesia JUG) serdecznie
zaprasza wszystkich na czwarte spotkanie, które odbędzie się
10.12.2008 o godzinie 18:30 w COIG (Centralny Ośrodek Informatyki
Górnictwa S.A.) w sali 136 na pierwszym piętrze, ul.Mikołowska 100.

Temat prezentacji: Kryptografia w Javie
Prowadzący: Zacheusz Siedlecki

Plan prezentacji:

Podstawy kryptografii w Javie
- Wprowadzenie
- Architektura JCA i JCE
- Szyfry symetryczne i asymetryczne
- Magazyny kluczy
- Skróty kryptograficzne
- Certyfikaty, podstawy PKI
- Podpis cyfrowy
- Dostawca usług kryptograficznych, konfiguracja

Praktyczne zastosowania (także z użyciem kart kryptograficznych)
- Wykorzystanie kart kryptograficznych (PKCS#11)
- Szyfrowanie strumienia
- Uwierzytelnianie klienta SSL certyfikatem
- Podpisywanie dokumentów PDF

Prezentacja będzie polegała w głównej mierze na omawianiu kodów
przykładowych programów.
Karty kryptograficzne użyte w przykładach zostały udostępnione przez
firmę CryptoTech.

Zapraszam wszystkich w imieniu Zacheusza i Silesia JUG.

czwartek, 4 grudnia 2008

Wizualizacja realacji tabel w bazach danych

Dzisiaj przyszło mi się zmierzyć ze zmianami w bazie danych (a dokładnie w jej strukturze), po chwili patrzenia we wszystkie tabele, zapragnąłem przed rozpoczęciem refaktoryzacji zobaczyć jak to wszystko wygląda wizualnie, niestety nie udało mi się znaleźć żadnej wtyczki do Eclipsa (może ktoś zna?) Postanowiłem użyć narzędzia The Universal Database Tool DbVisualizer działa na Mac OS więc ściągam i instaluje:)
Rozpoczynamy od konfiguracji połączenia z bazą danych w moim przypadku Postgresql.
Wpisujemy nazwę połączenia.

Wybieramy bazę danych.

Uzupełniamy konfigurację połączenia.

Gotowe, możemy zobaczyć co to narzędzie potrafi.

Teraz łączymy się z naszą bazą.

Teraz sprawdzamy References w graficznej postaci.

Klikamy References i chwilę czekamy i dostajemy całość.

Z jedną tabelą i paroma zależnościami poszło szybko, zobaczymy jaki będzie efekt jak użyję References na wszystkich tabelach.

Jak dla mnie efekt dosyć dobry teraz tylko sobie to wydrukuje i mogę zabrać się za zmienianie:) Ktoś zna jakieś lepsze narzędzie ?

sobota, 22 listopada 2008

3. Spotkanie Śląskiej Grupy Użytkowników Technologii Java (Silesia JUG)

Śląska Grupa Użytkowników Technologii Java (Silesia JUG) serdecznie zaprasza wszystkich na trzecie spotkanie, które odbędzie się 25.11.2008 o godzinie 18:30 w COIG (Centralny Ośrodek Informatyki Górnictwa S.A.) w sali 136 na pierwszym piętrze, ul.Mikołowska 100.

Temat prezentacji: Open source ESB - MULE ESB
Prowadzący: Łukasz Lipka

Cześć teoretyczna:
  • wprowadzenie do SOA (Serive Oriented Architecture)
  • wprowadzenie do ESB (Enterprise Service Bus)
  • przegląd dostępnych open source ESB
  • możliwości ESB w oparciu o MULE ESB:
  • rutowanie
  • transformacja wiadomości
  • obsługa wiadomości
  • zabezpieczenia
  • monitorowanie i zarządzanie
  • dlaczego firmy uważają ESB za swoją tajną broń:)
  • korzyści płynące z korzystania z ESB.
Cześć praktyczna:
  • pokaz rutowania wiadomości (gdzie podziały się moje wiadomości)
  • połączenie z JMS
  • użycie Springa do wstrzykiwania zależności
  • komunikacja z bazą danych

Łukasz Lipka jest wielkim fanem i pasjonatem języka Java, zawodowo związany z firmą itSilesia. Jest architektem rozwiązań biznesowych. Interesuje się Javą (od SE po EE) we wszystkich jej ujęciach, śledzi takie projekty jak Mule ESB, Apache ActiveMQ. Pasjonuje się wzorcami projektowymi i Test Driven Development. Założyciel Silesia JUG.

Po prezentacji (1,5h) odbędzie się krótka pogawędka (15 - 30 minut).
Po prezentacji pytania dla obecnych, gdzie będzie można wygrać:
a. IntelliJ IDEA Personal License
b. ReSharper Personal License
c. TeamCity Build Agent
d. Ruby IDE Personal License

Wstęp wolny!

Zapraszam w imieniu swoim i grupy Silesia JUG!




niedziela, 16 listopada 2008

2. Spotkanie Śląskiej Grupy Użytkowników Technologii Java (Silesia JUG)

Śląska Grupa Użytkowników Technologii Java (Silesia JUG) serdecznie zaprasza wszystkich na drugie spotkanie, które odbędzie się 19.11.2008 o godzinie 18:30 w COIG (Centralny Ośrodek Informatyki Górnictwa S.A.) w sali 136 na pierwszym piętrze, ul.Mikołowska 100.

Temat prezentacji: NetBeans Platform
Prowadzący: Marek Kliś

Plan prezentacji:
- Wykorzystanie platformy NetBeans do tworzenia aplikacji typu Desktop
- Tworzenie aplikacji działającej samodzielnie, oraz aplikacji będącej modułem rozszerzającym NetBeans IDE
- bibliotek Visual Library
- nowości w NetBeans 6.5

"Planuje zdecydowani więcej kodowania (na żywo) niż teorii." Marek Kliś

Po prezentacji (1,5h) odbędzie się krótka pogawędka (15 - 30 minut).
Po prezentacji pytania dla obecnych, gdzie będzie można wygrać:
a. IntelliJ IDEA Personal License
b. ReSharper Personal License
c. TeamCity Build Agent
d. Ruby IDE Personal License

Wstęp wolny!

Zapraszam w imieniu Marka i grupy Silesia JUG!


poniedziałek, 10 listopada 2008

Debugging Wicket w Eclipse z Jetty

Zadanie na dziś przedebugować aplikacje napisaną z użyciem Wicket i działającą na serwerze Jetty. Wybieramy Run/External Tools/External Tools ..."
Potem dodajemy nowa konfiguracje, klikamy add new launch konfigurations
Wpisujemy od góry ścieżkę gdzie jest zainstalowany maven, projekt który chcemy debugować, a na samym końcu argumenty do maven: "jetty:run". Później przechodzimy do zakładki "Environment" i dodajemy nową zmienną MAVEN_OPTS z wartościami:
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=n

Klikamy Run. Jeśli chcemy żeby serwer czekał na podłączenie debuggera ustawiamy ostatni parametr na y czyli suspend=y . Teraz tylko podłączenie debuggera
wybieramy Remote Java Application
wybieramy projekt do którego chcemy się podłączyć i potem wpisujemy hosta plus port jaki ustawiliśmy address=4000 teraz już tylko Debug :) postawić break pointy i udanej zabawy:)

wtorek, 4 listopada 2008

Spring property-placeholder i zewnętrzny plik properties

oj dzisiaj trochę czasu straciłem, niż w końcu znalazłem na jakimś bloku w komentarzu, dręczącą mnie odpowiedź, jak w Springu wczytać coś do ziarna springowego z zewnętrznego pliku properties.
Przykład z Mule 2.0.2 który wewnętrznie stosuje Springa, do wczytania pliku konfiguracyjnego:
<context:property-placeholder location="file:///Users/lipka/Documents/workspace/JMSRequest_Spring/conf/soft.properties" />
wczytanie properties w przypadku gdy w jarze mamy, następującą strukturę conf/soft.properties (wewnętrznie) wtedy odwołanie do properties wygląda tak:
<context:property-placeholder location="conf/soft.properties" />
odwołanie się do konkretnej wartości z pliku properties w ziarnie wygląda tak:
<spring:bean id="externalProgram" class="com.itsilesia.jmsexample.RunMe">
<spring:property name="programPath" value="${soft}"></spring:property>
</spring:bean>
a sam plik soft.properties
soft=/Applications/DrawIt.app/Contents/MacOS/DrawIt
Z ciekawych rzeczy to wysychałem dzisiaj http://agiletuning.pl/ o programowaniu w parach, gorąco polecam.
PS. jeśli mamy więcej plików properties to porostu po przecinku je dodajemy:)

wtorek, 28 października 2008

JDD 2008

Już trochę po JDD 2008, ale dopiero teraz znalazłem chwilę, żeby z notatek zrobić wpis i nie zapomnieć, o pewnych fajnych rzeczach które przyszły mi do głowy. Przedstawię to w postaci tabelarycznej wykład i co z niego mi zostało w głowie :)
  • Keynote - Ted Neward (ciekawa prezentacja o przyszłośći języków programowania)
  • "Wejście szpiega" Szczepan Faber - http://code.google.com/p/mockito/ (fajne bo Polskie:) a tak na prawdę to będę się musiał temu bliżej przyjrzeć )
  • Szkolenie z Mockito z Igor Czechowski, Bartosz Bańkowski, Szczepan Faber (szybko, profesjonalnie i przystępny wstęp do testowania za pomocą Mockito)
  • Keynote - Neal Ford (podziwiam za więdzę i sposób prezentacji, to co trochę zasmuciło to dosyć ostra krytyka Javy (przynajmniej ja to tak odebrałem) dlatego zerknę na Ruby raczej JRuby:))
  • "Wprowadzenie do OSGI i Spring-DM" Jacek Laskowski (super show plus profesjonalizm, po zatym to muszę się temu na poważnie przyjżeć bo Jacek pokazał, że drzemią w tym mechaniźmie ogromne moźliwości)
Konferencję uważam za bardzo udaną, choć szkoda, że nie udało mi się wysłuchać wykładów Waldemara Kota, Adama Bien, Adama Warski (Envers - to muszę sprawdzić koniecznie), Szymona Brandys. Jeszczę jedna rzecz która bardzo mnie ucieszyła to duża reprezentacja Silesia JUG na JDD:) Oby więcej takich konferencji:)

poniedziałek, 27 października 2008

Wrażenie po pierwszym spotkaniu Silesia JUG:)

Jadąc na spotkanie myślałem sobie dobrze jak będzie jakieś 15 - 20 osób, to będzie sukces:) jak dotarłem na miejsce, nie mogłem uwierzyć pełna sala :) (prawie 60 osób, dla tych co nie wierzą fotka)


Na początek przywitał nas wicedyrektor COIG i opowiedział w skrócie czym firma się zajmuje. Potem ja krótko opowiedziałem jak to się wszystko zaczęło od spotkania z Jackiem Laskowskim, a następnie Maciej Matecki zaczarował zgromadzonych wystąpieniem o GWT.

Jeszcze chwila dla sponsorów:) (według zgłoszeń)

itSilesia
QNT Systemy informatyczne
WASKO
Alan Systems

Później odbyła się krótka pogawędka o przyszłości Silesia JUG oraz temat Spring kontra EJB3 i sądzę, że w związku z tym na jakimś kolejnym spotkaniu dojdzie do konfrontacji tych dwóch technologii. No nic teraz tylko pozostaje tak zorganizować następne spotkania, żeby przyszło co najmniej tyle samo osób:)

wtorek, 7 października 2008

1. Spotkanie Śląskiej Grupy Użytkowników Technologii Java (Silesia JUG)

Śląska Grupa Użytkowników Technologii Java (Silesia JUG) serdecznie zaprasza wszystkich na pierwsze spotkanie, które odbędzie się 14.10.2008 o godzinie 18:30 w COIG (Centralny Ośrodek Informatyki Górnictwa S.A.) w sali 517 na pierwszym piętrze, ul.Mikołowska 100.

Temat prezentacji: GWT (Google Web Toolkit) - od początku do pierwszej aplikacji
Prowadzący: Maciej Matecki

Plan prezentacji:
część teoretyczna:

- krótka historia GWT
- co jest potrzebne?
- dostępne kontrolki
- Remote Procedure Call (RPC)

część praktyczna:

- jak zacząć?
- moje pierwsze RPC
- zdarzenia
- obsługa wyjątków

część teoretyczna po raz kolejny:

- przegląd bibliotek ułatwiających pracę z GWT
- przegląd obowiązkowych bibliotek
- co się nie załapało na prezentację, a co można poruszyć na innych
spotkaniach - tematy bardziej zaawansowane


Po prezentacji (1,5h) odbędzie się krótka pogawędka na temat dalszego
rozwoju Silesia JUG.
Po prezentacji pytania dla obecnych, gdzie będzie można wygrać:
a. IntelliJ IDEA Personal License
b. ReSharper Personal License
c. TeamCity Build Agent
d. Ruby IDE Personal License

Wstęp wolny!

Zapraszam w imieniu Maćka i grupy Silesia JUG!
Chcesz zostać patronatem, daj nam książkę a logo twojej firmy zostanie dodane do plakatu:)
PS. Jeśli jesteś studentem rozwieś ten plakat na swojej uczelni:) link do wersji do wydruku:)

czwartek, 2 października 2008

Eclipse - długość linii

Zadanie od kolegi, jak zmienić długość linii w Eclipse, Preferences -> Java Code Style -> Formatter odznaczamy Enable project specific settings, tworzymy nowy Profil klikamy New i wybieramy nazwę i bazę dla naszych nowych ustawień.

Potem idziemy do zakładki Line Wrapping i następnie w Maximum line width: wpisujemy ilość znaków jaką chcemy, żeby Eclipse nam wyświetlało:)

i potem Apply i OK i można się cieszyć ustawioną ilością znaków w linii:)



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


niedziela, 31 sierpnia 2008

Mule "echo" przykład

Po długim okresie nie pisanie czas wrócić do ESB w szczególności Mule 2.0, od czasu mojego ostatniego wpisu na temat instalacji Mule, na stronie projektu ukazała się ogromna ilość dokumentacji :) www.mulesource.org . Więc startujemy tworzymy nowy Mule 2.0 projekt:

Klikamy "Finish" i już mamy projekt stworzony:) Więc tak pierwsze zadanie to stworzyć klasę która będzie sprawdzała czy przekazana wartość z standardowego wejścia to "lukasz" jeśli tak to wypisze przywitanie w innym wypadku rzuci wyjątek.
Więc postępując zgodnie z dobrymi praktykami programistycznymi stworzymy interfejs:
package com.itsilesia;

/**
* @author lipka
*
*/
public interface Echo {
String echoMessage(String echo);
}

teraz implementujemy nasz interfejs:
package com.itsilesia;

/**
* @author lipka
*
*/
public class EchoUMOComponent implements Echo {

public String echoMessage(String echo) {
if(echo.equals("lukasz")){
return "Witaj "+echo;
}else{
throw new IllegalArgumentException("Zle dane");
}
}

}

skoro już mamy klasę, zostało nam tylko teraz napisać odpowiedni plik konfiguracyjny który przeczyta coś ze standardowego wyjścia prześle do naszego komponentu EchoUMOComponent a w razie nie powodzenia będzie w stanie obsłużyć wyjątek (w naszym wypadku wypisać na konsole).
<?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:spring="http://www.springframework.org/schema/beans"
xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.0"
xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
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/vm/2.0 http://www.mulesource.org/schema/mule/vm/2.0/mule-vm.xsd">
<description>Very simple echo example.</description>
<stdio:connector name="SystemStreamConnector"
promptMessage="Wpisz czarodziejskie slowo: " messageDelayTime="1000" />
<model name="echo">
<service name="displayingMessage">
<inbound>
<stdio:inbound-endpoint system="IN" />
</inbound>
<component class="com.itsilesia.EchoUMOComponent" />
<outbound>
<outbound-pass-through-router>
<stdio:outbound-endpoint system="OUT" />
</outbound-pass-through-router>
</outbound>
<default-service-exception-strategy>
<stdio:outbound-endpoint system="OUT" />
</default-service-exception-strategy>
</service>
</model>
</mule>

Krótki opis tego tagów z pliku myecho-config.xml:
  • xsi:schemaLocation="http://www.springframework.org/schema/.. -importujemy niezbędną przestrzeń nazw do dalszej konfiguracji Mule
  • stdio:connector - definiujemy konektor który czyta z standardowego wejścia czyli konsoli i do tego wypisuje nam komunikat zachęcający do wpisanie czegoś
  • model nazwa przez nas stworzonego modelu przetwarzania informacji
  • service name="displayingMessage" tworzenie naszego serwisu
  • inbound określenie danych wejściowych, na które ma reagować nasz model, w naszym przypadku reaguje on na wpisanie wyrazu i wciśnięcie klawisza ENTER
  • component class="com.itsilesia.EchoUMOComponent" po przejściu przez inbound informacja jest przekazywana do naszego komponentu, gdzie następuje przetwarzanie odebranej informacji
  • outbound i outbound-pass-through-router wyłapują informacje po przejściu przez nasz komponent i w naszym wypadku wypisują przetworzoną informacje na standardowe wyście
  • default-service-exception-strategy ten element wyłapuje wyjątki lecące w aplikacji i wypisuje je na standardowe wyjście
Więc wszytko gotowe teraz tylko uruchomić:

********************************************************************************
* A Fatal error has occurred while the server was running: *
* com.itsilesia.EchoUMOComponent (java.lang.ClassNotFoundException) *
* *
* The error is fatal, the system must shutdown *
* Server started: 01.01.70 01:00 *
* Server shutdown: 31.08.08 14:27 *
********************************************************************************

niestety Mule nie mogło znaleźć naszej klasy, musimy ja tam skopiować, najszybciej po prostu zrobić jara za pomocą Eclipse export i potem skopiować go do katalogu gdzie zainstalowaliśmy Mule a dokładni do katalogu lib/user/

Uruchamiamy nasz przykład:
lukasz-lipkas-computer:~/Documents/workspace/MyEcho lipka$ mule -config conf/myecho-config.xml

Wpisz czarodziejskie slowo:
lukasz

INFO 2008-08-31 15:09:23,509 [SystemStreamConnector.dispatcher.1] org.mule.transport.stdio.StdioMessageDispatcher: Connected: StdioMessageDispatcher{this=7d08eb, endpoint=stdio://system.out, disposed=false}
Witaj lukasz

Wpisz czarodziejskie slowo:
lipka
ERROR 2008-08-31 15:09:26,291 [displayingMessage.3] org.mule.service.DefaultServiceExceptionStrategy:
********************************************************************************
Message : Component that caused exception is: displayingMessage. Message payload is of type: String
Type : org.mule.api.service.ServiceException
Code : MULE_ERROR--2
JavaDoc : http://mule.mulesource.org/docs/apidocs/org/mule/api/service/ServiceException.html
Payload : lipka
********************************************************************************
Exception stack is:
1. Zle dane (java.lang.IllegalArgumentException)
com.itsilesia.EchoUMOComponent:16 (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/IllegalArgumentException.html)
2. Component that caused exception is: displayingMessage. Message payload is of type: String (org.mule.api.service.ServiceException)
org.mule.component.DefaultLifecycleAdapter:214 (http://mule.mulesource.org/docs/apidocs/org/mule/api/service/ServiceException.html)
********************************************************************************
Root Exception stack trace:
java.lang.IllegalArgumentException: Zle dane
at com.itsilesia.EchoUMOComponent.echoMessage(EchoUMOComponent.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.mule.model.resolvers.AbstractEntryPointResolver.invokeMethod(AbstractEntryPointResolver.java:147)
at org.mule.model.resolvers.ReflectionEntryPointResolver.invoke(ReflectionEntryPointResolver.java:127)
at org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:50)
at org.mule.component.DefaultLifecycleAdapter.intercept(DefaultLifecycleAdapter.java:202)
at org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:82)
at org.mule.component.AbstractJavaComponent.doOnCall(AbstractJavaComponent.java:73)
at org.mule.component.AbstractComponent.onCall(AbstractComponent.java:87)
at org.mule.model.seda.SedaService$ComponentStageWorker.run(SedaService.java:533)
at org.mule.work.WorkerContext.run(WorkerContext.java:310)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Thread.java:613)

********************************************************************************

ERROR 2008-08-31 15:09:26,292 [displayingMessage.3] org.mule.service.DefaultServiceExceptionStrategy: Message being processed is: org.mule.transport.DefaultMessageAdapter/org.mule.transport.DefaultMessageAdapter@2ed6f9{id=099b0bf3-775e-11dd-a41e-b944827db778, payload=java.lang.String, correlationId=null, correlationGroup=-1, correlationSeq=-1, encoding=UTF-8, exceptionPayload=org.mule.message.DefaultExceptionPayload@237817}
ExceptionMessage{message=lipka, context={MULE_ORIGINATING_ENDPOINT=endpoint.stdio.system.in}exception=org.mule.api.service.ServiceException: Component that caused exception is: displayingMessage. Message payload is of type: String, componentName='displayingMessage', endpointUri=stdio://system.in, timeStamp=Sun Aug 31 15:09:26 CEST 2008}

Wszystko działa więc teraz trzeba będzie to trochę skomplikować i w następnym wpisie połączyć to z jakimś serwerem ftp i jms.

środa, 28 maja 2008

Świetna Javowa konferencja JAVArsovia II

31 maja w Warszawie dobędzie się największa polska konferencja o tematyce Javy. Warto wspomnieć, że konferencja jest za darmo. Więc warto się zarejestrować i kto może to w sobotę do Warszawy. A ci co nie dają rady się tam pojawić mogą tylko liczyć na to, że organizatorzy udostępnią materiały:)

środa, 7 maja 2008

Ciekawa konferencja

Osoby zainteresowane takimi programami jak Scribus, Krita, Inkscape, Gimp, Blender oraz grafiką szeroko pojętą, mogą się udać do Wrocławia na darmową konferencję, więcej informacji na stronie organizatorów Libre Graphics Meeting 2008
Może ktoś z okolic Rybnika się tam wybiera?

piątek, 25 kwietnia 2008

Organizacja repozytorium

Dzisiejszym zadaniem jest zorganizowanie struktury repozytorium pod główny projekt w repozytorium subversion. Podstawowe informacje jak uruchomić svn można przeczytać w wpisie Mariusza Lipińskiego. Dobra a teraz do dzieła tworzymy trzy główne katalogi:
- trunk
- branches
- tags
W trunk trzymamy główną część projektu (najbardziej rozwojowa gałąź), branches przeznaczamy na poprawianie błędów i na eksperymentowanie developerów, jako ostatni został nam katalog tags gdzie zamrażamy konkretne wydania naszego projektu, jakieś ważne wydarzenie z cyklu życia naszego projektu (z reguły koresponduje on do konkretnego podkatalogu branches). Dobrze jest zrobić katalog tags jak katalog tylko do odczytu. Hmm chyba wszystko na początek jakieś uwagi?

poniedziałek, 7 kwietnia 2008

Eclipse Mule IDE

Dodajemy teraz możliwość tworzenia Mule projektów w Eclipse postępujemy z godnie z instrukcja Mule IDE 2.0 Pre-release User Guide Instalujemy niezbędne komponenty do Eclipse 3.3
No i na koniec sama wtyczka z Mule IDE. Dodajemy nowe URL do Software Updates http://dist.muleforge.org/mule-ide/updates-2.0.0/ . Restartujemy Eclipse i tworzymy nowy Mule Project.
Potem musimy jeszcze skonfigurować domyślne ustawienia dla Mule.
Teraz jeszcze tworzymy plik konfiguracyjny za pomocą IDE
Nasz Eclipse IDE zostało przystosowane do pracy z Mule:) W następnym wpisie stworzymy najprostszy działający projekt z użyciem Mule, FTP i mavena.

Apache ActiveMQ instalacja

Instalacja ApacheMQ tak zwanego Message Broker sprowadza się do ściągnięcia źródeł i ich rozpakowania, korzystamy z ActiveMQ 5.0.0 Release. Uruchomianie samego serwisu bez jakiej kol wiek konfiguracji z naszej strony, sprowadza się do przejścia do rozpakowanego katalogu, później podkatalog bin i uruchomienie skryptu uruchamiającego.
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/bin lipka$ ./activemq
Na kosoli po chwili można zobaczyć następujące logi:
Loading message broker from: xbean:activemq.xml
INFO BrokerService - Using Persistence Adapter: AMQPersistenceAdapter(/Users/lipka/Library/apache-activemq-5.0.0/data/localhost)
INFO BrokerService - ActiveMQ 5.0.0 JMS Message Broker (localhost) is starting
INFO BrokerService - For help or more information please see: http://activemq.apache.org/
INFO AMQPersistenceAdapter - AMQStore starting using directory: /Users/lipka/Library/apache-activemq-5.0.0/data/localhost
INFO KahaStore - Kaha Store using data directory /Users/lipka/Library/apache-activemq-5.0.0/data/localhost/kr-store/state
INFO ManagementContext - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
INFO AMQPersistenceAdapter - Active data files: []
INFO KahaStore - Kaha Store using data directory /Users/lipka/Library/apache-activemq-5.0.0/data/localhost/kr-store/data
INFO TransportServerThreadSupport - Listening for connections at: tcp://lukasz-lipkas-computer.local:61616
INFO TransportConnector - Connector openwire Started
INFO TransportServerThreadSupport - Listening for connections at: ssl://lukasz-lipkas-computer.local:61617
INFO TransportConnector - Connector ssl Started
INFO TransportServerThreadSupport - Listening for connections at: stomp://lukasz-lipkas-computer.local:61613
INFO TransportConnector - Connector stomp Started
INFO TransportServerThreadSupport - Listening for connections at: xmpp://lukasz-lipkas-computer.local:61222
INFO TransportConnector - Connector xmpp Started
INFO NetworkConnector - Network Connector org.apache.activemq.transport.discovery.multicast.MulticastDiscoveryAgent@28bdf4 Started
INFO BrokerService - ActiveMQ JMS Message Broker (localhost, ID:lukasz-lipkas-computer.local-50886-1207581085279-0:0) started
INFO TransportConnector - Connector vm://localhost Started
INFO log - Logging to org.slf4j.impl.JCLLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
INFO log - jetty-6.1.4
INFO WebConsoleStarter - ActiveMQ WebConsole initialized.
INFO /admin - Initializing Spring FrameworkServlet 'dispatcher'
INFO log - ActiveMQ Console at http://0.0.0.0:8161/admin
INFO log - ActiveMQ Web Demos at http://0.0.0.0:8161/demo
INFO log - Started SelectChannelConnector@0.0.0.0:8161

Żeby sprawdzić czy działa otwieramy przeglądarkę i sprawdzamy adres http://0.0.0.0:8161/admin
Ostatni test czy wszystko działa poprawnie uruchamiamy przykład dostarczony przez dystrybutora (typowy przykład klient (czeka na 10 wiadomość) producent (produkuje 10 wiadomości)). Do uruchomienia przykładu musimy mieć zainstalowanego Anta. W katalogu gdzie rozpakowaliśmy źródła przechodzimy do pod katalogu examples i w jednej konsoli uruchamiamy klienta w drugiej producenta.
Klient:
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/example lipka$ ant consumer
Producent:
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/example lipka$ ant producer

Wszystko działa:) Teraz już tylko połączyć to z Mule:)


Mule instalacja

Dzisiaj czas zacząć przygodę z jednym z najbardziej popularnych, darmowych ESB MULE. Nie będę robił wprowadzenia do ESB, napiszę w skrócie do czego może się przydać.
Moja definicja ESB to:
- szyna umożliwiająca komunikacje pomiędzy różnymi serwisami, jej główne założenie to uproszczenie tworzenia architektury SOA(Service Oriented Architecture) (architektura zorientowana na usługi).
Dobra zobaczymy jak to działa w praktyce, pojawiła się nowa wersja Mule 2.o.o idziemy do Download ściągamy źródła i je rozpakowujemy. Zerkamy jeszcze co nowego w wersji 2.0.0 z ciekawych rzeczy widzę, że w następnych wersjach ma być wsparcie dla OSGi.
The Registry architecture will continue to evolve a bit in future releases and will form the basis of OSGi support in Mule.
Wracając do Mule przed rozpoczęciem całej zabawy należy zainstalować niezbędne oprogramowanie(jvm, maven, ...). Po ściągnięciu i rozpakowaniu , czytamy INSTALL.txt, i wykonujemy następujące polecenia (w zależności od systemu operacyjnego, u mnie mac):
export MULE_HOME=/Users/lipka/Library/mule-2.0.0
export PATH=$PATH:$MULE_HOME/bin
Potem w konsoli piszemy:
mule
podczas pierwszego uruchomienia musimy zaakceptować licencje.
Do you accept the terms and conditions of this license agreement [y/n]?
y
i potem widzimy (maven ściągą niezbędne jary) i na końcu:
Starting the Mule Server...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.

WARN 2008-04-07 13:57:39,559 [WrapperListener_start_runner] org.mule.MuleServer: A configuration file was not set, using default: mule-config.xml


*******************************************************************************
No config file specified and no config by the name of mule-config.xml
found on the classpath.

Usage: mule -config [-builder ] [-debug] [-version]

mule-configuration - a URL for the Mule Config XML to use,
if not specified the config will be loaded from
the classpath

config-builder - a fully qualified class name of the builder to use
to configure Mule.

debug - configure Mule for JPDA remote debugging.
Customize settings by editing a JPDA_OPTS variable
in the mule startup script

version - print full product information
*******************************************************************************


INFO 2008-04-07 13:57:39,594 [Thread-0] org.mule.MuleServer: Mule server shutting down due to normal shutdown request
INFO 2008-04-07 13:57:39,603 [Thread-0] org.mule.MuleServer:
**************************************************************************************
* The server is shutting down due to normal shutdown request *
* Server shutdown: 07.04.08 13:57 *
**************************************************************************************
<-- Wrapper Stopped


Teraz jak już wszystko działa, można uruchomić najprostszy przykład, dostarczony z dystrybucją, w naszym wypadku to będzie Echo Example.
lukasz-lipkas-computer:~/Library/mule-2.0.0 lipka$ cd examples/echo/
lukasz-lipkas-computer:~/Library/mule-2.0.0/examples/echo lipka$ mule -config conf/echo-config.xml
Na konsoli powinna się pokazać możliwość wpisania jakiegoś przykładowego teksty (potem ENTER) i jeszcze raz go wyświetlenie, takie systemowe echo tylko za pomocą UMOComponentu:
**********************************************************************
* Mule ESB and Integration Platform *
* Version: 2.0.0 Build: 11521 *
* MuleSource, Inc. *
* For more information go to http://mule.mulesource.org *
* *
* Server started: 01.01.70 01:00 *
* Server ID: 8e67013c-049b-11dd-b60e-f34003987973 *
* JDK: 1.5.0_13 (mixed mode) *
* OS: Mac OS X (10.4.11, i386) *
* Host: lukasz-lipkas-computer.local (192.168.123.3) *
* *
* Agents Running: None *
**********************************************************************

Please enter something:
helloWorld :)
INFO 2008-04-07 14:10:17,896 [EchoUMO.2] org.mule.component.simple.LogComponent:
********************************************************************************
* Message received in service: EchoUMO. Content is: 'helloWorld :)' *
********************************************************************************
INFO 2008-04-07 14:10:17,911 [SystemStreamConnector.dispatcher.1] org.mule.transport.stdio.StdioMessageDispatcher: Connected: StdioMessageDispatcher{this=185633, endpoint=stdio://system.out, disposed=false}
helloWorld :)

Please enter something:


Mule już działa więc teraz trzeba będzie się przyjrzeć jak można go zastosować w projektach informatycznych.
PS. dla tych co mają maci, krótkie wprowadzenie do shella pod mac OS.




wtorek, 1 kwietnia 2008

Zarządzanie grupą rozproszonych programistów

Rozpoczynam temat z myślą, że jakieś bardziej doświadczone osoby pomogą mi w doborze jak najlepszych praktyk pracy zdalnej grupy programistów.
Z tego co mi się wydaje jedną z ważniejszych rzeczy w udanym projekcie informatycznym jest komunikacja w zespole. Do jak najlepszej komunikacji jak na razie został wybrany skype (nie ma problemu z tworzeniem konferencji paro osobowych).
Skype w praktyce (jeśli zespół jest rozproszony wtedy może zastępować codziennie spotkania w pracy):
- codziennie ta sama godzina konferencji, na której każdy z programistów opisuje co zrobił wczoraj i co planuje na dzisiaj (maksymalny czas na osobę nie powinien przekroczyć 3 -4 min).
Jak jest zaleta tej technologi ? Każdy z programistów wie co dzieje się w projekcie i do kogo się można zwrócić w razie wystąpienia jakiegoś problemu.
W jaki sposób zorganizować programowanie w parach (XP)? W tym wypadku przychodzi nam z pomocą NX dzięki któremu możemy współdzielić ekran, myszkę i klawiaturę z osobą po drugiej stronie globu.
Co do innych narzędzi usprawniających pracę programistów to zastanawiam się nad:
- cruise control (zautomatyzowane budowanie całego projektu uwzględniające junit i generujące raporty o aktualnym stanie projektu)
- trac + mylyn (jako w tyczka do Eclipse) (organizacja zadań z priorytetami)
- do tworzenia dokumentacji jakieś wiki (osobiście polecam jedno z prostszych dokuwiki)
- maven + svn (tutaj chyba nic nie muszę pisać:))
Jeżeli już ktoś pracował w rozproszonym środowisku programistów, proszę o wskazówki jak można usprawnić pracę i komunikację w takim zespole (i jakie narzędzia, praktyki były stosowane).

piątek, 28 marca 2008

AspectJ wprowadzenie część 2

Po przeczytaniu artykułu Jacka Laskowskiego postanowiłem raz jeszcze przetestować Eclipse 3.4M na Mac OS (niestety już nie pamiętam dlaczego, ale jakiś czas temu zainstalowałem, ale coś mi nie działało tak jak miało i wróciłem do 3.3). Więc zaczynamy Eclipse 3.4M się już ściągnęło teraz Help->Software Updates dodajemy http://download.eclipse.org/tools/ajdt/34/dev/update . I podczas ściągania wtyczki jeszcze szybkie zerknięcie na Help->Tips and Tricks... tam zawsze warto zerknąć choćby żeby przypomnieć sobie skróty:) Refactor > Rename (Alt+Shift+R) i dla tych co pracują nad więcej niż jednym projektem, bardzo miłe udogodnienie Assign working sets.
Od razu stworzyłem sobie working set dla projektów aspektowych:

Dobra czas teraz wrócić do programowania aspektowego, przypuśćmy, że nasza klasa Graphic będzie tworzona przez jakąś fabrykę (która będzie pobierać dane z jakiegoś CMS). Każdy obiekt Graphic będzie zawierał informacje, czy można nim poruszać czy nie. Nasze zdanie polega na tym, żeby tak zdefiniować aspekt, że jeżeli obiekt będzie miał możliwość poruszania się to należy wykonać ciało metody move() w innym wypadku je pominąć. Rady przed (before) i po (after) metodzie były zawsze wykorzystywane przed i po wywołaniu metody, którą przecinały. Szybkie spojrzenie do dokumentacji i kogoś nam jeszcze brakuje :) rady dookoła (around), która umożliwia sprawdzenie czegoś przed wykonaniem i po, ale ma ten plus, że można w niej zdefiniować czy punkt przecięcia ma pozwolić na wykonanie ciała metody, którą przecina. Dobra zobaczmy jak to teraz wygląda w kodzie, najpierw klasa Graphic.java
public class Graphic{
private boolean isMovable = false;

public void move(){
System.out.println("Moving");
}

public static void main(String[] args) {
Graphic graphic = new Graphic();
System.out.println("Before moving");
graphic.move();
System.out.println("Change graphic to movable true");
graphic.setMovable(true);
graphic.move();

System.out.println("End");
}

void setMovable(boolean isMovable) {
this.isMovable = isMovable;
}

public boolean isMovable() {
return isMovable;
}

}


Teraz definiujemy nasz aspekt Secure.aj:
package com.itsilesia.aspects;

public aspect Secure {
pointcut checkSecure(com.itsilesia.Graphic graphic):target(graphic) && execution(* com.itsilesia.Graphic.mo*(..));

void around(com.itsilesia.Graphic graphic) : checkSecure(graphic) {
if(graphic.isMovable()){
proceed(graphic);
}else{
System.out.println("Can't move graphic");
}
}
}

Co tutaj mamy, najpierw definiujemy punkt przecięcia, który będzie uwzględniał wszystkie metody klasy Graphic które są (* com.itsilesia.Graphic.mo*(..))
- * oznacza zasięg, w naszym przypadku możemy mieć (public, private, protected i paczkowy)
- com.itsilesia.Graphic.mo*(..) punkt przecięcia nastąpi podczas uruchamiania obiektów klasy Graphic których metody zaczynają się od mo, i mogą ale nie muszą pobierać parametry
- target(graphic) definiuje, że nasz obiekt docelowy ma być typu Graphic.
Później jest nasza rada (advice) dookoła (around) która sprawdza czy dany obiekt graficzny może być poruszony. Jeśli tak to wtedy pozwala na wykonanie ciała metody którą przecina, za pomocą proceed(obiekt), w przeciwnym wypadku wypisuje komunikat o nie możliwości poruszanie obiektu. W Eclipse 3.4M uruchamiamy naszą aplikacje za pomocą Run us->Java Application rezultat poniżej:
Before moving
Can't move graphic
Change graphic to movable true
Moving
End
Teraz można sobie jeszcze wyświetlić Visualiser - AspectJ Provider Window->Open Perspective->Other...->Aspect Visualization.
Na koniec skoro jak już używa Eclipse 3.4M to dorzucam moją ulubioną wtyczkę Mylyn (download.eclipse.org/tools/mylyn/update/e3.4 )(na pewno poświecę jej jeden wpis:) )

Plan przygotowany:)

wtorek, 25 marca 2008

AspectJ wprowadzenie

Szybki start z AspectJ najpierw ściągamy wtyczkę do Eclipse 3.3 za pomocą Help->Software Updates->Find and Install.. dodajemy nowy adres http://download.eclipse.org/tools/ajdt/33/update . Potem jeszcze zapoznanie się z wprowadzającym artykułem do The AspectJ Development Tools (AJDT). W Eclipse tworzymy projekt aspektowy i klikamy Finish:
Teraz stworzymy nową klasę(ctrl + n) Graphic.java
package com.itsilesia;

public class Graphic {
public void draw(){
System.out.println("Painting");
}

public static void main(String[] args) {
Graphic graphic = new Graphic();
graphic.draw();
}
}

Teraz piszemy nasz pierwszy aspekt(ctrl +n AspectJ-> Aspect):
package com.itsilesia.aspects;

public aspect Secure {
pointcut checkSecure():execution(* com.itsilesia.Graphic.draw());

before() : checkSecure() {
System.out.println("Checking dependencies before painting");
}

after() returning : checkSecure() {
System.out.println("Exiting painting");
}

}



Najpierw zdefiniowałem punkt przecięcia (pointcut) która ma zostać użyty podczas wywołania metody draw() z klasy Graphic, później stworzyłem radę(advice) która ma się wykonać przed(before) i po(after) trafieniu na punkt przecięcia.
Teraz uruchamiamy nasz program (Run as -> AspectJ/Java Application):

Checking dependencies before painting
Painting
Exiting painting

Program zadzialal wedlug naszych oczekiwań:)
Zobaczmy co jeszcze oferuje nam Eclipse w przypadku AOP, Cross References:
można zobaczyć gdzie w naszej klasie jest użyte programowanie aspektowe i jakie rady są wywoływane. Istnieje też, cała perspektywa w Eclipse do AOP (Aspect Visualization) pokazująca powiązanie pomiędzy naszymi klasami a aspektami:

A teraz co mi daje zastosowanie AOP w tym przypadku:
- przede wszystkim odizolowanie różnych modułów (budowanie aplikacji graficznej od jej zabezpieczenia)
- bez problemowa wymiana systemu zabezpieczeń, gdyż nigdzie nie jest ona uwzględniona w kodzie obsługi obiektów graficznych
- z punktu widzenia programisty jeden drugiemu nie uprzykrza pracy dopisując jakiś niepotrzebnych linii kodu

wtorek, 18 marca 2008

AOP wstęp

Zainspirowany blogiem Jacka Laskowskiego postanowiłem zacząć opisywać moje doświadczenia związane z Java i różnymi jej aspektami. Ostatnio trafiło mi się zdanie zmodyfikowania systemu uprawnień do aplikacje do tworzenia grafiki (plakatów, ulotek, automatyzacji całego procesu drukwoania). Po krótkiej rozmowie z osobą która stworzyła już pierwszą wersje pseudo działających systemu uprawnień, okazało się, że powstało on w ciągu jednego dnia przed jakaś prezentacja produktu. A rozwiązanie polegało na tym, że wszędzie w kodzie odpowiedzialnym za wyświetlanie modelu było wstawiane
if(masz_dostep()){
rysuj();
}
niestety jak to często bywa system zaczął się rozrastać i coraz większe narzekanie na dodawanie jakiś if() . Po krótkim namyślę, postanowiłem na nowo napisać system uprawnień przy użyciu AOP.
A więc zaczynamy, definicja według Wikipedii:
Programowanie aspektowe (aspect-oriented programming, AOP) to paradygmat tworzenia programów komputerowych wspomagający separację zagadnień i rozdzielenie programu na części w jak największym stopniu niezwiązane funkcjonalnie.
W czym AOP powinno nam pomóc:
- zagadnienia przenikające ( crosscutting concerns)
- ograniczeniu powielaniu kodu
- wprowadzeniem dodatkowych zachowań za pomocą tak zwanych przecięć (pointcuts)
- możliwość sprawdzenia pewnych warunków przed wywołaniem metody jak i po, oraz przechwycenie wyjątku jeśli takowy metoda rzuca
Najważniejsze pojęcia z AOP a później już tyko praktyka (AspectJ):
- przecięcia (pointcuts) określają punkty złączeń dla których należy stosować poszczególne rady (advices)
- rada (advice) określa co należy zrobić w punkcie złączenia, rada jest z reguły definiowana w obiektach przechwytujących metody (method interception)
- inter-type declarations - pozwalają programiście na zmianę statycznej struktury i relacji pomiędzy klasami
- aspects - jednostka modularyzacji dla zagadnień przenikających
Po krótkim wstępie w następnej części już praktyka na podstawie AspectJ.