/* * 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 flight; import client.FlightServiceCallback; 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(FlightService.class) @Scope("COMPOSITE") public class FlightServiceImpl implements FlightService { @Callback protected FlightServiceCallback callback; private FlightBD bd; private int sleepBookTime; private int sleepPaymentTime; private String behavior; public FlightServiceImpl() { bd = FlightBD.getInstance(); sleepBookTime = 0; sleepPaymentTime = 0; behavior = Constants.NORMAL; } public void book(int flightNumber) { new Thread(new BookThread(flightNumber)).start(); } public void pay(int flightNumber, int ticketNumber, CreditCard creditCard) { new Thread(new PayThread(flightNumber, ticketNumber, 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 flightNumber; BookThread(int flightNumber) { this.flightNumber = flightNumber; } public void run() { //Extra time to book try { Thread.sleep(sleepBookTime); } catch (InterruptedException ex) { Logger.getLogger(FlightServiceImpl.class.getName()).log(Level.SEVERE, null, ex); } //NORMAL behavior if (behavior.equals(Constants.NORMAL) || behavior.equals(Constants.EXCEPTIONAL_PAYMENT)) { Flight flight = bd.get(flightNumber); int ticketNumber = flight.addTicket(); if (ticketNumber == -1) { callback.throwsFlightException(new UnavailableFlightException()); return; } callback.confirmFlightBook(ticketNumber); } //EXCEPTIONAL_BOOK behavior else if (behavior.equals(Constants.EXCEPTIONAL_BOOK)) { callback.throwsFlightException(new UnavailableFlightException()); } } } private class PayThread implements Runnable { private int flightNumber; private int ticketNumber; private CreditCard creditCard; public PayThread(int flightNumber, int ticketNumber, CreditCard creditCard) { this.flightNumber = flightNumber; this.ticketNumber = ticketNumber; this.creditCard = creditCard; } public void run() { //Extra time to pay try { Thread.sleep(sleepPaymentTime); } catch (InterruptedException ex) { Logger.getLogger(FlightServiceImpl.class.getName()).log(Level.SEVERE, null, ex); } //NORMAL behavior if (behavior.equals(Constants.NORMAL)) { if (!verifyCreditCard(creditCard)) { Flight flight = bd.get(flightNumber); flight.removeTicket(ticketNumber); callback.throwsFlightException(new InvalidCreditCardException()); return; } callback.confirmFlightPayment(ticketNumber); } //EXCEPTIONAL_PAYMENT behavior else if(behavior.equals(Constants.EXCEPTIONAL_PAYMENT)) { callback.throwsFlightException(new InvalidCreditCardException()); } } private boolean verifyCreditCard(CreditCard creditCard) { // Random r = new Random(creditCard.getVerificationNumber()); // return r.nextBoolean(); return true; } } }