http://www.hut.fi/~kmkokko/oht/dokumentit/p1-vaihe4/tm.html |
Tik-76.115
Software Project
S98-K99 |
TRAKLA-EDIT |
Rekno: TM003 |
Versio: 03 |
Päivitetty: 1.2.1999 |
TEKNINEN MÄÄRITELMÄ |
Laatinut: KMK, JK, JO |
Tarkistanut: KMK, JK, JO |
Vastuussa: JO |
Sisällysluettelo
1. Johdanto
1.1. Määritelmiä
2. Järjestelmän yleiskuvaus
2.1. Yleiskuvaus järjestelmän toiminnasta
2.2. Käyttäjät
2.3 Toteutusvälineistä
2.4 Liittyminen ympäristöön
3. Reunaehdot
3.1. Java Serializable-rajapinta
3.2. Java Cloneable-rajapinta
3.3. Java RMI-kutsu
3.4. Järjestelmän liittyminen ympäristöön
3.4.1 File_IO-rajapinta
3.4.2 Trakla-palvelimen hakemistohierarkia
3.5 DSDL-kieli
4. Arkkitehtuurin kuvaus
4.1 Modulaarisuus
4.2 Korkean tason luokkamalli
4.2.1 GUI-luokka
4.2.2 Representation-luokat
4.2.3 Tietorakenne-luokat
4.2.4 Animaattori-luokka
4.3 Tapahtumien käsittely
4.4 Nimeämiskäytäntö
5. Rajapintahierarkia
5.1 GUI
5.2 Representation - Esitysmuoto
5.2.1 Esitysmuotojen toteuttamat rajapinnat
5.2.2 Esitysmuotojen käyttämät rajapinnat
5.3 Data Structure - Tietorakenne
5.3.1 Tietorakenteiden toteuttamat rajapinnat
5.3.2 Tietorakenteiden käyttämät rajapinnat
5.4 Animator - Animaattori
5.4.1 Animaattorin toteuttamat rajapinnat
5.4.2 Animaattorin käyttämät rajapinnat
6. Moduulien toteutuksen kuvaus
6.1 GUI
6.2 Esitysmuodot
6.3 Tietorakenteet
6.4 Animaattori
1. Johdanto
TKK:n tietojenkäsittelyopin laboratoriossa on 90-luvulla kehitetty
erilaisia sähköisen opetuksen tukijärjestelmiä, joista
eräs on Tietorakenteet
ja algoritmit -kurssilla käytössä oleva TRAKLA
-järjestelmä. Järjestelmä on tarkoitettu sekä
kurssin hallinnointiin että kurssilla käytössä olevien
tehtävien automaattiseen jakeluun, vastaanottoon ja tarkastamiseen.
Automaattisesti tarkastettavilla tehtävillä tarkoitetaan tässä
yhteydessä ei-triviaaleja algoritmien simulointitehtäviä,
jotka voidaan virittää sisällöltään jokaiselle
opiskelijalle erilaiseksi. Kahden viimeisen vuoden aikana järjestelmästä
on kehitetty WWW-pohjaista (WWW-TRAKLA),
jolloin järjestelmän opiskelijalle näkyvä käyttöliittymä
on WWW:ssä. Samalla opiskelijoille on tullut mahdolliseksi ratkoa
tehtäviä graafisella käyttöliittymällä. Java-pohjainen
käyttäliittymä toimii WWW-selaimessa ja esittää
tehtävässä käytetyt tietorakenteet graafisesti. Käyttöliittymä
kommunikoi TRAKLA
-järjestelmän kanssa sähköpostin välityksellä.
Vanhan järjestelmän reunaehdot kuitenkin rajoittavat tällä
hetkellä järjestelmän edelleenkehitystyötä.
Ohjelmatyönä toteutettava järjestelmä tulee liittymään
olennaisena osana TKO-laboratoriossa käynnissä olevaan LEAD-projektiin
(Learning Environment for Algorithms and Data Structures), jossa tarkoituksena
on rakentaa kohtuullisen kattava WWW-pohjainen tietorakenteiden ja algoritmien
oppimisympäristö, johon kuuluu harjoitustehtävien lisäksi
myös muuta opiskelumateriaalia. Järjestelmän on tarkoitus
hyödyntää vahvasti hypermedian mahdollisuuksia ja ennenkaikkea
etsiä hypermediasta uusia oppimista edesauttavia ominaisuuksia. Opiskelumateriaalin
lisäksi järjestelmän on tarkoitus kattaa myös kurssin
hallinnointiin liittyviä seikkoja aina ilmoittautumisesta palautteen
keräämiseen saakka. Projektissa koko hanketta on lisäksi
tarkoitus evaluoida pedagogisesta näkökulmasta ja pohtia millaista
opetuksellista ja oppimisen kannalta keskeistä lisäarvoa se tuo
mukanaan.
OLIO-TRAKLA on osa WWW-TRAKLA- konseptia; sitä tarkoitus käyttöä
lähinnä kurssin Tik-76.122 Tietorakenteet ja algoritmit harjoitustehtävien
automaattiseen jakeluun, vastaanottoon ja tarkastamiseen, sekä kurssin
hallinnointiin. Siihen on tarkoitus liittää myös jossain
määrin opintomateriaalia mm. linkkien ja viitteiden muodossa.
Enin osa opintomateriaalin tarjonnassa rajautuu kuitenkin OLIO-TRAKLA:n
ulkopuolelle.
Ohjelmatyönä toteutettava järjestelmä TRAKLA-EDIT
on osa OLIO-TRAKLA -järjestelmää (kuva 1). Kyseessä
on sen WWW-pohjainen käyttöliittymä, eli asiakaspään
sovellus joka kommunikoi TRAKLA-palvelimen kanssa.
Kuva 1 - OLIO-TRAKLA konsepti
1.1 Määritelmiä
LYHENNE, TERMI |
SELOSTUS |
DSDL |
Data Structure Description Language eli kuvauskieli, jolla voidaan
kuvata tietorakenteen tai animaattorin tila HTML-tyyppisilla tageilla ja
määritteillä |
Clonable Interface |
Luokan instanssien tulee tarjota close-metodi, jolla pystytään
kopioimaan luokan kenttien arvot yksi yhteen. |
Dynaaminen HTML |
HTML kielinen sivu, joka muodostetaan palvelimella annettujen parametrien
perusteella. |
Java Interface |
Rajapintamäärittely, joka määrittelee yksikäsitteisesti
toteutettavilta luokilta vaaditut palvelut ja toiminnot. |
LEAD |
Learning Environment for Algorithms and Data structures |
RMI |
Remote Method Invocation. |
Serializable Interface |
Javan tarjoama sarjallistamisrajapinta, jonka avulla voidaan ohjata
olion instanssin tila tietovuohon, josta se on myöhemmin palautettavissa. |
2. Järjestelmän yleiskuvaus
2.1. Yleiskuvaus järjestelmän toiminnasta
TRAKLA-EDIT -järjestelmä on OLIO-TRAKLA -järjestelmän
WWW-pohjainen käyttöliittymä. TRAKLA-EDIT:illä opettaja
voi luoda graafisesti tietorakenteisiin ja algoritmeihin liittyviä
tehtäviä ja esimerkkejä, joita puolestaan opiskelija voi
graafisesti suorittaa ja tutkia. Opettajan laatimat tehtävät
ja esimerkit tallennetaan TRAKLA-palvelimelle; oppilas voi siis tilata
tehtäviä ja esimerkkejä tältä palvelimelta ja
myös lähettää suorittamiaan tehtäviä sinne
tarkistettavaksi. Esimerkkeihin oppilas voi tutustua kelaamalla opettajan
esimerkkiin luomaa animaatiosekvenssiä edestakaisin.
2.2. Käyttäjät
Järjestelmän käyttäjäkunta muodostuu opiskelijoista,
assistenteista sekä luennoitsijasta. Profiloiduilla käyttäliittymällä
on tarkoitus mahdollistaa ohjelmiston toteutus siten, että sovelluksen
käynnistyessä voidaan käyttäjäidentifikaation
perusteella valita käytettävä profiili. Profiilit määrittelevät
toiminnot, jotka ovat istunnon aikana suoritettavissa. Luennoitsijan profiilissa
on mahdollista luoda uusia tehtäviä ja esimerkkejä, kun
taas opiskelijan profiili rajoittuu tehtävien ratkaisemiseen ja palauttamiseen
sekä valmiiden esimerkkien selaamiseen graafisen käyttälittymän
kautta.
2.3 Toteutusvälineistä
Järjestelmän vaatimuksiin kuuluu toimia kaikissa yleisimmissä
selaimissa (Explorer, Netscape) sekä käyttöjärjestelmissä
(Windows, UNIX, Machintosh). Toteutuksessa käytetään Java
Development Kit versiota 1.1.7A, jolloin rajoitteeksi jää selainten
yhteensopivuus ja tuki Javalle. Toteutuksessa käytettävät
Java-kääntäjä ja Java-tulkki ovat vapaasti haettavissa
Sun Microsystem yhtiön kotisivuilta www.sun.com.
Myös yleisimmät selaimet, Microsoftin Internet Explorerin uusin
versio on osoitteessa www.microsoft.com
sekä Netscapen uusin versio osoitteessa www.netscape.com,
ovat vapaasti haettavissa ja käytettävissä.
2.4 Liittyminen ympäristöön
TRAKLA-EDIT toimii graafisena käyttöliittymänä, jolla
voidaan laatia (opettaja) ja ratkaista(opiskelija) tehtäviä.
Sillä voidaan myös tehdä valmiita animaatiosekvenssejä
havainnollistamaan tietorakenteen toimintaa visuaalisessa muodossa (opettaja)
sekä tutustua (opiskelija) näihin animaatiosekvensseihin. TRAKLA-EDIT
kommunikoi OLIO-TRAKLA -järjestelmän TRAKLA-palvelimen kanssa.
TRAKLA-Palvelin koostuu kahdesta eri kokonaisuudesta: ensimmäinen
tarjoaa talletuskapasiteettia jonne voidaan tallentaa tehtäviä
ja esimerkkejä; toinen palvelimen toiminnallisuus on tehtävien
automaattinen tarkastus.
Tarkemmin aiheesta on kerrottu kohdassa 3.4.Järjestelmän
liittyminen ympäristöön.
3. Reunaehdot
TRAKLA-EDIT:in reunaehdot määräytyvät OLIO-TRAKLA konseptin
perusteella (kappale 1). TRAKLA-EDIT kommunikoi palvelimen kanssa, jossa
on levykapasiteettia ja TRAKLA-palvelin. Levykapasiteettia voidaan käyttää
tehtävien, esimerkkien ja vastausten tallentamiseen. Tietorakenteiden
ja animaattorin tila tallennetaan palvelimelle DSDL kuvauksena, jollei
kyseessä ole tehtävän palautus. Tehtävän palautus
suoritetaan sarjallistamalla animaattori ja tallentamalla näin saatu
tavukoodi palvelimelle. DSDL kuvaus voidaan myös lukea TRAKLA-EDIT:llä,
jolloin sovellus voidaan palauttaa tilaan, jossa se oli tallentamishetkellä.
Tämä mahdollistaa esimerkkien ja malliratkaisuiden tuottamisen
TRAKLA-EDIT:llä.
Opiskelijan tietorakenteelle suorittama ratkaisu tallennetaan animaattori-luokan
Client-instanssiin,
joka toteuttaa Java Serialization-rajapinnan. Tämä sarjallistettu
instanssi tallennetaan palvelimelle, jonne indikoidaan Java RMI-kutsu.
Kutsun saatuaan TRAKLA-palvelin ajaa malliratkaisun omaan animaattori-luokan
Server-instanssiinsa ja suorittaa vertailun Client- ja Server-instanssien
välillä. Animaattori -luokka toteutetaan TRAKLA-EDIT projektin
yhteydessä, ja samaa animaattorin toteutusta (kappale 4.4.) käytetään
myös TRAKLA-palvelimella.
3.1 Java Serializable-rajapinta
Java Serializable-rajapinnan toteutus mahdollistaa objektien tallennuksen
ja palatuksen. Objektien tallennus ja palautus mahdollistetaan esittämällä
niiden tila tavukoodina, jonka informaatio mahdollistaa objektin palauttamisen
alkuperäiseen tilaan. Tallennettava objekti voi toteuttaa joko Serializable-
tai Externalizable-rajapinnan. Tallennettavat objektit viittaavat
usein muihin objekteihin. Nämä muut objektit on tallennettava
samaan aikaan, kuin itse sarjallistuksen kohteena oleva objekti, jotta
objektien väliset suhteet säilyisivät konsistentteina.
Animaattorin client-instanssin tallentaminen toteutetaan seuraavalla
koodilohkolla [6]
:
/*
** serializa animator client
instance
*/
FileOutputStream f = new FileOutputStream(
"tmp" );
ObjectOutput s = new ObjectOutputStream(
f );
s.writeObject( animator.getClientInstance()
);
s.flush();
Animaattorin client-instanssin lukeminen toteutetaan seuraavalla koodilohkolla
[6]:
/*
** deserialize a animator client
instance from a file
*/
FileInputStream in = new FileInputStream(
"tmp" );
ObjectInputStream s = new ObjectInputStream(
in );
Animator animator = (Animator)s.readObject();
Keskeytykset, jotka sarjallistuva objekti voi aiheuttaa on listattu
alla. Kaikki nämä otetaan vastaan ja käsitellään
siten, että ohjelman suoritusta pystytään jatkamaan.
-
InvalidClassException
-
NotSerializableException
-
StreamCorruptedException
-
NotActiveException
-
InvalibObjectException
-
OptionalDataException
-
WriteAbortedException
3.2. Java Cloneable-rajapinta
Java Cloneable-rajapinnan toteuttaminen vaatii clone-metodin
toteuttamista tietorakenteissa, jotta animaattoriin voidaan tallentaa kopio
tietorakenteen tilasta tietyllä ajan hetkellä. Clone-metodi
kopioi kaikkien kenttien arvot luokassa.
Keskeytykset, jotka kloonatta objekti voi aiheuttaa on listattu alla.
Kaikki nämä otetaan vastaan ja käsitellään siten,
että ohjelman suoritusta pystytään jatkamaan.
-
CloneNotSupportedException
3.3. Java RMI-kutsu
Socket -kommunikaation asiakkaan ja palvelimen välillä
vaatisi sovellustason protokollaa, jonka toteuttamista on pyritty välttämään
OLIO-TRAKLA konseptissa. Remote method invocation (RMI) tarjoaa
vaihtoehdon puhtaaseen Java-ympäristöön. Common object
request broker architecture (COBRA) on myös liian raskas OLIO-TRAKLA
-ympäristöön, sillä tukea ei tarvita muille kielille
kuin Javalle.
Seuraavassa on esimerkki [7], jolla TRAKLA-EDIT pystyy herättämään
TRAKLA-palvelimen tarkastusmetodin yksinkertaisella RMI-kutsulla, kun opiskelija
on tallentanut sarjallistetun animaattorin TRAKLA-palvelimen levylle omaan
hakemistoonsa:
/**************************************************************
** interface definition for
server startCheckProcedure() method
**************************************************************/
public interface TRAKLA_server_interface
extends java.rmi.remote
{
int startCheckProcedure() throws
java.rmi.RemoteException;
}
/************************
** code for TRAKLA_server
************************/
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class Trakla_server extends
UnicastRemoteObject implements TRAKLA_server_interface
{
private String name;
public Trakla_server( String
userId )
{
super();
}
public void startCheckProcedure()
{
/*
** check submitted exercise
*/
}
public static void main( String
args[] )
{
/*
** create and install security
manager
*/
}
/*************
** TRAKLA-EDIT
*************/
import java.awt-*;
import java.rmi.*;
public class TRAKLE_EDIT extends
java.applet.Applet
{
public void init()
{
try {
TRAKLA_server_interface obj
= (TRAKLA_server_interface)Naming.lookup("//" + getCodeBase().getHost()+"TRAKLA_server"
);
int result = obj.startCheckProcedure();
} catch (Exception e) {
System.out.println( "TRAKLA_server
exception: " + e.getMessage() );
e.printStackTrace();
}
}
}
3.4. Järjestelmän liittyminen ympäristöön
3.4.1. File_IO rajapinta
TRAKLA-EDIT pystyy kommunikoimaan TRAKLA-palvelimen (kuva 1) kanssa File_IO-olion
kautta. Olion tarjoamat metodit (INTERFACE METHODS) mahdollistavat
pyyntöjen esittämisen palvelimelle, joka vastaa pyyntöihin
rajapinnassa määritellyssä ajassa (TIMEOUT LITERALS).
Tämä rajapinta on määritelty TRAKLA-palvelin projektin
puolesta ja sen tarjoamat palvelut ja literaalit ovat:
TIMEOUT LITERALS
-
LOAD_REQUEST_TIMEOUT
- Jos latausoperaationpyynnön kuittaus ei saavu palvelimelta tällä
aikavälillä, tulkitaan tapahtuneeksi ATP-kommunikointi virhe.
-
SAVE_REQUEST_TIMEOUT
- Jos tallennusoperaatiopyynnön kuittaus ei saavu palvelimelta tällä
aikavälillä, tulkitaan tapahtuneen ATP- kommunikaatio virhe.
-
DIRECTORY_REQUEST_TIMEOUT
- Jos hakemisto-operaatiopyynnön kuittaus ei saavu palvelimelta tällä
aikavälillä, tulkitaan tapahtuneen ATP-kommunikaatio virhe.
-
USER_IDENTIFICATION_TIMEOUT
- Jos käyttäjän tunnistamisoperaation kuittaus ei saavu
palvelimelta tällä aikavälillä, tulkitaan tapahtuneen
ATP-kommunikaatio virhe.
-
CONNECTION_TIMEOUT
- Jos yhteys TRAKLA-EDIT:in ja palvelimen välillä on auki ja
aikaväli ylittyy, katkaistaan yhteys ja käyttäjän on
tunnistauduttava uudelleen jatkaessaan kommunikointia palvelimen kanssa.
Kommunikaation alkaessa TRAKLA-palvelimelle käynnistetään
oma säie, jonka tehtävänä on toimia yhteyden ajastimena.
Säie herättää InterreptException-keskeytyksen
jos yhteys TRAKLA-EDIT:in ja TRAKLA-palvelimen välillä ei pysty
täyttämään edellä mainittujen TIMEOUT literaalien
asettamia aikarajoja. Aikarajojen tarkoituksena on estää tilanteet,
joissa TRAKLA-EDIT:in käyttäjä luulee suorittaneensa operaation,
joka todellisuudessa on estynyt internet-verkossa esiintyneen ruuhkan takia.
INTERFACE METHODS
-
Object load( String fname )
- Aktivoi yhteyden TRAKLA-palvelimelle ja palauttaa ladattavan objektin
TRAKLA-palvelimelta.
-
int save( Object l, String fname
) - Aktivoi yhteyden TRAKLA-palvelimelle ja tallentaa
objektin l TRAKLA-palvelimelle.
-
String [] dir( String path )
- Hakee hakemiston sisällön palvelimelta.
-
int errorcode()
- Palauttaa viimeksi tapahtuneen virheen koodin.
-
void set_userid( String user,
String password ) - Asettaa käyttäjätunnuksen
File_IO-olioon yhteyden aktivoimista load- ja save-metodeja varten.
-
String get_userid()
- Palauttaa File_IO-olioon asetetun käyttäjätunnuksen.
File_IO -olio herättää IOException-keskeytyksen jos
yhteyden muodostuminen epäonnistuu (ennen TIMEOUT literaalien aiheuttamaa
InterruptExceptionia). Tämän jälkeen voidaan kysyä
File_IO-oliolta epäonnistumisen syytä, ja päätellä
onko kyseessä väliaikainen vai pysyvä virhe.
3.4.2. TRAKLA-palvelimen hakemistohierarkia
TRAKLA-palvelin tarjoaa jokaiselle opiskelijalle henkilökohtaisen
hakemiston (kuva 2, student_dir) johon tällä opiskelijalla on
luku- ja kirjoitusoikeudet. Tämän hakemistopolku voidaan johtaa
käyttäjätunnuksesta, ja siihen opiskelija voi tallentaa
välisratkaisunsa ja palautettavat ratkaisut. Hakemistohierarkiassa
on myös esimerkkihakemisto (kuva 2, example_dir) johon vain luennoitsijalla
ja assistenteilla on kirjoitusoikeus. Esimerkkihakemistoon tallennetaan
esimerkit ja niihin liittyvät mallivastaukset. Tästä hakemistosta
kaikki opiskelijat pystyvät hakemaan esimerkkitehtäviä käydäkseen
niitä läpi omalla TRAKLA-EDIT istunnollaan.
Kuva 2 - TRAKLA-palvelimen hakemistohierarkia
3.5. DSDL-kieli
Tehtävänantojen, esimerkkien ja väliratkaisujen talletusmuoto
on valittava siten, että sovelluksen mahdolliset laajennukset ja toteutusympäristön
päivitykset eivät aiheuta muutosta niiden konsistenssiin. Konsistenssilla
käsitetään tässä tallennetun informaation tulkintaa
sille asetetun määrittelyn mukaan siten, että mahdolliset
uudet ominaisuudet eivät vaikuta vanhan informaation käsittelyyn.
TRAKLA-EDIT käyttää tallentamiseen sille erikseen määriteltävää
data
structure description language (DSDL) syntaksia, jonka ulkoasu on johdettu
HTML kielestä. Kielellä kuvataan oliokohtaista informaatiota,
jolloin tagien rajoittamat osa-alueet voidaan käsittää yhden
luokan instanssin kuvaukseksi. DSDL kielellä voidaan kuvata
-
Käyttöliittymän tila
-
Tietorakenteet
-
Animaatiosekvenssit
Formaali määritelmä DSDL:lle löytyy dokumentista:
DSDL
Specification.
4. Arkkitehtuurin kuvaus
4.1. Modulaarisuus
Modulaarisuudella eristetään toiminnalliset osakokonaisuudet
toisistaan siten, että moduulien sisäinen toteutus on riippumaton
toisistaan. Rajapintojen määritettely mahdollistaa yksittäisten
moduulien ja luokkien implementoinnin uudelleen ilman, että sen vaikutukset
ulottuvat muihin moduuleihin. Moduulimalli on esitetty kuvassa 3. Rajapintojen
metodit on esitetty TRAKLA-EDIT:in toiminnallisuutta kuvaavilla SDL
kuvilla liitteissä
1, 2,
3
ja
4. Moduulien toteutuksen kuvaus kappalessa
5 sisältää sanallisen määrittelyn rajapintojen
ja luokkien literaaleille sekä metodeille. Rajapinnat on määritelty
kappaleessa 4.
Kuva 3 - TRAKLA-EDIT moduulimalli
-
GUI - Graphical User Interface eli graafinen käyttöliittymä
toimii käyttäjän graafisesti tekemien toimintojen tulkitsijana.
GUI on vastuussa siitä, että se osaa delegoida käyttäjien
pyytämät toiminnot kyseessä olevien luokkien oikeille instansseille
sekä yhdistää useampaa oliota koskevat toiminnot toimintosarjaksi,
josta muodostuu haluttu toiminnallisuus (esim. tehtävien tallennuksessa
DSDL-sivun yhdistäminen olioden palauttamista DSDL-alisivuista). GUI:n
toimintaa ohjataan valikoilla (LIITE
1: PROCESS MENU EVENT), joista on valittavissa
seuraavat toiminnalliset ryhmät:
TIEDOSTO TOIMINNOT (FILE):
-
New - LIITE 1: PROCEDURE
FILE EVENT: NEW. Jos käyttäjä ei halua menettää
editoitua informaatiota, new-proseduuri tallentaa tietorakenteet, niiden
esitysmuotojen sijainnin käyttöliittymässä ja animaattorin
sekvenssin DSDL-kieliseksi tiedostoksi palvelimelle. Tämän jälkeen
kaikki viittaukset esitysmuotoihin vapautetaan ja animaattorin client-instanssi
tyhjennetään. Proseduurin jälkeen TRAKLA-EDIT:in käyttöliittymä
on alkutilasssa.
-
Open - LIITE 1: PROCEDURE
FILE EVENT: OPEN. Open-proseduuri lataa File_IO-olion
load-metodin
avulla palvelimelta DSDL-kielisen sivun, jonka kuvaamat tietorakenteet
ja mahdollinen animaattori sekvenssi palautetaan tilaan, jossa se oli ennen
tallennusta tietorakenteiden ja animaattorin putDSDL-metodeilla.
-
Close - LIITE 1: PROCEDURE
FILE EVENT: CLOSE. Close-proseduuri tallentaa tietorakenteet
ja niiden esitysmuotojen sijainnin käyttöliittymässä
sekä animaattorin sekvenssin DSDL kieliseksi tiedostoksi palvelimelle.
Tämän jälkeen kaikki viittaukset esitysmuotoihin vapautetaan
ja animaattorin client-instanssi tyhjennetään. Proseduurin
jälkeen TRAKLA-EDIT:in käyttöliittymä on alkutilasssa.
-
Save - LIITE 1: PROCEDURE
FILE EVENT: SAVE. Tallentaa kaikki oletusesitysmuodoista viitattujen
tietorakenteiden tilat DSDL kuvauksena palvelimelle
File_IO-olion
tarjoaman save-metodin avulla. Jos kyseessä oli esimerkki,
tallennetaan myös animaattorin sekvenssi.
-
Save As... - LIITE 1: PROCEDURE
FILE EVENT: SAVE AS... Toimiin samoin kuin save-proseduuri edellä,
mutta käyttäjä voi määritellä tallennettavat
DSDL -kuvauksen nimen.
-
Check - LIITE 1: PROCEDURE
FILE EVENT: CHECK. Tallentaa Java Serializable-rajapinnalla
sarjallistetun animaattorin palvelimelle
File_IO-luokan save-metodilla.
Jos tallennus onnistui virheittä, indikoidaan RMI-kutsu TRAKLA-palvelimelle,
jolloin tehtävän tarkastus alkaa.
-
Exit - LIITE 1: PROCEDURE
FILE EVENT: EXIT exit-proseduuri tallentaa tietorakenteet ja
niiden esitysmuotojen sijainnin käyttöliittymässä sekä
animaattorin sekvenssin DSDL-kieliseksi tiedostoksi palvelimelle. Tämän
jälkeen kaikki resurssit vapautetaan ja käyttäliittymä
ikkuna suljetaan. TRAKLA-EDIT on käynnistettävä uudestaan,
jos halutaan jatkaa työskentelyä.
MUOKKAUS TOIMINNOT (EDIT):
LISÄYS TOIMINNOT (INSERT):
-
Data Structure - LIITE 1:
PROCEDURE
INSERT EVENT: DATA STRUCTURE.
FactoryForDS luo uuden
tietorakenteen, joka palauttaa tietorakenteen oletusesitysmuodon. Oletusesitysmuodon
paneeli liitetään GUI:n containeriin, jolloin se saadaan aktiiviseksi
näytölle. Esitysmuoto tallennetaan GUI:ssa sijaitsevaan esitysmuoto-listaan,
josta se voidaan poistaa ja sen ominaisuuksia (koko, sijainti) voidaan
muokata.
-
Representation for Data Structure - LIITE
1: PROCEDURE INSERT EVENT: REPRESENTATION.
Lisää näytölle esitysmuodon. Esitysmuoto saadaan näytöllä
jo olevalta esitysmuodolta, joka luo sillä olevan tietorakenneviittauksen
avulla tietorakenteelle uuden esitysmuodon. Esitysmuoto tallennetaan GUI:ssa
sijaitsevaan esitysmuoto-listaan, josta se voidaan poistaa ja sen ominaisuuksia
(koko, sijainti) voidaan muokata.
MUOTOILU TOIMINNOT (FORMAT):
ANIMAATTORI TOIMINNOT (ANIMATOR):
APU TOIMINNOT (HELP):
-
Repr - Representation eli esitysmuoto vastaa tietorakenteen
piirtämisestä kuvaruudulle. Tietokenteiden alkioiden graafinen
käsittely hallitaan esitysmuodossa siten, että tietorakenteita
muokataan vasta, kun koko operaatio on suoritettu loppuun. Näin vältetään
tietorakenteiden joutuminen epäkonsistenssiin tilaan. Epäkonsistenssilla
tarkoitetaan esimerkiksi puun jonkin haaran irtaantumista puusta omaksi
puukseen siten, että siihen ei ole enään viittausta alkuperäisestä
puusta. Tapahtumien käsittely ja niiden tulkitseminen TRAKLA-EDIT:ssä
sekä esimerkkinä käytetyn taulukko (table) -esitysmuodon
toiminnallisuus on kuvattu SDL-kaavioina (LIITE
2).
-
DS - Data Structure eli tietorakenteet ovat kirjallisuudesta
saatavia fyysisiä toteutuksia, jotka voivat olla tehtävänantona
tai esimerkkinä. Kaikki ruudulla esitettävät tietorakenteet
käyttävät niille toteutettuja oletusesitysmuotoja. Tietorakenteita
ovat mm. tekstikentät (esim. tehtävänannon tekstimuotoinen
kuvaus), alkutietorakenteet (esim. taulukko alkioita) ja palautettava tietorakenne
(esim. jonkin algoritmin mukaan muokattu puu). Tietorakenteiden algoritmit
voidaan olio-ohjelmoinnin tyyliä noudattaen toteuttaa erillisinä
luokkina, jolloin niiden uudelleenkäyttöaste nousee. LIITE
3 kuvaa esimerkkinä käytettävän tietorakenteen
(taulukko) toiminnallisuuden SDL kuvauksena.
-
Anim - Animator eli animaattori tallentaa esitysmuodon toteutuksessa
valitun semantiikan (COPY, MOVE tai SWAP, kuva 4)
mukaan tietorakenteen alkioihin kohdistetut atomiset operaatiot sekvensseiksi.
Semantiikoilla saavutetaan tietorakenteen muokkauksessa haluttu toiminnallisuus;
kopioidaan alkio, kun se siirretään tietorakenteesta toiseen,
siirretäänkö se vai onko kyseessä vaihto-operaatio,
jolloin kohde- ja lähdeavain vaihtavat paikkaa. Tallenteen perusteella
voidaan tietorakenne palauttaa tilaan, jossa se oli ennen siihen kohdistettua
operaatiota. Koska animaattoriin tallennetaan atomiset operaatiot, pystytään
ruudulla esittämään animaatio myös operaatioista, jotka
koostuvat useammasta atomisesta operaatiosta (esimerkiksi rotaatio). Toteutuksessa
käytetään Java-Cloneable-rajapintaa, joka mahdollistaa
tietorakenteiden kuvaamisen tietyllä ajan hetkellä. Tätä
toimintoa voidaan verrata perinteisten ohjelmointikielten muistilohkon
kopioimistoimintoon (kuva 5).
Kuva 4 - Tietorakenne operaatioiden semantiikat
Kuva 5 - Animaattorin Java Cloneable-rajapinnan toteutus
4.2. Korkean tason luokkamalli
Kappaleessa 4.1 esitetty modulaarisuus jakautuu luontevasti luokiksi, jotka
on esitetty kuvassa 6. Luokat itsessään muodostuvat aliluokista,
joiden toteutus on kuvattu kappalessa 5. Korkean tason luokkamallin tarkoituksena
on määritellä toiminnalisten kokonaisuuksien toteutus ja
omistussuhteet.
Kuva 6 - Korkean tason luokkamalli
4.2.1. GUI-luokka
GUI-luokka hallitsee graafista käyttöliittymää ja pystyy
liittämään esitysmuotoja hallussaan olevaan Java-Containeriin.
Esitysmuotoja säilytetään vektorissa, jonka alkiot ovat
Representation-tyyppisiä. Containeriin voidaan liittää myös
animaattori-luokan ohjauksen mahdollistava paneeli.
4.2.2. Representation-luokat
Esitysmuoto-luokka sisältää aina viittauksen yhteen tietorakenteeseen.
Useampi esitysmuoto voi kuitenkin viitata samaan tietorakenteeseen, joka
mahdollistaa tietorakenteelle useita eri näkymiä (kuva 7).
Kuva 7 - Esitysmuoto - tietorakenne; omistussuhteet
GUI-luokka käyttää näkee vain esitysmuodon, jonka
se pystyy liittämään tai poistamaan näytöltä.
Tietorakenteen lisäämisen yhteydessä FactoryForDS (kappale
5.1) palauttaa kyseiselle tietorakenteelle määritellyn oletusesitysmuodon.
Viittaus tietorakenteeseen annetaan esitysmuodon muodostimessa, jolloin
varmistetaan, ettei esitysmuoto yritä koskaan piirtää olematonta
tietorakennetta.
Operaatiot, jotka kohdistuvat tietorakenteisiin, kuten uuden esitysmuodon
liittäminen tietorakenteeseen, tapahtuu esitysmuodon kautta, jossa
on viittaus tietorakenteeseen. Kappaleessa 3.1 esitetyn
Java Serialization-rajapinna
vuoksi on tarpeellista välttää viittauksia tietorakenteista
esitysmuotoihin, koska silloin jouduttaisiin sarjallistamaan koko TRAKLA-EDIT.
Uusien tietorakenteiden ja esitymuotojen toteutuksesta TRAKLA-EDIT ympäristössä
käsittelee erilleinen dokumentti Tietorakenteiden
toteutus TRAKLA-EDIT ympäristössä.
4.2.3. Tietorakenne-luokat
Tietorakenne-luokat ovat fyysisiä toteutuksia tiedon tallentamiselle
johonkin ennalta määriteltyyn tallennusrakenteeseen. TRAKLA-EDIT:in
tehtävänä on havainnollistaa tietorakenteiden toimintaa
visuaalisesti, joten tietorakenteiden toteutuksessa on huomioitava animaattorin
ja esitysmuotojen tarvitsemat rajapinta-metodit. Uusien tietorakenteiden
ja esitymuotojen lisäämisestä TRAKLA-EDIT ympäristöön
on erillinen dokumentti osoitteessa
Tietorakenteiden
toteutus TRAKLA-EDIT ympäristössä.
4.2.4. Animaattori-luokka
TRAKLA-EDIT käyttää animaattorista Client-instanssia.
Singleton [3] Desing Pattern mallintaa luokan toteutuksen, jossa varmistetaan,
ettei luokasta voida käyttää kuin ennalta määriteltyjä
instansseja; TRAKLA-EDIT:lle Client- ja TRAKLA-palvelimelle Server-instanssi.
Animaattoriin tallentuvat tietorakenteen muutokset Javan Clonable-rajapinnan
määrittelemällä clone-metodeilla. Javan Serializable-rajapinta
puolestaan mahdollistaa animaatiosekvenssin siirtämisen TRAKLA-palvelimelle
tarkastettavaksi tavukoodina. TRAKLA-EDIT:ssä animaattoria käyttää
myös GUI-luokka, jonka avulla käyttäjä voi käydä
läpi ja palata takaisin ennalta tallennettuja sekvenssejä animaattorin
tarjoaman ohjauspaneelin tai "Animator"-valikon avulla (LIITE
1).
4.3. Tapahtumien käsittely
Tapahtumien käsittely, Java Events, on toteutettu TRAKLA-EDIT:ssä
siten, että tapahtumat kuunnellaan sen luokan instanssissa, johon
ne kohdistuvat:
-
MenuEvents - Otetaan vastaan GUI:ssa ActionListener-rajapinnan
metodeilla.
-
MouseEvents - Otetaan vastaan esitysmuoto-luokan instansseissa MouseListener-
ja MouseMotionListener-rajapintojen metodeilla, joihin käyttäjän
operaatiot kohdistuvat.
-
KeyboardEvents - Otetaan vastaan esitysmuoto-luokan instansseissa
KeyboardListener-rajapinnan
metodeilla, joihin käyttäjän operaatiot kohdistuvat.
4.4. Nimeämiskäytäntö
-
Rajapinnat - Rajapintojen nimeämisessä käytetään
kuvassa 3 esitettyjä merkintöjä. Niiden tarkoitus on kuvata
rajapinnan metodien tarjoamaa toiminnallisuutta. Rajapinnat on käsitelty
omasssa kappaleessaan (kappale 4).
-
Representation - ei varsinaisesti ole rajapinta, vaan abstrakti
luokka, josta kaikki esitysmuodot periytetään. Abstrakti luokka
sisältää alustamisen RepresentationPanel-paneelille,
joka voidaan liittää GUI:ssa Containeriin.
-
Operational - Tietorakenteen operationaaliset metodit esitetään
operational-rajapinnassa (esimerkiksi taulukolle Table_operational-rajapinnassa).
Tietorakennekohtaiset rajapinnat periytyvät ylimmän tason operational-rajapinnasta.
-
Layout - Tietorakenteiden piirtämiseen tarvittavat metodit
esitetään layout-rajapinnassa (esimerkiksi taulukolle Table_layout-rajapinnassa).
Tietorakennekohtaiset rajapinnat periytyvät ylimmän tason layout-rajapinnasta.
-
AnimatorSignal - Animaattori ilmoittaa tämän rajapinnan
kautta tietorakenteelle, että sitä on pyydetty siirtymään
johonkin edellä tallennettuun tilaan.
-
Animator - Tietorakenne tallentaa tilansa operaatioden jälkeen
animaattoriin tämän rajapinnan tarjoamien metodien avulla.
-
AnimatorControl - Käyttäjä voi ohjata animaattoria
GUI:n avulla, joka välittää pyynnöt animaattorille
tämän rajapinnan metodien välityksellä.
-
Esitysmuodot - Esitysmuodot koostuvat kompositiona (kuva 8) näkymästä
(view) ja toiminnallisesta osasta (logic). Näkymä-luokat nimetään
_View
jälkiliitteellä (esimerkiksi Table_view), jotka käyttävät
tietorakenteissa toteutettua Layout rajapintaa (Table_Layout). Toiminnalliset
luokat nimetään _Logic jälkiliitteellä (esimerkiksi
Table_Logic), jotka käyttävät tietorakenteissa toteutettua
Operational-rajapintaa (esimerkiksi Table_Operational).
-
Tietorakenteet - Tietorakenteet nimetään niitä kuvaavilla
nimillä ja jälkiliitteellä
_DS(esimerkiksi Table_DS),
lyhenteinä on suotavaa käyttää kirjallisuudesta [2]
löytyviä merkintöjä.
Kuva 8 - Esitysmuoto kompositio
5. Rajapintahierarkia
Järjestelmän eri moduulit näkevät toisensa rajapintojen
läpi. Rajapinnoissa määritellään moduulien välisessä
kommunikoinnissa tarvittavat metodit, jolloin moduulien sisäinen toteutus
ei ole järjestelmän kannalta lukkoonlyöty. Tämä
mahdollistaa tarvittaessa järjestelmän moduulien uudelleen kirjoittamisen
tai lisäämisen (esitysmuotojen ja tietorakenteiden lisäämisen).
5.1 GUI
Käyttöliittymä ei näy järjestelmän muille
moduuleille eikä näin myöskään tarjoa niille rajapintaa.
Käyttöliittymä kommunikoi esitysmuotojen kanssa Representation-rajapinnan
kautta (kuva 3). Tietorakenteisiin käyttöliittymällä
ei ole suoraa rajapintaa vaan se kommunikoi niiden kanssa esitysmuotojen
tai animaattorin välityksellä sekä luo tietorakenteita FactoryForDS-olion
avulla. Animaattorille käyttöliittymä välittää
pyyntöjä AnimatorControl-rajapinnan välityksellä.
TRAKLA-palvelimen kanssa käyttöliittymä kommunikoi TRAKLA-palvelimen
projektin tarjoaman File_io-luokan olion metodien kautta.
5.2 Representation - Esitysmuoto
5.2.1 Esitysmuotojen toteuttamat rajapinnat
Esitysmuodot periyttävät abstraktin Representation-luokan
käyttöliittymän ja esitysmuotojen väliseen kommunikointiin.
"Representation-rajapintaa" ei siis ole toteutettu rajapintana, vaan abstraktina
luokkana. Tämä mahdollistaa kappaleessa 5 esitettyjen metodien
oletustoteutuksen, jolloin niitä ei tarvitse implementoida jokaista
uutta esitysmuotoa toteutettaessa.
Abstrakti Representation-luokka toteuttaa seuraavat metodit:
-
getDSDL() - palauttaa DSDL muotoisen alisivun, joka kuvaa GUI:n
näkymän esitysmuotojen sijainnin ja koon.
-
getDSDSDL() - palauttaa esitysmuodosta viitatun tietorakenteen kuvauksen
DSDL muodossa.
-
getSupportedRepresentations() - palauttaa esitysmuodon tietorakenteen
tuntemat esitysmuodot
-
getRepresentationPanel() - palauttaa esitysmuodon käyttämän
paneelin, joka voidaan liittää GUI:n containeriin.
-
addNewRepresentationForDS() - luo uuden esitysmuodon tietorakenteelle
-
changeFont() - muokkaa esitysmuodon käyttämää
kirjaisinta ja sen kokoa.
Kaikille yllä kuvatuille metodeille on oletustoteutus, joten niitä
ei tarvitse implementoida uutta esitysmuotoa TRAKLA-EDIT ympäristöön
liittettäessä. Metodien tarkempi kuvaus löytyy kappaleesta
6 ja SDL kuvat LIITTEESTÄ 2.
5.2.2 Esitysmuotojen käyttämät rajapinnat
Esitysmuodot kommunikoivat tietorakenteiden kanssa Operational-
ja Layout-rajapintojen kautta.
5.3 Data Structure - Tietorakenne
5.3.1 Tietorakenteiden toteuttamat rajapinnat
Tietorakenteet toteuttavat Operational-rajapinnan tai siitä
perityn rajapinnan, esitysmuotojen kautta suoritettaville tietorakenteiden
muokkausoperaatioille (esim. insert, delete, jne..). Eri tietorakenteiden
erityisoperaatioita toteutettaessa rajapinnat peritään joko Operational-rajapinnasta
tai jostain muusta siitä periytyvästä rajapinnasta (kuva
9). Operational-rajapinnan metodit tarkentuvat tietorakenteiden
operaatioiden määrittelyn yhteydessä (Tietorakenteiden
toteutus TRAKLA-EDIT ympäristössä).
Esimerkki Operational-rajapinnan perinnästä:
Kuva 9 - Esimerkki Operational-rajapinnan perinnästä
Operational-rajapinta määrittää ainakin seuraavat
metodit:
-
putDSDL - saa DSDL kuvauksen, jonka perusteella luo tietorakenteen.
-
getDSDL - generoi tietorakenteesta DSDL kuvauksen.
-
getMyReprNames - palauttaa tietorakenteen tukemien esitysmuotojen
nimet.
-
addNewRepr - luo tietorakenteelle uuden esitysmuodon.
Tietorakenteet toteuttavat myös Layout-rajapinnan tai siitä
perityn rajapinnan. Esitysmuodot käyttävät rajapintaa tietorakenteen
graafisen esityksen muodostamisessa (rajapinnan metodeita esim. getHeight(),
getWidth(), ...). Tietorakenteen esittämisessä tarvittavat metodit
ovat useassa tapauksessa tietorakennekohtaisia, jolloin tietorakenteen
toteuttama rajapinta peritään Layout-rajapinnasta tai
siitä periytyvästä rajapinnasta (kuva 10). Rajapinnan metodit
tarkennetaan tietorakenteiden ja esitysmuotojen määrittelyn yhteydessä.
Esimerkki Layout-rajapinnan perinnästä:
Kuva 10 - Layout-rajapinnat
5.3.2 Tietorakenteiden käyttämät
rajapinnat
Tietorakenteet kommunikoivat animaattorin kanssa AnimatorSequence-rajapinnan
kautta.
5.4 Animator - Animaattori
5.4.1 Animaattorin toteuttamat rajapinnat
Animaattori toteuttaa AnimatorControl-rajapinnan, jolla käyttöliittymästä
voidaan kelata animaattoria eteen ja taakse.
AnimatorControl-rajapinta sisältää metodit:
-
getClientAnimator - palauttaa animaattorin client-instanssin.
-
getServerAnimator - palauttaa animaattorin serverinstanssin.
-
forward - siirtää animaattoria yhden askeleen eteenpäin.
-
backward - siirtää animaattoria yhden askeleen taaksepäin.
-
begin - siirtää animaattorin animaatiosekvenssin alkuun.
-
end - siirtää animaattorin animaatiosekvenssin loppuun.
-
play - suorittaa animaatiosekvenssin.
-
Delete - poistaa "näkyvillä" olevan askeleen animaatiosekvenssistä
-
getAnimatorPanel - palauttaa animaattorin ohjaukseen käytettävän
paneelin.
Animaattori toteuttaa AnimatorSequence-rajanpinnan, jonka kautta
tietorakenteet kertovat animaattorille tietorakenteisiin kohdistuneista
operaatiosta. Animaattori tallentaa operaatiot animaatiosekvensseinä,
jotka voivat koostua atomisista kokonaisuuksista (esimerkiksi rotaatio).
-
CloneDS() - tallentaa animaattoriin viitauksen kloonattuun tietorakenteeseen.
Metodi käyttää parametrina saamansa tietorakenteen clone-metodin
toteutusta kloonauksen suorittamiseen (kappale 3.2).
Lisäksi animaattori toteuttaa Javan Serializable-rajapinnan,
jota käytetään kappaleessa 3.1 esitetyllä tavalla tehtävien
tarkastukseen.
5.4.2 Animaattorin käyttämät rajapinnat
Animaattori käyttää AnimatorSignal-rajapintaa (kuva
3) pyytäessään tietorakennetta siirtymään animaattorin
haluamaan tilaan.
6. Moduulien toteutuksen kuvaus
Moduulien toteutuksessa käyttöliittymän toteutus on pyrittävä
suorittamaan ensimmäiseksi. Sen sekä animaattorin totetutuksessa
tulee pyrkiä siihen, että järjestelmään voidaan
lisätä jälkikäteen mahdollisimman vaivattomasti uusia
tietorakenteita ja niiden esitysmuotoja. Luokkien OMT-kaavioissa muiden
kuin geneeristen metodien nimeäminen tietorakenne- ja esitysmuoto-luokille
on mahdotonta, sillä tietorakenteilla käsitetään TRAKLA-EDIT
konseptissa kaikki ruudulla esitettävä esitykset (esimerkiksi
tehtävänanto teksti ja tehtävän palautuksena annettava
binääripuu). TRAKLA-EDIT:ssä on käytössä
rajapinta-hierarkia, joka tarkentuu alaspäin mentäessä tietorakennetyyppien
mukaan kappaleessa 5 esitetyllä tavalla.
6.1. GUI
Graafinen käyttöliittymä periytyy Java Frame-luokasta
(kuva 11), joka toteuttaa ikkunan esitykseen tarvittavat metodit. GUI luo
toiminnallisia luokkia, joiden avulla hallitaan käyttöliittymän
näkymä, käyttäjän tekemät toiminnot ja kommunikaatio
TRAKLA-palvelimen kanssa. GUI-luokka itsessään toimii olioden
aktivoijana ja säiliönä, johon voidaan tallentaa ja josta
voidaan hakea eri olioiden instansseja. Luokille, joista voi olla vain
yksi instanssi (LoginDialog, LayoutManager, TraklaMenuHandler ja FactoryForDS)
se tallennetaan ennalta allokoituihin muuttujiin. Esitysmuotoja voi olla
useita liitettynä ikkunaan, ja niitä säilytetään
Representation-tyyppisessä vektorissa.
Kuva 11 - GUI OMT
-
Representation - Esitysmuodot luovat paneelin, joka voidaan liittää
GUI:n containeriin. Representation-rajapinta määrittelee metodit,
joilla esitysmuotoja voidaan hallita GUI valikoiden avulla.
-
getRepresentationPanel - metodilla saadaan esitysmuodon paneeli,
joka voidaan liittää tai poistaa Layoutista.
-
getSupportedRepresentations - palauttaa vektorin, jossa on lueteltu
esitysmuodon tietorakenteen tukemat esitysmuodot. Nämä voidaan
liittää dynaamisesti valikoihin, joista käyttäjä
voi valita halutun esitysmuodon tietorakenteelle.
-
addNewRepresentationForDS - palauttaa uuden esitysmuodon halutulle
tietorakenteeelle.
-
LoginDialog - LoginDialog tunnistaa käyttäjän tarkastaen
salasanan oikeellisuuden TRAKLA-palvelimelta. Käyttäjän
tunnistetiedot tallennetaan animaattorin client-instanssin UserInformation-olioon.
-
showDialog - aktivoi käyttäjätietoja kysyvän
dialogin.
-
getUserId - palauttaa käyttäjän antamat ja TRAKLA-palvelimelta
verifioidut tiedot.
-
LayoutManager - Esitysmuodot pystytään sijoittamaan TRAKLA-EDIT
ikkunassa ennalta määriteltyihin paikkoihin, ja tämä
meta-informaatio tallennetaan istunnon päättyessä, jolloin
näkymä on tiedossa, kun TRAKLA-EDIT -istunto aktivoidaan seuraavan
kerran. LayoutManager huolehtii tilan varaamisesta ruudulta aktiivisille
esitysmuodoille ja mahdollistaa esitysmuodon koon ja sijainnin määrittelemisen.
-
addNewPanel - lisää esitysmuodon paneelin GUI:n containeriin
layout managerin määrittelemään paikkaan.
-
removePanel - poistaa aktiivisen esitysmuodon paneelin GUI:n containerista.
-
resizePanel - muuttaa esitysmuodon paneelin kokoa.
-
repositionPanel - muuttaa esitysmuodon paneelin sijaintia layoutissa.
-
TraklaMenuHandler - Valikoista osa on staattisia eli ne ovat joko
käytössä koko istunnon ajan tai eivät lainkaan riippuen
valitusta käyttäjäprofiilista (opiskelija, luennoitsija).
Osa valikoista puolestaan on dynaamisia, kuten valitut esitysmuodot ja
tietorakenteet. Dynaamisten valikoiden ja niihin liittyvien toimintojen
hallinta kuuluu TraklaMenuHandler-luokalle. Luokka toteuttaa Java MenuListener-rajapinnan,
jolla voidaan kuunnella valikoihin kohdistuneita toiminteita.
-
FactoryForDS - Tietorakennetehtaan tarkoitus on kohdistaa uusien
tietorakenteiden lisäämisestä aiheutuvat muutokset yhteen
luokkaan. Tietorakennetehdas pitää sisällään luettelon
toteutetuista tietorakenteista, jonka TraklaMenuHandler voi käydä
kysymässä liittäessään valikoita ikkunaan. Kun
valikkotoiminto kohdistuu tietorakenteisiin, voidaan tietorakenteen nimi
välittää tietorakennetehtaalle, joka osaa luoda tietorakenteesta
ja esitysmuodosta uuden instanssin.
-
getDSNames - palauttaa vektorin, jossa on järjestelmään
toteutettujen tietorakenteiden nimet. Nämä liitetään
valikkoon, josta käyttäjä voi liittää ne näyttöön.
-
createNewDS - luo valikosta valitun tietorakenteen ja palauttaa
sen oletusesitysmuodon. Oletusesitysmuotoa voidaan käyttää
myöhemmin esitysmuotoon ja tietorakenteeseen kohdistuviin toiminteisiin.
6.2. Esitysmuodot
Esitysmuodot periytyvät abstraktista Reprepresentation-luokasta
(kuva 12). Tämä luokka määrittelee kaikilta esitysmuodoilta
vaadittavat metodit ja toteutuksen muodostimelle, joka alustaa esitysmuodon
representationPanel -luokan. RepresentationPanel-luokan instanssi huolehtii
hiiri- ja näppäimistötapahtumien vastaanottamisesta ja niiden
delegoimisesta esitysmuodon action-metodille. Esitysmuoto on kompositio
View-
ja Logic-olioiden instansseista, jotka ovat vastuussa tietorakennekohtaisesta
piirtämis- ja muokkaamistoiminnoista. Kompositio mahdollistaa näkymien
(view) tai operaatioiden (logic) käyttämisen uudelleen, jos tietorakenteen
layout-tai operational-rajapinta on vaadittavaa tyyppiä (esim. table_view-luokkaa
käyttääkseen tietorakenteet on toteutettava table_layout-rajapinta).
Valmiita esitysmuotoja, esimerkiksi Table_Representation voidaan
käyttää jos halutaan jonkin uuden järjestelmään
lisättävän tietorakenteen tukevan myös Table-näkymää.
Tällöin tietorakenteen on toteutettava molemmat Table_Layout-
ja Table_Operational-rajapinnat ja pystyttävä palauttamaan
tukemiensa esitysmuotojen nimet alla olevan esimerkin mukaan.
Kaksoisbufferointi on paras tapa yhdessä update-funktion kanssa
toteuttaa värinätön animaatio. Kaksoisbufferointi tarkoittaa,
sitä että on olemassa kaksi erillistä piirtopintaaa, joihin
vuorotellen piirretään (p1 ja p2). Kaksoisbufferoinnin toteutus
vaatii seuraavat operaatiot [1]:
-
Näytetään piirtopinta 1
-
Piirretään piirtopinnalle 2
-
Viive
-
Näytetään piirtopinta 2
-
Piirretään piirtopinnalle 1
-
Viive
public class New_DS implements New_Layout,
New_Operational, Table_Layoyut, Table_Operational
{
...
public Vector getSupportedRepresentationNames()
{
...
return( "NewDS", "Table" );
}
...
}
Kuva 12 - Esitysmuodot OMT
-
Representation - Abstrakti luokka, josta peritään kaikki
toteutettavat esitysmuodot. Abstraktissa luokassa on toteutettu muodostin,
joka luo esitysmuodolle paneelin (RepresentationPanel). Jos luokka
toteuttaa oman muodostimen on sen kutsutta tätä muodostinta
super-muuttujan
avulla.
-
action - Tämä metodi on abstrakti, eli sen totetuts on
esitysmuotokohtainen. Sitä kutsutaan aina, kun paneeli vastaanottaa
hiiri- tai näppäimistötapahtuman. Tapahtumatyypit on määritelty
julkisina literaaleina Representation-luokassa. Esitysmuoto voi
reagoida halutulla tavalla eri tyyppisiin tapahtumiin. Esimerkkinä
on taulukko tyyppisen esitysmuodon SDL-kuvaus:
LIITE
2: PROCEDURE TABLE REPRESENTATION ACTION.
-
addNewRepresentationForDS - LIITE
2: PROCEDURE ADD NEW REPRESENTATION
FOR DS. Representation -luokka sisältää toteutuksen
tälle metodille, joka lisää hallussaan olevalle tietorakenteelle
parametrina saamansa uuden esitysmuodon ja palauttaa tämän esitysmuodon
kutsujalle.
-
ChangeFont - LIITE 2: PROCEDURE
CHANGE REPRESENTATION FONT. Representation-luokka sisältää
toteutuksen tälle metodille, joka muuttaa tietorakenteen esitykseen
käytettyä kirjaisimen koko ja tyyliä saamiensa parametrien
perusteella.
-
getRepresentationPanel - LIITE
2: PROCEDURE GET REPRESENTATION PANEL.
Representation-luokka sisältää toteutuksen tälle metodille,
joka palauttaa hallussaan olevan RepresentationPanel-instanssin.
-
getSupportedRepresentations - LIITE
2: PROCEDURE GET SUPPORTED REPRESENTATIONS.
Kysyy hallussaan olevalta tietorakenteelta, mitä esitysmuotoja tämä
tukee. Paluuarvona on vektori, joka sisältää mahdolliset
esitysmuotojen nimet.
-
getDSDL - LIITE 2: PROCEDURE
GET DSDL. Luo DSDL-alisivun, joka sisältää DSDL-muotoisen
informaation esitysmuodon parametreista.
-
getDSDSDL - LIITE 2: PROCEDURE
GET DS DSDL Luo DSDL-alisivun, joka saadaan esitysmuodon hallussa
olevalta tietorakenteen getDSDL-metodilta.
-
RepresentationPanel - RepresentationPanel periytyy Java Panel-luokasta
ja toteuttaa Java MouseListener- ja MouseMotionListener-rajapinnat.
Luokka käyttää Representation-rajapinnassa määriteltyä
action-metodia (LIITE 2:
PROCEDURE
ACTION) piirtääkseen ruudulle eventin aiheuttaman toiminnon.
-
View - View-luokassa on toteutettu tietorakenteen esittämiseen
vaadittava logiikka, joka huolehtii tietorakenteen esteettisyydestä
ja havainnollisuudesta. Kuvassa 10 esitetyt esimerkit havainnollistavat,
että view-luokan metodit ovat tietorakennekohtaisia ja vaativat tietorakenteelta
vastaavan Layout-rajapinnan toteuttamista.
-
Logic - Logic-luokassa suoritetaan käyttäjän tietorakenteille
suorittamien muokkausten kuvaaminen tietorakenteiden operational-rajapintametodikutsuiksi.
Kuvassa 13 esitetyt esimerkit esittävät taulukko- tietorakenteen
muokkausten kuvauksia Table_Operational-rajapintametodien kutsuiksi.
Esitysmuodot käyttävät RepresentationObject-rajapinta
-tyyppisiä olioita esittämään tietorakenteita paneeleissaan.
RepresentationObject-rajapinta jakautuu objekteihin, joilla on kaikilla
yhtenäiset siirto- ja sijainti-metodit, mutta niiden piirtometodi
voi kuvata ne määritellyllä tavalla (kuva 13). Uusia esitysmuotoja
lisättäessä voidaan käyttää näitä
valmiita objekteja tai lisätä järjestelmään uusi
esitettävä luokka, joka toteuttaa RepresentationObject-rajapinnan.
Kuva 13 - Esitysmuodon piirto-objektit
-
getXcoordinate - palauttaa x-koordinaatin johon objekti on sijoitettu.
-
getYcoordinate - palauttaa y-koordinaatin johon objekti on sijoitettu.
-
getKey - palauttaa objektin tietorakenne avaimen.
-
drag - siirtää objektia kaksoispuskurointia käyttäen.
6.3. Tietorakenteet
Tietorakenteet ovat kirjallisuudesta saatavia kokonaisuuksia, jotka pystyvät
tallentaan objekteja niille ominaisten kutsujen avulla. Tietorakenteilla
voi myös olla sisäistä toimintaa, jolla ne järjestävät
alkioita esimerkiksi hakuajan minimoimiseksi. TRAKLA-EDIT:ssä kaikki
tietorakenteet toteuttavat kaksi niille ominaista rajapintaa, Layout-
ja Operation-rajapinnat. Näiden rajapintojen metodien avulla
tietorakenne voidaan piirtää (View) ja käyttäjän
tai TRAKLA-palvelimen tekemät operaatiot voidaan kuvata Operational-rajapinnan
kutsuiksi. Tietorakenteet toteuttavat Java Cloneable-rajapinnan,
jonka avulla ne tallennetaan animaattoriin sekvensseiksi. Sekvenssi sisältää
kaiken tarvittavan tiedon, jonka avulla tietorakenne voidaan palauttaa
edelliseen tilaan. Animaattori käyttää AnimatorSignal-rajapintaa
ilmoittaakseen tietorakenteelle, että sen on päivitettävä
itsensä. Tietorakenteiden algoritmit voivat olla toteutettuna erillisenä
luokkana, jolloin niiden uudelleenkäyttettävyysaste nousee (kuva
14).
Tietorakenteilta vaaditaan 3 metodia, jotka liittyvät niiden hallintaan
ja niiden esitysmuotojen näyttämiseen TRAKLA-EDIT ympäristössä:
-
getDSDL - palauttaa DSDL alisivun, joka kuvaa tietorakenteen tilan.
-
putDSDL - alustaa tietorakenteen DSDL alisivulla, joka kuvaa tietorakenteen
tilaa, jossa se oli tallennushetkellä.
-
getNewRepresentation - palauttaa uuden esitysmuodon tietorakenteelle.
-
getSupportedRepresentations - palauttaa tietorakenteen tukemien
esitysmuotojen nimet.
Kuva 14 - Tietorakenteet OMT
LIITE 3 - SDL PICTURES FOR TABLE
DATA STRUCTURE kuvaa tietorakenteen metodit SDL kuvauksina.
Esimerkkinä on käytetty taulukko tietorakennetta.
6.4. Animaattori
Animaattori on Java Serializable-rajapinnan toteuttava luokka, jonka
tehtävänä on tallentaa Cloneable-rajapinnan avulla kloonattuja
tietorakenne-olioita sekvenssiksi. Sekvenssien tallentaminen tapahtuu tallentamalla
ne vektoriin ja erottamalla tapahtumat erillisellä merkillä,
jolloin yksi tapahtuma voi muodostua monesta atomisesta operaatiosta (esim.
tietorakenteesta 1 - tietorakenteeseen 2 - tietorakenteessa 2 rotaatio
).
Animaattori on toteutettu Singleton Design Pattern [3] -muunnelmalla,
jossa on mahdollista luoda kaksi, client- ja server-, instanssia.
Client-instanssiin
tallennetaan TRAKLA-EDIT:ssä tietorakenteille tehdyt operaatiot ja
Server-instanssiin TRAKLA-palvelimella tehty "oikea" vastaus, jota
verrataan palautettuun Client-instanssiin.
Animaattorilla on UserInformation-luokan instanssi, jota voidaan
käyttää getUserInformation- ja
putUserInformation-metodien
avulla. Instanssi alustetaan, kun käyttäjä tunnistautuu
järjestelmään GUI:n tarjoaman LoginDialog-luokan
avulla. UserInformation-luokan informaatio tarvitaan myöhemmin
File_IO-metodeissa.
Koska UserInformation-instanssiin on viittaus animaattorista, on
se myös sarjallistuva ja näin ollen käyttäjää
koskeva informaatio siirtyy sarjallistetun animaattorin mukana palvelimelle
(kuva 15).
Timer-luokka toteuttaa ajastimen, jota käytetään
play-proseduurin yhteydessä. Timer-luokan toteutus saadaan kirjallisuudesta
[8], ja se on toteutettu TimerCallback-rajapinta tyyppisenä.
Tämä rajapinta määrittelee metodin, jota kutsutaan,
joka kerran, kun ajastin laukeaa.
public interface TimerCallBack
{
public void tick();
}
Kuva 15 - Animaattori OMT
-
clear - tyhjentää animaattorin sekvenssi vektorin. Tätä
metodia kutsutaan kun valikosta on valittu new-, close- tai exit-toiminto.
-
cloneDS - tallentaa kuvassa 5 esitetyllä tavalla tietorakenteen
kloonin animaattorin vektoriin. Kloonaus tapahtuu kutsumalla parametrina
saadun tietorakenteen clone-metodia.
-
getDSDL - palauttaa DSDL alisivun, joka kuvaa animaattorin tilan.
-
putDSDL - alustaa animaattorin parametrina saamansa DSDL-kielisen
alisivun mukaan.
-
begin - LIITE 4: PROCEDURE
ANIMATOR: BEGIN - siirtää animaattorin sekvenssi-osoittimen
osoittamaan ensimmäistä animoitua toimintoa. Tietorakennetta
pyydetään AminatorSignal-rajapinnan putClone()-metodin
avulla siirtymään animaattorin osoittamaan tilaan.
-
end - LIITE 4: PROCEDURE
ANIMATOR: END - siirtää animaattorin sekvenssi-osoittimen
osoittamaan viimeistä animoitua toimintoa. Tietorakennetta pyydetään
AminatorSignal-rajapinnan
putClone()-metodin avulla siirtymään animaattorin osoittamaan
tilaan.
-
forward - LIITE 4: PROCEDURE
ANIMATOR: FORWARD - siirtää animaattorin sekvenssi-osoittimen
osoittamaan seuraavaa animoitua toimintoa. Tietorakennetta pyydetään
AminatorSignal-rajapinnan
putClone()-metodin avulla siirtymään animaattorin osoittamaan
tilaan.
-
backward - LIITE 4: PROCEDURE
ANIMATOR: BACKWARD - siirtää animaattorin sekvenssi-osoittimen
osoittamaan edellistä animoitua toimintoa. Tietorakennetta pyydetään
AminatorSignal-rajapinnan
putClone()-metodin avulla siirtymään animaattorin osoittamaan
tilaan.
-
play LIITE 4: PROCEDURE
ANIMATOR: PLAY - suorittaa animaatiosekvessin animaattori-osoittimen
ilmoittamasta paikasta eteenpäin. Ruudun välkymisen estämiseksi
RepresentationObject-luokassa
on toteutettu kaksoispuskurointi. Animaattori käynnistää
ajastimen jolla se pystyy kontrolloimaan animaatiosekvinssin suoritusvauhtia.
-
delete LIITE 4: PROCEDURE ANIMATOR: PLAY -
poistaa animaattorin sekvenssi-osittimen osoittaman animaatioaskeleen sekvenssistä.
Osoitin siirretään poitettua askelta edeltäneeseen askeleeseen.
Tietorakennetta pyydetään AminatorSignal-rajapinnan putClone()-metodin
avulla siirtymään animaattorin osoittamaan tilaan.
-
getAnimatorPanel - palauttaa animaattorin paneelin, joka sisältää
graafiset painikkeet animaattorin ohjaukseen.
-
getClientInstance - LIITE 4:
PROCEDURE
ANIMATOR: GET CLIENT INSTANCE - palauttaa animaattorin Client-instanssin.
-
getServerInstance - LIITE 4:
PROCEDURE
ANIMATOR: GET SERVER INSTANCE - palauttaa animaattorin Server-instancssin.
Kirjallisuus viitteet
[1] Opeta itsellesi Java ohjelmointi, Petri Kiuttu - Juha Niemi,
Suomen ATK kustannus, 1996
[2] Data Structures and Algorithm Analysis in C, Mark Allen
Weiss, 1992
[3] Design Patterns, Elements of Reusable Object-Oriented Software,
Gamma - Helm - Johnson - Vlissides, Addison-Wesley, 1997
[4] Diplomityö, Puu-tietorakenteiden havainnollistaminen,
Petteri Hämäläinen, TKK, 1998
[5] Core Java 1.1 Volume II - Advanced Features, Cay S. Horstmann
- Gary Cornell, Sun Microsystems, 1998
[6] Java Object Serialization Specification, Revision 1.43,
JDK 1.2, November 30, 1998
[7] Java Object Java RMI Tutorial, Revision 1.3, JDK 1.1 FCS,
February 10, 1997
[8] Hacking Java - The Java Professional's Resource Kit, Mark
Wutka, QUE, 1997