Zum Menü springen Zum Inhalt springen

iamBlog

Java: Collections & Serialisierung

18.06 2008 10:02

Für die fleißigen unter uns gibt es hier noch die letzen beiden Java-Aufgaben.

Aufgabe 7: hier soll die Set-Datenstruktur unserer Artikelverwaltung durch eine Hash-Map ersetzt, sowie ein Protokoll zur Überwachung der Kundenaktionen erstellt werden.

Aufgabe 8: hier wird nun unser Programm so erweitert, dass die Kunden, Mitarbeiter und Artikel extern gespeichert werden können.

Aufgabe 7

Hash-Map

Wir sollen hier die Set-basierte Verwaltung von Artikeln durch eine Hash-Map ersetzen.

Deshalb öffnen wir das Buch der Videothek und ändern gleich mal was.


    private Set artikelListe = new Set(2);

wird nun zu


    private HashMap artikelMap = new HashMap();

Nun müssen wir nur noch die Methoden addArticle, deleteArticle und findArticle überarbeiten.


    public void addArticle(Artikel article)
    {
        article.setArtikelNummer(generateArticleNumber(article.getArtikelTyp()));
        artikelListe.add(article);
    }

wird zu


    public void addArticle(Artikel article)
    {
        article.setArtikelNummer(generateArticleNumber(article.getArtikelTyp()));
        artikelMap.put(article.getArtikelNummer(), article);
    }

    public void deleteArticle(String articleNr)
    {
        for(int c = 0; c < artikelListe.getLength(); c++){
            if(artikelListe.get(c).equals(findArticle(articleNr))){
                artikelListe.rem(c);
                break;
            }
        }
    }

wird zu


    public void deleteArticle(String articleNr)
    {
        artikelMap.remove(articleNr);
    }

und


    public Artikel findArticle(String articleNr){
        Artikel ret = null;
        for(int c = 0; c < artikelListe.getLength(); c++){
            if(((Artikel) artikelListe.get(c)).getArtikelNummer().equalsIgnoreCase(articleNr)){
                ret = (Artikel) artikelListe.get(c);
                break;
            }
        }
        return ret;
    }

wird zu


    public Artikel findArticle(String articleNr){
        return artikelMap.get(articleNr);
    }

Nur noch die Methode listArtikel anpassen


    public void listArtikel() throws ExistException
    {
        System.out.println("| Artikel Nr       | ArtikelTyp | Beschreibung                          | Anzahl auf Lager  | Zusatzinfo        |");
        System.out.println("+------------------+------------+---------------------------------------+-------------------+-------------------+");

        if(artikelMap.isEmpty()) throw new ExistException("Keine Artikel vorhanden");
        
        data = artikelMap.values();
        it   = data.iterator();
        Artikel tmp;
        
        while( it.hasNext() ) {
            tmp = (Artikel) it.next();
            String z = tmp.getArtikelNummer();
            String y = "Artikel Nr       ";
            
            z = fitTable(z, y.length(), ' ');
            System.out.println("| " + z + tmp.toString());
        }
    }

und fertig ist der Umstieg auf die Hash-Map!

Protokoll

Um die Aktionen unserer Kunden nachvollziehen zu können müssen wir jetzt ein Protokoll bauen.

Die Protocoll-Entry-Klasse

Zuerst einen Protokoll-Eintrag:


public class ProtocollEntry {
    private String protocollTyp;
    private String descriptiveText;
    private String zeitspempel;
    private Calendar time = Calendar.getInstance();
    
    public ProtocollEntry(String protocollTyp,  String  descriptiveText) {
        this.descriptiveText =descriptiveText;
        this.protocollTyp=protocollTyp;
        zeitspempel = "" + time.getTime();
    }
    
    public String toString(){
        return "_" + zeitspempel + " _" + protocollTyp + " (" + descriptiveText+ ")";
    }
}

Die Klasse Protocoll

