package auctionsniper.xmpp; import java.util.logging.FileHandler; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import org.apache.commons.io.FilenameUtils; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import auctionsniper.Auction; import auctionsniper.AuctionHouse; import auctionsniper.UserRequestListener.Item; public class XMPPAuctionHouse implements AuctionHouse { private static final String LOGGER_NAME = "auction-sniper"; public static final String LOG_FILE_NAME = "auction-sniper.log"; public static final String ITEM_ID_AS_LOGIN = "auction-%s"; public static final String AUCTION_ID_FORMAT = ITEM_ID_AS_LOGIN + "@%s/" + XMPPAuctionHouse.AUCTION_RESOURCE; public static final String AUCTION_RESOURCE = "Auction"; private final XMPPConnection connection; private final LoggingXMPPFailureReporter failureReporter; public XMPPAuctionHouse(XMPPConnection connection) throws XMPPAuctionException { this.connection = connection; this.failureReporter = new LoggingXMPPFailureReporter(makeLogger()); } public Auction auctionFor(Item item) { return new XMPPAuction(connection, auctionId(item.identifier, connection), failureReporter); } public void disconnect() { connection.disconnect(); } public static XMPPAuctionHouse connect(String hostname, String username, String password) throws XMPPAuctionException { XMPPConnection connection = new XMPPConnection(hostname); try { connection.connect(); connection.login(username, password, AUCTION_RESOURCE); return new XMPPAuctionHouse(connection); } catch (XMPPException xmppe) { throw new XMPPAuctionException("Could not connect to auction: " + connection, xmppe); } } private static String auctionId(String itemId, XMPPConnection connection) { return String.format(AUCTION_ID_FORMAT, itemId, connection.getServiceName()); } private Logger makeLogger() throws XMPPAuctionException { Logger logger = Logger.getLogger(LOGGER_NAME); logger.setUseParentHandlers(false); logger.addHandler(simpleFileHandler()); return logger; } private FileHandler simpleFileHandler() throws XMPPAuctionException { try { FileHandler handler = new FileHandler(LOG_FILE_NAME); handler.setFormatter(new SimpleFormatter()); return handler; } catch (Exception e) { throw new XMPPAuctionException("Could not create logger FileHandler " + FilenameUtils.getFullPath(LOG_FILE_NAME), e); } } }