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