diff options
Diffstat (limited to 'sandbox/dougsleite/travelagency/src/main/java/hotel/HotelServiceImpl.java')
-rw-r--r-- | sandbox/dougsleite/travelagency/src/main/java/hotel/HotelServiceImpl.java | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/sandbox/dougsleite/travelagency/src/main/java/hotel/HotelServiceImpl.java b/sandbox/dougsleite/travelagency/src/main/java/hotel/HotelServiceImpl.java new file mode 100644 index 0000000000..7f86fdeaf8 --- /dev/null +++ b/sandbox/dougsleite/travelagency/src/main/java/hotel/HotelServiceImpl.java @@ -0,0 +1,175 @@ +/* + * 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; + } + } +} |