Wprowadzenie do projektu QualitySpy



Podobne dokumenty
Programowanie obiektowe

Programowanie Obiektowe GUI

Platforma e-learningowa

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Język Java część 2 (przykładowa aplikacja)

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

Dokumentacja do API Javy.

Wprowadzenie do Doctrine ORM

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Aplikacje WWW - laboratorium

Instrukcja użytkownika

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Projekt Hurtownia, realizacja rejestracji dostaw produktów

WellCommerce Poradnik: CMS

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Produkcja by CTI. Proces instalacji, ważne informacje oraz konfiguracja

Zaawansowane aplikacje internetowe

TEMAT : KLASY DZIEDZICZENIE

Płace Optivum. 1. Zainstalować serwer SQL (Microsoft SQL Server 2008 R2) oraz program Płace Optivum.

Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Laboratorium 7 Blog: dodawanie i edycja wpisów

Instrukcja obsługi Zaplecza epk w zakresie zarządzania tłumaczeniami opisów procedur, publikacji oraz poradników przedsiębiorcy

1 Moduł Modbus ASCII/RTU 3

Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?

Ćwiczenia nr 4. Arkusz kalkulacyjny i programy do obliczeń statystycznych

Spis treści. 1 Moduł Modbus TCP 4

I. Interfejs użytkownika.

SERWER AKTUALIZACJI UpServ

PWI Instrukcja użytkownika

3.4. Opis konfiguracji layoutów.

Instrukcja do programu Do7ki 1.0

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Kurs WWW. Paweł Rajba.

Krok 2: Pierwsze uruchomienie

Instrukcja laboratoryjna nr.4

Wnioski i dyspozycje elektroniczne. Instrukcja użytkownika systemu bankowości internetowej dla firm. BOŚBank24 iboss

Interfejsy i klasy wewnętrzne

Programowanie obiektowe

PRODUKCJA BY CTI INSTRUKCJA INSTALACJI I KONFIGURACJI

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Instrukcja użytkownika bgk24 Moduł Konsolidacja Finansów Publicznych

Podręcznik Użytkownika LSI WRPO

Programowanie obiektowe

Ratownictwo Medyczne

Kurs walut. Specyfikacja projektu. Marek Zając

Dodawanie i modyfikacja atrybutów zbioru

Laboratorium 8 ( Android -pierwsza aplikacja)

Język Java część 2 (przykładowa aplikacja)

Uruchomienie aplikacji elektronicznych na platformie epuap

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Instrukcja do programu Przypominacz 1.6

Programowanie obiektowe

Zaawansowane aplikacje WWW - laboratorium

Pierwsza niedogodność dotyczy strony zarządzaj działami.

Rozdział ten zawiera informacje o sposobie konfiguracji i działania Modułu OPC.

Programowanie obiektowe

Stworzenie programu KSIĄŻKA ADRESOWA posiadającego funkcjonalności przechowywania danych o osobach dodanych przez użytkownika.

Programowanie obiektowe

Tworzenie szablonów użytkownika

INSTRUKCJA. SIMPLE.HCM Proces obsługi Kartoteki Pracownika, Kartoteki Przełożonego oraz Raportów kadrowo-płacowych

1 Moduł Modbus ASCII/RTU

Konfiguracja programu MS Outlook 2007 dla poczty w hostingu Sprint Data Center

Rozdział 4 KLASY, OBIEKTY, METODY

INSTRUKCJA OBSŁUGI SUPLEMENT

Programowanie zaawansowane

PODRĘCZNIK UŻYTKOWNIKA SYSTEMU PROJEKT EBOOKING TRUCK CZĘŚĆ I. PUESC

Instrukcja do programu Przypominacz 1.5

Instrukcja obsługi. Helpdesk. Styczeń 2018

ELF. Instrukcja użytkownika. (System wspomagający wypełnianie wniosków elektronicznych)

PHP 5 język obiektowy

Laboratorium 9 (Więcej Aktywności, w Androidzie)

Instrukcja obsługi portalu wersja dla aptek. Logowanie do portalu:

Ogranicz listę klasyfikacji budżetowych do powiązanych z danym kontem księgowym

DEMERO Automation Systems

OBIEKTY TECHNICZNE OBIEKTY TECHNICZNE

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

