Versionare Fisiere

Într-un sistem de versionare de fișiere text (un sistem care ține minte conținutul fișierului dar și conținutul fișierului înainte de fiecare modificare a sa), un fișier este reprezentat ca și obiect.

Un astfel de obiect este caracterizat de numele său (String), conținut (String) și un id unic (int) al obiectului.

Conținutul și numele fișierului se setează la crearea obiectului folosind un constructor. Identificatorul trebuie și el setat la crearea obiectului folosind un mecanism implementat de voi și trebuie să fie transparent pentru clientul unui obiect fișier (adică, de exemplu, valoare id-ului nu trebuie să fie dat de client prin constructor, etc.).

Fiecare fișier mai conține în starea sa o referință către un alt obiect fișier care reprezintă versiunea anterioară a obietului fișier curent. La crearea unui obiect fișier, acesta nu are versiuni anterioare.

Pe un fișier putem realiza în continuare următoarele operații:

    • salveazaVersiune: această metodă crează un nou obiect fișier a cărui nume e dat de numele fișierului pe care s-a apelat metoda, la care se adaugă șirul “bak”. Conținutul noului fisier va fi identic cu al fișierului pe care am apelat operația. În continuare, noul fișier este înregistrat ca versiune anterioară a fișierului curent folosind câmpul descris anterior și dedicat acestui lucru. Evident, versiunea anterioară a fisierului pe care am apelat metoda este inregistrată ca și versiune anterioară a noului obiect fișier creat.

    • concateneaza: care primește ca parametru o referință către un alt obiect fișier și concatenează conținutul său la conținutul obiectului pe care am apelat metoda. Înainte de a face aceste operații, se salveaza o nouă versiune pentru fișierul pe care am apelat metoda

    • toString: care întoarece un șir de caractere de forma: “id nume_fisier [ continut ]

    • numărConcatenari: care intoarce numărul de concatenări care au fost efectuate pe un fișier

Implementați clasa Fisier iar într-o clasă separată implementați un main în care să se evidențieze toate funcționalitățile descrise anterior.

class Fisier

{

private String nume;

private String continut;

private int id;

private Fisier prev_ver;

private int nr_concatenari=0;


public Fisier(String name, String content)

{

this.nume=name;

this.continut=content;

this.prev_ver=null;

this.id=(nume + continut).hashCode();

}


public void salveazaVersiune()

{

Fisier f=new Fisier(this.nume+"bak",this.continut);

f.id=(nume+continut+prev_ver).hashCode();

f.prev_ver=this.prev_ver;

this.prev_ver=f;

}


public void concateneaza(Fisier f)

{

this.salveazaVersiune();

this.continut += this.continut;

this.nr_concatenari++;

}


public String toString()

{

if(this.prev_ver!=null)

return this.id+this.nume+"["+this.continut+"]\n"+ prev_ver;

else

return this.id + this.nume + "[" +this.continut + "]\n";


}

public int numarConcatenari()

{

return nr_concatenari;

}

}


class Main

{

public static void main(String[] args)

{

Fisier f1=new Fisier("test","Hello world");

System.out.println(f1);

f1.salveazaVersiune();

System.out.println(f1);

Fisier f2=new Fisier("Exclamare","!");

f1.concateneaza(f2);

f1.salveazaVersiune();

System.out.println(f1);

System.out.println("Concatenari: "+f1.numarConcatenari());

}

}