Strona główna--artykuly--jline
  

Analiza możliwości zastosowania silnika skryptowego JLine

  1. Cel
  2. Co to jest JLine
  3. Jak to działa.
  4. Licencja
  5. Wymagania
  6. Implementacja
  7. Podsumowanie
  8. Alternatywy
  9. Załączniki
  10. Materiały

1.Cel

Celem niniejszego dokumentu jest przedstawienie możliwości wykorzystania silnika skryptowego JLine w projektach informatycznych.

Co to jest JLine

JLine jest prostym mechanizmem skryptowego silnika pracującego w systemowej konsoli Terminala tekstowego. I dostarczającego programom konsolowym napisanym w języku Java udogodnień znanych z terminali systemowych takich, jak historia poleceń, czy uzupełnienie składni.

Jak to działa

Mechanizm JLine jest po prostu biblioteką programistyczną (plik jar) którą można dołączyć do swojego programu konsolowego pisanego w języku Java. Wykorzystanie tej biblioteki zwalnia programistę Java od konieczności pisania własnego mechanizmu obsługi linii poleceń takich jak pamiętanie historii, czy podpowiadanie składni poleceń i ich argumentów. W prosty sposób można także zaimplementować mechanizm czytania poleceń z pliku skryptowego, wystarczy w tym celu zdefiniować odpowiedni strumień plikowy a następnie przekazać go do obiektu „ConsoleReader” zajmującego się przetwarzaniem poleceń pobieranych ze zdefiniowanego strumienia wejściowego. Tym strumieniem może być zarówno dowolny strumień danych tekstowych jak i standardowe wejście, w języku Java oznaczone jako „System.in”. (domyślne zachowanie) Warto w tym miejscu podkreślić że silnik JLine nie narzuca programiście w żaden sposób jakiego języka skryptowego ma program używać, tak więc napisanie mechanizmu obsługi danych czytanych ze strumienia należy do programisty, który za pomocą standardowych mechanizmów analizy tekstu dostępnych w języku Java decyduje o akcjach podejmowanych przez jego program.

Licencja

Biblioteka JLine jest udostępniana do publicznego użytku na zasadach bardzo liberalnej licencji BSD (chyba najbardziej łagodna licencja ze wszystkich publicznych licencji).

Wymagania

JVM w wersji >= 1.2, poza tym plik biblioteki jline-nn.nn.nn.jar (gdzie nn.nn.nn to numer wersji biblioteki pobranej ze strony projektu) który należy dołączyć albo do lokalnej zmiennej systemowej CLASSPATH, albo do projektu w EClipse jako tzw. „Build path” albo ewentualnie jako parametr –cp w wywołaniu z konsoli maszyny wirtualnej java. Bibliotekę zarówno w wersji binarnej jak i źródłowej można pobrać ze strony projektu http://jline.sourceforge.net/ i to już w zasadzie wszystko, bo projekt Eclipse nie posiada dedykowanej wtyczki do tej biblioteki więc wszystko przy niej trzeba robić ręcznie.

Implementacja

W najprostszym przypadku obsługa tego silnika skryptowego to po prostu jedna pętla pobierająca informację wpisywane w konsoli tekstowej jako kolejne linie tekstu wpisane przez użytkownika. I na podstawie tych stringów można podejmować decyzję odnośnie wykonania określonych akcji.

ConsoleReader reader = new ConsoleReader();			//obiekt odpowiedzialny za pobieranie danych z konsoli tekstowej

List completors = new LinkedList();					//lista tzw. kompletorów czyli obiektow odpowiedzialnych za uzupełnianie składni

completors.add(new SimpleCompletor(new String[]{"su","pwd","cd"}));
completors.add(new FileNameCompletor());
completors.add(new ClassNameCompletor());
completors.add(new NullCompletor());
reader.addCompletor(new ArgumentCompletor(completors));

while ((line = reader.readLine("prompt> ")) != null) //główna pętla decyzyjna programu, pobiera linię ze standardowego wejścia i wystawia na standardowe wyjście znak zachęty
{
    //TODO: Tutaj ma się znajdować główny element decyzyjny czyli w domyśle jakis switch, cache lub drabinka IFów
    //wybierający jakie polecenia są wybrane przez konsole i jakie akcje mają zostać podjęte   
 	if (line.equalsIgnoreCase("exit")) // warunek wyjścia z pętli
   	{
   		break;
   	}
}

Tak rozumiana logika działania tego silnika niespecjalnie różni się od zwykłej pętli pobierającej dane ze standardowego wyjścia. Jednakże mamy tu szereg udogodnień takich jak mechanizm „Kompletorów” których różne rodzaje odpowiadają za dostarczenie na konsole funkcjonalności odpowiedzialnej za auto uzupełnianie treści po wybraniu przycisku TAB na konsoli tekstowej. Po przejęciu przetwarzania przez kod Javy standardowo nie mielibyśmy takiego udogodnienie dopiero biblioteka JLine to umożliwia. Jest kilka standardowych kompletorów i tak.

