Задачата е дадена на контролно 1 по ПИК3 на 14.112015г.
Имате за задача да релизирате back end компонент от уеб система за резервация на билети за събития. Всеки ден във файл постъпват наличните билети за нови концерти. Системата зарежда билетите и „отваря врати” за покупко-продажбата, файлът се трие и се зарежда отново на другия ден. Клиенти се свързват през уеб базиран интерфейс към системата и си резервират билети.
Задача 1: Създайте клас Event, който да има place; date; startHour; numberOFTickets,priceOfTicket както и конструктор с параметри и абстрактен метод boolean sellTicket(int num)throws NoMoreTicketException, който по подаден брой билети отнема от общия брой толкова, колкото са подадени и връща true, а ако билетите са свършили, хвърля изключението. Член променливите оставете с такъв модификатор за достъп, че да може да се виждат само в рамките на текущия пакет и в наследниците(за да спестите време). Създайте две имплементации на Event – неабстрактните класове Concert и VolleyBallMatch. Първият има член променлива starName, а вторият – firstTeam и secondTeam. Член променливите са с модификатор за достъп както тези в Event. И за двата класа напишете конструктор с параметри. Създайте ваши изключения NoMoreTicketException и UnrecognisedRowException, като предефинирате конструктурите им, приемащи стринг, и методите им getMessage().
Задача 2: Създайте интерфейс Importable, който да има един метод Object[] importDataFromFile(), който хвърля IOException. Създайте клас, имплементиращ интерфейса, с име TicketLoader. Той чете от файл на име: „dailytickets.txt“. Файлът съдържа информацията за билетите в следния вид:
1*John Smith*Arena Armeec*15.11.2015*20:00*20000*50*
1*Adam Brayan*NDK*16.11.2015*21:00*5000*100*
2*Levski*CSK*Arena Armeec*16.09.2015*22:00*2000*25*
Както виждате във файла са записани данни за обекти от тип Event. Всеки от тях е на нов ред, а кода, с който започва реда може да използвате за критерий дали имаме обект Concert – ‘1‘ или обект от тип VolleyBallMatch – ‘2’. Ако нещо в четенето на файла се обърка и възникне IoException, нека методът го изхвърли. Ако прочете такъв ред, който не отговаря на дефинираните 2 типа обекти горе, то да се хвърля и обработва на място изключение от тип UnrecognisedRowException, в конструктора на който ще подавате информация за това кой е неуспешно прочетения ред. Методът не трябва да спира ако срещне такъв ред, а трябва да продължи към следващия до края на файла. За удобство, можете да си направите private метод, който да ви връща броя редове във файла, за да знаете с колко елемента да инициализирате масива с обекти от тип Event, който ще връщате като резултат.
Задача 3: Създайте клас EventProcessing, в койтo трябва да има два публични масива- единият от концерти, а другият от волейболни мачове. Имплементирайте статичен метод void processTickets(), в който използвайте TicketLoader-а, за да заредите дневните билети. С върнатия масив от Event обекти процедирайте по следния начин: разделете обектите от тип Concert и от тип VolleyBallMatch и с тях напълнете статичните масиви. Може да използвате за целта instance of. Статичните масиви ще се взимат от друг компонент на уеб приложението. Вашата работа спира до тук.
package control; public abstract class Event { protected String place; protected String date; protected String startHour; protected int numberOFTickets; protected double priceOfTicket; public Event(String place, String date, String startHour, int numberOFTickets, double priceOfTicket) { this.place = place; this.date = date; this.startHour = startHour; this.numberOFTickets = numberOFTickets; this.priceOfTicket = priceOfTicket; } public abstract boolean sellTicket(int numberOfTickets) throws NoMoreTicketException; } package control; public class Concert extends Event { protected String starName; public Concert(String starName, String place, String date, String startHour, int numberOFTickets, double priceOfTicket) { super(place, date, startHour, numberOFTickets, priceOfTicket); this.starName = starName; } @Override public boolean sellTicket(int num) throws NoMoreTicketException { if (num > this.numberOFTickets || this.numberOFTickets == 0) { throw new NoMoreTicketException(this.starName + "'s concert."); } else { this.numberOFTickets = this.numberOFTickets - num; System.out.println(num + " tickets saled!"); System.out.println("All free tickets are: " + this.numberOFTickets); return true; } } } package control; public class VolleyBallMatch extends Event { protected String firstTeam; protected String secondTeam; public VolleyBallMatch(String firstTeam, String secondTeam, String place, String date, String startHour, int numberOFTickets, double priceOfTicket) { super(place, date, startHour, numberOFTickets, priceOfTicket); this.firstTeam = firstTeam; this.secondTeam = secondTeam; } @Override public boolean sellTicket(int num) throws NoMoreTicketException { if (num > this.numberOFTickets || this.numberOFTickets == 0) { throw new NoMoreTicketException(this.firstTeam + " - " + this.secondTeam); } else { this.numberOFTickets = this.numberOFTickets - num; return true; } } } package control; public class NoMoreTicketException extends Exception { private String nameOfEvent; public NoMoreTicketException(String nameOfEvent) { super(); this.nameOfEvent = nameOfEvent; } public String getMessage() { return "There is no more tickets for: " + nameOfEvent; } } package control; public class UnrecognisedRowException extends Exception { private String message; public UnrecognisedRowException(String message) { super(message); this.message = message; } public String getMessage() { return message; } } package control; import java.io.IOException; public interface Importable { /** * Every day will import data from file. *@return Object[] - extracted objects from file. *@exception IOException - if file doesn't exists or *some IO error occurs. */ public Object[] importDataFromFile() throws IOException; } package control; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Field; public class TicketLoader implements Importable { private final static String FILE_WITH_CONCERTS_NAME = "dailytickets.txt"; private static BufferedReader reader = null; @Override public Object[] importDataFromFile() throws IOException { Event[] arrayofEvents = null; int numberOfRows = getNumberOfRows(); reader = new BufferedReader(new FileReader(FILE_WITH_CONCERTS_NAME)); arrayofEvents = new Event[numberOfRows]; String line; int currentRowIndex = 0; //with reflection get number of classes' fields. Field[] fieldsOfConcertClass = Concert.class.getDeclaredFields(); Field[] fieldsOfEventClass = VolleyBallMatch.class.getSuperclass().getDeclaredFields(); Field[] fieldsOfVolleyClass = VolleyBallMatch.class.getDeclaredFields(); int totalNumberOfFieldsOfVolleyClass = fieldsOfEventClass.length + fieldsOfVolleyClass.length; int totalNumberOfFieldsOfConcertClass = fieldsOfEventClass.length + fieldsOfConcertClass.length; while ((line = reader.readLine()) != null) { try { if (line.startsWith("1")) { String[] concertArray = line.split("\\*"); if (concertArray.length == (totalNumberOfFieldsOfConcertClass + 1)) { Concert c = new Concert(concertArray[1], concertArray[2], concertArray[3], concertArray[4], Integer.parseInt(concertArray[5]), Double.parseDouble(concertArray[6])); arrayofEvents[currentRowIndex++] = c; } } else if (line.startsWith("2")) { String[] volleyArray = line.split("\\*"); if (volleyArray.length == (totalNumberOfFieldsOfVolleyClass + 1)) { VolleyBallMatch v = new VolleyBallMatch(volleyArray[1], volleyArray[2], volleyArray[3], volleyArray[4], volleyArray[5], Integer.parseInt(volleyArray[6]), Double.parseDouble(volleyArray[7])); arrayofEvents[currentRowIndex++] = v; } else { throw new UnrecognisedRowException( "One unrecognised row was founded at " + (currentRowIndex + 1) + " row!"); } } } catch (UnrecognisedRowException e) { System.out.println(e.getMessage()); } } return arrayofEvents; } private int getNumberOfRows() throws IOException { reader = new BufferedReader(new FileReader(FILE_WITH_CONCERTS_NAME)); int numberOfRows = 0; while (reader.readLine() != null) { numberOfRows++; } reader.close(); return numberOfRows; } } package control; import java.io.IOException; public class EventProcessing { public static Concert[] arrayOfConcerts = null; public static VolleyBallMatch[] arrayOfVolleyball = null; private final static int SIZE_OF_OBJECT_BUFFER = 100; public static void main(String[] args) { System.out.println("Only for testing:"); try { processTickets(); } catch (IOException e1) { e1.printStackTrace(); } Concert c = arrayOfConcerts[0]; try { c.sellTicket(500); c.sellTicket(20000); } catch (NoMoreTicketException e) { System.out.println(e.getMessage()); } } /** * This static method will be invoked every day to fill the static arrays of * objects of type Concert and VolleyBallMatch with data from file. The last * imported information from previous day will be deleted from the buffers. * The buffers will be created with default size of 100 elements. * * @throws IOException * - if IO problems occur. */ public static void processTickets() throws IOException { System.out.println("Processing..."); arrayOfConcerts = new Concert[SIZE_OF_OBJECT_BUFFER]; arrayOfVolleyball = new VolleyBallMatch[SIZE_OF_OBJECT_BUFFER]; TicketLoader t = new TicketLoader(); Event[] arrayOfEvents = (Event[]) t.importDataFromFile(); int i = 0; int j = 0; for (Event e : arrayOfEvents) { if (e instanceof Concert) { arrayOfConcerts[i++] = (Concert) e; } else if (e instanceof VolleyBallMatch) { arrayOfVolleyball[j++] = (VolleyBallMatch) e; } } System.out.println("Process of importing finished."); System.out.println("Num loaded concerts: " + i); System.out.println("Num loaded volleyballs: " + j); } } Задача за упражнение: Напишете клас User с полета nickName и password. Класът имплементира интерфейса Validator с абстрактен метод checking. Методът проверява дали nickName е email поща, ако е email, обектът се създава и се записва във файл, ако не е email, то хвърля Exception(User defined) и не позволява обектът да се създаде. Напишете статичен метод с 3 параметъра 1- обект от тип файл 2-String nickName 3-String password Методът връща boolean. По дадените nickName и password проверява във файла дали съществуват и съответсват тези име/парола,ако да- методът връща true, ако не- съответно връща false. Примерно решение, дадено от студенти по време на упражнение:import java.util.Scanner; import java.io.*; public class Main { public static void main(String[] args) throws IOException, NotMailAddressException { Scanner scanner = new Scanner(System.in); System.out.println("Enter username…"); String name = scanner.nextLine(); System.out.println("Enter password…"); String pass = scanner.nextLine(); System.out.println("Enter file name:"); File f = new File(scanner.nextLine()); User user = new User(name, pass); if (user != null) { addUser(f, user); } System.out.println("Enter username for searching."); String searchedUsername = scanner.nextLine(); System.out.println("Enter password for searching."); String searchedPassword = scanner.nextLine(); boolean exists = User.searchUser(f, searchedUsername, searchedPassword); if (exists) { System.out.println("exists."); } else { System.out.println("doesn’t exist."); } } private static void addUser(File f, User u) throws IOException { FileWriter writer = new FileWriter(f, true); writer.write(u.username + "*"); writer.write(u.password + "*"); writer.flush(); } } public class NotMailAddressException extends Exception { @Override public String getMessage() { return "Invalid username!"; } } import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.regex.Matcher; public class User implements Validator { String username; String password; public User(String username, String password) throws NotMailAddressException { boolean valid = checkUsername(username); if (valid) { this.username = username; this.password = password; } else { throw new NotMailAddressException(); } } @Override public boolean checkUsername(String username) { Matcher matcher = VALID_MAIL.matcher(username); return matcher.find(); }; public static boolean searchUser(File f, String name, String pass) throws IOException { FileReader reader = null; BufferedReader bufferedReader = null; try { reader = new FileReader(f); bufferedReader = new BufferedReader(reader); String line = bufferedReader.readLine(); String[] data = line.split("#"); for (int i = 0; i < data.length; i++) { if (data[i].equals(name + "*" + pass)) { return true; } } } catch (IOException e) { System.out.println("ERROR in reading from file: " + f.getName()); } finally { reader.close(); bufferedReader.close(); } return false; } } import java.util.regex.Pattern; public interface Validator { public static final Pattern VALID_MAIL = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);; public boolean checkUsername(String username); }Явор Томов, Даниел Джолев
***Примерна задача***
Напишете клас User с полета nickName и password. Класът имплементира
интерфейса validater с абстрактен метод checking. Методът проверява дали nickName е
email поща, ако е email, обектът се създава и се записва във файл, ако не е email,
хвърля exception(който си го правим ние) и не позволява обекта да се създаде.
Напишете статичен метод с 3 параметъра
1- обект от тип файл
2-String nickName
3-String password
методът връща boolean. По дадените nickName и password проверява във файла дали съществуват и съответсват ,
ако да методът връща true, ако не съответно връща false.
***Примерно решение***
import java.util.Scanner;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException, NotMailAddressException {
Scanner scanner = new Scanner(System.in);
System.out.println(“Enter username…”);
String name = scanner.nextLine();
System.out.println(“Enter password…”);
String pass = scanner.nextLine();
System.out.println(“Enter file name:”);
File f = new File(scanner.nextLine());
User user = new User(name,pass);
if(user!=null) {
addUser(f,user);
}
System.out.println(“Enter username for searching.”);
String searchedUsername = scanner.nextLine();
System.out.println(“Enter password for searching.”);
String searchedPassword = scanner.nextLine();
boolean exists = User.searchUser(f,searchedUsername, searchedPassword);
if(exists) {
System.out.println(“exists.”);
}
else {
System.out.println(“doesn’t exist.”);
}
}
private static void addUser(File f, User u) throws IOException {
FileWriter writer = new FileWriter(f,true);
writer.write(u.username+”*”);
writer.write(u.password+”*”);
writer.flush();
}
}
////////////////////////////////////////////
public class NotMailAddressException extends Exception {
@Override
public String getMessage() {
return “Invalid username!”;
}
}
////////////////////////////////////////////
import java.io.InvalidObjectException;
import java.util.regex.Matcher;
public class User implements Validator {
String username;
String password;
public User(String username, String password) throws NotMailAddressException {
boolean valid = checkUsername(username);
if(valid) {
this.username = username;
this.password = password;
}
else {
throw new NotMailAddressException();
}
}
@Override
public boolean checkUsername(String username) {
Matcher matcher = VALID_MAIL.matcher(username);
return matcher.find();
};
public static boolean searchUser(File f, String name,String pass) throws IOException {
FileReader reader = new FileReader(f);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();
String[] data = line.split(“#”);
for (int i = 0; i < data.length; i++) {
if(data[i].equals(name+"*"+pass)) {
return true;
}
}
return false;
};
}
//////////////////////////////////////////////////
import java.util.regex.Pattern;
public interface Validator {
public static final Pattern VALID_MAIL=Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);;
public boolean checkUsername(String username);
}