/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package hotel; import client.HotelServiceCallback; import common.Constants; import common.CreditCard; import common.InvalidCreditCardException; import java.util.logging.Level; import java.util.logging.Logger; import org.osoa.sca.annotations.Callback; import org.osoa.sca.annotations.Property; import org.osoa.sca.annotations.Scope; import org.osoa.sca.annotations.Service; @Service(HotelService.class) @Scope("COMPOSITE") public class HotelServiceImpl implements HotelService { @Callback protected HotelServiceCallback callback; private HotelBD bd; private int sleepBookTime; private int sleepPaymentTime; private String behavior; public HotelServiceImpl() { bd = HotelBD.getInstance(); sleepBookTime = 0; sleepPaymentTime = 0; behavior = Constants.NORMAL; } public void book(int roomID) { new Thread(new BookThread(roomID)).start(); } public void pay(int roomID, int confirmationID, CreditCard creditCard) { new Thread(new PayThread(roomID, confirmationID, creditCard)).start(); } public String getBehavior() { return behavior; } @Property(name = "behavior", required = false) public void setBehavior(String behavior) { this.behavior = behavior.toUpperCase(); } public int getSleepBookTime() { return sleepBookTime; } @Property(name = "sleepBookTime", required = false) public void setSleepBookTime(int sleepBookTime) { this.sleepBookTime = sleepBookTime; } public int getSleepPaymentTime() { return sleepPaymentTime; } @Property(name = "sleepPaymentTime", required = false) public void setSleepPaymentTime(int sleepPaymentTime) { this.sleepPaymentTime = sleepPaymentTime; } private class BookThread implements Runnable { private int roomID; public BookThread(int roomID) { this.roomID = roomID; } public void run() { //Extra time to book try { Thread.sleep(sleepBookTime); } catch (InterruptedException ex) { Logger.getLogger(HotelServiceImpl.class.getName()).log(Level.SEVERE, null, ex); } //NORMAL behavior if (behavior.equals(Constants.NORMAL) || behavior.equals(Constants.EXCEPTIONAL_PAYMENT)) { HotelRoom room = bd.get(roomID); int confirmationID = room.book(); if (confirmationID != -1) { callback.confirmHotelBook(confirmationID); return; } callback.throwsHotelException(new UnavailableHotelException( "Room " + roomID + " is already booked!")); } //EXCEPTIONAL_BOOK behavior else if (behavior.equals(Constants.EXCEPTIONAL_BOOK)) { callback.throwsHotelException(new UnavailableHotelException( "Room " + roomID + " is already booked!")); } } } private class PayThread implements Runnable { private int roomID; private int confirmationID; private CreditCard creditCard; public PayThread(int roomID, int confirmationID, CreditCard creditCard) { this.roomID = roomID; this.confirmationID = confirmationID; this.creditCard = creditCard; } public void run() { //Extra time to pay try { Thread.sleep(sleepPaymentTime); } catch (InterruptedException ex) { Logger.getLogger(HotelServiceImpl.class.getName()).log(Level.SEVERE, null, ex); } //NORMAL behavior if (behavior.equals(Constants.NORMAL)) { HotelRoom room = bd.get(roomID); //Testing the confirmation ID if (room.getAlreadyBookedNumber() != confirmationID) { room.unbook(); callback.throwsHotelException(new InvalidConfirmationIDException()); return; } //Testing the credit card if (!verifyCreditCard(creditCard)) { room.unbook(); callback.throwsHotelException(new InvalidCreditCardException()); return; } callback.confirmHotelPayment(confirmationID); } //EXCEPTIONAL_PAYMENT behavior else if (behavior.equals(Constants.EXCEPTIONAL_PAYMENT)) { callback.throwsHotelException(new InvalidCreditCardException()); } } private boolean verifyCreditCard(CreditCard creditCard) { // Random r = new Random(creditCard.getVerificationNumber()); // return r.nextBoolean(); return true; } } }