Package shell
Class Branch
- java.lang.Object
-
- shell.Node
-
- shell.Command
-
- shell.Branch
-
- All Implemented Interfaces:
Condition
public class Branch extends Command
Nadtřída všech ovladačů uzlů. Rozvětvení nadřazeného uzlu na více podřízených. Zavádí obecný kontejner vnořených uzlůnodes
, které bude ovládat. Rozšiřuje metodu procházenígo()
o práci s tímto kontejnerem. Překládá "lidskou" slovní identifikaci (slovo z příkazové řádky) vnořeného uzlu na identifikaci strojovou (odkaz na objekt/uzelnode
). Podporuje ovládání vnořeného uzlunode
podle módu aktivity metodounodeCover()
, která v případě neaktivity jen předává zpracování metoděnodeGo()
, která se stará o údržbu aktuální úrovněNode.level
. Vyhodnocení módu aktivity řeší už metodaCommand.active()
předkaCommand
, která jej zNode.level
odvozuje. MetodanodeGo()
vstupuje do vnořeného uzlu (předává mu řízení voláním jeho metodyNode.go()
). Metodygo()
všech objektů tvoří základní rozhraní procházení stromovou strukturou uzlů. V aktivním módu (Command.active()
) je otestováno metodounodeCondition()
, zda jsou splněny podmínky pro vykonání akce nebo ne. Pokud ano, je zpracování předáno metoděnodeAction()
a poté metoděoutDone()
, která informuje o úspěšném provedení. Pokud ne, metodaoutError()
informuje o chybě. MetodynodeCondition()
anodeAction()
jsou určeny k vlastím implementacím v potomcích. Ve výchozí implementacinodeCondition()
jen vrací true (žádné podmínky) anodeAction()
provádí jennodeGo()
. Tak je zajištěno, že je nutné v potomcích implemetovat jen to skutečně potřebné, nebo před implementací vlastních akcí nejprve ladit splnění podmínek ve vlastní metoděnodeCondition()
a až poté implementovat vlastnínodeAction()
. Protože výchozínodeAction()
je implementována jako přesměrování nanodeGo()
, bude se objekt i vnodeAction()
chovat stejně jako v módunodeGo()
, dokud nebude v potomcích implementovánanodeAction()
vlastní. Třída podporuje dvě možnosti zpracování vnořených uzlů. Nejprve se pokusí vzít slovo ze vstupu (Prompt.hasNext()
) jako "lidský" identifikátor uzlu. Pokud slovo ve vstupu je, odebere jej metodouPrompt.next()
a pokusí se jej přeložit na strojovou identifikaci (hledá podle slova odkaz nanode
v kontejnerunodes
metodoufindFirst(java.lang.String)
). Pokud je uzel nalezen, zpracuje jej. Pokud ne, tiskne se chyba metodououtErrorPath()
. Pokud slovo chybí úplně, standardně se mají zpracovat vnořené uzlynodes
všechny. Povinnost identifikovat jeden konkrétní uzel znodes
je možné zapnout parametremlevelNodePath
. Pak se v řípadě chybějící identifikace vPrompt
tiskne chyba metodououtErrorWord()
.levelNodePath
je potřeba nastavit například u ovladače všech příkazůApp
, aby jeho metodago()
nezpracovala všechny najednou, nebo u konkrétních příkazů: (Placer
- aby šlo jít jen do jednoho východu, "pick" - aby šlo jedním příkazem sebrat jen jeden předmět, atd.). Naopak, výchozí hodnota parametrulevelNodePath
poskytuje možnost procházení celým stromem uzlů, nebo jen určitým podstromem, pokud je vPrompt
zadána alespoň část "cesty".Command.levelActive
ilevelNodePath
jsou "úrovňové" atributy, které říkají, na jaké úrovni se má chování změnit. "Úrovňové" chování Branch objektů je tedy možné jednoduše ovlivnit nastavováním těchto atributů. Veškeré textové podklady pro komponování výstupních textů, jsou standardizovány parametrymasterDelimiter
,nodesBegin
,nodesEmpty
,nodesDelimiter
,nodesEnd
arecurse
. MetodynodeCover()
,nodeCondition()
anodeAction()
odpovídají stejné koncepci, jakou mají metodyCommand.cover()
,Command.condition()
aCommand.action()
v třídě předkaCommand
.
-
-
Field Summary
Fields Modifier and Type Field Description boolean
dNode
vypisovat za hláškou úspěchu název uzlu a tečkuboolean
eNode
vypisovat za chybovou hláškou název uzlu a tečkujava.lang.String
errorPath
odpověď v případě chyby při nesplnění povinnosti identifikovat jeden konkrétní uzel znodes
podlelevelNodePath
java.lang.String
errorPathDelimiter
oddělovač zprávy od uzlujava.lang.String
errorWord
odpověď v případě chyby nenalezeného identifikátoru ze vstupu načerpaného metodouPrompt.next()
; hledá se vnodes
metodoufindFirst(java.lang.String)
boolean
extName
vypisovat za hláškou úspěchu rozšířený název uzlu (Node.outExtName()
namístoNode.outName()
)int
levelNodePath
úroveň zanoření, na které platí povinnost uvést slovo/cestu; pokud není tímto parametrem zapnuta a uživatel slovo neuvede, zpracují se všechnynodes
v kontejnerujava.lang.String
masterDelimiter
oddělovač uzlu od svého kontejneru, není-linoPrint
Node
node
pracovní ukazatel na uzel, který se má zpracovatNodes
nodes
kontejner vnořených uzlů třídyNodes
; hodnota null přepíná chování objektu na chování předka; je to výchozí stavjava.lang.String
nodesBegin
uvaděč kontejneru vnořených uzlůjava.lang.String
nodesDelimiter
oddělovač uzlů v kontejneru, je-li jich zpracováváno více než jedenjava.lang.String
nodesEmpty
nahrazovač výpisu kontejneru vnořených uzlů, je-li kontejner prázdnýjava.lang.String
nodesEnd
ukončovač kontejneru vnořených uzlůboolean
noGoEmpty
do rozvětvení (s tiskem uzlu) se v případě prázdného kontejneru nemá vůbec vstupovat; standardně se vstoupí do rozvětvení i v případě prázdného kontejneru a namísto kontejneru se tisknenodesEmpty
boolean
noPathNoAll
pokud není uvedena cesta, která je povinná a není tímto příznakem zakázano, přepne se procházení na výpisy všech uzlů - jen se mód aktivity zablokuje, aby se namísto provedení vypsal seznam všech možnostíboolean
noPrint
před rozvětvením uzlu se uzel nemá tisknoutstatic java.util.ArrayList<Node>
passed
static Prompt
prompt
java.lang.String
recurse
nahrazovač rekurzívní smyčky; pokud má hierarchie smyčku, nevstupuje se do kontejnerunodes
, ale vypíše se náhrada, aby to bylo zřejmé-
Fields inherited from class shell.Command
comment, done, error, levelActive
-
Fields inherited from class shell.Node
comparable, level, name, noActive
-
-
Constructor Summary
Constructors Constructor Description Branch(java.lang.String name, java.lang.String comment)
Branch(java.lang.String name, java.lang.String comment, int levelActive, java.lang.String done, boolean extName, boolean dNode, java.lang.String error, boolean eNode, Nodes nodes, int levelNodePath)
Branch(java.lang.String name, java.lang.String comment, int levelActive, java.lang.String done, java.lang.String error)
Branch(java.lang.String name, java.lang.String comment, java.lang.String done, boolean extName, boolean dNode, java.lang.String error, boolean eNode, Nodes nodes)
Branch(java.lang.String name, java.lang.String comment, java.lang.String done, java.lang.String error)
Branch(java.lang.String name, java.lang.String comment, Nodes nodes)
Branch(java.lang.String name, java.lang.String comment, Nodes nodes, boolean noPrint)
Branch(java.lang.String name, java.lang.String comment, Nodes nodes, boolean noPrint, int levelNodePath)
Branch(java.lang.String name, java.lang.String comment, Nodes nodes, java.lang.String nodesBegin, java.lang.String nodesDelimiter)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
defPrompt()
Standardní nastavení poskytovatele cest z příkazových řádkek z klávesniceboolean
findFirst(java.lang.String s)
void
go()
Rozšiřuje metoduCommand.go()
předka o práci s kontejnerem uzlůnodes
.void
nodeAction()
Je určená ke zpracování node vCommand.active()
módu.boolean
nodeCondition()
Je určená k otestování podmínek, zda se může vykonat nodeAction.void
nodeCover()
Ovladač zpracování jednoho vnořeného uzlu.void
nodeGo()
Vrstvička zanoření při průchodu do nižší úrovně.boolean
nodePath()
void
nodesCover()
Zpracování všech vnořenýchnodes
.void
outDone()
Tiskne potvrzující odpověď.void
outError()
Tiskne chybovou odpověď.void
outErrorPath()
Vytiskne text, když ve vstupu chybí povinná slovní identifikace.void
outErrorWord()
Vytiskne text při špatně zadané slovní identifikaci.static java.lang.String
plural(int i)
void
setNodes(Nodes nodes)
Změní/nastaví odkaznodes
na jiný/nový kontejner.void
setNoPrint(boolean noPrint)
Změní příznak výpisunoPrint
.-
Methods inherited from class shell.Node
getComparable, getExtName, getName, mes, met, out, outExtName, outName, setName, toComparable
-
-
-
-
Field Detail
-
passed
public static final java.util.ArrayList<Node> passed
-
prompt
public static Prompt prompt
-
nodes
public Nodes nodes
kontejner vnořených uzlů třídyNodes
; hodnota null přepíná chování objektu na chování předka; je to výchozí stav
-
noGoEmpty
public boolean noGoEmpty
do rozvětvení (s tiskem uzlu) se v případě prázdného kontejneru nemá vůbec vstupovat; standardně se vstoupí do rozvětvení i v případě prázdného kontejneru a namísto kontejneru se tisknenodesEmpty
-
noPrint
public boolean noPrint
před rozvětvením uzlu se uzel nemá tisknout
-
masterDelimiter
public java.lang.String masterDelimiter
oddělovač uzlu od svého kontejneru, není-linoPrint
-
errorPathDelimiter
public java.lang.String errorPathDelimiter
oddělovač zprávy od uzlu
-
nodesBegin
public java.lang.String nodesBegin
uvaděč kontejneru vnořených uzlů
-
nodesEmpty
public java.lang.String nodesEmpty
nahrazovač výpisu kontejneru vnořených uzlů, je-li kontejner prázdný
-
nodesDelimiter
public java.lang.String nodesDelimiter
oddělovač uzlů v kontejneru, je-li jich zpracováváno více než jeden
-
nodesEnd
public java.lang.String nodesEnd
ukončovač kontejneru vnořených uzlů
-
recurse
public java.lang.String recurse
nahrazovač rekurzívní smyčky; pokud má hierarchie smyčku, nevstupuje se do kontejnerunodes
, ale vypíše se náhrada, aby to bylo zřejmé
-
levelNodePath
public int levelNodePath
úroveň zanoření, na které platí povinnost uvést slovo/cestu; pokud není tímto parametrem zapnuta a uživatel slovo neuvede, zpracují se všechnynodes
v kontejneru
-
errorPath
public java.lang.String errorPath
odpověď v případě chyby při nesplnění povinnosti identifikovat jeden konkrétní uzel znodes
podlelevelNodePath
-
errorWord
public java.lang.String errorWord
odpověď v případě chyby nenalezeného identifikátoru ze vstupu načerpaného metodouPrompt.next()
; hledá se vnodes
metodoufindFirst(java.lang.String)
-
noPathNoAll
public boolean noPathNoAll
pokud není uvedena cesta, která je povinná a není tímto příznakem zakázano, přepne se procházení na výpisy všech uzlů - jen se mód aktivity zablokuje, aby se namísto provedení vypsal seznam všech možností
-
node
public Node node
pracovní ukazatel na uzel, který se má zpracovat
-
dNode
public boolean dNode
vypisovat za hláškou úspěchu název uzlu a tečku
-
eNode
public boolean eNode
vypisovat za chybovou hláškou název uzlu a tečku
-
extName
public boolean extName
vypisovat za hláškou úspěchu rozšířený název uzlu (Node.outExtName()
namístoNode.outName()
)
-
-
Constructor Detail
-
Branch
public Branch(java.lang.String name, java.lang.String comment)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, Nodes nodes)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, Nodes nodes, boolean noPrint)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, Nodes nodes, boolean noPrint, int levelNodePath)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, Nodes nodes, java.lang.String nodesBegin, java.lang.String nodesDelimiter)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, int levelActive, java.lang.String done, java.lang.String error)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, java.lang.String done, java.lang.String error)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, int levelActive, java.lang.String done, boolean extName, boolean dNode, java.lang.String error, boolean eNode, Nodes nodes, int levelNodePath)
-
Branch
public Branch(java.lang.String name, java.lang.String comment, java.lang.String done, boolean extName, boolean dNode, java.lang.String error, boolean eNode, Nodes nodes)
-
-
Method Detail
-
plural
public static java.lang.String plural(int i)
-
defPrompt
public void defPrompt()
Standardní nastavení poskytovatele cest z příkazových řádkek z klávesnice
-
setNoPrint
public void setNoPrint(boolean noPrint)
Změní příznak výpisunoPrint
.
-
outErrorPath
public void outErrorPath()
Vytiskne text, když ve vstupu chybí povinná slovní identifikace.
-
outErrorWord
public void outErrorWord()
Vytiskne text při špatně zadané slovní identifikaci.
-
findFirst
public boolean findFirst(java.lang.String s)
Hledánode
vnodes
podle "s". Pokud najde první vyhovující, nastaví jej donode
a vrátí true, jinak false.- Parameters:
s
- slovo ze vstupu- Returns:
- příznak nalezení
- See Also:
nodes
,node
,Node.toComparable(java.lang.String)
,Node.getComparable()
-
nodeCondition
public boolean nodeCondition()
Je určená k otestování podmínek, zda se může vykonat nodeAction. Výchozí výsledek testu je true, ale v případě, že objekt potřebuje nějak podmínit vykonánínodeAction()
, je potřeba implementovat potomka s vlastní metodou nodeCondition. Například při umisťování míčků do batohu se kontroluje, zda je ještě místo, nebo jde-li míček sebrat apod.
-
nodeGo
public void nodeGo()
Vrstvička zanoření při průchodu do nižší úrovně. Stará se o nastavení aktuální úrovně, podle které metoda out odsadí výstup.- See Also:
Node.level
,node
,Node.go()
-
nodeAction
public void nodeAction()
Je určená ke zpracování node vCommand.active()
módu. Provede se jen pokud je tato Branch aktivní a nodeCondition vrátí true. Výchozí chování je vstup do uzlu (procházení stromem uzlů), ale například potomek této třídy Mover, namísto vstupu do uzlu, uzel přesouvá znodes
doMover.targetNodes
. Tato i rozšířené metody potomků mají tvořit veškerou funkci ovladačů vnořených uzlů. Metodu volá metodanodeCover()
. Tato výchozínodeAction()
volá metodunodeGo()
-
outError
public void outError()
Tiskne chybovou odpověď. PokudeNode
, přidává uzelNode.outName()
, kterého se chyba týká a tečku.- Overrides:
outError
in classCommand
- See Also:
eNode
,Node.outName()
-
outDone
public void outDone()
Tiskne potvrzující odpověď. PokuddNode
, přidává uzel, kterého se odpověď týká a tečku.extName
příznak rozhoduje, zda se pro tisknode
použijeNode.outExtName()
nebo jenNode.outName()
.- Overrides:
outDone
in classCommand
- See Also:
dNode
,Node.outExtName()
,Node.outName()
-
nodePath
public boolean nodePath()
Povinnost volby uzlunode
znodes
je standardně řízena urovní zanořeníNode.level
. Ve výchozím stavulevelNodePath
==-1 nebude platit povinnost zvolit uzel na žádné urovni.- Returns:
- příznak, zda je volba uzlu na aktuální úrovni zanoření povinná.
-
nodeCover
public void nodeCover()
Ovladač zpracování jednoho vnořeného uzlu. Pokud je ovladač uzlů aktivní (Command.active()
), metoda s uzlemnode
provede akcinodeAction()
. Pokud aktivní není, do uzlu jen vstoupínodeGo()
. Balí volánínodeCondition()
anodeAction()
do jednotné metodiky zpracování nastavenéhonode
. Standardizuje tisk odpovědí. K tomu používá metoduoutDone()
(po úspěšném testunodeCondition()
) nebooutError()
(po testu neúspěšném).- See Also:
Command.active()
,nodeCondition()
,nodeAction()
,outDone()
,outError()
,nodeGo()
-
nodesCover
public void nodesCover()
Zpracování všech vnořenýchnodes
. Mezi jednotlivými uzly tiskne oddělovačnodesDelimiter
. Pro zpracování každého uzlu pak volánodeCover()
.- See Also:
nodes
,nodesDelimiter
,nodeCover()
-
go
public void go()
Rozšiřuje metoduCommand.go()
předka o práci s kontejnerem uzlůnodes
. Testuje, zda je povolena rozšiřující metodika oproti předkovi (Command
, který ještě neznánodes
). Zde je to právě test, je-li atributnodes
nastavený. Rozšiřující metodiku je možné operativně zapínat/vypínat a třída se pak bude/nebude chovat jako předek. Tento jediný test umožní objektům oboje chování. Pokud je zadán slovní identifikátor vnořeného uzlu z příkazové řádky (Prompt.hasNext()
,Prompt.next()
), objektBranch
se pokusí podle něj uzel identifikovat (findFirst(java.lang.String)
). Potvrzení o úspěšné identifikaci uzlu se netiskne. Tiskne jen chybu při neúspěšné identifikacioutErrorWord()
, pokud je identifikátor zadán chybně. Pokud slovní identifikace není zadána vůbec (Prompt.hasNext()
== false), objekt Branch provede akci se všeminodes
. Vyjímkou je povinnost slovní identifikátor zadat (např. přilevelNodePath
==1 pro první úroveň). Pak se při chybějící identifikaci tiskne chyba. Při úspěšné identifikaci podřízeného uzlunode
je volána metodanodeCover()
,která se zabývá již podřízeným uzlem, přičemž tento nadřízený se netiskne (zadanou cestu není nutné opakovat). Tento nadřízený Branch uzel se tiskne jen v případě následného zpracování všechnodes
metodounodesCover()
, ovšem pokud není jeho tisk před kontejnerem podřízenýchnodes
parametremnoPrint
vypnut. K tisku oddělení nadřízeného s podřízenými je použit řetězecmasterDelimiter
. Pokud je kontejnernodes
v tomto objektu již zpracováván průchodem z vyšší úrovně (poznámka vpassed
), není přistoupeno k jeho opětovnému zpracování jako prevence zacyklení. Namísto vstupu do kontejneru metodounodesCover()
se tiskne řetězecrecurse
.- Overrides:
go
in classCommand
- See Also:
nodes
,Command.go()
,prompt
,Prompt.hasNext()
,Prompt.next()
,findFirst(java.lang.String)
,nodeCover()
,outErrorWord()
,levelNodePath
,nodePath()
,errorPathDelimiter
,outErrorPath()
,noPathNoAll
,Node.noActive
,noPrint
,Command.print()
,Node.out(java.lang.String)
,masterDelimiter
,nodesBegin
,nodesEmpty
,passed
,recurse
,nodesCover()
,nodesEnd
-
-