Piece
.
@author
).
@version
).
package java.util
: (BitSet), HashMap,
HashSet, ArrayList, LinkedList, apod. + prislusne Iterator
. I zde jsou samozrejme
vyjimky potvrzujici pravidlo..
package cz.cuni.jagrlib.piece
. Pocitejte s tim, jen
v pripade nejnutnejsi potreby si vytvorte svoji "soukromou" package
uvnitr
cz.cuni.jagrlib.piece
.
Piece
, Plug
, Channel
:Piece
je zakladni "stavebni kamen", ze ktereho se sklada
"stavebnice" = algoritmus.
Je to jakasi "krabicka" ("black-box"), ktera implementuje predepsane protokoly
(interface
v Jave) a az v druhem planu (prip. zcela nedulezita) je konkretni metoda
jejich realizace.
Kazdy Piece
definuje jakesi "stycne body" se svym okolim -
Plug
s (zasuvky). Kazdy Plug
rika, ktery protejsek (opet formalne typu
Piece
) se na tomto miste muze pripojit (a zda smi pripadne tento Plug
zustat nezapojen). Konkretni propojeni je realizovano tridou Channel
: na kazde
strane ma jeden Piece
(vlastne jeden jeho Plug
), a tedy jeden protokol
(interface
v Jave). Pres Channel
se tedy da komunikovat oboustranne:
leva strana vola dany protokol prave strany a naopak..
Plug
je v ramci sveho Piece
odkazovani pomoci "klice" -
znakoveho retezce. Stejny klic se pouziva ke konkretnimu propojeni (Channel
).
Kazdy Plug
ma nekolik atributu:
isMandatory()
- oznacuje, zda musi byt tato zasuvka vzdy povinne zapojena.
isMulti()
- dovoluje pripojit zasuvku na tzv. MultiChannel
(protejskem by pak bylo soucasne nekolik objektu Piece
).
isCloneable()
- oznacuje tzv. "klonovatelne" zasuvky:
Piece
na tomto miste muze obslouzit jednu nebo vice kompatibilnich zasuvek. Jedna
takova zasuvka existuje vzdy, ostatni se mohou v pripade potreby " naklonovat"
(identifikatory jsou pak zakonceny poradovymi cisly).
inputInterfaceName
- identifikator protokolu, ktery muze byt zvnejsku volan
(muj protejsek mne vola).
outputInterfaceName
- identifikator protokolu, ktery volam smerem ven
(ja volam muj protejsek).
Template
, TemplateRegistry
:Konkretni konfigurace zasuvek (Plug
s) nejakeho Piece
muze byt
reprezentovana ve forme objektu Template
. Je to jakysi "vzor", katalogizace
Piece
z hlediska kompatibility (spise formalni = syntakticke, nez semanticke).
Jeden konkretni Piece
muze splnovat nekolik ruznych Template
,
tj. muze hrat nekolik ruznych "roli" (byt zamenitelny podle ruznych vzoru).
Jednotlive Template
hraji roli ekvivalenci (ve smyslu kompatibility) na tride vsech
Piece
.
Template
vsak slouzi i jako castecna usporadani na tride vsech
Piece
. Je-li napr. Template T1
podmnozinou
Template T2
, znamena to, ze vsechny Piece
vyhovujici
T2
, jsou soucasne pouzitelne na miste T1
.
Vsechny instance Template
jsou v JaGrLib registrovany v globalni tride
TemplateRegistry
. V soucasnosti jsou implementovany pouze pristupove metody pres
"jmeno" a "kategorii" (viz nize.), pozdeji by mely byt k dispozici tez
ruzne unifikace a hledani kompatibilnich Template
(ve smyslu inkluze). Atributy
instanci Template
:
name
- string slouzici jako jednoznacny pristupovy klic
v TemplateRegistry
.
category
- string obsahujici hierarchicke zarazeni Template
(syntakticky je to posloupnost sub-kategorii oddelenych teckami ".").
description
- delsi textovy popis (komentar).
PieceRegistry
:Vsichni konkretni potomci tridy Piece
jsou v systemu JaGrLib registrovani
v globalni tride PieceRegistry
. Konkretni Piece
je zde spojen se
vsemi sablonami (Template
), ktere implementuje. Pridavani zaznamu do
PieceRegistry
je povinnosti kazdeho potomka Piece
(viz nize).
Piece
:Jednotlive kroky pri vytvareni potomka tridy Piece
mohou vypadat takto (priklady
jsou ze skutecne implementace LineBresenham
):
interface
), ktere musi dany objekt implementovat,
a deklarovat tridu s vhodnym jmenem jako potomka Piece
:
public class LineBresenham extends Piece implements
LineRender {
...
}
Plug
s):
public LineBresenham () {
...
newInputPlug(INPUT,IFACE+"LineRender");
newOutputPlug(OUTPUT,IFACE+"BitMask");
}
interface
). Pritom pro odkazovani na napojene Piece
pouzivat funkce getInterface()
, napr.:
public void drawLine ( int x1, int y1, int x2, int y2 )
throws BadInterfaceException {
BitMask out = (BitMask)getInterface(OUTPUT,IFACE+"BitMask");
...
}
Piece
na
jine objekty pomoci funkci Piece.connect()
.
Template
, dodrzovat alespon priblizne
zavedeny system
super(NAME,DESCRIPTION,CATEGORY);
newPiece()
,
napr.:
public Piece newPiece () {
return new LineBresenham();
}
Template
) a registrovat objekt
v PieceRegistry
:
interface
nasledovana sluvkem
"To
" a jmeny vystupnich interface
- viz soubor
"template.dat
").
Template
, dodrzovat alespon priblizne zavedeny system
Template
a napojit mu zasuvky (Plug
s) stejne
jako vlastnimu objektu
Piece
se vsemi relevantnimi sablonami
private final static String TEMPLATE_NAME = "LineRenderToBitMask";
private final static String TEMPLATE_CATEGORY = CAT_2D + CAT_DRAW + "line";
private static boolean isRegistered = false;
{
if ( !isRegistered ) {
isRegistered = true;
Template t = new Template(TEMPLATE_NAME,null,TEMPLATE_CATEGORY);
t.newInputPlug(INPUT,IFACE+"LineRender");
t.newOutputPlug(OUTPUT,IFACE+"BitMask");
PieceRegistry.register(new LineBresenham(),t,null);
}
}
Zatim je nutne vytvorit fungujici "skladacku" rucne - viz napr. Main.java.
PieceRegistry.restore(null)
, tim se precte registracni databaze
vsech existujicich potomku Piece
.
Piece
), ktere se budou pouzivat.
Piece.connect()
.
RasterImage.getBufferedImage()
(viz
Main.java).
JPEGImageEncoder
(viz
Main.java).
PieceRegistry.save(null)
a
TemplateRegistry.save(null)
- tim se na disk ulozi aktualizovane verze
registracnich databazi (pro Piece
i Template
).
Copyright (c) 2000-2003 Josef Pelikán, last change: 17.10.2003