WERSJA 4.3. Opis zmian. Spis treści

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Currenda EPO Instrukcja Konfiguracji. Wersja dokumentu: 1.3

SUBIEKT GT IMPORT XLS Dokumenty

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Instrukcja użytkownika Integrator Allegro X DEFT

Viatoll Calc v1.3. Viatoll Calc. Instrukcja użytkownika. Strona 1

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Backend Administratora

Obsługa systemu OGNIVO w aplikacji Kancelaria Komornika

Referat Pracy Dyplomowej

Aplikacje WWW - laboratorium

ZINTEGROWANY SYSTEM ZARZĄDZANIA TREŚCIĄ

Platforma e-learningowa

Baza danych sql. 1. Wprowadzenie

Moduł Handlowo-Magazynowy Przeprowadzanie inwentaryzacji z użyciem kolektorów danych

Rozdział ten zawiera informacje na temat zarządzania Modułem Modbus TCP oraz jego konfiguracji.

Specyfikacja techniczna. mprofi Interfejs API

Transkrypt:

Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować krok po kroku prostą funkcjonalność związaną z serwisem GitHub. W trakcie tłumaczenia będę komentował i opisywał strukturę projektu. Dla uproszczenia będę pomijał początek nazwy pakietu pl.wroc.pwr.qualityspy i będę odnosił się do tylko ostatniego członu. 2. Co będzie implementowane Zaimplementujemy funkcjonalność wyświetlającą liczbę repozytoriów które posiada dany użytkownik na GitHubie i liczbę obserwujących dla każdego z repozytoriów. Instrukcja została oparta o przykładowe użycie biblioteki do obsługi API Githuba: https://github.com/eclipse/egit-github/tree/master/org.eclipse.egit.github.core 3. Rewizja Przykład jest tworzony w oparciu o najnowszą rewizję na dzień 28.06.2015. Jest to rewizja numer 185. 4. Nowe pole konfiguracyjne W tym punkcje zajmiemy się dodaniem nowego pola do plików konfiguracyjnych. Przejdźmy do pakietu common z modułu common i wybierzmy interfejs BugtrackerProperties Interfejsy XXXProperties wraz z klasą Properties definiują strukturę pliku konfiguracyjnego. Interfejsy opisują jakie dane można pobrać z konfiguracji, natomiast klasa dodatkowo opisuje jak te dane są zapisywane w pliku (mówiąc dokładniej definiuje nazwę klucz. Konfiguracja jest zapisywana w postaci klucz wartość). Dodajmy zatem metodę o definicji public String getxxx(); np. o nazwie getgithubexampleuser. Zapisanie zmian w tym pliku powinno od razu skutkować wyświetleniem błędu w klasie Properties. Przejdźmy zatem do tej klasy.

Jako że klasa implementuje interfejsy XXXProperties, musimy zaimplementować dodaną właśnie metodę. Jeśli spojrzymy na strukturę klasy zauważymy, że metody występują trójkami: getxxx(), setxxx(string value) i getxxxkey(). Pierwsza i druga kolejno pobiera i zapisuje wartość korzystając z metod getproperty(string key) i setproperty(string key, String value), trzecia metoda zwraca wartość klucza dla wybranej opcji konfiguracji (jak wcześniej wspomniałem dane zapisywane są w postaci klucz wartość). Dodajmy zatem trójkę takich metod: Zdefiniujmy metodę public String getgithubexampleuser() która zwraca tekst exampleuser. Następnie zdefiniujmy metody getgithubexampleuser i setgithubexampleuser tak jak jest to opisane w komentarzu powyżej i posiłkując się przykładami z innych pól konfiguracyjnych np. z pola JiraPassword. Następnie musimy to pole konfiguracyjne obsłużyć przez interfejs graficzny. W tym celu przejdźmy do klasy ConfigJPanel z pakietu gui w modue gui. Rysunek 1 ConfigJPanel Ta klasa zawiera całą implementacje funcjonalności związaną z obsługą pól edycyjnych ich edycją i walidacją. Sam zapis wywoływany jest w klasie MenuJPanel, która wywołuje metodę savechangesofcomponent klasy ConfigJPanel, która iteruje po wierszach tabeli widocznej na powyższym zrzucie ekranu, dzięki czemu dodanie do niej nowego wiersza z opcją konfiguracyjną spowoduje już zapisywanie tej opcji do pliku. Odnajdźmy metodę addrowjiratoconfigtable, metoda ta powoduje dodanie wierszy do tabeli edycyjnej po wybraniu zakładki Jira. Zakładka Jira obsługuje zarówno pobieranie danych z IssueTrackera Jiry jak i Githuba poprzez odpowiedni wybór opcji bugtracker. Metoda ta zawiera szereg wywołań metody addrowtoconfigtable, która jako argumenty przyjmują klucz i wartość pola konfiguracyjnego. Wykorzystajmy zatem wcześniej stworzone metody getgithubexampleuserkey i getgithubexampleuser. Dodajmy zatem nowe wywołanie wyżej wspomnianej metody.

