Projekt bazy uniwersalnego dashboarda Stanisław Klekot, nr indeksu 126398 3marca2013
1 Opis wycinka rzeczywistości DashWiki to w założeniu aplikacja typu wiki dla administratorów. Od tradycyjnych silników różni się tym, że potrafi pobierać dane użyte do wypełnienia strony z zewnętrznych źródeł, takich jak system monitoringu czy system zbierania danych o wydajności i rysowania wykresów. Łączenie się z zewnętrznymi systemami realizowane jest za pomocą makr użytych w treści strony. DashWiki ma służyć przede wszystkim za panel kontrolny( dashboard ), na którym są zebrane najważniejsze informacje o bieżącym stanie sieci, serwerów czy aplikacji i z którego da się łatwo dostać do paneli z danymi szczegółowymi(które mogą być kolejnymi stronami wiki albo zewnętrznymi webaplikacjami). Użytkownik Żeby móc wyedytować stronę użytkownik musi się zalogować, więc DashWiki powinno znać nazwę tego użytkownika(reg008). Użytkownik ma już login dla innych systemów i typowo jest to niedługi ciąg znaków(do 64 znaków; ogr015). Oczywiście login jest unikalny(ogr014). Typowa funkcja skrótu zwraca 128 do 256 bitów, co w systemie szesnastkowym powinno się daćzapisaćzapomocą64cyfr haszhasłamożemiećzatemdo64znaków(ogr016). Strona wiki Strona ma pewną nazwę(unikalną; reg001) i zawartość, która mówi, jaki tekst i jak sformatowany należy wyświetlić w przeglądarce. Nazwy stron w DashWiki nie odbiegają od tradycyjnych silników, stosowana jest konwencja CamelCase z użyciem liter, cyfr i podkreślnika, możliwe jest też użycie w nazwie slasha(dla zbudowania hierarchii stron); nazwa strony powinna mieć od 2 do 128 znaków(ogr002). Oczywiście dwie różne strony nie mogą mieć tej samej nazwy(ogr001). Zawartość strony jest tekstem bez specjalnych ograniczeń oprócz użytego języka formatowania (ogr003). Ze względu na koszt parsowania i przetwarzania języka formatowania strona jest jeszcze opatrzona skrótem(haszem) treści, który może być użyty jako identyfikator dla gotowego kodu HTML w cache u. Skrót jest ciągiem znaków o długości do 64 znaków(ogr004). Strona domowa Użytkownik może mieć ustawioną stronę startową, która wyświetla się mu po zalogowaniu (reg009). Jeśli nie ma ustawionej takiej strony, wyświetla się domyślna. Strona startowa, jeśli jest ustawiona(reg011), musi być prawidłową nazwą strony(ogr017, ogr017). To użytkownik wybiera swoją stronę startową, więc nie każda strona będzie czyjąś startową (reg010), a niektóre strony będą startowymi dla wielu użytkowników(reg012). Treść strony makra W treści strony można używać makr. Każde z makr jest identyfikowane jednoznacznie przez nazwę(reg022 ogr025), która jest niepustym ciągiem do 64 znaków(ogr026). Makro w użyciu przypomina funkcję z języków programowania: ma listę przyjmowanych argumentów w postaci ciągu słów oddzielonych przecinkami(do 256 znaków; ogr027) i typ zwracanych danych(jedno słowo do 64 znaków; ogr028, reg029, reg031). Zwracany typ służy do ustalenia w jaki sposób traktować użycie makra: lista powoduje, że zostanie wygenerowany zestaw wierszy w tabeli, po jednym wierszu dla każdego elementu z wyniku; grafika wstawia w miejscu makra obraz PNG/GIF/JPEG(w typowym przypadku będzie to wykres zmian pewnej wartości w czasie), stan to krótki tekst opisujący bieżącą sytuację usługi czy hosta(przykładowo działa, wyłączony, nie wiadomo ) i tak dalej. Zwracany typ jest identyfikowany przez nazwę (reg028). 1
Makro jest elementem, którego użycie powoduje komunikację z innymi systemami, więc potrzebne są informacje na temat celu komunikacji(url, para host+port albo analogiczne, opisane przezciągdo256znaków;ogr030). Dokomunikacjizcelemmakroużywajednegozkilkuprotokołów, jak XML-RPC, SOAP czy zwykłe żądanie HTTP GET(reg023). Nazwa protokołu jest ciągiem do 64 znaków(ogr029). Każde makro musi skądś pobierać dane, więc musi mieć zdefiniowany dokładnie jeden protokół (reg024, reg026). Makro jest sparametryzowane po to, żeby mogło żądać od zewnętrznego systemu danych na temat różnych obiektów. Żeby to uzyskać makro musi przekazać w żądaniu parametry. Opis tych parametrów jest ciągiem do 256 znaków(ogr031). Makra są definiowane przez użytkownika, a obsługiwane przez DashWiki protokoły i typy zwaracanych danych są zdefiniowane przez samą aplikację, może więc istnieć protokół albo typ danych, który nie jest używany przez żadne makro(reg025, reg030), może też istnieć protokół albo typ danych używany przez wiele makr(reg027, reg032). Historia edycji stron Każda strona ma swoją historię edycji. Dane historyczne mają podobną strukturę do zwykłych stron(nazwa, zawartość i skrót o takich samych typach; ogr005, ogr006, ogr007), rozszerzoną o dodatkowe informacje: czas utworzenia(data z godziną; ogr008), kolejny numer zwany rewizją (liczba całkowita 32-bitowa większa od 0; ogr009) i autora(reg013). Autorem musi być jeden użytkownik(ogr010, reg015), ta informacja ma zatem tę samą formę. Użytkownik mógł nie utworzyć żadnej strony(reg014), mógł również utworzyć wiele stron (reg016). Strona wiki musi mieć odpowiadającą jej historię odpowiednia strona w historii ma tę samą nazwę(reg004), przy czym najnowsza(o najwyższej rewizji) strona w historii o tej nazwie musi mieć taką samą zawartość i taki sam hasz, jak strona(reg006, reg007). Strona w historii nie musi mieć odpowiadającej jej strony, jeśli strona o tej nazwie została usunięta(reg005). Rekord odpowiadający usunięciu strony będzie w takim przypadku zawierał NULLwzawartościiwhaszu. Niemogąistniećwhistoriidwiewersjetejsamejstrony,któremajątęsamąrewizjęalboten sam czas utworzenia(ogr012, ogr013, reg002, reg003). Sesja HTTP Użytkownik musi być zalogowany żeby móc edytować strony. Do ustalenia które żądanie HTTP jest od zalogowanego użytkownika służy sesja. Każda sesja ma unikalny identyfikator, losowy ciąg znaków o długości do 64 znaków(reg017, ogr019, ogr020). Sesja może być przypisana do użytkownika(reg020, ogr021 i ogr022, bo właściciel musi mieć ten sam format), ale nie musi, gdy dotyczy niezalogowanego odwiedzającego(reg018). Użytkownik nie musi być zalogowany do DashWiki, więc może nie mieć żadnej sesji(reg019), może też być zalogowany wielokrotnie na różnych stanowiskach(reg021). Sesja ma czas wygaśnięcia podany w formie daty z godziną(ogr023). Sesja przenosi informację o stanie aplikacji między żądaniami HTTP. Ta informacja(zmienne sesyjne) jest zbiorem zmiennych zserializowanym do formatu JSON. Nie ma specjalnych ograniczeń na wielkość tego środowiska(ogr024). 2
2 Reguły funkcjonowania i ograniczenia dziedzinowe 2.1 Regułyfunkcjonowania oznaczenie definicja reg001 strona jest identyfikowanym przez nazwę opisem dashboarda reg002 strona w historii jest identyfikowaną przez nazwę i datę utworzenia wersją strony reg003 strona w historii alternatywnie jest identyfikowana przez nazwę i rewizję reg004 strona musi mieć odpowiadającą jej stronę w historii o tej samej nazwie reg005 strona w historii nie musi odpowiadać żadnej stronie reg006 strona ma jedną odpowiadającą jej stronę w historii reg007 strona w historii odpowiada najwyżej jednej stronie reg008 użytkownik jest zalogowaną do aplikacji osobą mogącą edytować strony; identyfikowany jest przez nazwę reg009 użytkownik może mieć zdefiniowaną stronę domową reg010 strona nie musi być stroną domową użytkownika reg011 użytkownik ma najwyżej jedną stronę domową reg012 strona może być stroną domową wielu użytkowników reg013 strona w historii musi mieć użytkownika jako autora reg014 użytkownik nie musi być autorem żadnej strony w historii reg015 strona w historii ma jednego użytkownika jako autora reg016 użytkownik może być autorem wielu stron w historii reg017 sesja to zbiór zmiennych w aplikacji identyfikowany przez identyfikator sesji reg018 sesja może dotyczyć użytkownika reg019 użytkownik może nie mieć żadnej sesji reg020 sesja dotyczy najwyżej jednego użytkownika reg021 użytkownik może mieć wiele sesji reg022 makro to identyfikowana przez nazwę funkcja, której można użyć w opisie dashboarda reg023 protokół to identyfikowany przez nazwę sposób komunikacji z zewnętrznymi aplikacjami(używany przez makro) reg024 makro musi mieć zdefiniowany protokół reg025 protokół nie musi być używany przez żadne makro reg026 makro ma zdefiniowany jeden protokół reg027 protokół może być używany przez wiele makr reg028 typ danych to identyfikowany przez nazwę rodzaj danych zwracany przez makro reg029 makro musi mieć zdefiniowany zwracany typ danych reg030 typ danych nie musi być zwracany przez żadne makro reg031 makro zwraca jeden typ danych reg032 typ danych może być zwracany przez wiele makr Tabela 1: Lista reguł funkcjonowania opisanego wycinka rzeczywistości 2.2 Ograniczeniadziedzinowe oznaczenie definicja ogr001 nazwa strony jest unikalna ogr002 nazwa strony jest ciągiem od 2 do 128 znaków, składającym się z liter, cyfr, podkreślenia i slasha, zaczynającym się od wielkiej litery ogr003 zawartość strony jest tekstem dowolnej długości ogr004 skrót zawartości strony jest ciągiem od 0 do 64 znaków ogr005 nazwa strony w historii jest ciągiem od 2 do 128 znaków, składającym się z liter, cyfr, podkreślenia i slasha, zaczynającym się od wielkiej litery 3
oznaczenie definicja ogr006 zawartość strony w historii jest tekstem dowolnej długości ogr007 skrót zawartości strony w historii jest ciągiem od 0 do 64 znaków ogr008 czas utworzenia strony w historii jest datą z godziną ogr009 rewizjastronywhistoriijestliczbącałkowitązzakresu [1,2 32 1] ogr010 autor strony w historii jest użytkownikiem ogr011 nazwa autora strony w historii jest ciągiem od 0 do 64 znaków ogr012 strona w historii ma unikalną parę nazwa + rewizja ogr013 strona w historii ma unikalną parę nazwa + czas utworzenia ogr014 nazwa użytkownika jest unikalna ogr015 nazwa użytkownika jest ciągiem od 0 do 64 znaków ogr016 hasz hasła użytkownika jest ciągiem od 0 do 64 znaków ogr017 strona startowa użytkownika odpowiada nazwie strony wiki ogr018 strona startowa użytkownika jest ciągiem od 0 do 128 znaków ogr019 identyfikator sesji jest unikalny ogr020 identyfikator sesji jest ciągiem od 0 do 64 znaków ogr021 odwiedzający, do którego należy sesja, jest użytkownikiem ogr022 nazwa odwiedzającego, do którego należy sesja, jest od 0 do 64 znaków ogr023 czas wygaśnięcia sesji jest datą z godziną ogr024 zestaw zmiennych sesyjnych sesji jest tekstem dowolnej długości ogr025 nazwa makra jest unikalna ogr026 nazwamakrajestciągiemod1do64znaków ogr027 przyjmowane parametry makra są opisane ciągiem od 0 do 256 znaków ogr028 typ danych zwracany przez makro jest ciągiem od 0 do 64 znaków ogr029 protokół używany przez makro jest ciągiem od 0 do 64 znaków ogr030 celmakrajestciągiemod0do256znaków ogr031 parametry dla celu makra są opisane ciągiem od 0 do 256 znaków Tabela 2: Lista ograniczeń dziedzinowych w opisanym wycinku rzeczywistości 3 Definicje predykatowe encji oznaczenie definicja enc001 Page(page name, content, hash) enc002 HistoryPage(hist page name, hist content, hist hash, creation time, revision) enc003 User(user name, password hash) enc004 Session(session id, expiry time, variables) enc005 Macro(macro name, destination, input args, output args) enc006 Protocol(protocol) enc007 ResultType(result type) Tabela 3: Definicje encji w bazie 4
4 Definicje predykatowe związków między encjami oznaczenie definicja zwi001 HasHomePage(User(0..*):Page(0..1)) zwi002 IsAuthor(HistoryPage(0..*): User(1..1)) zwi003 IsSessionFor(Session(0..*): User(0..1)) zwi004 UsesProtocol(Macro(0..*): Protocol(1..1)) zwi005 ReturnsType(Macro(0..*): ResultType(1..1)) zwi006 HasHistory(Page(0..*): HistoryPage(1..1)) Tabela 4: Definicje relacji w bazie 5 Diagram związków encji Diagram ER dla DashWiki 5
6 Definicjerelacji oznaczenie definicja rel001 Pages(page name, content, hash,#(hist page name,creation time)) rel002 HistoryPages(hist page name, hist content, hist hash, creation time, revision,#user name) rel003 Users(user name, password hash,#page name) rel004 Sessions(session id, expiry time, variables,#user name) rel005 Macros(macro name, destination, input args, output args,#protocol,#result type) rel006 Protocols(protocol) rel007 ResultTypes(result type) Tabela 5: Definicje relacji między encjami 7 Opisyrelacji 7.1 rel001pages enc001 Page(page name, content, hash) zwi006 HasHistory(Page(0..*): HistoryPage(1..1)) page name łańcuch(128) PK,/^[A-Z][A-Za-z0-9_/]+$/ reg001, ogr001, ogr002 content tekst ogr003 hash łańcuch(64) ogr004 hist page name łańcuch(128) NOT NULL zwi006 creation time czas NOT NULL zwi006 FK(hist page name, creation time) HistoryPage zwi006 6
7.2 rel002historypages enc002 HistoryPage(hist page name, hist content, hist hash, creation time, revision) zwi002 IsAuthor(HistoryPage(0..*): User(1..1)) hist page name łańcuch(128) NOT NULL,/^[A-Z][A-Za-z0-9_/]+$/ ogr005, reg002, reg003 hist content tekst ogr006 hist hash łańcuch(64) ogr007 creation time czas NOT NULL ogr008, reg002 revision liczba(9) NOT NULL ogr009, reg003 author łańcuch(64) FK Users ogr010, ogr011, zwi002 PK(hist page name, creation time) reg002 UNIQUE(hist page name, revision) reg003 7.3 rel003users enc003 User(user name, password hash) zwi001hashomepage(user(0..*):page(0..1)) user name łańcuch(64) PK ogr014, ogr015, reg008 password hash łańcuch(64) ogr016 home page łańcuch(128) FK Pages ogr017, ogr018, zwi001 7
7.4 rel004sessions enc004 Session(session id, expiry time, variables) zwi003 IsSessionFor(Session(0..*): User(0..1)) session id łańcuch(64) PK reg017, ogr019, ogr020 expiry time czas ogr023 variables tekst ogr024 user name łańcuch(64) FK Users ogr021, ogr022, zwi003 7.5 rel005macros enc005 Macro(macro name, destination, input args, output args) zwi004 UsesProtocol(Macro(0..*): Protocol(1..1)) zwi005 ReturnsType(Macro(0..*): ResultType(1..1)) macro name łańcuch(64) PK, length > 0 reg022, ogr025, ogr026 destination łańcuch(256) ogr030 input args łańcuch(256) ogr027 output args łańcuch(256) ogr031 protocol łańcuch(64) NOT NULL, FK Protocols ogr029, zwi004 result type łańcuch(64) NOT NULL, FK ResultTypes ogr028, zwi005 8
7.6 rel006protocols enc006 Protocol(protocol) protocol łańcuch(64) PK reg023, ogr029 7.7 rel007resulttypes enc007 ResultType(result type) result type łańcuch(64) PK reg028, ogr028 9