Kompletory można sumować oraz ustalać ich kolejność na liście obiektu „ConsoleReader”. Kolejność w jakiej kompletory zostały dodane „addCompletor” decyduje jakiego typu uzupełnienia i w jakiej kolejności będą brane pod uwagę przy wpisywaniu listy poleceń w konsoli przez użytkownika np. w przykładzie powyżej pierwsze naciśnięcie przycisku TAB uzupełni wpis w lini poleceń o jedną z nazw „su”, „pwd”,”cd” następne przyciśnięcie przycisku TAB uzupełni linię poleceń o nazwę pliku lub katalogu występującego w katalogu bieżącym. Kolejny TAB uzupełni nazwę klasy Javy (jakiś z plików .class) a ostatni kompletor typu „NullCompletor” zadba o to aby nie było już dalej uzupełniania lini poleceń. Warto tu nadmienić że kompletory nie determinują wcale tego co można wpisać w konsoli, one jedynie podpowiadają (TAB bez początku polecenia) i uzupełniają już zaczęte polecenie o dalszy zdefiniowany ciąg „SimpleCompletor” lub np. o nazwę pliku lub katalogu „FileNameCompletor”. A co będzie wpisane zależy jedynie od użytkownika.

Poza ułatwieniem jakie zapewniają kompletory, mechanizm JLine wspiera również zapamiętanie historii wpisywanych poleceń tak aby po wybraniu przycisku „uppArrow” lub „downArrow” można było przeglądać historię wpisywanych wcześniej poleceń, i ponownie spowodować wybranie jednego z nich. Funkcjonalność tę zapewnia obiekt „History”. Obiekt ten jest standardowo włączony jednakże dzięki zdefiniowaniu własnego takiego obiektu i dodaniu go do obiektu klasy „ConsoleReader” „setHistory” można ustawić jakie parametry jak miejsce przechowywania pliku historii, wielkość pamiętanej historii, czyszczenie historii, czy choćby np. z jakich już wpisów ma się składać historia „addToHistory”.

Ciekawym mechanizmem jest również możliwość pobrania (dzięki klasie fabryki) obiektu typu Terminal „Terminal.getTerminal()” dzięki któremu (a konkretnie jednaj z klas dziedziczącej po tym obiekcie czli, „WindowsTerminal”, „UnixTerminal”, „UnsuportedTerminal” możemy wykonywać pewne działania na terminalu (tty, cmd) takie jak np. pobieranie rozmiaru terminalu, włączania „echa” itp. charakterystyczne dla danej platformy działania.

Podsumowanie

Zaczynając przyglądać się temu silnikowi skryptowemu myślałem że, jest to jakiś mechanizm który umożliwia przetwarzanie poleceń języka Java w już skompilowanej aplikacji, coś jak np. silnik języka Basic w aplikacji MSExcel lub javascript w przeglądarkach WWW. Jednak JLine jest zupełnie innym typem rozwiązania. Tutaj trzeba sobie zdefiniować swój własny zestaw poleceń (własny język skryptowy) oraz sztywne akcje jakie mają się wykonywać (własny shell). To rozwiązanie jest więc tylko trochę bardziej rozbudowaną pętlą pobierająca linię poleceń ze standardowego wejścia trybu tekstowego konsoli, i w zależności od tego co użytkownik wpisał program może wykonywać ustalone kawałki kodu. To rozwiązanie spowoduje ze twoja aplikacja trybu konsolowego będzie bardziej przyjazna dla użytkownika, tak jak tylko aplikacja trybu konsolowego może być przyjazna. Natomiast można sobie zadań pytanie po co tworzyć aplikacje sterującą trybu tekstowego skoro można to zrobić w jakimś ładnym GUI graficznym (biblioteka, AWT, SWT, Swing). Natomiast JLine może mieć zastosowanie jako mechanizm rozbudowujący jakiś język skryptowy. Przykładem takiej interesującej współpracy jest język Clojure, który dzięki wykorzystaniu jline „java -cp jline-0.9.91.jar:clojure.jar jline.ConsoleRunner clojure.main” uzyskuje mechanizmy znane z trybów konsolowych (historia, podpowiadanie składni).

Alternatywy

Załączniki

Plik projektu Eclipse myJLine.zip zawierający już plik jar z biblioteką JLine. Prosta implementacja podstawowych funkcjonalności tego silnika.

Materiały

http://jline.sourceforge.net

Niestety biblioteka ta nie ma zbyt licznej dokumentacji rozsianej po Internecie i tak naprawdę najwięcej można się dowiedzieć ze strony tej biblioteki dostępnej na portalu sourceforge.net. Tym niemniej można tam znaleźć zarówno samą bibliotekę jak i bogatą dokumentację typu „javadoc” z kilkoma podstawowymi przykładami oraz testami jednostkowymi. http://jline.sourceforge.net/xref-test



Dodaj komentarz:
Tak
Nie

Autor:44
Data: 2014-03-06 11:59
Treść:54

Autor:Extern
Data: 2011-05-25 22:43
Treść:Test

Autor:Extern
Data:2011-05-25 22:41
Treść:Test

Copyright Extern