package com.diodesoftware.scb.agents; import com.diodesoftware.scb.tables.*; import com.diodesoftware.scb.email.EmailMgr; import com.diodesoftware.dbmapper.DBMapper; import java.sql.Connection; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Calendar; import org.apache.log4j.Logger; import javax.servlet.ServletContext; public class UrlPurchaseAgent { private static Logger log = Logger.getLogger(UrlPurchaseAgent.class); public UrlPurchaseAgent() { } public UrlCheckout queueUrlToBuy(String url, int userId, Connection con) { if (log.isDebugEnabled()) log.debug("Queing URL to purchase URL [" + url + "] User ID [" + userId + "]"); if (url != null && !url.endsWith("/")) { url += "/"; } // Check to see if already purchased String sql = "Select * from UrlCheckout where Url = ? and Complete = 'Y'"; boolean alreadyPurchased = false; try { PreparedStatement prepStmt = con.prepareStatement(sql); prepStmt.setString(1, url); ResultSet rs = prepStmt.executeQuery(); alreadyPurchased = rs.next(); rs.close(); prepStmt.close(); } catch (SQLException e) { log.error("Error running SQL [" + sql + "]", e); } if (alreadyPurchased) { if (log.isDebugEnabled()) log.debug("URL [" + url + "] User ID [" + userId + "] has been purchased already."); // Renew ClipAgent clipAgent = ClipAgent.getInstance(); Clip clip = clipAgent.loadClip(url, con); boolean renewing = false; if(clip.getOwnerId() > 0){ Owner owner = (Owner)DBMapper.load(Owner.class, clip.getOwnerId(), con); if(owner != null && owner.getUserId() == userId){ renewing = true; } } if(!renewing)return null;// Only the purchaing user can renew } UrlCheckout urlCheckout = new UrlCheckout(); urlCheckout.setCreated(Calendar.getInstance()); urlCheckout.setCompleteDate(Calendar.getInstance()); urlCheckout.setComplete(false); urlCheckout.setUrl(url); urlCheckout.setUserId(userId); DBMapper.getInstance().save(urlCheckout, con); if (log.isDebugEnabled()) log.debug("URL [" + url + "] User ID [" + userId + "] checkout queued."); return urlCheckout; } public synchronized void buyUrl(Payment payment, Connection con, ServletContext context) { // This is comming in from pay pal Figure out the URL based on the USER ID. // This is set to be one at time. // TODO: When on multiple servers we will need to find a new way of doing this if (log.isDebugEnabled()) log.debug("Completeing URL purchase"); DBMapper mapper = DBMapper.getInstance(); int urlcheckOutID = Integer.parseInt(payment.getCustom()); UrlCheckout urlCheckout = (UrlCheckout) mapper.load(UrlCheckout.class, urlcheckOutID, con); int years = 0; String itemNumber = payment.getItemNumber(); boolean ssl = false; if ("URL-1YR".equals(itemNumber) || "URL-1YR-SSL".equals(itemNumber)) { years = 1; } else if ("URL-5YR".equals(itemNumber) || "URL-5YR-SSL".equals(itemNumber)) { years = 5; } else if ("URL-10YR".equals(itemNumber) || "URL-10YR-SSL".equals(itemNumber)) { years = 10; } if(itemNumber != null && itemNumber.indexOf("SSL") != -1){ ssl = true; } if (years == 0) { log.error("Unknown item number [" + itemNumber + "] aborting purchase"); throw new RuntimeException("Unknow item number [" + itemNumber + "] aborting purchase"); } if (log.isDebugEnabled()) log.debug("item Number [" + itemNumber + "] Years [" + years + "]"); int userId = urlCheckout.getUserId(); if (userId != -1) { // If we have a user ID then make owner Owner owner = new Owner(); ClipAgent clipAgent = ClipAgent.getInstance(); Clip clip = clipAgent.loadClip(urlCheckout.getUrl(), con); Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); end.add(Calendar.YEAR, years); owner.setUserId(urlCheckout.getUserId()); owner.setStart(start); owner.setEnd(end); owner.setSslAccess(ssl); mapper.save(owner, con); if (clip == null) { clip = new Clip(); clip.setUri(urlCheckout.getUrl()); } clip.setOwnerId(owner.getNumber()); clip.setKeepFor(-1); // Never Delete Calendar cleanDate = Calendar.getInstance(); cleanDate.set(Calendar.YEAR, 2525); clip.setCleanDate(cleanDate); mapper.save(clip, con); urlCheckout.setComplete(true); urlCheckout.setCompleteDate(Calendar.getInstance()); mapper.save(urlCheckout, con); User user = (User) mapper.load(User.class, urlCheckout.getUserId(), con); EmailMgr.getInstance().sendPurchaseThankyou(urlCheckout, user, context); if (log.isDebugEnabled()) log.debug("Url purchase complete"); } else { // No URL, make a credit if (log.isDebugEnabled()) log.debug("User ID not set, creating a token"); String token = UrlCredit.generateToken(con); UrlCredit credit = new UrlCredit(); credit.setTransactionId(payment.getTxnId()); credit.setEmail(payment.getPayerEmail()); credit.setUri(urlCheckout.getUrl()); credit.setToken(token); credit.setYears(years); credit.setSslAccess(ssl); mapper.save(credit, con); EmailMgr.getInstance().sendCreditThankyou(credit, context); urlCheckout.setComplete(true); urlCheckout.setCompleteDate(Calendar.getInstance()); mapper.save(urlCheckout, con); // Never delete purchased cl1ps. Never ClipAgent clipAgent = ClipAgent.getInstance(); Clip clip = clipAgent.loadClip(urlCheckout.getUrl(), con); clip.setKeepFor(-1); // Never Delete Calendar cleanDate = Calendar.getInstance(); cleanDate.set(Calendar.YEAR, 2525); clip.setCleanDate(cleanDate); mapper.save(clip, con); if (log.isDebugEnabled()) log.debug("Token created, e-mail sent"); } } public UrlCredit loadCredit(String token, Connection con) { UrlCredit result = null; String sql = "Select * from UrlCredit where Token = ? and Used = 'N'"; try { PreparedStatement prepStmt = con.prepareStatement(sql); prepStmt.setString(1, token); ResultSet rs = prepStmt.executeQuery(); while (rs.next()) { result = (UrlCredit) DBMapper.getInstance().loadSingle(UrlCredit.class, rs); } rs.close(); prepStmt.close(); } catch (SQLException e) { log.error("Error running sql [" + e + "]"); } return result; } public void completeCredit(UrlCredit urlCredit, User user, Connection con) { DBMapper mapper = DBMapper.getInstance(); Owner owner = new Owner(); ClipAgent clipAgent = ClipAgent.getInstance(); Clip clip = clipAgent.loadClip(urlCredit.getUri(), con); Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); end.add(Calendar.YEAR, urlCredit.getYears()); owner.setUserId(user.getNumber()); owner.setStart(start); owner.setEnd(end); owner.setSslAccess(urlCredit.isSslAccess()); mapper.save(owner, con); if (clip == null) { clip = new Clip(); clip.setUri(urlCredit.getUri()); } clip.setOwnerId(owner.getNumber()); clip.setKeepFor(-1); // Never Delete Calendar cleanDate = Calendar.getInstance(); cleanDate.set(Calendar.YEAR, 2525); clip.setCleanDate(cleanDate); urlCredit.setUsed(true); urlCredit.setOwnerId(owner.getNumber()); mapper.save(clip, con); mapper.save(urlCredit,con); } }