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