package com.diodesoftware.scb.agents;
import com.diodesoftware.dbmapper.DBMapper;
import com.diodesoftware.scb.tables.ClipCookie;
import com.diodesoftware.scb.ClipUtil;
import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Cookie;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* Created by IntelliJ IDEA.
* User: Rob
* Date: Jul 4, 2006
* Time: 9:17:10 PM
* To change this template use File | Settings | File Templates.
*/
public class CookieAgent {
private static CookieAgent instance = null;
private DBMapper dbMapper;
private Logger log = Logger.getLogger(CookieAgent.class);
public static final String COOKIE_NAME = "cl1pcookie";
private CookieAgent(DBMapper mapper) {
this.dbMapper = mapper;
}
public static synchronized void initalize(DBMapper dbMapper) {
instance = new CookieAgent(dbMapper);
}
public static CookieAgent getInstance() {
return instance;
}
public ClipCookie load(HttpServletRequest request, Connection con) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
String value = null;
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (COOKIE_NAME.equals(cookie.getName())) {
value = cookie.getValue();
return load(value, con);
} else {
if (log.isDebugEnabled())
log.debug("Not my Cookie [" + cookie.getName() + "] != [" + COOKIE_NAME + "]");
}
}
}
return null;
}
public ClipCookie load(String value, Connection con) {
if (log.isDebugEnabled())
log.debug("Looking for cookied with value [" + value + "]");
ClipCookie result = null;
String sql = "Select * from ClipCookie where Value = ?";
try {
PreparedStatement prepStmt = con.prepareStatement(sql);
prepStmt.setString(1, value);
ResultSet rs = prepStmt.executeQuery();
if (rs.next()) {
result = (ClipCookie) dbMapper.loadSingle(ClipCookie.class, rs);
}
rs.close();
prepStmt.close();
} catch (SQLException e) {
log.error("Error running SQL [" + sql + "]", e);
}
return result;
}
public void clearCookie(HttpServletRequest request,
HttpServletResponse response,
Connection con) {
ClipCookie cc = load(request, con);
if (cc != null) {
cc.setUserId(-1);
cc.setValue("REMOVE");
dbMapper.save(cc, con);
}
Cookie cookie = new Cookie(COOKIE_NAME, "done");
cookie.setMaxAge(-1);
cookie.setPath("/");
response.addCookie(cookie);
}
public ClipCookie create(int userId, Connection con,
HttpServletRequest request,
HttpServletResponse response) {
ClipCookie clipCookie;
String value;
do {
value = ClipUtil.genString(50);
clipCookie = load(value, con);
} while (clipCookie != null);
clipCookie = new ClipCookie();
clipCookie.setValue(value);
clipCookie.setUserId(userId);
dbMapper.save(clipCookie, con);
Cookie cookie = new Cookie(COOKIE_NAME, value);
cookie.setMaxAge(120 * 24 * 60 * 60);
cookie.setPath("/");
response.addCookie(cookie);
if (log.isDebugEnabled())
log.debug("Added cookie [" + cookie.getName() + "] v[" + cookie.getValue() + "]");
return clipCookie;
}
}