package org.ow2.choreos;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.jws.WebMethod;
import javax.jws.WebService;
import org.ow2.choreos.log.SimpleLogger;
import org.ow2.choreos.log.SimpleLoggerImpl;
@WebService
public class TravelAgencyService implements TravelAgency {
private static final String AIRLINE_ERROR_MESSAGE = "Not possible to buy now: Airline service is not working";
private static final String AIRLINE_NOT_SET_ERROR_MESSAGE = "Not possible to buy now: I don't know the Airline service yet";
private static List<URL> endpoints = new ArrayList<URL>();
private final SimpleLogger logger = new SimpleLoggerImpl("/tmp/travel_agency.log");
private AtomicInteger counter = new AtomicInteger();
public TravelAgencyService() {
logger.info("Travel Agency started at " + TravelAgencyStarter.SERVICE_ADDRESS);
}
@WebMethod
@Override
public void setInvocationAddress(String role, String name, List<String> endpoints) {
logger.info("setting inv. addrr to "+ endpoints);
if (role.equals("airline")) {
String endpointStr = "";
List<URL> newEndpoints = new ArrayList<URL>();
try {
for(String str: endpoints) {
endpointStr = str;
newEndpoints.add(new URL(endpointStr));
logger.info("Endpoint to airline: " + endpointStr);
}
} catch (MalformedURLException e) {
logger.error("Invalid airline endpoint URL: " + endpointStr);
}
TravelAgencyService.endpoints.clear();
TravelAgencyService.endpoints.addAll(newEndpoints);
} else {
logger.warn("Invalid role (" + role + ") in setInvocationAddress");
}
logger.info("Set inv. addrr to "+ TravelAgencyService.endpoints);
}
@WebMethod
@Override
public String buyTrip() {
if(endpoints.size() == 0) {
logger.error(AIRLINE_NOT_SET_ERROR_MESSAGE);
return AIRLINE_NOT_SET_ERROR_MESSAGE;
}
int index = counter.getAndIncrement();
index %= endpoints.size();
String flightTicketNumber = null;
try {
logger.debug("Trying airline index " + index + ", URL: " + endpoints.get(index).toString());
FlightTicketNumberRetriever retriever = new FlightTicketNumberRetriever(endpoints.get(index));
flightTicketNumber = retriever.getFlightTicketNumber(); // "33"
} catch (IllegalStateException e) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(stream);
e.printStackTrace(ps);
logger.error(stream.toString());
logger.error(AIRLINE_ERROR_MESSAGE);
return AIRLINE_ERROR_MESSAGE;
}
String hotelReservationNumber = "22";
String result = flightTicketNumber + "--" + hotelReservationNumber;
logger.info("request to buy trip; response: " + result);
return result;
}
}