Sprawozdanie
Transkrypt
Sprawozdanie
Informatyka, studia dzienne, mgr II st. Semestr II Programowanie Aplikacji Internetowych Prowadzący: dr inż. Marcin Kwapisz, mgr inż. Wiktor Wandachowicz Mateusz Grotek 186816 Tomasz Król 186833 Michał Łysik 186840 Paweł Tarasiuk 186875 2013/2014 poniedziałek, 14:15 Sprawozdanie - etap 2. Omówienie działającego prototypu W aktywnej bazie danych przechowywane są obiekty biznesowe. Baza zarządza także logiką biznesową. Zawiera reguły które umożliwiają, lub uniemożliwiają dodawanie, modyfikację i usuwanie obiektów biznesowych. Baza waliduje wchodzące do niej dane i zapewnia ich integralność. Centrala firmy posiada bazę główną. Każdy oddział posiada bazę oddziałową. Baza oddziałowa jest kopią fragmentu bazy głównej dotyczącej jednego oddziału. Synchronizacja odbywa się automatycznie co określony czas. Synchronizacją baz zajmuje się konektor. Konektor udostępnia dane z bazy w postaci webservice'ów. Zajmuje się także synchronizacją między bazami oddziałowymi a centralną bazą danych. Centrala firmy posiada konektor główny, a każdy oddział własny konektor oddziałowy. Dodatkowo konektor oddziałowy może podczas przetwarzania zapytania SOAP od aplikacji wykonać (jeśli jest taka potrzeba) dodatkowe zapytanie SOAP do konektora centrali. Dzieje się tak jeżeli odbywa się zapytanie o dane trzymane tylko w centrali, a nie w oddziałowej bazie danych. Aplikacja komunikuje się z konektorem i wysyła do niego zapytania o dane. Jest jedna aplikacja centrali i każdy oddział posiada własne aplikacje oddziałowe. Aplikacja przetwarza dane otrzymane z zapytań do postaci kodu wysyłanego do przeglądarki użytkownika. Podstawowe działanie komunikacji Między centralą a oddziałem wymieniane są wszystkie dane dotyczące tego właśnie oddziału (osoby, stanowiska, typy stanowisk, działy firmy). Istotnym elementem, który musi być brany pod uwagę przy synchronizacji jest struktura informacji o różnych rodzajach obiektów. Działy przechowywane są w postaci hierarchicznej; osoby mają strukturę hierarchiczną jeśli chodzi o przełożonych. Typy stanowisk mają strukturę płaską. Same stanowiska są powiązane z typem stanowiska oraz z działem w którym jest to stanowisko. Jeśli stanowisko jest obsadzone, to jest ono także powiązane z osobą, która je zajmuje. Przykładowe fragmenty kodu Dodawanie osoby w WebService w .NET: public void positionCreate(Position position) { if (position == null) throw new FaultException(new FaultReason("Obiekt przekazany null")); using (DbPostgressContext context = new DbPostgressContext()) { try { var query = (from entity in context.Positions where entity.id == position.id select entity).ToList<Position>(); if (query.Count > 1) { for (int i = 0; i < query.Count; i++) { context.Positions.Remove(query[i]); } context.Positions.Add(position); } else if (query.Count == 1) { query.First<Position>().type = position.type; } else { context.Positions.Add(position); } context.SaveChanges(); } catch (Exception handledexceprion) { FaultException exception = new FaultException(new FaultReason("Złanianie więzow integralności jednego z ograniczeń")); throw exception; } } } Sprawdzanie poprawności numeru PESEL za pomocą funkcji języka Python wykonywnej po stronie serwera baz danych PostgreSQL: -- pesel check CREATE OR REPLACE FUNCTION pesel_correct(pesel BIGINT) RETURNS BOOLEAN AS $$ isLeapYear = lambda y: y&3 and y%25 or not y&15 peselStr = str(pesel) if len(peselStr) > 11: return False peselStr = ('0'*(11-len(peselStr))) + peselStr if not peselStr.startswith('0000'): yearOffset = (1900, 2000, 2100, 2200, 1800) middlePartOfDate = int(peselStr[2:4]) year = int(peselStr[0:2]) + yearOffset[middlePartOfDate/20] month = middlePartOfDate%20 day = int(peselStr[4:6]) daysInMonth = (None, 31, 28 if not isLeapYear(year) else 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) if not (1 <= month <= 12): return False if not (1 <= day <= daysInMonth[month]): return False weights = (1, 3, 7, 9, 1, 3, 7, 9, 1, 3) peselDigits = tuple(int(ch) for ch in peselStr) controlDigit = (1000-sum(map(lambda t: t[0]*t[1], zip(weights, peselDigits[:10]))))%10 return controlDigit == peselDigits[10] $$ LANGUAGE plpython2u; Konieczna była implementacja kontraktów SOAP w języku SmallTalk. Przykład dla klasy Person: contract ^classContract ifNil: [ classContract := ClassContract new mappedToClass: self; at: 'id' put: PrimitiveContract long; at: 'pesel' put: PrimitiveContract string; at: 'firstName' put: PrimitiveContract string; at: 'secondName' put: PrimitiveContract string; at: 'lastName' put: PrimitiveContract string; at: 'superior' put: PrimitiveContract long; at: 'position' put: PrimitiveContract long; at: 'changed' put: PrimitiveContract boolean; yourself ] Kontrakt dla metody findPerson: findContract ^methodContracts at: #findContract ifAbsentPut: ( MethodContract new at: 'person' put: self contract; at: 'personFindResult' put: self arrayContract; at: 'result' put: self arrayContract; yourself ) Widok dla formularza: renderContentOn: html html div class: 'col-lg-6 col-lg-offset-3 col-md-6 col-md-offset-3 col-sm-6 col-sm-offset-3'; with: [ html div class: 'panel panel-default'; with: [ header ifNotNil: [ html div class: 'panel-heading'; with: header ]. html form class: 'form-horizontal'; with: [ html div class: 'panel-body'; with: [ self renderFieldsOn: html. ]. html div class: 'panel-footer'; with: [ self renderActionsOn: html ] ] ] ] Materiały źródłowe ● ● ● ● ● ● ● ● Mozilla Developer Network -- https://developer.mozilla.org/ jQuery API Documentation -- http://api.jquery.com/ Bootstrap 2.3.2 Documentation -- http://getbootstrap.com/2.3.2/ PostgreSQL Documentation -- http://www.postgresql.org/docs/ Windows Communication Foundation -- http://msdn.microsoft.com/en-us/library/vstudio/ ms735119(v=vs.90).aspx LINQ -- http://msdn.microsoft.com/en-us/library/bb397926.aspx Entity Framework Documentation -- http://msdn.microsoft.com/pl-pl/library/ff453894.aspx GNU Smalltalk Documentation -- http://smalltalk.gnu.org/documentation