Door toedoen van computertechnologie is de functionaliteit van telefoniesystemen de laatste tien jaar sterk toegenomen. We beschikken nu over geautomatiseerde menu's, gesofisticeerde antwoordapparaten, conference call mogelijkheden, groepsadressering, en dergelijke meer. Een functionaliteit die de meeste telefoniesystemen aanbieden, is om oproepen door te schakelen. Als iemand op vakantie gaat, dan kan hij het systeem instellen zodat binnenkomende oproepen worden doorgeschakeld naar een collega. Voor deze opgave moet je een programma schrijven dat kan gebruikt worden om doorgeschakelde oproepen te beheren voor de Universiteit Gent.
Alle telefoonnummers van de Universiteit Gent bestaan uit vier cijfers. Werknemers kunnen oproepen doorschakelen door bepaalde informatie in te voeren via hun telefoontoestel. Als een werknemer afwezig zal zijn, dan voert hij de volgende informatie in: zijn eigen telefoonnummer, het telefoonnummer waarnaar moet doorgeschakeld worden, het tijdstip vanaf wanneer hij afwezig zal zijn en hoe lang hij afwezig zal zijn. Deze informatie is onderhevig aan de volgende voorwaarden:
telefoonnummers bestaan altijd uit vier cijfers, waarbij vooraan ook nullen kunnen staan
het telefoonnummer 9999 is voorbehouden, en heeft een speciale betekenis voor het doorschakelsysteem (zie verder)
tijdstippen worden voorgesteld als incrementen van één uur en zijn gebaseerd op een klok die telkens bij het begin van het jaar begint te lopen vanaf 0; het tijdstip vanaf wanneer een werknemer afwezig zal zijn, wordt dus altijd weergegeven als een geheel getal tussen 0 en 8784 ($$= 366 \times 24$$); het doorschakelsysteem wordt telkens herstart bij het begin van een nieuw jaar
een doorschakelopdracht die wordt ingesteld vanaf tijdstip $$t$$ voor een duurtijd $$d$$ zal actief zijn vanaf tijdstip $$t$$ tot en met tijdstip $$t + d$$
De telefooncentrale mag ervan uitgaan dat werknemers "'correcte"' informatie doorgeven aan het doorschakelsysteem. Ze geven de informatie in volgens het juiste formaat. Ze geven geen doorschakelopdrachten die het einde van het jaar overschrijden. De centrale moet wel controleren of eenzelfde werknemer nooit meerdere doorschakelopdrachten ingeeft waarvan de periodes overlappen in de tijd. Maar zelfs als de werknemers informatie doorgeven die vanuit hun eigen standpunt correct is, kunnen er nog inconsistenties optreden waarbij er oneindig wordt doorgeschakeld. Stel bijvoorbeeld dat Nico zijn oproepen doorschakelt naar Veerle, Veerle schakelt haar oproepen door naar Annick, en Annick schakelt haar oproepen door naar Nico. Als één van deze drie werknemers wordt opgebeld, dan zal de oproep tot het einde der tijden doorgeschakeld worden. Om dergelijke situaties op te vangen, gebruikt het doorschakelsysteem het doodlopend telefoonnummer 9999. Elke binnenkomende oproep die aanleiding geeft tot een oneindige lus wordt daarbij doorgeschakeld naar het speciale telefoonnummer 9999.
Definieer een klasse Telefooncentrale waarmee het doorschakelsysteem van een telefooncentrale kan aangestuurd worden. De functionaliteit van het doorschakelsysteem moet hierbij voldoen aan bovenstaande omschrijving. De objecten van de klasse Telefooncentrale moeten daarvoor minstens over de volgende methoden beschikken:
Een methode doorschakelen waarmee een doorschakelopdracht kan doorgeven worden aan de telefooncentrale. Aan deze methode moeten vier argumenten doorgegeven worden: i) het telefoonnummer (string) van de werknemer die de doorschakelopdracht ingeeft, ii) het telefoonnummer (string) waarnaar moet doorgeschakeld worden, iii) het tijdstip $$t$$ (int) vanaf wanneer de doorschakeling moet ingaan, en iv) de duurtijd $$d$$ (int) van doorschakeling. Indien de werknemer die de doorschakelopdracht ingeeft eerder al een doorschakelopdracht heeft ingegeven die in de tijd overlapt met de nieuwe doorschakelopdracht, dan moet de methode een AssertionError opwerpen met als boodschap ongeldige opdracht.
Een methode configureer waaraan de naam van een tekstbestand moet doorgegeven worden. Elke regel van het tekstbestand bevat vier getallen (gescheiden door spaties) bestaande uit vier cijfers. Deze getallen bevatten de informatie voor het instellen van een doorschakelopdracht: doel bestemming start duur. De methode moet deze doorschakelopdrachten doorgeven aan de telefooncentrale, waarbij het doorschakelsysteem zo ingesteld wordt dat een oproep naar werknemer met telefoonnummer doel moet doorgeschakeld worden naar telefoonnummer bestemming vanaf tijdstip start voor een zekere periode van duur uur.
Een methode oproep waarmee een binnenkomende oproep kan verwerkt worden. Aan deze methode moeten twee argumenten doorgegeven worden die aangeven dat er op een gegeven tijdstip (int, tweede argument) een oproep binnenkomt naar een gegeven telefoonnummer (string, eerste argument). De methode moet een string als resultaat teruggeven, die het telefoonnummer aangeeft waarnaar de binnenkomende oproep zal doorgeschakeld worden volgens de doorschakelopdrachten die tot hiertoe aan het systeem doorgegeven werden.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand instellingen.txt1 zich in de huidige directory bevindt.
>>> centrale = Telefooncentrale()
>>> centrale.oproep('4444', 150)
'4444'
>>> centrale.doorschakelen('4444', '6666', 100, 200)
>>> centrale.doorschakelen('5555', '7777', 600, 200)
>>> centrale.oproep('5555', 700)
'7777'
>>> centrale.doorschakelen('5555', '8888', 750, 100)
Traceback (most recent call last):
AssertionError: ongeldige opdracht
>>> centrale2 = Telefooncentrale()
>>> centrale2.configureer('instellingen.txt')
>>> centrale2.oproep('1111', 50)
'1111'
>>> centrale2.oproep('1111', 150)
'2222'
>>> centrale2.oproep('1111', 200)
'3333'
>>> centrale2.oproep('2222', 225)
'3333'
>>> centrale2.oproep('1111', 270)
'9999'
>>> centrale2.oproep('1111', 320)
'4444'
>>> centrale2.oproep('3333', 320)
'4444'
>>> centrale2.oproep('3000', 900)
'3000'
>>> centrale2.oproep('3333', 1250)
'1111'
>>> centrale2.oproep('7777', 1250)
'9999'