/******************************************* Den här filen innehåller en klass bil_db_c som utgör en stubbe för access av en databas. Då den kompileras genereras en fil bil_db_c.class som kan kopplas på ett program som senare ska köra ovanpå en riktig databas. OM STUBBEN Jobbar mot två vektorer bil_vektor och stat_vektor istället för mot databastabeller. Ingen konsistenkoll görs mellan data inom eller mellan dessa vektorer. Ser till att svar på anrop ser ut som om de kom från en databas. HISTORIK 991116 Håkan Lindegren Grundversion med ArrayList 991116 Torbjörn Eriksson Otestad JDK1.1-säkring av Xet Vad som gjorts: 1) Bytt ArrayList mot Vector 2) Bytt add() mot addElement() 3) Bytt get() mot elementAt() 4) Bytt remove() mot removeElementAt() add, get och remove finns visserligen i Vectorklassen, men först i JDK1.2. 991117 Håkan Lindegren Provat Vector-varianten Lagt till historikrubrik 000925 Implementerat iterator() Tagit bort get_first/get_next Extern bil_db_exception-klass 001120 HLi Rättat fel i select_1. 001121 HLi Rättat fel i delete. 020530 HLi Överger kravet på att bil_db_i ska implementeras Överger kravet på att stubben ska ersättas med riktig DB *******************************************/ import java.util.Vector; import java.util.StringTokenizer; import java.util.Iterator; /** Klassen ger ett javasnitt mot en tänkt databas med två tabeller: BIL: för att hålla reda på nya bilar och deras priser BIL_STAT: för att hålla reda på samlingsstatistik för bilarna i BIL. Den fungerar emellertid endast som en stubbe och ska senare (efter kursen) ersättas med riktiga db-kopplingar. */ public class bil_db_c { // Konstruktor public bil_db_c() { this.bil_vektor = new Vector(); this.stat_vektor = new Vector(); this.connected = false; } /** Ordnar uppkoppling mot databasen. Ska anropas en gång innan anrop till efterföljande metoder. @param username Användarnamn i DB @param password Passord i DB @return Kastar bil_db_exception vid fel. I stubbefallet SKA gälla att username == "java" och password == "inl2" för att exception inte ska uppstå. */ public void connect( String username, String password ) throws bil_db_exception { if ( !username.equals( "java" ) || !password.equals( "inl2" ) ) { throw new bil_db_exception(); //////////////////////////////// } if ( ! this.connected ) { this.bil_vektor.addElement( "ABC123,Volvo,95,150000" ); this.bil_vektor.addElement( "BBC123,Volvo,95,140000" ); this.bil_vektor.addElement( "AAC123,Volvo,96,160000" ); this.bil_vektor.addElement( "BBD123,Volvo,96,140000" ); this.bil_vektor.addElement( "ABC223,SAAB,95,180000" ); this.bil_vektor.addElement( "BBC323,SAAB,95,140000" ); this.bil_vektor.addElement( "AAC723,SAAB,96,220000" ); this.bil_vektor.addElement( "BBD823,SAAB,96,170000" ); this.stat_vektor.addElement( "Volvo,95,2,290000" ); this.stat_vektor.addElement( "Volvo,96,2,300000" ); this.stat_vektor.addElement( "SAAB,95,2,320000" ); this.stat_vektor.addElement( "SAAB,96,2,390000" ); this.connected = true; } } // bil_db_c /** Ger tillbaka en iterator över posterna i en bildatabas. @return Kastar bil_db_exception vid databasfel. Ger en iterator som returnerar bil_record_c-poster vid rätt. */ public Iterator iterator() throws bil_db_exception { if ( ! this.connected ) { throw new bil_db_exception(); //////////////////////////////// } return new stub_iterator_c( this.bil_vektor ); } // iterator /** Lägger in en post i DB. @param bil_record Ska hålla data för nya posten. @return Kastar bil_db_exception vid databasfel. Sätter bil_record.ok = true om posten gick att lägga in Sätter bil_record.ok = false om det inte gick att lägga in post men DB fortfarande OK */ public void insert( bil_record_c bil_record ) throws bil_db_exception { if ( !this.connected ) { throw new bil_db_exception(); //////////////////////////////// } StringBuffer sb = new StringBuffer(); sb.append( bil_record.regnr ); sb.append( "," ); sb.append( bil_record.marke ); sb.append( "," ); sb.append( bil_record.ar ); sb.append( "," ); sb.append( bil_record.nypris ); bil_vektor.addElement( sb.toString() ); bil_record.ok = true; } // insert /** Uppdaterar en post i DB. @param bil_record Ska hålla data för uppdateringsposten. OBS! bil_record.regnr SKA vara ett befintligt regnr i DB och kan inte ändras av denna funktion. @return Kastar bil_db_exception vid databasfel. Sätter bil_record.ok = true om posten gick att uppdatera Sätter bil_record.ok = false om det inte gick att uppdatera post men DB fortfarande OK */ public void update( bil_record_c bil_record ) throws bil_db_exception { if ( !this.connected ) { throw new bil_db_exception(); //////////////////////////////// } this.delete( bil_record ); if ( bil_record.ok ) { this.insert( bil_record ); } } // update /** Tar bort en post ur DB. @param bil_record bil_record.regnr ska ange registreringsnummer. @return Kastar bil_db_exception vid databasfel. Sätter bil_record.ok = true om posten gick att ta bort Sätter bil_record.ok = false om det inte gick att ta bort posten post men DB fortfarande OK */ public void delete( bil_record_c bil_record ) throws bil_db_exception { if ( !this.connected ) { throw new bil_db_exception(); //////////////////////////////// } bil_record_c temp = null; boolean hittad = false; Iterator iterator = this.iterator(); while ( iterator.hasNext() && !hittad ) { temp = (bil_record_c)iterator.next(); hittad = temp.regnr.equalsIgnoreCase( bil_record.regnr ); if ( hittad ) { iterator.remove(); } } // while bil_record.ok = hittad; } // delete /** Ger medelnypris för bilar av visst märke och årsmodell givet registreringsnumret på en sådan bil. @param regnr REGNR på en bilpost i DB @return Medelnypris eller 0 vid någon typ av fel */ public int medelvarde( String regnr ) { bil_record_c temp = new bil_record_c(); temp.regnr = regnr; try { this.select_1( temp ); } catch ( bil_db_exception exc ) { return 0; //////////// } int medelv = 0; if ( temp.ok ) { for ( int index = 0; index < this.stat_vektor.size(); index++ ) { String statbuf = (String)this.stat_vektor.elementAt( index ); StringTokenizer extraktor = new StringTokenizer( statbuf, "," ); String marke = extraktor.nextToken(); String arbuf = extraktor.nextToken(); if ( marke.equalsIgnoreCase( temp.marke ) && new Integer( arbuf ).intValue() == temp.ar ) { String antalbuf = extraktor.nextToken(); String summabuf = extraktor.nextToken(); int antal = new Integer( antalbuf ).intValue(); int summa = new Integer( summabuf ).intValue(); medelv = summa / antal; break; ///////// } // if } // for } // if return medelv; } // medelvarde /** Ger tillbaka data om en bil givet ett regnr @param bil_record bil_record.regnr ska hålla REGNR för en bilpost i DB @return Kastar bil_db_exception vid databasfel. Sätter bil_record.ok = true om posten med regnr fanns Sätter bil_record.ok = false om den inte fanns men DB fortfarande OK */ public void select_1( bil_record_c bil_record ) throws bil_db_exception { if ( !this.connected ) { throw new bil_db_exception(); //////////////////////////////// } boolean hittad = false; bil_record_c temp = null; Iterator iterator = this.iterator(); while ( iterator.hasNext() && !hittad ) { temp = (bil_record_c)iterator.next(); hittad = temp.regnr.equalsIgnoreCase( bil_record.regnr ); } // while bil_record.ok = hittad; if ( bil_record.ok ) { bil_record.regnr = temp.regnr; bil_record.marke = temp.marke; bil_record.ar = temp.ar; bil_record.nypris = temp.nypris; } } // select_1 /** Ska se till att databasuppkoplling tas ned. */ public void close() { } // close // privata deklarationer private Vector bil_vektor = new Vector(); private Vector stat_vektor = new Vector(); private boolean connected = true; private static bil_db_c unique_bil_db; } // bil_db_c