DIA Opdracht 4 (Arjan Dekker) Place klasse: #Deze klasse wordt gebruikt in zowel de client als de server #Daarom deze klasse in apart bestand gezet, die geinclude wordt #door zowel de server als client class Place #automatisch get functies aangemaakt attr :row attr :seatNumber #deze moet ook geset worden, door true wordt automatisch een setfunctie aangemaakt attr :cr_number, true #de constructor def initialize(row, seatNumber) @row = row @seatNumber = seatNumber end end
Client: #!/usr/bin/ruby #Distributed ruby en de place klasse zijn nodig, dus includen require 'drb/drb' require 'place.rb' #poort en plaats waar server op draait SERVER_URI = "druby://localhost:8787" #starten van de service DRb.start_service bios_service = DRbObject.new_with_uri(SERVER_URI) #weergeven van een welkomsbericht print "Welkom bij de BiosFactory\n" #Loopen tot applicatie gesloten wordt loop do #inlezen van wat gegevens print "Voer bioscoopnaam in: " STDOUT.flush bios = gets #de bioscoop wordt of aangemaakt of gereturned indien deze bestaat bioscoop = bios_service.get_bioscoop(bios)
#inlezen van wat gegevens print "Voer Rij in (A..Z): " STDOUT.flush rij = gets #inlezen van wat gegevens print "Voer stoelnr in (1..50): " STDOUT.flush seatnr = gets #nieuw place object aanmaken en doorgeven aan server print "Kaartje kost: ", bioscoop.getPrice(Place.new(rij.chop!,seatnr.chop!)), "\n" #inlezen van wat gegevens print "Kaartje kopen? (j/n): " STDOUT.flush answer = gets answer.chop! #indien kaartje te duur of iets dergelijks, dan plaats niet reserveren if answer == "j" print "Voer creditcard nummer in: " STDOUT.flush creditcardnr = gets #bookSingleSeat uitvoeren op server met een nieuw aangemaakte instantie van de placeklasse bioscoop.bookSingleSeat(Place.new(rij, seatnr), creditcardnr) end
#Overzicht uitprinten (niet nuttig maar dit laat alleen zien dat het werkt ;) ) print bioscoop.printSummary() #aantal geboekte plaatsen weergeven (niet nuttig maar dit laat alleen zien dat het werkt ;) ) print "aantal plaatsen: ",bioscoop.getNumberOfSeats(),"\n\n" STDOUT.flush end
Server: #!/usr/bin/ruby #Distributed ruby en de place klasse zijn nodig, dus includen require "drb/drb" require 'place.rb' #poort en plaats waar server op draait URI = "druby://localhost:8787" #De klassen waarvan de server instanties bijhoudt class Bioscoop #dit nodig om een referentie van het object door te geven include DRb::DRbUndumped #De constructor def initialize(bios_name) @bios_name = bios_name @places = [] end #functie retouneerd de prijs (boeken van een rij voor rij F is duurder dan achterin de zaal) def getPrice(pl) if pl.row < "F" return 10 else return 7 end end
#retouneerd het aantal geboekte plaatsen def getNumberOfSeats() return @places.size end #genereerd een overzicht van alle plaatsen die geboekt zijn. def printSummary() summary = summary , "Overzicht #{@bios_name}" summary = summary , "Plaatsen die geboekt zijn:\n" #de array met plaatsen langs van deze betreffende bioscoop @places.each { |i| summary = summary, i.row,i.seatNumber, " betaald met cr_nummer :", i.cr_number , "\n" } #geeft een lijst met geboekte plaatsen terug return "#{summary}" end #returned de naam van de bioscoop def getBiosName() return @bios_name end #voegt een geboekte plaats toe aan de placesarray def bookSingleSeat(pl,cr_number) pl.cr_number = cr_number @places.push(pl) end end
#De factory pattern klasse (maakt instanties van het bioscoop object aan, als deze nog niet bestaat #en geeft de juiste bioscoop terug als erom gevraagd wordt. class BiosFactory def initialize() @bioscopen = {} end #geeft de bioscoop terug waarom gevraagd wordt. #bestaat deze niet dan wordt er een nieuw object aangemaakt en deze wordt terug gegeven. def get_bioscoop(name) #check of object al bestaat if
[email protected]_key? name #bestaat nog niet dus nieuwe aanmaken @bioscopen[name] = Bioscoop.new(name) end #bestaat wel dus de juiste terug geven return @bioscopen[name] end end #Server Object aanmaken (nodig om mee te kunnen communiceren) SERVER_OBJECT = BiosFactory.new() #Service wordt gestart $SAFE = 1 DRb.start_service(URI, SERVER_OBJECT) DRb.thread.join