Hier werden die Protokoll-Einträge eines Kunden verwaltet:


public class Protocoll {
    private Vector list = new Vector();
    private ProtocollEntry tmp;
    private Iterator it;
     
    public void writeProtocollEntry( String protocollTyp,  String  descriptiveText){
        tmp = new ProtocollEntry(protocollTyp, descriptiveText);
        list.add(tmp);
    }
     
    public void listProtocollEntry(){
        it = getProtocollIterator();
        while(it.hasNext()){
            tmp = it.next();
            System.out.println(tmp.toString());
        }
    }
     
    public Iterator getProtocollIterator(){
        Iterator  it = list.iterator();
        return it;
    }
}

Testen


public class Testsuite {
    public static void main(String[] args){
        
        Videothek video = new Videothek();

        Zeitgeber fatherTime = Zeitgeber.getInstance();
        fatherTime.setZeitfortschritt(1);
        
        Timer timer  = new Timer();
        timer.scheduleAtFixedRate( fatherTime , 1000, 100);
        
         /***************************************
         *   Kundenerstellung
         ***************************************/
        PrivatKunde Kunde1 = new PrivatKunde("Franz", "Huber");     
        FirmenKunde Kunde2 = new FirmenKunde("Google" , "Corporation");
        
        /***************************************
         *    Artikelerstellung
         ***************************************/
        CD article1 = new CD("Pink Floyd","Pink Floyd, Another Brick in the Wall", 2);
        DVD article2 = new DVD("Dinofilm","In Einem Land vor unserer Zeit", 5, 0);
        SWEET article3 = new SWEET("Kaugummi","Kirsch-Geschmack", 20, "5Tage");

        /***************************************
         *    Administrator Test
         ***************************************/
        AdministrationsSicht admin = video;
        
        admin.addArticle(article1);
        admin.addArticle(article2);
        admin.addArticle(article3);
        
        admin.addKunde(Kunde1);
        admin.addKunde(Kunde2);

        KundenLogin videothek   = video;
        KundenSicht kSicht;
        
        kSicht = videothek.login(Kunde1.getKundenNr());
        kSicht.listArticle();
        kSicht.borrowArticle(article1.getArtikelNummer());
        kSicht.buyArticle(article3.getArtikelNummer());
        kSicht.logOff();
        
        Kunde1.showProtocoll();
    }
}

Aufgabe 8

Zuerst übernehmen wir das geforderte Interface PersistenceLayer aus der Aufgabenstellung:


public interface PersistenceLayer {
     public void saveKunde( Kunde kunde ) throws VideothekException;
     public void deleteKunde( String kundenNr) throws VideothekException;;
     public Kunde loadKunde( String kundenNr ) throws VideothekException;;
     public List listAllCustomerNumbers() throws VideothekException;

     public void saveMitarbeiter( Mitarbeiter mitarbeiter ) throws VideothekException;
     public void deleteMitarbeiter( String mitarbeiterNr ) throws VideothekException;
     public Mitarbeiter loadMitarbeiter( String mitarbeiterNr ) throws VideothekException;
     public List listAllMitarbeiterNumbers() throws VideothekException;

     public void saveArtikel( Artikel artikel ) throws VideothekException;
     public void deleteArtikel( String artikelNr ) throws VideothekException;
     public Artikel loadArtikel( String artikelNr ) throws VideothekException;
     public List listAllArtikelNumbers() throws VideothekException;
}

Anschließend erstellen wir eine neue Klasse in der wir das Interface PersistenceLayer implementieren.


public class DataHandler implements PersistenceLayer{
    ...
}

noch eine wichtige variable hinzufügen...


private final char seperator = File.separatorChar;

