Прошу помощи - не засчитывается третий пункт требований задачи,
Update: Дело оказалось в методе processVideos класса AdvertisingManager, надо было проверить список кандидатов на isEmpty() и бросить NoVideoAvailableException.
Restaurant.java:
package com.javarush.task.task27.task2712;
import com.javarush.task.task27.task2712.kitchen.Cook;
import com.javarush.task.task27.task2712.kitchen.Waiter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class Restaurant {
private static final int ORDER_CREATING_INTERVAL = 100;
public static void main(String[] args) throws InterruptedException {
Locale.setDefault(Locale.US);
Cook[] cooks = {new Cook("Amigo"), new Cook("mAmigo")};
int count = 0;
List<Tablet> tablets = new ArrayList<>();
for(int i = 0; i < 4; ++i) {
Tablet tablet = new Tablet(i);
tablet.addObserver(cooks[count++%2]);
tablets.add(tablet);
}
Waiter waiter = new Waiter();
cooks[0].addObserver(waiter);
cooks[1].addObserver(waiter);
Thread t = new Thread(new RandomOrderGeneratorTask(tablets, ORDER_CREATING_INTERVAL));
t.start();
Thread.sleep(1000);
t.interrupt();
DirectorTablet directorTablet = new DirectorTablet();
directorTablet.printAdvertisementProfit();
directorTablet.printCookWorkloading();
directorTablet.printActiveVideoSet();
directorTablet.printArchivedVideoSet();
}
}
RandomOrderGeneratorTask.java:
package com.javarush.task.task27.task2712;
import java.util.List;
public class RandomOrderGeneratorTask implements Runnable {
private List<Tablet> tablets;
private int interval;
public RandomOrderGeneratorTask(List<Tablet> tablets, int interval) {
this.tablets = tablets;
this.interval = interval;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
Tablet tablet = tablets.get((int) (Math.random() * tablets.size()));
tablet.createTestOrder();
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
return;
}
}
}
}
Tablet.java:
package com.javarush.task.task27.task2712;
import com.javarush.task.task27.task2712.ad.AdvertisementManager;
import com.javarush.task.task27.task2712.ad.NoVideoAvailableException;
import com.javarush.task.task27.task2712.kitchen.Order;
import com.javarush.task.task27.task2712.kitchen.TestOrder;
import java.io.IOException;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Tablet extends Observable {
private static Logger logger = Logger.getLogger(Tablet.class.getName());
private final int number;
public Tablet(int number) {
this.number = number;
}
public String getName() {
return String.valueOf(number);
}
@Override
public String toString() {
return String.format("Tablet{number=%d}", number);
}
public void createTestOrder() {
TestOrder order = null;
try {
order = new TestOrder(this);
processOrder(order);
} catch (IOException e) {
logger.log(Level.SEVERE, "Console is unavailable.");
}
}
private void processOrder(Order order) {
if (!order.isEmpty()) {
ConsoleHelper.writeMessage(order.toString());
try {
new AdvertisementManager(order.getTotalCookingTime()*60).processVideos();
} catch (NoVideoAvailableException e) {
logger.log(Level.INFO, "No video is available for the order " + order);
}
setChanged();
notifyObservers(order);
}
}
public Order createOrder() {
Order order = null;
try {
order = new Order(this);
processOrder(order);
} catch (IOException e) {
logger.log(Level.SEVERE, "Console is unavailable.");
}
return order;
}
}
Order.java:
package com.javarush.task.task27.task2712.kitchen;
import com.javarush.task.task27.task2712.ConsoleHelper;
import com.javarush.task.task27.task2712.Tablet;
import java.io.IOException;
import java.util.List;
public class Order {
private final Tablet tablet;
protected List<Dish> dishes;
public Order(Tablet tablet) throws IOException {
this.tablet = tablet;
initDishes();
}
protected void initDishes() throws IOException {
dishes = ConsoleHelper.getAllDishesForOrder();
}
public int getTotalCookingTime() {
int result = 0;
for (Dish dish : dishes) {
result += dish.getDuration();
}
return result;
}
public List<Dish> getDishes() {
return dishes;
}
public boolean isEmpty() {
return dishes.isEmpty();
}
@Override
public String toString() {
return String.format("Your order: %s of %s", dishes.toString(), tablet.toString());
}
}
TestOrder.java:
package com.javarush.task.task27.task2712.kitchen;
import com.javarush.task.task27.task2712.Tablet;
import java.io.IOException;
import java.util.ArrayList;
public class TestOrder extends Order {
public TestOrder(Tablet tablet) throws IOException {
super(tablet);
}
@Override
protected void initDishes() throws IOException {
dishes = new ArrayList<>();
for (Dish dish : Dish.values()) {
if ((int) (Math.random() * 2) == 1) {
dishes.add(dish);
}
}
}
}