wtorek, 24 czerwca 2008

Eclipse Ganymede - nadchodzi kosmiczny kombajn

Pod koniec kwietnia powitaliśmy NetBeans w wersji 6.1. Zawierał on niezliczoną liczbę poprawek i udogodnień, jeszcze nie zdążyliśmy ochłonąć, a już za kilka dni pojawi się najnowsza wersja największego "konkurenta" czyli Eclipse o nazwie kodowej Ganymede.

Ganymede - okno startowe

Najlepiej poznawać nowe możliwości pisząc jakiś przykładowy program. Niech będzie to aplikacja która będzie przeliczać waluty na podstawie danych z wyszukiwarki Google.



Przygotowanie


Z racji, że lubię swoje projekty trzymać w repozytorium (SVN) muszę zainstalować najpierw wtyczkę SVN (niestety nadal nie jest ona w podstawowym pakiecie, mamy natomiast CVS-a) i tu pierwszy szok. Całkowicie przepisany system aktualizacji oraz instalacji pluginów.

Ganymede aktualizacja oprogramowania

Teraz zamiast conajmniej dziwnego kreatora mamy przejrzyste okienko z listą zainstalowanych pluginów oraz zakładke pozwalającą zainstalować nowe.
Wtyczka obsługująca SVN nazywa się Subversiv a opis jej instalacji można znaleźć w moim poprzednim wpisie. Przy okazji dodam, że znalazłem mały bug w wersji linuxowej, podczas instalacji pluginów w oknie z podsumowaniem nie pojawiła mi się lista dodatków do zainstalowania, dopiero w następnym oknie (z licencją) mogłem podejrzeć co instaluję.

Tworzymy nowy projekt


Pora na utworzenie nowego projektu , tutaj raczej nic się nie zmieniło, standardowe okiengo z możliwością nadania nazwy, wersji Javy, a także dodaniem bibliotek zewnętrznych. Dodawanie klas do już istniejącego projektu również nie uległo zmianie.

Czas przystąpić do do dzieła


Naszego projektu dodajemy klasę odpowiedzialną za konwersje walut (nazywać się będzie CurrencyChecker).
Po jej otwarciu nadal nie widzimy jakiś szczególnych zmian w interfejsie, no może poza małą dodatkową ikoną  w górnym toolbarze. Po jej wciśnięciu pojawia się dodatkowy pasek:

Ganymede - mechanizm okruszków

Pasek zwany Breadcrumbs z pozoru mało znaczący pozwala przyśpieszyć prace w projektach z dużą liczbą plików i pakietów. System okruchów (z ang. breadcrumbs) dzieli nam naszą aplikacje na: Projekt, Źródła, Pakiety i Klasy, więc jeśli piszemy sobie zadowoleni jakąś metodę i musimy szybko przejść do klasy w zupełnie innym pakiecie wystarczy, że klikniemy w nasz aktualny pakiet, a wyświetli się lista wszystkich dostępnych pakietów. Klikniem na strzałke obok pakietu i zaraz rozwinie się z niego lista klas. Wygodne i proste choć trzeba się przyzwyczaić, mamy przecież okno Projektów które spełnia niemal identyczną rolę.

Nasza klasa wymaga kilku pól i klas. Jej podstawowa forma wygląda tak:
public class CurrencyChecker {
    private final String googleQuery = "/search?q={QUERY}&ie=utf-8&oe=utf-8&aq=t";
    private String baseCurrency;
    private String toCurrency;
    private float amount = 0.0f;
    private float value = 0.0f;
    private float result = 0.0f;

    public CurrencyChecker(String from, String to, float amount) {
        this.baseCurrency = from;
        this.toCurrency = to;
        this.amount = amount;
    }
}

Mamy pola: baseCurrency które mówi nam z jakiej waluty będziemy konwerterować, toCurrency do jakiej waluty, wartość typu float amount która mówi nam jaką sume chcemy przekonwerterować. mamy jeszcze pole value które przechowuje jednostkową wartość waluty docelowej, a pole result wynik konwersji.Wydawać by się mogło, że to dość nadmiarowa liczba pól, ale warto je stworzyć na niedaleką przyszłość gdzie będziemy przechowywać wynik/wyniki ostatniej/ostatnich konwersji.Do konwerterowania walut użyjemy poczciwej wyszukiwarki Google-a. Będziemy ją pytać o wartość jednostkową, a potem przeliczać podaną przez nas liczbę.Pobranie wartości jednostkowej odbywa się w metodzie getBaseValue() i wygląda następująco:
private float getBaseValue() throws Exception{
    URL u = null;
    URLConnection uc = null;
    float value = 0.0f;
    StringBuffer sb = new StringBuffer();

    try{
        String query = googleQuery.replace("{QUERY}", "1%20"+this.baseCurrency+"%20IN%20"+this.toCurrency);
        u = new URL("http","www.google.pl",query);
        uc = u.openConnection();
        uc.setRequestProperty("User-Agent","Firefox/3.0");
        BufferedReader bf = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        String line;
        while((line = bf.readLine())!=null){
            sb.append(line);
        }
    }catch (IOException e) {
        throw new Exception(e.getMessage());
    }
    Scanner sc = new Scanner(sb.toString());
    if((sc.findInLine("calc_img.gif")!=null) && (sc.findInLine("= |DecimalNumeral")!=null)){
        value = Float.valueOf(sc.next());
    }else{
        throw new Exception("No data from google");
    }
    return value;
}

Po krótce można powiedzieć, że metoda pobiera stronę która jest wynikiem wyszukiwania frazy:
1 podstawowaWaluta IN walutaDocelowa (np "1 PLN IN EUR - złotówka w euro).
Nastepnie sprawdzamy czy wyniki wyszukiwania zawierają wynik kalkulatora (a dokładniej jego ikonę która świadczy o jego istnieniu w wynikach) oraz pobiera wynik który rzutuje na wartość float. Ta zwracana jest i na jej podstawie obliczany jest wynik.
Końcowe obliczenia dokonywane są w metodzie convert() która wygląda jak poniżej:
public float convert(){
    try{
        this.value = this.getBaseValue();
        this.result = this.amount * this.value;
    }catch(Exception e){
    System.out.println("Currency cannot be converted.n"+e.getMessage());
    }
    return this.result;
}

Prosta metoda nie potrzebująca komentarza. Pozwala przekonwerterować zadaną przez nas wartość z waluty bazowej do waluty docelowej.

Podsumowanie


Pomimo, że Ganymede nie wprowadza wielu nowości (przynajmniej dla programisty JSE), widać, że kierują się w dobrymkierunku czyli ułatwić i umilić pracę programiście.
Można zauważyć wzrost wydajności aplikacji, uruchamia się ona znacznie szybciej a również odpowiada naakcje użytkownika bez jakichkolwiek zająknięć. Pomimo, że nie jest to jeszcze wersja finalna działa całkiem stabilnie (poza kilkoma niewielkimi problemami).
Moim zdaniem największą bolączką Eclipse-a są zbyt rozbudowane opcje, i początkowa mała intuicyjność. Jeśli ktoś się pierwszy raz spotyka z Eclipsem trudno jest mu znaleźć opcje których szuka (a one przecież są ;))
W sobotę w Krakowie odbywa się Eclipse DemoCamp więc na pewno dowiem się coś więcej o nowościach w eclipse.

Brak komentarzy:

Prześlij komentarz