Nur noch die fehlenden Methoden... (hier: nur Artikel - analog für Mitarbeiter und Kunden)


    public void saveArtikel(Artikel artikel) throws VideothekException {
        File f = new File(System.getProperty("user.dir")+seperator+"artikel");
        if(!f.exists()) f.mkdir();
        try{
            FileOutputStream fos = new FileOutputStream("."+seperator+"artikel"+seperator+artikel.getArtikelNummer());
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(artikel);
            os.close();
        } catch (IOException e){
            System.out.println(e.toString());
        }
    }

    public void deleteArtikel(String artikelNr) throws VideothekException {
        File f = new File(System.getProperty("user.dir")+seperator+"artikel"+seperator+artikelNr);
        f.delete();
    }

    public List listAllArtikelNumbers() throws VideothekException {
        File f = new File(System.getProperty("user.dir")+seperator+"artikel");
        return arrayToList(f.list());
    }

(Die Methode arrayToList wandelt ein String-Array in eine Liste aus Strings um)


    public void saveArtikel(Artikel artikel) throws VideothekException {
        File f = new File(System.getProperty("user.dir")+seperator+"artikel");
        if(!f.exists()) f.mkdir();
        try{
            FileOutputStream fos = new FileOutputStream("."+seperator+"artikel"+seperator+artikel.getArtikelNummer());
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(artikel);
            os.close();
        } catch (IOException e){
            System.out.println(e.toString());
        }
    }

Noch bei den Klassen wie Artikel etc. ein implements Serializable hinzufügen dass man diese schön speichern kann.


    public Artikel loadArtikel(String artikelNr) throws VideothekException {
        Artikel ret = null;
        try {
            FileInputStream fis = new FileInputStream("."+seperator+"artikel"+seperator+artikelNr);
            ObjectInputStream is = new ObjectInputStream(fis);
            ret = (Artikel)is.readObject();
            is.close();
        } catch (IOException e) {
        } catch (ClassNotFoundException e) {
        }
        return ret;
    }


Da nun alles wichtige implementiert wurde, müssen wir nur noch die neuen Funktionen in unser Programm einbauen. Hier: dataHandler.saveArtikel(article);


    public void addArticle(Artikel article)
    {
        article.setArtikelNummer(generateArticleNumber(article.getArtikelTyp()));
        artikelMap.put(article.getArtikelNummer(), article);
        try {
            dataHandler.saveArtikel(article);
        } catch (VideothekException e) {
            System.out.println(e.toString());
        }
    }

Den Rest kann man analog schreiben. Aber das überlass ich jetzt euch ;) Viel Spaß :)

Der ganze Code zum durchstöbern

Kommentare

  1. Noch keine Kommentare vorhanden.
  2. Dieser Eintrag kann nicht mehr kommentiert werden.

Nächster Eintrag: My Designer of the Week: #2 Thinkdust

Vorheriger Eintrag: Der neue Open Movie: Big Buck Bunny

Über den iamBlog

Der iamBlog ist von und für Studenten der FH Augsburg und alle Leute die sich für Design, Medien und Multimedia interessieren.

Namensgebend war der Studiengang InterAktive Medien an der FH Augsburg.

Der Blog befindet sich Moment noch im Aufbau. Wir entschuldigen uns für eventuell fehlende Funktionen und den ein oder anderen Fehler im System.

Die neuesten Links

Kategorien

Das neueste Design

Avant von pichfl

Zum Auswählen eines Designs einfach oben links auf den Button Hintergrund ändern klicken.

Feeds

Die Einträge im Blog lassen sich als Atom-Feed abonnieren. Außerdem gibt es einen kombinierten Atom-Feed, der Blogeinträge und Links enthält.
Diese Feeds werden z.B. von Browsern wie Safari oder Mozilla Firefox, Newsreadern wie NetNewsWire oder Feadreader oder Onlinediensten wie Google Reader unterstützt und werden automatisch aktualisiert, wenn neue Einträge im iamBlog vorhanden sind.

Werbung

Disclaimer

This page will never work with Internet Explorer. If you use Internet Explorer to view this page, all styles and features are deactivated. Use Firefox, Safari or Opera to see all the beautiful colours of the internet.