Author
others
View
0
Download
0
Embed Size (px)
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
ZAVRŠNI RAD br. 2375
POHRANA ZNAČAJKI DATOTEKA U
PROGRAMSKOM SUSTAVU ZA
DETEKCIJU PLAGIJATA
Ivan Kraljević
Zagreb, svibanj 2012.
Sadržaj
Uvod ............................................................................................................................. 1
1. Izrada značajki datoteka ....................................................................................... 2
2. Obrada arhiva s izvornim programima ................................................................ 9
3. Shema baze podataka ......................................................................................... 14
4. Komunikacija sustava s bazom podataka .......................................................... 20
5. Demonstracija rada sustava ............................................................................... 28
5.1. Registracija na sustav ................................................................................. 28
5.2. Pohrana arhiva i tekstualnih datoteka ........................................................ 30
5.3. Dohvat podataka ........................................................................................ 31
5.4. Brisanje i ažuriranje podataka .................................................................... 33
Zaključak ................................................................................................................... 34
Literatura .................................................................................................................... 35
Sažetak ....................................................................................................................... 36
Summary .................................................................................................................... 37
1
Uvod
Plagiranje izvornih tekstova programa ozbiljan je problem na Fakultetu
elektrotehnike i računarstva. Nemali broj studenata iz različitih razloga posuđuje gotova
rješenja programskih zadataka drugih kolega te ih prisvajaju i prezentiraju kao vlastita
rješenja. Kako fakultet svake godine upisuje više od 600 studenata od kojih će svi slušati
barem nekoliko kolegija čije zadaće i/ili laboratorijske vježbe uključuju pisanje programa,
pregledavanje i međusobno uspoređivanje velikog broja studentskih programskih rješenja
predstavlja veliki napor profesorima i asistentima. S druge strane, prisvajanje tuđih rješenja
ne ide u korist ni samim studentima zato što na taj način štete svome inženjerskom
obrazovanju i usavršavanju.
Iz navedenih razloga očita je potreba za sustavom koji bi fakultetskom osoblju
omogućio jednostavno prepoznavanje programskih plagijata. U tu svrhu razvijen je
programski sustav koji uz jednostavno podešavanje, analizira izvorne kodove programskih
zadataka te otkriva potencijalne programske plagijate.
U ovom završnom radu govorit će se o pohrani izvornih programa u bazu podataka,
automatiziranoj izradi značajki pojedinih izvornih tekstova i njihovom utjecaju na
otkrivanje plagijata. U drugom dijelu rada prikazat ćemo rad sustava na prethodno
definiranoj bazi izvornih tekstova programa.
Svi razredi koji obavljaju prethodno spomenute aktivnosti su implementirani u
objektno-orijentiranom programskom jeziku Java.
2
1. Izrada značajki datoteka
Svaku datoteku pobliže opisuje niz elemenata: veličina datoteke, ime datoteke,
datum zadnje promjene, tip datoteke i slično. Za tekstualne datoteke, poput izvornih
kodova, možemo odrediti još cijeli niz elemenata kao što su ukupni broj redaka (linija
teksta), ukupni broj znakova u tekstu, sažetak (engl. checksum), itd. Budući da je svrha
sustava otkrivanje plagijata izvornih kodova, iz izvornih je kodova potrebno izbaciti sve
što ne utječe na izvođenje programa, na primjer: komentari, višestruke praznine, prazni
redci. Za privremenu pohranu (tj. za pohranu u radnoj memoriji) značajki i elemenata
datoteke s izvornim kodom implementiran je razred FileCharacteristics. Unutar
razreda pohranjeni su sljedeći elementi:
fileID - jedinstveni identifikator datoteke.
fileName - ime datoteke s izvornim tekstom programa.
author - autor izvornog teksta programa.
dateModified - datum posljednje promjene datoteke.
sourceCode - izvorni tekst programa.
sourceCodeFN - normalizirani izvorni tekst programa.
checksum - sažetak izvornog teksta programa.
lineNumber - broj linija izvornog teksta programa (prazni redovi se ne broje).
characterNumber - broj znakova u izvornom tekstu programa (praznine,
tabulatori, oznake za kraj reda i znakovi unutar komentara se ne broje).
fileSize - veličina datoteke.
extension - ekstenzija datoteke (npr .java, .cpp).
Svi elementi dotičnog razreda su enkapsulirani, a njihove vrijednosti je moguće dohvatiti
ili postaviti isključivo korištenjem pripadnih get/set metoda.
Prilikom stvaranja instance razreda FileCharacteristics konstruktoru razreda je
potrebno predati osnovne elemente: izvorni kod, ime datoteke, veličinu (memorijsko
zauzeće) datoteke i datum posljednje promjene.
3
Slika 1.1 Konstruktor razreda FileCharacteristics.
Ako promotrimo konstruktor uočavamo da nakon stvaranja instance nisu postavljene
vrijednosti svih značajki. Za njihovo je postavljanje potrebno nad objektom eksplicitno
pozvati metodu doAll().
Slika 1.2 Programski kod metode doAll() razreda FileCharacteristics.
Konkretno, metoda doAll() postavlja vrijednosti atributa sourceCodeFN,
lineNumber, characterNumber i checksum. Za izračun vrijednosti tih atributa
implementiran je poseban razred Utilities. Svrha razreda Utilities je brzo i
jednostavno izračunavanje i dohvaćanje spomenutih atributa. Sve metode razreda su
4
statičke te za njihovo korištenje nije potrebno stvarati instance razreda Utilities.
Metode koje razred implementira prikazane su na Slika 1.3.
Slika 1.3 Dijagram razreda Utilities.
Slika 1.4 Programski kod metode countLines() razreda Utilities.
Metoda countLines() broji retke teksta predanog u argumentu te kao povratnu
vrijednost vraća broj redaka teksta. Važno je napomenuti da se prazne linije ne broje.
5
Slika 1.5 Programski kod metode countCharacters() razreda Utilities.
Metoda countCharacters() broji znakove teksta predanog u argumentu te kao
povratnu vrijednost vraća ukupni broj znakova u tekstu. Tijekom računanja broja znakova
ne uračunavaju se znakovi za označavanje novog retka, praznine, tabulatori, kao ni
komentari unutar izvornog koda.
Slika 1.6 Programski kod metode removeBlanks() razreda Utilities.
Metoda removeBlanks() uklanja sav bijeli prostor (engl. whitespace), tj. uklanjaju se
sve praznine, oznake za novi red i tabulatori iz teksta u argumentu.
6
Slika 1.7 Programski kod metode removeComments() razreda Utilities.
Metoda removeComments() uklanja sve jednolinijske i višelinijske komentare iz
izvornog koda.
Slika 1.8 Programski kod metode fullyNormalizeText() razreda Utilities.
Metoda fullyNormalizeText() potpuno normalizira tekst, tj. prvo ukloni sve
jednolinijske i višelinijske komentare, a potom i sav bijeli prostor.
7
Slika 1.9 Programski kodovi metoda za izračun sažetka teksta.
Jedan od veoma važnih atributa neke datoteke jest njezin sažetak (engl. checksum). Sažetak
je numerička vrijednost sadržaja datoteke koja se dobiva pozivom nekog kriptografskog
algoritma nad njezinim sadržajem. Neki od danas najpopularnijih i najkorištenijih
algoritama za računanje sažetka datoteke su: MD5, SHA-1 i SHA-256.
Unutar razreda Utilities implementirane su metode koje nad sadržajem izračunavaju
sažetak datoteke uporabom jednog od triju spomenutih algoritama. U samom
programskom sustavu za računanje sažetka odabran je algoritam sa najvećom raspršenosti,
odnosno SHA-256 algoritam. Sažetak teksta se računa nad normaliziranim izvornim
kodom [3].
Slika 1.10 Programski kod metode validExtension() razreda Utilities.
Prije nego što se pokrene obrada neke datoteke potrebno je provjeriti je li datoteka
tekstualnog formata. Provjera formata datoteke povjerena je metodi
validExtension() iz razreda Utilities. Metoda kao ulazni argument prima ime
datoteke ili samo ekstenziju datoteke, te ga/ju uspoređuje sa regularnim izrazom:
^.*\\.(c|cs|cpp|java|js|txt|pl|php|py|jsp|jspx|hs)$
8
Ako ulazni argument odgovara regularnom izrazu, format datoteke je podržan i metoda
vraća vrijednost true, a inače vraća false. U slučaju da je format nepodržan
konstruktor razreda FileCharacteristics će baciti Runtime iznimku.
9
2. Obrada arhiva s izvornim programima
Svi izvorni programi pohranjeni su u .zip arhivama. Unutar glavne arhive nalaze
se kazala (mape, engl. folders) koja označavaju ime autora izvornog koda, a unutar svakog
kazala nalazi se .zip arhiva(u daljnjem tekstu: unutarnja arhiva). U unutarnjoj arhivi
pohranjeni su svi izvorni kodovi dotičnog autora. Hijerarhija strukture datoteka prikazana
je na Slika 2.1.
Slika 2.1 Hijerarhija strukture datoteka.
Za obradu arhive zadužena su tri razreda iz paketa hr.fer.csi.input:
UnzipMainFile
UnzipSingleFile
ReadFile
10
Razred UnzipMainFile obrađuje vanjsku (glavnu) arhivu, razred
UnzipSingleFile obrađuje unutarnju arhivu, dok je razred ReadFile namijenjen
obradi jedne tekstualne datoteke.
Kod obrade neke arhive prvo je potrebno stvoriti instancu razreda UnzipMainFile te
nakon toga pozvati metodu unzip(). Metoda unzip() kao povratnu vrijednost vraća
listu objekata FileCharacteristics, tj. vraća sve obrađene izvorne kodove. Nakon
obrade arhive pomoću metode getErrorMessages() mogu se dohvatiti opisi svih
pogrešaka s kojima se sustav susreo tijekom obrade arhive. Najčešće greške su oštećene
.zip arhive, nepodržani formati arhiva (kao što su .rar ili .7zip), neispravni ili
nepodržani formati tekstualnih datoteka unutarnjih arhiva.
Slika 2.2 Dijagram razreda UnzipMainFile.
Pseudokod metode unzip() razreda UnzipMainFile:
unzip()
Ulaz: Path - putanja do .zip arhive, Destination - mjesto gdje će
se podaci privremeno izdvojiti(engl. extract).
Izlaz: lista instanci razreda FileCharacteristics.
učitajZipArhivu(Path);
sveDatoteke = prazna lista;
trenutnoKazalo = null;
while (ima neobrađenih datoteka u zipu) {
entry = prva neobrađena datoteka;
11
if (entry == kazalo) {
if (trenutnoKazalo != null) {
obrišiTrenutnoKazalo;
}
trenutniAutor = entry.ime;
trenutnoKazalo = Destination + entry.ime;
stvoriNovoKazalo(trenutnoKazalo);
}
else {
extractajTrenutnuDatoteku(Destinacija + trenutnoKazalo,
entry.ime);
unutarnjiZip = stvori objekt razreda UnzipSingleFile;
sveDatoteke.dodaj = unutarnjiZip.getListFromZip(Destinacija +
trenutnoKazalo, entry.ime, trenutniAutor);
obiršiStvorenuDatoteku;
}
entry = obrađen;
}
obrišiTrenutnoKazalo();
vrati sveDatoteke;
Pseudokod metode unzip() razreda UnzipMainFile.
Iz navedenog pseudokoda vidljivo je da se pri obradi koriste i instance razreda
UnzipSingleFile. Uloga razreda UnzipSingleFile je obrada unutarnje arhive u
kojoj se nalaze izvorni programi. Razred UnzipSingleFile se koristi i u slučajevima
kada je na primjer student krivo predao svoju arhivu (npr. .rar format umjesto .zip).
Sustav će dojaviti da je došlo do greške tijekom obrade dotične arhive te korisnik sustava
mora ručno ispraviti problem s arhivom. Nakon popravljanja arhive korisnik ne mora
iznova pohranjivati cijelu glavnu arhivu, već može jednostavno pohraniti unutarnju
(ispravljenu) arhivu te korištenjem instance razreda UnzipSingleFile sadržaj arhive
se jednostavno može dodati već obrađenim datotekama.
12
Slika 2.3 Dijagram razreda UnzipSingleFile.
Pseudokod metode getListFromZip() razreda UnzipSingleFile:
getListFromZip()
Ulaz: Path - putanja do arhive, Author - autor izvornih kodova
unutar arhive.
Izlaz: lista instanci razreda FileCharacteristics.
učitajZipArhivu(Path);
sveDatoteke = prazna lista;
while(ima neobrađenih datoteka u zipu) {
entry = prva neobrađena datoteka;
izvorniKodDatoteke = ReadFile.readTextFile(entry);
FileCharDatoteke = stvori novi objekt razreda
FileCharacteristics(izvorniKodDatoteke);
sveDatoteke.dodaj = FileCharDatoteke;
entry = obrađen;
}
vrati sveDatoteke;
Iz navedenog pseudokoda vidljivo je da tijekom obrade arhive sustav poziva metodu
readTextFile() razreda ReadFile. S obzirom na to da je metoda statička nije
potrebno stvarati instancu razreda ReadFile. Uloga metode je čitanje tekstualne datoteke
i vraćanje njezinog sadržaja. Kao što se razred UnzipSingleFile može koristiti ako je
došlo do pogreške nad nekom unutarnjom arhivom tijekom obrade glavne arhive, tako se i
13
metoda readTextFile() može koristiti umjesto ponovnog pohranjivanja cijele
unutarnje arhive.
Paket čija je uloga obrada arhiva, datoteka i automatizirana izrada značajki prikazan je na
Slika 2.4.
Slika 2.4 Prikaz dijagrama razreda hr.fer.csi.input.
14
3. Shema baze podataka
Baza podataka nam omogućuje jednostavno pohranjivanje i povezivanje podataka
bez nepotrebne zalihosti. Podaci se pohranjuju na način da budu neovisni o programima
koji ih koriste te su strukturirani tako da buduća nadogradnja bude što jednostavnija.
Shema baze podataka je u trećoj normalnoj formi te su navedena potrebna integritetska
ograničenja.
Slika 3.1 EER model baze podataka.
15
Detaljnijim promatranjem EER modela možemo zaključiti:
svaki korisnik(engl. user) može imati proizvoljan broj recenzija (engl. review)
unutar svake recenzije nalazi se proizvoljan broj zadataka (engl. task)
svaki zadatak referencira proizvoljan broj arhiva (engl. archive) i datoteka (engl.
file)
neka datoteka može sadržavati referencu na arhivu, ali i ne mora (npr. ako je
datoteka samostalno pohranjena, tj. nije dio nijedne arhive)
uz svaku datoteku vezan je točno jedan redak iz relacije lex
određena datoteka može biti referencirana u maksimalno 2 retka u relaciji
comparisonresult
Atribut Tip Opis
userID int identifikator korisnika
firstName vchar ime korisnika
lastName vchar prezime korisnika
email vchar e-mail korisnika
password vchar zaporka korisnika
createdOn date datum registracije
PK = {userID}
UNIQUE = {email}
Tablica 3.1 Relacija User.
Entitetom User predstavljeni su svi registrirani korisnici koji imaju mogućnost
prijave na sustav koristeći svoj e-mail i zaporku. Nad atributom email definirano je
integritetsko ograničenje UNIQUE čime se sprječava višestruko registriranje sa jednom te
istom adresom elektroničke pošte. Uz to, važno je napomenuti da se korisnikova zaporka
ne sprema u izvornom obliku, već se korištenjem SHA1 algoritma sprema sažetak lozinke.
16
Atribut Tip Opis
reviewID int identifikator reviewa
userID int identifikator vlasnika
reviewName vchar ime reviewa
description vchar opis reviewa
createdOn date datum stvaranja
PK = {reviewID}
FK = {userID}
Tablica 3.2 Relacija Review.
Entitet Review predstavlja recenziju pojedinog korisnika. Unutar svake recenzije
spremljeni su pojedini korisnikovi zadaci.
Atribut Tip opis
taskID int identifikator zadatka
reviewID int identifikator reviewa kojemu
zadatak pripada
name vchar ime zadatka
description vchar opis zadatka
KGramLength int duljina k-grama
KGramWindowLength int veličina k-gram prozora
ModuloPValue int ModuloP vrijednost
pCheckums int težina sažetka u ukupnom
rezultatu
pKgramWinn int težina winnowing algoritma
pKgramModP int težina 0 modulo P algoritma
17
pLex int težina leksičke analize
PK = {taskID}
FK = {reviewID}
Tablica 3.3 Relacija Task.
Entitet Task predstavlja pojedini zadatak. Vrijednosti KGramLength,
KGramWindowLength i ModuloPValue su atributi pojedinih algoritama. Vrijednosti
pChecksum, pKgramWinn, pKgramModP i pLex predstavljaju udjele pojedinih algoritama
pri izračunu ukupne sličnosti.
Atribut Tip Opis
archiveID int identifikator arhive
taskID int identifikator zadatka kojemu
arhiva pripada
archiveName vchar ime arhive
archive longblob arhiva
PK = {archiveID}
FK = {taskID}
Tablica 3.4 Relacija Archive.
Entitet Archive sadrži arhive zadataka. Pojedini zadatak može imati nula ili više
arhiva, a kod brisanja pojedinog zadatka, brišu se i sve njegove arhive.
Atribut Tip Opis
fileID int identifikator datoteke
archiveID int identifikator arhive
taskID int identifikator zadatka
fileName vchar ime datoteke
18
sourceCode longblob izvorni kod / sadržaj datoteke
extension vchar ekstenzija datoteke
size bigint veličina datoteke
uploadMethod vchar način pohrane datoteke
date date vrijeme posljednje izmjene
datoteke
author vchar ime autora datoteke
PK = {fileID}
FK = {archiveID}
FK = {taskID}
Tablica 3.5 Relacija File.
Entitet File sadrži datoteke i značajke datoteka. Od značajki se pohranjuju ime
datoteke i ime autora datoteke, veličina i datum posljednje izmjene datoteke, tip
(ekstenzija) datoteke te način pohrane datoteke (grupna ili samostalna datoteka). Uz to,
pohranjuju se i identifikatori zadatka i arhive kojima datoteka pripada. Datoteka ne mora
nužno pripadati određenoj arhivi i u tom slučaju vrijednost atributa archiveID bit će null.
Atributi Tip Opis
comparisonresultID int identifikator rezultata
firstID int identifikator prve datoteke
secondID int identifikator druge datoteke
similarity int ukupna sličnost
KGramSimilarity int sličnost dobivena
KGramWinnowing algoritmom
KGramModPSimilarity int sličnost dobivena
KGramModP algoritmom
checksumSimilarity int sličnost sažetaka
19
PK = {comparisonresultID}
FK = {firstID}
FK = {secondID}
Tablica 3.6 Relacija ComparisonResult.
Entitet ComparisonResult predstavlja rezultat usporedbe dviju datoteka. Ukupna
sličnost ovisi o rezultatima pojedinih algoritama usporedbe i o udjelu algoritama pri
računanju ukupne sličnosti. Udjeli pojedinih algoritama pohranjeni su u relaciji Task.
20
4. Komunikacija sustava s bazom podataka
Kako bi sustav mogao pohranjivati podatke u bazu podataka i koristiti pohranjene
podatke u radu, razvijen je paket hr.fer.csi.database.
Slika 4.1 Objektni dijagram paketa hr.fer.csi.database.
21
Razredi Archive, ComparisonResult, Lex, Review, Task, User i
SourceFile (relacija File) sadrže atribute nazivom jednake istoimenim relacijama u
bazi podataka. Navedeni razredi korišteni su za pohranu podataka koji su prethodno
dohvaćeni iz baze podataka.
Najvažniji razred paketa je DatabaseIO. Pomoću njega je omogućeno spajanje na bazu
podataka, a preko njegovih metoda vrši se pohrana i pristup podacima.
Pri stvaranju instance razreda mora se predati putanja do datoteke u kojoj su pohranjena
adresa baze podataka te korisničko ime i lozinka potrebni za uspješno spajanje sustava s
bazom podataka. Pohranjivanje potrebnih podataka u vanjsku datoteku preporuča se jer
ono omogućuje jednostavnu i fleksibilnu konfiguraciju podataka potrebnih za spajanje na
bazu bez potrebe za mijenjanjem i ponovnim prevođenjem programskog koda [1].
Podaci u datoteci spremljeni su u obliku db.parametar=vrijednost. Primjer datoteke
s nužnim podacima:
db.url=jdbc:mysql://localhost:3306/similarity
db.user=korisnik19
db.passwd=lozinka1
Unutar konstruktora DatabaseIO izvodi se čitanje vanjske datoteke, te stvaranje veze s
bazom podataka. Nakon toga, korisnik može manipulirati podacima pomoću mnogobrojnih
metoda instance razreda DatabaseIO. Implementirane metode prikazane su u Tablica
4.1.
Naziv metode Opis
getConnection(String dbFile) Privatna metoda koja stvara vezu s bazom.
printDBMetaData() Ispisuje podatke o bazi podataka.
registerUser(User user) Sprema podatke o korisniku iz argumenta u
relaciju User.
loginUser(String email, String
password)
Provjera postoji li korisnik u bazi podataka.
retriveUserNames(int userID) Vraća ime i prezime korisnika određenog
22
identifikatorom.
retriveUserReviews(int userID) Vraća podatke o svim recenzijama korisnika
određenog identifikatorom.
createReview(Review review) Stvara novu recenziju.
retriveReview(int reviewID) Vraća recenziju određenu identifikatorom.
deleteReview(int reviewID) Briše recenziju određenu identifikatorom.
updateReviewName(int reviewID,
String name)
Preimenovanje recenzije.
updateReviewDescription(int
reviewID, String descritption)
Izmjena opisa recenzije.
createTask(Task task) Stvara novi zadatak.
retriveReviewTasks(int reviewID) Vraća podatke o svim zadacima recenzije
određene identifikatorom.
deleteTask(int taskID) Briše zadatak određen identifikatorom.
retriveTask(int taskID) Vraća zadatak određen identifikatorom.
setTaskValues(int taskID, int
kgramLength, int
kgramWindowLength, int moduloP)
Postavlja parametre algoritama vezane uz
zadatak određen identifikatorom.
setTask_P_Values(int taskID, int
pChecksums, pKgramWinn,
pModuloP, int pLex)
Postavlja udjele pojedinih algoritama u
računanju ukupne sličnosti.
retriveTaskValues(int taskID) Vraća parametre algoritama.
retriveTask_P_Values(int taskID) Vraća udjele pojedinih algoritama.
updateTaskName(int taskID,
String name)
Preimenovanje zadatka.
updateTaskDescription(int
taskID, String description)
Izmjena opisa zadatka.
23
storeMainArchive(int taskID,
String path, String
tmpDestination)
Obrađuje i sprema glavnu arhivu. Vraća
listu svih grešaka koje su nastale tijekom
obrade arhive.
storeSingleArchive(int taskID,
String path, String author)
Obrađuje i sprema unutarnju arhivu. Vraća
listu svih grešaka koje su nastale tijekom
obrade arhive.
retriveArchive(int archiveID,
String path)
Pristupa arhivi i pohranjuje ju na lokaciju
određenu argumentom path. Vraća
informacije o arhivi.
retriveArchives(int taskID) Vraća sve arhive zadatka određenog
identifikatorom.
updateArchiveName(int archiveID,
String name)
Preimenovanje arhive.
deleteArchive(int archiveID) Briše arhivu iz baze.
deleteArchives(int taskID) Briše sve arhive zadatka određenog
identifikatorom.
storeSingleFile(int taskID,
String path, String author)
Sprema tekstualnu datoteku koja se nalazi
na lokaciji određenoj argumentom path.
storeFile(int taskID, int
archiveID, FileCharacteristics
file)
Sprema tekstualnu datoteku koja je dio
arhive.
storeFile(int taskID, int
archiveID, FileCharacteristics
file, String author)
Sprema tekstualnu datoteku koja je dio
arhive.
retriveFile(int fileID) Vraća datoteku određenu identifikatorom.
retriveFiles(int taskID) Vraća sve datoteke zadatka određenog
identifikatorom.
retriveFileCharacteristics(int Vraća sve datoteke zadatka određenog
24
taskID) identifikatorom kao instance razreda
FileCharacteristics.
retriveFilesOutOfRange(int
taskID, long minSize, long
maxSize)
Vraća sve datoteke zadatka određenog
identifikatorom čija veličina nije unutar
intervala [minSize, maxSize].
expectedFiles(int archiveID, int
expected)
Vraća true ako je očekivani broj datoteka
u arhivi jednak argumentu expected,
inače vraća false.
deleteFile(int fileID) Briše datoteku određenu identifikatorom.
addComparisonResult(int firstID,
int secondID, int similarity,
int KGramSimilarity, int
KGramModPSimilarity, int
checksumSimilarity)
Pohranjuje sličnosti između dvije datoteke u
bazu.
updateComparisonResult(int
firstID int secondID, int
similarity, int KGramSimilarity,
int KGramModPSimilarity, int
checksumSimilarity)
Ažurira vrijednosti sličnosti između dvije
datoteke.
getComparisonResult(int firstID,
int secondID)
Vraća sve sličnosti datoteka koje su
određene argumentima firstID i
secondID.
storeLex(int fileID,
List<TableRow> constantsMap,
List<TableRow> identifierMap,
List<TableRow> krosTableMap,
List<TableRow> uniformTable)
Pohranjuje rezultate leksičke analize
datoteke određene identifikatorom.
retriveLex(int fileID) Vraća rezultate leksičke analize datoteke
određene identifikatorom.
Tablica 4.1 Metode razreda DatabaseIO.
25
Većina metoda iz gornje tablice implementirana je na sljedeći način:
1. Ovisno o zahtjevu metode napisan je SQL upit gdje se umjesto konkretnih
vrijednosti postavljaju upitnici ('?'), tj. rezerviraju se mjesta koja će kasnije biti
popunjena.
2. Stvara se instanca razreda PreparedStatement koja interno pohranjuje
prethodno napisani SQL upit.[2]
3. Korištenjem set metoda objekta PreparedStatement prethodno rezervirana
mjesta popunjavaju se konkretnim vrijednostima.
4. Izvršava se upit. Ako upit treba dohvaćati vrijednosti (SELECT upiti) povratna
vrijednost pri izvršavanju će biti instanca razreda ResultSet.
5. Ako je vraćen objekt tipa ResultSet, iterira se kroz njega i uzimaju se svi
potrebni podaci.
Na sljedećih nekoliko slika prikazane su metode pomoću kojih se nešto dohvaća,
pohranjuje, mijenja ili briše iz baze podataka. Zbog velikog broja i opsežnosti pojedinih
metoda, neće biti prikazane sve metode koje se pojavljuju u Tablica 4.1.
26
Slika 4.2 Primjer dohvaćanja podataka: metoda retriveUserReviews().
Slika 4.3 Primjer pohrane podatka: metoda storeFile().
27
Slika 4.4 Primjer brisanja podataka: metoda deleteTask().
Slika 4.5 Primjer ažuriranja podatka: metoda updateTaskName().
28
5. Demonstracija rada sustava
Za demonstraciju sustava pripremljena je jedna glavna (main.zip). jedna
unutarnja (single.zip) arhiva i jedna tekstualna datoteka (zad2.c). Datoteke su
pohranjene u na lokaciji C:\Test\. U glavnoj arhivi (main.zip) su pohranjena tri
kazala, a u svakom od njih se nalazi jedna arhiva. Dvije arhive su u .zip formatu, dok je
jedna u .rar formatu kojega sustav ne podržava. U svakoj arhivi su pohranjene tri
datoteke sa programskim kodom.
U unutarnjoj arhivi (single.zip) se nalaze dvije tekstualne datoteke (zad1.c i zad3.c) i
jedna slika (zad2.png).
5.1. Registracija na sustav
Programski sustav je napravljen tako da ne dopušta pohranu podataka korisnicima koji nisu
registrirani i koji nemaju barem jednu recenziju i zadatak. Stoga se prvo moramo
registrirati na sustav, zatim stvoriti novu recenziju i nakon toga stvoriti novi zadatak.
Programski odsječak sa Slika 5.1 prikazuje registraciju korisnika na sustav.
Slika 5.1 Programski odsječak za registraciju korisnika.
29
Otvaranjem baze podataka preko sučelja phpMyAdmin, vidimo da je registracija uspješno
obavljena.
Slika 5.2 Uspješna registracija na sustav.
Može se primijetiti kako se korisnik i sustav ne moraju brinuti oko dodjele jedinstvenog
identifikatora jer dotični problem rješava baza podataka.
Nakon što smo obavili registraciju potrebno je stvoriti novu recenziju i novi zadatak.
Slika 5.3 Stvaranje nove recenzije.
Identifikator novostvorene recenzije je 12.
Slika 5.4 Stvaranje novog zadatka.
Identifikator novostvorenog zadatka je 19.
30
5.2. Pohrana arhiva i tekstualnih datoteka
Nakon što smo se uspješno registrirali na sustav, stvorili novu recenziju i novi zadatak
možemo početi sa pohranom datoteka u bazu podataka.
Slika 5.5 Spremanje glavne arhive u bazu podataka.
Prethodno je spomenuto da se u glavnoj arhivi nalazi jedna unutarnja arhiva koja je
neispravnog formata, stoga se očekuje da će sustav dojaviti grešku tijekom obrade dotične
arhive, ali da nakon toga neće prestati sa obradom podataka, nego da će ostale ispravne
datoteke obraditi i spremiti u bazu podataka.
Slika 5.6 Ispis pogrešaka prilikom obrade glavne arhive.
Nakon što smo spremili glavnu arhivu, sada idemo pokušati spremiti unutarnju
arhivu (single.zip). Programski odsječak koji obavlja dotičnu radnju prikazan je na
Slika 5.7.
Slika 5.7 Spremanje unutarnje arhive u bazu podataka.
31
Unutar single.zip se nalazi jedna nepodržana datoteka naziva zad2.png. Prilikom
obrade arhive sustav bi nam trebao dojaviti o dotičnoj grešci.
Slika 5.8 Ispis pogrešaka prilikom obrade unutarnje arhive.
Konačno, spremiti ćemo ispravnu tekstualnu datoteku u sustav.
Slika 5.9 Spremanje arhive u bazu podataka.
5.3. Dohvat podataka
Za dohvat podataka je potrebno deklarirati objekt kakav želimo dohvatiti. Na primjer ako
želimo dohvatiti niz zadataka potrebno je deklarirati listu objekata Task, ako želimo
dohvatiti jedan zadatak potrebno je deklarirati jedan Task objekt, itd. Nakon deklaracije
objekta, pozivamo metodu iz razreda DatabaseIO koja dohvaća tražene podatke, te
povratnu vrijednost metode preusmjerimo na deklarirani objekt.
32
Slika 5.10 Primjer dohvata podataka.
Nakon pokretanja prikazanog programskog odsječka ispisuje nam se rezultat kao na Slika
5.11.
Slika 5.11 Ispis rezultata.
33
5.4. Brisanje i ažuriranje podataka
Za brisanje podataka u bazi podataka potrebno je pozvati metodu koja briše podatke iz
određene relacije (sve metode imaju prefiks delete) te preko argumenta predati jedinstveni
identifikator objekta kojeg se želi obrisati.
Slika 5.12 Programski isječak koji briše jedan zadatak.
Za ažuriranje podataka potrebno je potrebno je pozvati metodu koja ažurira podatke iz
određene relacije (sve metode imaju prefiks update) te preko argumenta predati jedinstveni
identifikator objekta kojega se želi ažurirati i vrijednosti koje se žele ažurirati.
Slika 5.13 Preimenovanje zadatka.
34
Zaključak
Sustav je osmišljen tako da buduća nadogradnja bude što je moguće jednostavnija
bez potrebe za mijenjanjem postojećeg izvornog teksta programa. Baza podataka je
osmišljena tako da ne ovisi o programskom sustavu što dodatno povećava fleksibilnost
cjelovitog sustava. Tijekom izrade sustava pojedine komponente su ispitane na velikom
broju različitih ulaza te su riješeni mnogi problemi koji bi mogli izazvati prekid rada
sustava ili netočnu obradu i prikaz podataka.
U budućoj nadogradnji sustava fokusirati će se na prikupljanju dodatnih značajki izvornih
programa i razvoju sustava tako da se mogu obraditi trenutno nepodržani formati datoteka
za pohranu (kao što su .rar i .zip arhive). Paralelno sa razvojem sustava razvijati će se
i baza podataka.
35
Literatura
[1] ZETCODE.COM MySQL Java Tutorial.
http://zetcode.com/databases/mysqljavatutorial/ 2012.
[2] ECKEL, B. Thinking in Java 3rd Edition. 2002.
[3] BAOTIĆ, A. Otkrivanje sličnosti u izvornim tekstovima programa. Diplomski rad.
Sveučilište u Zagrebu, 2011.
36
Sažetak
Pohrana značajki datoteka u programskom sustavu za detekciju plagijata
Namjerno posuđivanje i prepisivanje tuđih programskih rješenja je ozbiljan
problem na mnogim fakultetima. Iz tog razloga razvijen je sustav koji obrađuje studentska
programska rješenja te pronalazi potencijalne plagijate. U ovom radu prezentiran je dio
sustava koji obavlja obradu ulaznih arhiva sa studentskim rješenjima, automatiziranu
obradu studentskih programskih rješenja te pohranjivanje ključnih podataka u bazu
podataka. Osim ključnih podataka o datotekama u bazu podataka pohranjuju se parametri
algoritama koji izračunavaju sličnosti datoteka, rezultati algoritama i cijeli niz drugih
podataka. Sustav je implementiran u objektno-orijentiranom jeziku Java koristeći MySQL
bazu podataka. Za učitavanje i obradu arhiva i datoteka implementiran je paket
hr.fer.csi.input, a za pohranjivanje u bazu podataka i pristup podacima
implementiran je paket hr.fer.csi.database.
Ključne riječi: obrada arhiva, obrada datoteka, značajke datoteka, upravljanje bazom
podataka, Java, MySQL.
37
Summary
File Proporties Storage in the Plagiarism Detection Programming System
Many faculties have a serious problem with students that deliberately borrow and
copy another student's software solutions. For this reason, a system that finds potential
plagiarism is needed. In this paper a part of the system that handles input archive files,
processes them and handles storing key information to a database is discussed. In addition
to key information, many other values are also stored in the designed database. Some of
these values include parameters of algorithms that find potential plagiarism, results of
those algorithms and other data. The whole system is implemented in the object-oriented
programming language Java and uses a MySQL database. The package hr.fer.input
handles file and archive processing and the package hr.fer.database handles file
storage.
Keywords: archive processing, file processing, file characteristics, database management,
Java, MySQL.