package com.diodesoftware.scb.tables;
import com.diodesoftware.dbmapper.DBMapper;
import com.diodesoftware.dbmapper.DatabaseColumn;
import com.diodesoftware.dbmapper.DatabaseColumnType;
import com.diodesoftware.dbmapper.DatabaseEntry;
import com.diodesoftware.scb.PictureInfo;
import com.diodesoftware.scb.S3FileHandler;
import com.diodesoftware.scb.agents.S3AccessAgent;
import org.apache.log4j.Logger;
import org.jets3t.service.S3ServiceException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.StringTokenizer;
/**
* Copyright 2008 Sensemaker Software Inc.
* User: rob
* Date: Mar 13, 2008
* Time: 9:14:09 PM
*/
public class ClipS3Object implements DatabaseEntry {
private int number;
private int clipId;
private int type;
private String name;
private String bucket;
private Calendar created;
private Calendar lastDownloaded;
private int downloadCount;
private String info;
public static final int TYPE_FILE = 1;
public static final int TYPE_PICTURE = 2;
private static Logger log = Logger.getLogger(ClipS3Object.class);
private DatabaseColumn[] columns = new DatabaseColumn[]{
new DatabaseColumn("ClipId", DatabaseColumnType.DECIMAL),
new DatabaseColumn("Type", DatabaseColumnType.DECIMAL),
new DatabaseColumn("Name", DatabaseColumnType.TEXT),
new DatabaseColumn("Bucket", DatabaseColumnType.TEXT),
new DatabaseColumn("Created", DatabaseColumnType.DATEEPOCH),
new DatabaseColumn("LastDownloaded", DatabaseColumnType.DATEEPOCH),
new DatabaseColumn("DownloadCount", DatabaseColumnType.DECIMAL),
new DatabaseColumn("info", DatabaseColumnType.TEXT)
};
public DatabaseColumn[] columns(){
return columns;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getClipId() {
return clipId;
}
public void setClipId(int clipId) {
this.clipId = clipId;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
public Calendar getCreated() {
return created;
}
public void setCreated(Calendar created) {
this.created = created;
}
public Calendar getLastDownloaded() {
return lastDownloaded;
}
public void setLastDownloaded(Calendar lastDownloaded) {
this.lastDownloaded = lastDownloaded;
}
public int getDownloadCount() {
return downloadCount;
}
public void setDownloadCount(int downloadCount) {
this.downloadCount = downloadCount;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
// When uploaded create an entry
public static void createFile(Clip clip, String fileName, String bucket, Connection con){
createS3(clip, fileName, bucket, ClipS3Object.TYPE_FILE, "", con);
}
public static void createS3(Clip clip, String fileName, String bucket, int type, String info, Connection con){
if(clip.getNumber() == 0){
DBMapper.save(clip, con);// Get a number if not already here
}
createS3(clip.getNumber(), fileName, bucket, type, info, con);
}
public static void createS3(int clipId, String fileName, String bucket, int type, String info, Connection con){
ClipS3Object cs3 = new ClipS3Object();
cs3.clipId = clipId;
cs3.created = Calendar.getInstance();
cs3.downloadCount = 0;
cs3.lastDownloaded = Calendar.getInstance();
cs3.bucket = bucket;
cs3.name = fileName;
cs3.type = type;
cs3.info = info;
DBMapper.save(cs3,con);
}
public static void deleteFiles(Clip clip, Connection con)
{
String sql = "delete from ClipS3Object where ClipId = " + clip.getNumber();
try{
PreparedStatement prepStmt = con.prepareStatement(sql);
//prepStmt.setInt(1, clip.getNumber());
prepStmt.executeUpdate(sql);
prepStmt.close();
}catch(SQLException e){
log.error("Error deleting file sql[" + sql + "]", e);
}
}
// List object FILES for a clip
public static List listFiles(Clip clip, Connection con){
String sql = "Select * from ClipS3Object where ClipId = ? and Type = " + TYPE_FILE;
List result = new ArrayList();
if(clip.getNumber() == 0)return result;
try{
PreparedStatement prepStmt = con.prepareStatement(sql);
prepStmt.setInt(1, clip.getNumber());
ResultSet rs = prepStmt.executeQuery();
while(rs.next()){
result.add(DBMapper.loadSingle(ClipS3Object.class, rs));
}
rs.close();
prepStmt.close();
}catch(SQLException e){
log.error("Error running SQL [" + sql + "]",e);
}
return result;
}
// When downloading on clip id and file Id
public static ClipS3Object retreiveFile(Clip clip, int objectId, Connection con){
String sql = "Select * from ClipS3Object where ClipId = ? and Number = ? and Type = " + TYPE_FILE;
ClipS3Object result = null;
try{
PreparedStatement prepStmt = con.prepareStatement(sql);
prepStmt.setInt(1, clip.getNumber());
prepStmt.setInt(2, objectId);
ResultSet rs = prepStmt.executeQuery();
while(rs.next()){
result = (ClipS3Object)DBMapper.loadSingle(ClipS3Object.class, rs);
}
rs.close();
prepStmt.close();
}catch(SQLException e){
log.error("Error running SQL [" + sql + "]",e);
}
return result;
}
public static List listPictureUrls(Clip clip, Connection con){
List result = new ArrayList();
if(clip.getNumber() == 0)return result;
String sql = "Select * from ClipS3Object where ClipId = ? and Type = " + TYPE_PICTURE;
try{
S3FileHandler s3fh = new S3FileHandler();
String location = null;
PreparedStatement prepStmt = con.prepareStatement(sql);
prepStmt.setInt(1, clip.getNumber());
List objects = new ArrayList();
ResultSet rs = prepStmt.executeQuery();
while(rs.next()){
ClipS3Object cs3o = (ClipS3Object)DBMapper.loadSingle(ClipS3Object.class, rs);
location = S3AccessAgent.getInstance().open(clip, cs3o, con);
//location = s3fh.openKey(clip, cs3o.getName());
String url = "http://s3.amazonaws.com/" + location + "/" + cs3o.getName();
log.debug("Got pic URL [" + url + "]");
String info = cs3o.getInfo();
int width = 200;
int height = 200;
StringTokenizer st = new StringTokenizer(info, ",");
if(st.hasMoreTokens())
width = Integer.parseInt(st.nextToken());
if(st.hasMoreTokens())
height = Integer.parseInt(st.nextToken());
PictureInfo pi = new PictureInfo(cs3o.getNumber(), url, width, height, cs3o.getName());
result.add(pi);
}
rs.close();
prepStmt.close();
}catch(SQLException e){
log.error("Error running SQL [" + sql + "]",e);
}
return result;
}
}