Zbudujmy cały projekt i uruchommy go zgodnie z instrukcją przekazaną prze prowadzących zajęcia. (Niepoprawne uruchomienie np. poprzez wybranie Run ze środowiska programistycznego spowoduje nie pojawienie się i/lub błędne pojawienie się przykładowych konfiguracji) Wybierzmy jedną z przykładowych konfiguracji TestGitHub/1.0. Na zakładce Jira powinno pojawić się nowe pole konfiguracyjne: Rysunek 2 GUI z nowym polem Wprowadźmy przykładową wartość np. defunkt i naciśnijmy przycisk ENTER lub przejdźmy do innego pola konfiguracyjnego. Tylko w ten sposób zapiszemy zmiany w polu. Następnie wybierzmy ikonę Dyskietki. Konfiguracja jest za każdym razem czytana z pliku, dlatego niezbędne jest wcześniejsze zapisanie konfiguracji przed uruchomieniem funkcjonalności związanej ze ściąganiem danych. Przejdźmy do folderu config/testgithub/1.0 i otwórzmy w edytorze tekstu plik qs.properties. Rysunek 3 Ścieżka do pliku qs.properties Rysunek 4 Plik qs.properties 5. Implementacja przykładowej funkcjonalności Nasza przykładowa funkcjonalność jest związana z komponentem bugtracker wykorzystującym GitHuba. Funkcjonalność ściągająca zagadnienia dla wybranego repozytorium już jest zaimplementowana, jest tam obsłużone tworzenie klienta dla githuba i serwisu repozytoriów, dlatego właśnie tam małym kosztem dołożymy naszą przykładową funkcjonalnośc. Dla tych co nie zaglądali do przykładów biblioteki z linku w rozdziale Co będzie implementowane:

Rysunek 5 Przykładowe użycie Github klienta Rozpocznijmy implementacje. Przejdźmy do modułu bugtracker i z pakietu bugtracker.github wybierzmy klasę GithubConnector. Moduły odpowiedzialne za ściąganie danych takie jak: bugtracker, metrics, version-control, ci zawierają klasy XXXConnector. Są to klasy których zadaniem jest zainicjowanie właściwego klienta z daną usługą np. bugtracker serwisu Github, połączenie z usługą Jenkins itp. i wystawienie metod pozwalających na pobranie danych z tych usług. Dane te muszą zostać także odpowiednio przekonwertowane na model który jest zapisywany w bazie danych.dla przykładu GithubConnector w metodzie init tworzy połączenie z serwisem Github za pomocą klasy GithubClient, która pochodzi z zewnętrznej biblioteki. Konfiguruje to połączenie a następnie udostępnia metodę getissueswithfulldescription, która z kolei pobiera zagadnienia z githuba także za pomocą funkcjo z biblioteki service.getissues(repository, issuefilter); a następnie wykorzystuje odpowiedni konwerter do konwersji na format modelu parser.convertgithubissuetoissuedescription(issue). Dodajmy zatem do tej klasy pole przechowujące listę Repozytoriów wybranego użytkownika: private List<Repository> repos; A następnie w metodzie init po zainicjowaniu klienta Githuba i serwisu repozytoriów wykonajmy metodę z Rysunku: Przykładowe użycie Github klienta: repositoryservice.getrepositories(string user) A skąd pobrać usera? Zauważmy, że do konstruktora GithubConnectora podawany jest obiekt klasy Properties, dokładnie tej klasy którą modyfikowaliśmy w poprzednim rozdziale, dzięki czemu mamy dostęp do metody getgithubexampleuser(). Przed wywołaniem sprawdźmy tylko czy przekazane pole nie jest puste. Rysunek 6 Kod po modyfikacjach Doskonale. Po tych modyfikacjach po utworzeniu GithubConnectora zostaje pobrana lista repozytoriów. Utwórzmy teraz metodę, która będzie wyświetlała odpowiednie informacje.

