laden Mladen Mijatovic Beograd
Član broj: 146405 Poruke: 33 *.ptt.yu.
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*; // Iterator, LinkedList, List, ListIterator, Map, TreeMap, StringTokenizer
/**
* Klasa koja stvara stablo direktorijuma.
*
*/
public class DirStablo {
private MojDir koren;
private MojDir tekDir;
private final String RAZDEL; // na UNIX sistemima je "/", a u win/dosu je razdelnik je "\"
private final String KOREN; // kakav je koren. Na UNIX-u "/", u win/dosu "c:\"
/**
* Konstruktor DirStablo klase. Stvara koreni èvor na koga pokazuju i koren i tekDir
* promenljive i postavlja razdelnik
*
* @param tipKorena param. koji odreðuje naèin predstavljanja korenod direktorijuma
* @param tipRazdela param. koji odreðuje kako se dele imena direktorimuma u putanji
*/
public DirStablo(String tipKorena, String tipRazdela) {
RAZDEL = tipRazdela;
KOREN = tipKorena;
tekDir = koren = new MojDir(KOREN, null);
}
/**
* Podrazumevani konstruktor DirStablo klase. Postavlja Dos prompt.
*/
public DirStablo() {
this("C:\\", "\\");
}
/**
* Metoda koja simulira promenu direktorijuma.
*
* @param putanja param. koji predstavlja string putanju nekog
* direktorijuma. Npr: "abc/mojdir/zk"
* @exception OpstiIzuzetakException ukoliko putanja ima više razdelnika koji su spojeni
*/
public void cd(String putanja) throws OpstiIzuzetakException {
tekDir = nadjiDir(putanja);
}
/**
* Metoda koja simulira odlazak u naddirektorijum ukoliko tekuæi direktorijum nije koren
* kada se osataje na istom mestu.
*/
public void cd2() {
if (tekDir.naddir != null)
tekDir = tekDir.naddir;
}
/**
* Metoda koja simulira stvaranje direktorijuma.
*
* @param putanja param. koji predstavlja string putanju nekog
* direktorijuma. Npr: "abc/mojdir/zk"
* @exception OpstiIzuzetakException ukoliko je putanja null, baca se NemaDiraException kroz
* OpstiIzuzetak jer je njegova podklasa, zatim ako se u
* putanji nalazi više radelnika spojenih ili putanja veæ
* postoji
*/
public void md(String putanja) throws OpstiIzuzetakException {
String poddir; // prima tokene koji se dobiju razdvajanjem putanje
String pomPut;
boolean stvorenBar1 = false;
MojDir dir;
if (putanja == null)
throw new NemaDiraException("null dir", "\"null\"");
if (putanja.indexOf(RAZDEL + RAZDEL) != -1)
throw new OpstiIzuzetakException("2 ili vise / bez znaka izmedju njih", // 1.
"postojanje putanje sa \"" + RAZDEL + RAZDEL // 2. param.etar
+ "\" u sebi\na vasa putanja je: " + putanja);
if (putanja.startsWith(KOREN)) {
dir = koren;
pomPut = putanja.substring(KOREN.length()); // odbacivanje KOREN-a
} else {
dir = tekDir;
pomPut = putanja;
}
StringTokenizer strTok = new StringTokenizer(pomPut, RAZDEL);
while (strTok.hasMoreTokens()) {
poddir = strTok.nextToken();
if (dir.poddirovi.containsKey(poddir)) { // postoji dir => teraj dalje
dir = (MojDir) dir.poddirovi.get(poddir);
} else { // ne postoji traženi dir => napravi ga
MojDir novi = new MojDir(poddir, dir);
dir.poddirovi.put(poddir, novi); // stavljanje u mapu
dir = novi;
stvorenBar1 = true;
}
}
if (!stvorenBar1) // ceo put je veæ postojao
throw new OpstiIzuzetakException("Postoji dir", // 1.
"postojanje vise direktorijuma sa istom putanjom\n" // 2. param.
+ "a direktorijum: " + dir.dajPut() + " vec postoji");
}
/**
* Metoda koja briše prosleðeni joj direktorijum.
*
* @param putanja param. koji predstavlja string putanju nekog
* direktorijuma. Npr: "abc/mojdir/zk"
* @exception OpstiIzuzetakException ako se pokuša nemoguæe brisanje naddirektorijuma,
* tekæeg i korenog direktorijuma ili ukoliko putanja
* ima više radelnika koji su spojeni
*/
public void rd(String putanja) throws OpstiIzuzetakException {
MojDir brisi;
brisi = nadjiDir(putanja);
if (brisi == koren)
throw new OpstiIzuzetakException("Brisanje korena", "brisanje korena");
if (brisi == tekDir)
throw new OpstiIzuzetakException("Brisanje tek dira", "brisanje tekuceg direktorijuma");
if (!brisi.poddirovi.isEmpty()) { // ima poddirektorijume
String odgovor;
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("Upozorenje! Direktorijum koji brisete nije prazan.\nDa li nastavljate (\"n\" za ne) ? ");
try {
odgovor = stdin.readLine();
} catch (IOException izuzetak) {
System.err.println("Greska u citanju: ");
odgovor = "n";
}
odgovor = odgovor.trim().toLowerCase();
if (odgovor.startsWith("n"))
return;
if (brisi.jeNaddir(tekDir)) // da li se tekDir nalazi u poddir-u dira koji se briše
throw new OpstiIzuzetakException("Brisanje naddira", // 1.
"brisanje naddirektorijuma: " + brisi.dajPut() // 2. param.
+ "\niz njegovog poddirektorijuma: " + tekDir.dajPut());
} // -- if (.... ako ima poddirektorijume
brisi.naddir.poddirovi.remove(brisi.imeDira);
}
/**
* Metoda koja štampa putanju do tekuæeg direktorijuma.
*/
public void pwd() {
System.out.println(tekDir.dajPut());
}
/**
* Metoda koja prikazuje sadržaj direktorijuma posleðenog kroz param. putanja.
*
* @param putanja param. koji predstavlja string putanju nekog
* direktorijuma. Npr: "abc/mojdir/zk"
* @exception OpstiIzuzetakException ukoliko putanja ima više radelnika koji su spojeni
*/
public void ls(String putanja) throws OpstiIzuzetakException {
MojDir rez = (putanja == null) ? tekDir : nadjiDir(putanja);
System.out.print(rez); // implicitno poziva toString()
}
private MojDir nadjiDir(String putanja) throws OpstiIzuzetakException {
String poddir; // prima tokene koji se dobiju razdvajanjem putanje
String pomPut;
MojDir dir;
if (putanja == null)
throw new NemaDiraException("null dir", "\"null\"");
if (putanja.indexOf(RAZDEL + RAZDEL) != -1)
throw new OpstiIzuzetakException("2 ili vise / bez znaka izmedju njih", // 1.
"postojanje putanje sa \"" + RAZDEL + RAZDEL // 2. param.
+ "\" u sebi\na vasa putanja je: " + putanja);
if (putanja.startsWith(KOREN)) {
dir = koren;
pomPut = putanja.substring(KOREN.length()); // odbaci KOREN (npr. 'C:\') u putanji
} else {
dir = tekDir;
pomPut = putanja;
}
StringTokenizer strTok = new StringTokenizer(pomPut, RAZDEL);
while (strTok.hasMoreTokens()) {
poddir = strTok.nextToken();
if (!dir.poddirovi.containsKey(poddir)) { // greška ne postoji traženi deo
String pomStr = dir.dajPut();
if (pomStr.equals(KOREN))
pomStr = pomStr.substring(0, pomStr.length() - 1);
throw new NemaDiraException("Nepostojeci dir", pomStr + RAZDEL + poddir);
}
dir = (MojDir) dir.poddirovi.get(poddir);
}
return dir;
}
/**
* Unutrašnja klasa koja predstavlja direktorijum.
*
*/
protected class MojDir {
MojDir naddir;
String imeDira;
Map poddirovi = new TreeMap(); // sortirana heš tabela
MojDir(String imeD, MojDir nadD) {
imeDira = imeD;
naddir = nadD;
}
public String toString() {
Iterator i = poddirovi.keySet().iterator();
StringBuffer dirImena = new StringBuffer();
while (i.hasNext())
dirImena.append(i.next().toString()).append("\n");
return dirImena.toString();
}
String dajPut() {
StringBuffer strBuf = new StringBuffer(KOREN); // odmah ubacujemo KOREN jer svaka putanja njim poèinje
List lista = new LinkedList();
for (MojDir c = this; c != koren; c = c.naddir)
lista.add(c.imeDira);
ListIterator li = lista.listIterator(lista.size());
// zalepi na strBuf poslednji el. liste, ovo se radi van sledeæe
// while petlje da bi se doblio /a/b, a ne //a/b ako je RAZDEL "/"
if (li.hasPrevious())
strBuf.append((String) li.previous());
while (li.hasPrevious())
strBuf.append(RAZDEL).append((String) li.previous()); // lepi npr. "/imepoddira"
return strBuf.toString();
}
boolean jeNaddir(MojDir tekuci) {
for (tekuci = tekuci.naddir; tekuci != null; tekuci = tekuci.naddir) {
if (tekuci == this) // this je referenca na sebe samog kao self u paskalu
return true;
}
return false;
}
} // -- klasa MojDir
}
[Ovu poruku je menjao laden dana 01.06.2007. u 01:13 GMT+1]
|