Utwórzmy metodę o definicji: public void showwatcherslist(); Metoda nie zwraca nic, ponieważ wykorzystamy klasę ErrorWindow przeznaczoną do wyświetlania błędów w GUI. Przeitreujmy po repozytoriach z listy repos i dla każdego z nich odczytajmy wartość zwracaną przez metodę getwatchers(). Dane pod postacią nazwa repozytorium liczba wrzućmy do pojedynczego Stringa. W tym celu polecam użyć klasy StringBuilder, która jest klasą przeznaczoną właśnie do wielokrotnego sklejania łańcucha tekstowego. Można także na potrzeby ćwiczenia wykorzystać po prostu operator +, jednak zalecam zapoznać się z w/w klasą. Klasa ErrorWindow jest klasą typu Singleton. Aby uzyskać instancję klasy Singleton posłużymy się metodą statyczną ErrorWindows.getInstance(). Następnie aby wykorzystać ErrorWindow wykorzystamy metodę handleerror. Ta metoda przyjmuje dwa argumenty typu Exception i typu Errors. Klasa Errors jest klasą zdefiniowaną w module common, tak jak i sama klasa ErrorWindow w pakiecie errorhandling. Klasa ta jest klasą abstrakcyjną i służy do implementacji zachowania przycisków TryAgain i EndProcess. Klasa ErrorWindow służy do wyświetlania komunikatu wyjątku, dlatego musimy opakować nasz tekst w jakiś wyjątek, dlatego posłużymy się wywołaniem new Exception(watchersList). Jeśli chodzi o drugi argument, należy przekazać nową instancję klasy Errors z pustą implementacją jej metod. Rysunek 7 Użycie ErrorWindow W tym momencie implementacja samej przykładowej funkcjonalności jest gotowa. Pozostaje nam tylko wywołanie. 6. Wywołanie nowej funkcjonalności Wróćmy do modułu gui, tym razem jednak do pakietu integration. W tym pakiecie znajdują się klasy FetchXXXThread. Te klasy poza klasą FetchDataThread, która ma inne znaczenie w metodzie fetcherrun implementuje to co się dzieje po wybraniu

jednego z przycisków Fetch w GUI. Wspomniana klasa FetchDataThread to klasa która opakowuje klasy FetchXXXThread w odpowiedni wątek i obsługę błędów. Otwórzmy klasę FetchJiraThread. Jak wcześniej wspomniałem funkcjonalność ściągania zagadnień z bugtrackera Jira i Github są połączone ze sobą. W metodzie fetcherrun przejdźmy do warunku gdzie wykryte zostało że pole konfiguracyjne bugtracker ma wartość github. Zauważmy że tworzony jest GithubConnector na referencji klasy bazowej IBugTrackerConnector. Pamiętajmy że stworzona funkcjonalność pozwala nam wyciągnąć dane za pomocą metody, dodanej wyłącznie do klasy GithubConnector. Musimy zatem obsłużyć tę funkcjonalność w tym warunku. Na początku zrzutujmy referencję issueconnector na referencję klasy GithubConnector, a następnie wywołajmy metodę showwatcherslist();, ponownie pod warunkiem, że pole githubexampleuser nie jest puste. Rysunek 8 Kod po modyfikacjach. Ponownie zbudujmy projekt i uruchommy według instrukcji podanej na zajęciach. Wybierzmy konfigurację TestGitHub/1.0. Przejdźmy na zakładkę Jira i wprowadźmy exampleuser: defunkt. Pamiętajmy że musimy nacisnąć ENTER lub wyjść z pola edycyjnego, a następnie nacisnąć ikonę zapisu. Wybierzmy przycisk Fetch JIRA. po chwili powinno pojawić się okno błędu z listą repozytoriów i liczbą ich obserwatorów.

Rysunek 9 Okno błędu