Author: jflesch
Date: 2007-07-06 16:33:03 +0000 (Fri, 06 Jul 2007)
New Revision: 13956
Added:
trunk/apps/Thaw/src/thaw/plugins/transferLogs/
trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java
trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java
trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java
Modified:
trunk/apps/Thaw/src/thaw/gui/Table.java
trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties
trunk/apps/Thaw/src/thaw/i18n/thaw.properties
trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties
trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java
trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
trunk/apps/Thaw/src/thaw/plugins/index/Index.java
trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
Log:
Rewrite of the transferlogs plugin : better UI ; page per page display
Modified: trunk/apps/Thaw/src/thaw/gui/Table.java
===================================================================
--- trunk/apps/Thaw/src/thaw/gui/Table.java 2007-07-06 16:15:16 UTC (rev
13955)
+++ trunk/apps/Thaw/src/thaw/gui/Table.java 2007-07-06 16:33:03 UTC (rev
13956)
@@ -14,6 +14,7 @@
import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import javax.swing.JLabel;
+import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Component;
import javax.swing.ImageIcon;
@@ -44,8 +45,6 @@
private boolean hasChanged = false;
private Thread savingThread;
- private int columnWithKeys = -1;
-
private boolean statusInProgressBars = true;
public Table(Config config, String prefix) {
@@ -104,16 +103,19 @@
setAsListener();
}
+ private DefaultRenderer renderer;
+
public void specifyColumnWithKeys(int c) {
- columnWithKeys = c;
+ renderer.specifyColumnWithKeys(c);
}
public void showStatusInProgressBars(boolean v) {
- statusInProgressBars = v;
+ renderer.showStatusInProgressBars(v);
}
public void setDefaultRenderer() {
- setDefaultRenderer(getColumnClass(0), new DefaultRenderer());
+ renderer = new DefaultRenderer();
+ setDefaultRenderer(getColumnClass(0), renderer);
}
@@ -149,22 +151,33 @@
- protected class DefaultRenderer extends DefaultTableCellRenderer {
+ public static class DefaultRenderer extends DefaultTableCellRenderer {
private final static long serialVersionUID = 20060821;
+ private boolean statusInProgressBars = true;
+ private int columnWithKeys = -1;
+
private Color softGray;
+
public DefaultRenderer() {
softGray = new Color(240,240,240);
}
- public Component getTableCellRendererComponent(final JTable
table, final Object value,
+ public void showStatusInProgressBars(boolean v) {
+ statusInProgressBars = v;
+ }
+
+ public void specifyColumnWithKeys(int c) {
+ columnWithKeys = c;
+ }
+
+ public Component getTableCellRendererComponent(final JTable
table, Object value,
final boolean
isSelected, final boolean hasFocus,
final int row,
final int column) {
if (value == null)
- return
super.getTableCellRendererComponent(table, "",
-
isSelected, hasFocus, row, column);
+ value = "";
if (value instanceof FCPTransferQuery) {
final FCPTransferQuery query =
(FCPTransferQuery)value;
@@ -176,7 +189,9 @@
Component cell;
if (value instanceof ImageIcon) {
- cell = new JLabel(((ImageIcon)value));
+ return new JLabel(((ImageIcon)value));
+ } if (value instanceof JPanel) {
+ cell = (Component)value;
} else if(value instanceof Long) {
cell =
super.getTableCellRendererComponent(table,
@@ -189,8 +204,8 @@
area.setLineWrap(true);
area.setWrapStyleWord(true);
- if (getRowHeight(row) <
area.getPreferredSize().getHeight())
-
setRowHeight((int)area.getPreferredSize().getHeight());
+ if (table.getRowHeight(row) <
area.getPreferredSize().getHeight())
+
table.setRowHeight((int)area.getPreferredSize().getHeight());
cell = area;
Modified: trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties 2007-07-06
16:15:16 UTC (rev 13955)
+++ trunk/apps/Thaw/src/thaw/i18n/source.thaw_fr.properties 2007-07-06
16:33:03 UTC (rev 13956)
@@ -36,6 +36,10 @@
thaw.common.localPath=Chemin local
thaw.common.priority=Priorit?
+
+# for page per page
+thaw.common.page=Page
+
thaw.common.try=Essai
thaw.common.key=Clef
@@ -479,18 +483,21 @@
thaw.plugin.transferLogs.copyKey=Copier les clefs li?es aux entr?es
s?lectionn?es
thaw.plugin.transferLogs.date=Date
+thaw.plugin.transferLogs.dates=Date(s)
+thaw.plugin.transferLogs.dateStart=D?marr? le:
+thaw.plugin.trasnferLogs.dateEnd=Fini le:
thaw.plugin.transferLogs.message=Message
thaw.plugin.transferLogs.key=Clef
+thaw.plugin.transferLogs.file=Fichier
+thaw.plugin.transferLogs.fileSize=Taille
+thaw.plugin.transferLogs.isSuccess=R?ussi
+thaw.plugin.transferLogs.averageSpeed=Vitesse moyenne
thaw.plugin.transferLogs.isDup=Est-ce que la clef a d?j? ?t? vue ?
-thaw.plugin.transferLogs.download.added=T?l?chargement ajout?
-thaw.plugin.transferLogs.download.failed=T?l?chargement ?chou?
-thaw.plugin.transferLogs.download.successful=T?l?chargement r?ussi
+thaw.plugin.transferLogs.type=Type
+thaw.plugin.transferLogs.type.download=T?l?chargement
+thaw.plugin.transferLogs.type.insertion=Insertion
-thaw.plugin.transferLogs.insertion.added=Insertion ajout?e
-thaw.plugin.transferLogs.insertion.failed=Insertion ?chou?e
-thaw.plugin.transferLogs.insertion.successful=Insertion r?ussie
-
thaw.plugin.transferLogs.finalStatus=Status final
thaw.plugin.transferLogs.none=(aucune)
Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2007-07-06 16:15:16 UTC
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2007-07-06 16:33:03 UTC
(rev 13956)
@@ -57,6 +57,9 @@
thaw.common.no=No
thaw.common.priority=Priority
+# for page per page
+thaw.common.page=Page
+
thaw.common.clearFinished=Remove finished transfers
# The following one *must* specify that this is about the transfer(s) only !
thaw.common.removeFromTheList=Cancel and remove selected transfers
@@ -492,19 +495,21 @@
thaw.plugin.transferLogs.copyKey=Copy the keys related to the selected entries
thaw.plugin.transferLogs.date=Date
+thaw.plugin.transferLogs.dates=Date(s)
+thaw.plugin.transferLogs.dateStart=Started:
+thaw.plugin.transferLogs.dateEnd=Ended:
thaw.plugin.transferLogs.message=Message
thaw.plugin.transferLogs.key=Key
+thaw.plugin.transferLogs.file=File
+thaw.plugin.transferLogs.fileSize=File size
+thaw.plugin.transferLogs.isSuccess=Successful
+thaw.plugin.transferLogs.averageSpeed=Average speed
thaw.plugin.transferLogs.isDup=has the key already been seen ?
-thaw.plugin.transferLogs.download.added=Download added
-thaw.plugin.transferLogs.download.failed=Download failed
-thaw.plugin.transferLogs.download.successful=Download successful
+thaw.plugin.transferLogs.type=Type
+thaw.plugin.transferLogs.type.download=Download
+thaw.plugin.transferLogs.type.insertion=Insertion
-thaw.plugin.transferLogs.insertion.added=Insertion added
-thaw.plugin.transferLogs.insertion.failed=Insertion failed
-thaw.plugin.transferLogs.insertion.successful=Insertion successful
-
-thaw.plugin.transferLogs.finalStatus=Final status
thaw.plugin.transferLogs.none=(none)
thaw.plugin.transferLogs.importKeys=Import key list
Modified: trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties 2007-07-06 16:15:16 UTC
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw_fr.properties 2007-07-06 16:33:03 UTC
(rev 13956)
@@ -36,6 +36,10 @@
thaw.common.localPath=Chemin local
thaw.common.priority=Priorit\u00e9
+
+# for page per page
+thaw.common.page=Page
+
thaw.common.try=Essai
thaw.common.key=Clef
@@ -479,18 +483,21 @@
thaw.plugin.transferLogs.copyKey=Copier les clefs li\u00e9es aux entr\u00e9es
s\u00e9lectionn\u00e9es
thaw.plugin.transferLogs.date=Date
+thaw.plugin.transferLogs.dates=Date(s)
+thaw.plugin.transferLogs.dateStart=D\u00e9marr\u00e9 le:
+thaw.plugin.trasnferLogs.dateEnd=Fini le:
thaw.plugin.transferLogs.message=Message
thaw.plugin.transferLogs.key=Clef
+thaw.plugin.transferLogs.file=Fichier
+thaw.plugin.transferLogs.fileSize=Taille
+thaw.plugin.transferLogs.isSuccess=R\u00e9ussi
+thaw.plugin.transferLogs.averageSpeed=Vitesse moyenne
thaw.plugin.transferLogs.isDup=Est-ce que la clef a d\u00e9j\u00e0
\u00e9t\u00e9 vue ?
-thaw.plugin.transferLogs.download.added=T\u00e9l\u00e9chargement ajout\u00e9
-thaw.plugin.transferLogs.download.failed=T\u00e9l\u00e9chargement
\u00e9chou\u00e9
-thaw.plugin.transferLogs.download.successful=T\u00e9l\u00e9chargement
r\u00e9ussi
+thaw.plugin.transferLogs.type=Type
+thaw.plugin.transferLogs.type.download=T\u00e9l\u00e9chargement
+thaw.plugin.transferLogs.type.insertion=Insertion
-thaw.plugin.transferLogs.insertion.added=Insertion ajout\u00e9e
-thaw.plugin.transferLogs.insertion.failed=Insertion \u00e9chou\u00e9e
-thaw.plugin.transferLogs.insertion.successful=Insertion r\u00e9ussie
-
thaw.plugin.transferLogs.finalStatus=Status final
thaw.plugin.transferLogs.none=(aucune)
Modified: trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java 2007-07-06 16:15:16 UTC
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java 2007-07-06 16:33:03 UTC
(rev 13956)
@@ -45,13 +45,19 @@
import thaw.fcp.FCPTransferQuery;
import thaw.fcp.FreenetURIHelper;
+import thaw.plugins.transferLogs.*;
-/**
- * Quick and dirty plugin to log the transfers
- */
+
public class TransferLogs implements Plugin, ActionListener, Observer {
- public final static String MAX_DISPLAYED = "1000";
+ public final static byte TRANSFER_TYPE_NULL = 0;
+ public final static byte TRANSFER_TYPE_DOWNLOAD = 1;
+ public final static byte TRANSFER_TYPE_INSERTION = 2;
+ public final static String[] TRANSFER_TYPE_NAMES = {
+ I18n.getMessage("thaw.plugin.transferLogs.importedKey"),
+ I18n.getMessage("thaw.common.download"),
+ I18n.getMessage("thaw.common.insertion")
+ };
private Core core;
private Hsqldb db;
@@ -60,15 +66,12 @@
private JButton purgeLogs;
- private JButton copyKey;
private JButton importKeys;
private JButton exportKeys;
+ private TransferTable table;
- private Table table;
- private EventListModel model;
-
public TransferLogs() {
}
@@ -102,19 +105,18 @@
JLabel topLabel = new
JLabel(I18n.getMessage("thaw.plugin.transferLogs.transferLogs"));
topLabel.setIcon(IconBox.file);
- model = new EventListModel();
- model.reloadList();
- table = new Table(core.getConfig(), "transfer_log_table",
- model);
+ table = new TransferTable(db, core.getConfig());
- purgeLogs = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.purgeLogs"),
IconBox.minDelete);
- copyKey = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.copyKey"), IconBox.minCopy );
- importKeys = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.importKeys"),
IconBox.minImportAction);
- exportKeys = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.exportKeys"),
IconBox.minExportAction);
+ purgeLogs = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.purgeLogs"),
+ IconBox.minDelete);
+ importKeys = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.importKeys"),
+ IconBox.minImportAction);
+ exportKeys = new
JButton(I18n.getMessage("thaw.plugin.transferLogs.exportKeys"),
+ IconBox.minExportAction);
+
purgeLogs.addActionListener(this);
- copyKey.addActionListener(this);
importKeys.addActionListener(this);
exportKeys.addActionListener(this);
@@ -123,17 +125,16 @@
buttonPanel.add(purgeLogs);
buttonPanel.add(importKeys);
buttonPanel.add(exportKeys);
- buttonPanel.add(copyKey);
JPanel southPanel = new JPanel(new BorderLayout());
southPanel.add(buttonPanel, BorderLayout.WEST);
southPanel.add(new JLabel(""), BorderLayout.CENTER);
tab.add(topLabel, BorderLayout.NORTH);
- tab.add(new JScrollPane(table), BorderLayout.CENTER);
+ tab.add(table.getPanel(), BorderLayout.CENTER);
tab.add(southPanel, BorderLayout.SOUTH);
- setAsObserverEverywhere(true);
+ setAsObserverEverywhere();
core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.transferLogs.transferLogsShort"),
thaw.gui.IconBox.file,
@@ -145,8 +146,12 @@
public boolean stop() {
core.getMainWindow().removeTab(tab);
- setAsObserverEverywhere(false);
+ core.getQueueManager().deleteObserver(this);
+ /* TODO : delete observers ! */
+ /* Hm should we ? Just remove the observer on the queue should
be enought ? */
+ /* Others observers will just keep data sync ? */
+
db.unregisterChild(this);
return false;
@@ -164,21 +169,44 @@
protected void createTables() {
- /*
- * this db structure is dirty, I know it, and at the moment,
- * I don't care => I will fix it later
- */
- sendQuery("CREATE CACHED TABLE transferEvents ("
+ sendQuery("CREATE CACHED TABLE transferLogs ("
+ "id INTEGER IDENTITY NOT NULL,"
- + "date TIMESTAMP NOT NULL,"
- + "msg VARCHAR(500) NOT NULL,"
+ + "dateStart TIMESTAMP NOT NULL,"
+ + "dateEnd TIMESTAMP NULL,"
+ + "transferType TINYINT NOT NULL,"
+ "key VARCHAR(500) NULL,"
+ + "filename VARCHAR(128) NULL, "
+ + "size BIGINT NULL, " /* long */
+ "isDup BOOLEAN NOT NULL, "
+ "isSuccess BOOLEAN NOT NULL, "
+ "PRIMARY KEY (id))");
}
+ protected boolean isDup(String key) {
+ return isDup(db, key);
+ }
+ public static boolean isDup(Hsqldb db, String key) {
+ try {
+ synchronized(db.dbLock) {
+
+ PreparedStatement st;
+
+ st =
db.getConnection().prepareStatement("SELECT id FROM transferEvents "+
+ "WHERE
LOWER(key) LIKE ? AND isSuccess = TRUE");
+ st.setString(1,
FreenetURIHelper.getComparablePart(key)+"%");
+ ResultSet set = st.executeQuery();
+ return set.next();
+
+ }
+ } catch(SQLException e) {
+ Logger.error(new TransferLogs(), "Unable to know if a
key is dup in the event because : "+e.toString());
+ }
+
+ return false;
+ }
+
+
/**
* Returns no error / Throws no exception.
* @return false if an exception happened
@@ -198,174 +226,30 @@
/**
* Add the current plugin as an observer on all the running query
- * @param really if set to false, will deleteObserver() instead of
addObserver()
*/
- public void setAsObserverEverywhere(boolean really) {
- if (really)
- core.getQueueManager().addObserver(this);
- else
- core.getQueueManager().deleteObserver(this);
-
-
+ public void setAsObserverEverywhere() {
Vector runningQueue = core.getQueueManager().getRunningQueue();
synchronized(runningQueue) {
for (Iterator it = runningQueue.iterator();
it.hasNext();) {
FCPTransferQuery query =
(FCPTransferQuery)it.next();
-
- if (really) {
- if (query.isFinished() &&
!isDup(query.getFileKey()))
- notifyEnd(query);
-
- if (query instanceof Observable)
-
((Observable)query).addObserver(this);
- } else {
- if (query instanceof Observable)
-
((Observable)query).deleteObserver(this);
- }
+ notifyAddition(query);
}
- }
- }
-
- protected boolean isDup(String key) {
- try {
- synchronized(db.dbLock) {
-
- PreparedStatement st;
-
- st =
db.getConnection().prepareStatement("SELECT id FROM transferEvents "+
- "WHERE
LOWER(key) LIKE ? AND isSuccess = TRUE");
- st.setString(1,
FreenetURIHelper.getComparablePart(key)+"%");
- ResultSet set = st.executeQuery();
- return set.next();
-
- }
- } catch(SQLException e) {
- Logger.error(this, "Unable to know if a key is dup in
the event because : "+e.toString());
+ core.getQueueManager().addObserver(this);
}
-
- return false;
}
- protected void notifyAddition(FCPTransferQuery query) {
- String str;
- String key;
- if (query.getQueryType() == 0)
- return;
-
- if (query.getQueryType() == 1) {
- str =
I18n.getMessage("thaw.plugin.transferLogs.download.added") + " : "
- + query.getFilename();
- key = query.getFileKey();
- } else {
- if (query.getPath() == null)
- return;
-
- str =
I18n.getMessage("thaw.plugin.transferLogs.insertion.added") + " : "
- + query.getPath();
- key = null;
- }
-
- java.sql.Timestamp date = new java.sql.Timestamp((new
java.util.Date()).getTime());
-
- boolean isDup;
-
- if (key != null)
- isDup = isDup(key);
- else
- isDup = false;
-
- try {
- synchronized(db.dbLock) {
- PreparedStatement st;
-
-
- st =
db.getConnection().prepareStatement("INSERT INTO transferEvents "+
-
"(date, msg, key, isDup, isSuccess) "+
- "
VALUES "+
- "(?,
?, ?, ?, FALSE)");
- st.setTimestamp(1, date);
- st.setString(2, str);
- st.setString(3, key);
- st.setBoolean(4, isDup);
-
- st.execute();
- }
- } catch(SQLException e) {
- Logger.error(this, "Error while adding an event to the
logs: "+e.toString());
- }
-
- model.reloadList();
+ protected void notifyAddition(FCPTransferQuery query) {
+ new Transfer(db, query, table);
+ table.refresh();
}
- protected void notifyEnd(FCPTransferQuery query) {
- String str;
- String key;
- if (query.isFinished() && query instanceof Observable)
- ((Observable)query).deleteObserver(this);
-
- if (query.getQueryType() == 0 || !query.isFinished())
- return;
-
- if (query.getQueryType() == 1)
- str = "thaw.plugin.transferLogs.download.";
- else
- str = "thaw.plugin.transferLogs.insertion.";
-
- if (query.isSuccessful())
- str = I18n.getMessage(str+"successful");
- else
- str = I18n.getMessage(str+"failed");
-
- key = query.getFileKey();
-
- str += " : "+query.getFilename();
-
- str += "\n" +
I18n.getMessage("thaw.plugin.transferLogs.finalStatus") + " :
"+query.getStatus();
-
- boolean isDup;
- boolean isSuccess = query.isSuccessful();
-
- if (key != null)
- isDup = isDup(key);
- else
- isDup = false;
-
- java.sql.Timestamp date = new java.sql.Timestamp((new
java.util.Date()).getTime());
-
-
- try {
- synchronized(db.dbLock) {
- PreparedStatement st;
-
-
- st =
db.getConnection().prepareStatement("INSERT INTO transferEvents "+
-
"(date, msg, key, isDup, isSuccess) "+
- "
VALUES "+
- "(?,
?, ?, ?, ?)");
- st.setTimestamp(1, date);
- st.setString(2, str);
- st.setString(3, key);
- st.setBoolean(4, isDup);
- st.setBoolean(5, isSuccess);
-
- st.execute();
- }
- } catch(SQLException e) {
- Logger.error(this, "Error while adding an event to the
logs: "+e.toString());
- }
-
-
- model.reloadList();
- }
-
-
public void update(Observable o, Object param) {
if (o instanceof FCPQueueManager) {
@@ -378,167 +262,15 @@
if(core.getQueueManager().isInTheQueues(query)
&& query.isRunning()) { // then it's an addition
- if (query instanceof Observable)
- ((Observable)query).addObserver(this);
- if
(core.getQueueManager().isQueueCompletlyLoaded())
- notifyAddition(query);
+ notifyAddition(query);
return;
}
}
-
- if (o instanceof FCPTransferQuery) {
- FCPTransferQuery query = (FCPTransferQuery)o;
-
- if (query.isFinished()) {
- notifyEnd(query);
- return;
- }
- }
}
- private class Event {
- private java.sql.Timestamp date;
- private String msg;
- private String key;
- private boolean isDup;
- public Event(java.sql.Timestamp date, String message, String
key, boolean isDup) {
- this.date = date;
- this.msg = message;
- this.key = key;
- this.isDup = isDup;
- }
-
- public java.sql.Timestamp getDate() {
- return date;
- }
-
- public String getMsg() {
- return msg;
- }
-
- public String getKey() {
- return key;
- }
-
- public boolean isDup() {
- return isDup;
- }
- }
-
- private class EventListModel extends
javax.swing.table.AbstractTableModel {
- private static final long serialVersionUID = 1L;
-
- private DateFormat dateFormat;
-
- public String[] columnNames =
- {
- I18n.getMessage("thaw.plugin.transferLogs.date"),
- I18n.getMessage("thaw.plugin.transferLogs.message"),
- I18n.getMessage("thaw.plugin.transferLogs.key"),
- I18n.getMessage("thaw.plugin.transferLogs.isDup")
- };
-
-
- public Vector events = null; /* thaw.plugins.index.File Vector
*/
-
-
- public EventListModel() {
- super();
- dateFormat = DateFormat.getDateTimeInstance();
- }
-
- public void reloadList() {
- events = null;
-
- try {
- synchronized(db.dbLock) {
- PreparedStatement st;
-
- st =
db.getConnection().prepareStatement("SELECT date, msg, key, isDup FROM "+
-
"transferEvents ORDER BY date DESC LIMIT "+MAX_DISPLAYED);
-
- ResultSet set = st.executeQuery();
-
- events = new Vector();
-
- while(set.next()) {
- events.add(new
Event(set.getTimestamp("date"),
-
set.getString("msg"),
-
set.getString("key"),
-
set.getBoolean("isDup")));
- }
- }
- } catch(SQLException e) {
- Logger.error(this, "Error while getting the
list of events from the logs: "+e.toString());
- }
-
- refresh();
- }
-
-
- protected void refresh() {
- final TableModelEvent event = new TableModelEvent(this);
- fireTableChanged(event);
- }
-
- public int getRowCount() {
- if (events == null)
- return 0;
-
- return events.size();
- }
-
- public int getColumnCount() {
- return columnNames.length;
- }
-
- public String getColumnName(final int column) {
- return columnNames[column];
-
- }
-
- public Object getValueAt(final int row, final int column) {
- if (events == null)
- return null;
-
- if (column == 0)
- return
dateFormat.format(((Event)events.get(row)).getDate());
-
- if (column == 1)
- return ((Event)events.get(row)).getMsg();
-
- if (column == 2) {
- String key = ((Event)events.get(row)).getKey();
- return key != null ? key :
I18n.getMessage("thaw.plugin.transferLogs.none");
- }
-
- if (column == 3)
- return ((Event)events.get(row)).isDup() ? "X" :
"";
-
- return null;
- }
-
-
- public Vector getSelectedRows(Table table) {
- int[] selectedRows = table.getSelectedRows();
-
- if (selectedRows == null)
- return null;
-
- Vector r = new Vector();
-
- for (int i = 0 ; i < selectedRows.length ; i++) {
- r.add(events.get(selectedRows[i]));
- }
-
- return r;
- }
- }
-
-
private File chooseFile(boolean save) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle(I18n.getMessage("thaw.plugin.transferLogs.chooseFile"));
@@ -549,11 +281,16 @@
}
+ public static java.sql.Timestamp getNow() {
+ return new java.sql.Timestamp((new java.util.Date()).getTime());
+ }
+
+
private class KeyImporter implements Runnable {
public KeyImporter() { }
public void run() {
- java.sql.Timestamp date = new java.sql.Timestamp((new
java.util.Date()).getTime());
+ java.sql.Timestamp date = getNow();
File file = chooseFile(false);
@@ -569,6 +306,18 @@
String strLine;
+ PreparedStatement st = null;
+
+ try {
+ st =
db.getConnection().prepareStatement("INSERT INTO transferLogs "+
+
"(dateStart, dateEnd, transferType,"+
+
" key, filename, size, isDup, isSuccess) "+
+
" VALUES "+
+
"(?, ?, 0, ?, ?, NULL, ?, TRUE)");
+ } catch(SQLException e) {
+ Logger.error(this, "Error while
preparing to import keys : "+e.toString());
+ }
+
while ((strLine = br.readLine()) != null) {
String key = strLine.trim();
@@ -576,21 +325,14 @@
continue;
boolean isDup = isDup(key);
- String str =
I18n.getMessage("thaw.plugin.transferLogs.importedKey")
- + " :
"+FreenetURIHelper.getFilenameFromKey(key);
try {
synchronized(db.dbLock) {
- PreparedStatement st;
-
- st =
db.getConnection().prepareStatement("INSERT INTO transferEvents "+
-
"(date, msg, key, isDup, isSuccess) "+
-
" VALUES "+
-
"(?, ?, ?, ?, FALSE)");
st.setTimestamp(1,
date);
- st.setString(2, str);
+ st.setTimestamp(2,
date);
st.setString(3, key);
- st.setBoolean(4, isDup);
+ st.setString(4,
FreenetURIHelper.getFilenameFromKey(key));
+ st.setBoolean(5, isDup);
st.execute();
}
@@ -607,7 +349,7 @@
Logger.error(this, "(2) Unable to import keys
because: "+e.toString());
}
- model.reloadList();
+ table.refresh();
}
}
@@ -628,8 +370,9 @@
PreparedStatement st;
st =
db.getConnection().prepareStatement("SELECT DISTINCT key "+
-
"FROM transferEvents "+
-
"WHERE key is NOT NULL");
+
"FROM transferLogs "+
+
"WHERE key is NOT NULL"+
+
" AND isSuccess = TRUE");
ResultSet set = st.executeQuery();
@@ -657,35 +400,15 @@
if (e.getSource() == purgeLogs) {
sendQuery("DROP TABLE transferEvents");
+ sendQuery("DROP TABLE transferLogs");
createTables();
- model.reloadList();
+ table.refresh();
return;
}
- if (e.getSource() == copyKey) {
- Vector v = model.getSelectedRows(table);
- if (v == null)
- return;
-
- String str = "";
-
- for (Iterator it = v.iterator();
- it.hasNext();) {
- String key = ((Event)it.next()).getKey();
-
- if (key != null)
- str += key + "\n";
- }
-
- GUIHelper.copyToClipboard(str);
-
- return;
- }
-
-
if (e.getSource() == importKeys) {
Thread th = new Thread(new KeyImporter());
th.start();
Modified: trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java 2007-07-06 16:15:16 UTC
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java 2007-07-06 16:33:03 UTC
(rev 13956)
@@ -41,7 +41,7 @@
private JDialog dialog;
private JButton closeDialog;
- public final static int DIALOG_X = 300;
+ public final static int DIALOG_X = 400;
public final static int DIALOG_Y = 500;
Modified: trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
2007-07-06 16:15:16 UTC (rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
2007-07-06 16:33:03 UTC (rev 13956)
@@ -21,7 +21,7 @@
public class FileManagementHelper {
/**
- * Class implementing IndexAction will automatically do an
addActionListener if necessary
+ * Class implementing FileAction will automatically do an
addActionListener if necessary
*/
public interface FileAction extends ActionListener {
Modified: trunk/apps/Thaw/src/thaw/plugins/index/Index.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/Index.java 2007-07-06 16:15:16 UTC
(rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/index/Index.java 2007-07-06 16:33:03 UTC
(rev 13956)
@@ -786,8 +786,6 @@
return 0;
}
- Logger.info(this, "Getting lastest version ...");
-
String key;
if (specificRev >= 0) {
Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
2007-07-06 16:15:16 UTC (rev 13955)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
2007-07-06 16:33:03 UTC (rev 13956)
@@ -1306,7 +1306,7 @@
JLabel header = null;
JPanel buttonPanel = null;
- frame = new
JDialog(getIndexBrowserPanel().getMainWindow().getMainFrame(),
I18n.getMessage("thaw.plugins.index.addKeys"));
+ frame = new
JDialog(getIndexBrowserPanel().getMainWindow().getMainFrame(),
I18n.getMessage("thaw.plugin.index.addKeys"));
frame.setVisible(false);
header = new
JLabel(I18n.getMessage("thaw.plugin.fetch.keyList"));
Added: trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java
(rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/transferLogs/Transfer.java 2007-07-06
16:33:03 UTC (rev 13956)
@@ -0,0 +1,427 @@
+package thaw.plugins.transferLogs;
+
+import java.sql.*;
+
+import java.util.Observer;
+import java.util.Observable;
+
+
+import thaw.core.Logger;
+
+import thaw.fcp.FCPTransferQuery;
+import thaw.fcp.FCPClientPut;
+import thaw.fcp.FCPClientGet;
+import thaw.fcp.FreenetURIHelper;
+
+import thaw.plugins.Hsqldb;
+import thaw.plugins.TransferLogs;
+
+
+public class Transfer implements Observer {
+ private Hsqldb db;
+
+ private FCPTransferQuery query;
+
+ private int id;
+
+ private Timestamp dateStart;
+ private Timestamp dateEnd;
+ private byte transferType;
+ private String key;
+ private String filename;
+ private long size;
+ private boolean isDup;
+ private boolean isSuccess;
+
+ private TransferTable table;
+
+
+ public Transfer(Hsqldb db,
+ FCPTransferQuery query,
+ TransferTable table) {
+ this.db = db;
+ this.query = query;
+ this.id = -1;
+ this.table = table;
+
+
+ if (!findOrInsertEntry(query))
+ findOrInsertEntry(query); /* because we need the id of
the entry */
+
+ if (!query.isFinished()
+ && query instanceof Observable) {
+ ((Observable)query).addObserver(this);
+ }
+ }
+
+
+ /**
+ * If found, return true, if inserted returns false.
+ * If found, but some informations in the bdd is not correct, it's
updated.
+ */
+ private boolean findOrInsertEntry(FCPTransferQuery query) {
+ boolean entryFound;
+
+ entryFound = false;
+
+ Logger.info(this, "Searching corresponding query in the logs
...");
+
+ synchronized(db.dbLock) {
+ try {
+ PreparedStatement st;
+
+ String qKey = query.getFileKey();
+
+ if (qKey == null ||
!FreenetURIHelper.isAKey(qKey))
+ qKey = null;
+
+ /* by key first */
+
+ if (qKey != null) {
+
+ st =
db.getConnection().prepareStatement("SELECT id, dateStart, dateEnd, "+
+
"transferType, "+
+
"key, filename, size, isDup, isSuccess "+
+
"FROM transferLogs "+
+
"WHERE key LIKE ? AND dateEnd IS NULL "+
+
"ORDER BY dateStart DESC "+
+
"LIMIT 1");
+ st.setString(1,
FreenetURIHelper.getComparablePart(qKey)+"%");
+
+ ResultSet set = st.executeQuery();
+
+ if (set.next()) {
+ entryFound = true;
+ this.id =
set.getInt("id");
+ this.dateStart =
set.getTimestamp("dateStart");
+ this.dateEnd =
set.getTimestamp("dateEnd");
+ this.transferType =
set.getByte("transferType");
+ this.key =
set.getString("key");
+ this.filename =
set.getString("filename");
+ this.size =
set.getLong("size");
+ this.isDup =
set.getBoolean("isDup");
+ this.isSuccess =
set.getBoolean("isSuccess");
+ }
+ }
+
+
+ /* by filename else */
+
+ String filename = query.getFilename();
+
+ if (filename != null && entryFound == false) {
+ st =
db.getConnection().prepareStatement("SELECT id, dateStart, dateEnd, "+
+
"transferType, "+
+
"key, filename, size, isDup, isSuccess "+
+
"FROM transferLogs "+
+
"WHERE filename = ? AND dateEnd IS NULL "+
+
"ORDER BY dateStart DESC "+
+
"LIMIT 1");
+ st.setString(1, filename);
+
+ ResultSet set = st.executeQuery();
+
+ if (set.next()) {
+ entryFound = true;
+ this.id =
set.getInt("id");
+ this.dateStart =
set.getTimestamp("dateStart");
+ this.dateEnd =
set.getTimestamp("dateEnd");
+ this.transferType =
set.getByte("transferType");
+ this.key =
set.getString("key");
+ this.filename =
set.getString("filename");
+ this.size =
set.getLong("size");
+ this.isDup =
set.getBoolean("isDup");
+ this.isSuccess =
set.getBoolean("isSuccess");
+ }
+ }
+
+
+ if (qKey == null && filename == null) { /* this
query would be useless ?! */
+ Logger.warning(this, "Query with
filename & key == null ? can do nothing with that");
+ return false;
+ }
+
+
+ if (entryFound) { /* we check if we must update
the entry */
+ boolean mustUpdateKey = false;
+ boolean mustUpdateDateEnd = false;
+ boolean mustUpdateSize = false;
+
+ if (this.key == null && qKey != null)
+ mustUpdateKey = true;
+
+ if (qKey == null && this.key != null)
+ qKey = this.key;
+
+ if (qKey != null && this.key != null
+ && !qKey.equals(this.key)) /* the
key has changed ? can it happen ? */
+ mustUpdateKey = true;
+
+ if (query.isFinished() && this.dateEnd
== null)
+ mustUpdateDateEnd = true;
+
+ if (query.getFileSize() >= 0
+ && query.getFileSize() >= size)
+ mustUpdateSize = true;
+
+
+ if (mustUpdateKey) {
+ updateKey(qKey);
+ }
+
+
+ if (mustUpdateDateEnd) {
+
updateDateEnd(query.isSuccessful());
+ }
+
+ if (mustUpdateSize) {
+ updateSize(query.getFileSize());
+ }
+
+ } else { /* we insert a new one */
+ /* except if this query has already
ended, because it means we weren't
+ * used for this job, so we won't move
:P */
+ if (query.isFinished())
+ return false;
+
+ /* the main problem here is that when
we insert a data
+ * hsqldb is not able to give us back
the primary key generated
+ * so when this function will return
false (no entry found => inserted),
+ * the constructor will call it again
to find the primary key
+ */
+
+ Timestamp now = TransferLogs.getNow();
+
+ st =
db.getConnection().prepareStatement("INSERT INTO transferLogs "+
+
"(dateStart, dateEnd, transferType, "+
+
" key, filename, size, isDup, isSuccess) "+
+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
+ st.setTimestamp(1, now);
+
+ if (query.isFinished())
+ st.setTimestamp(2, now);
+ else
+ st.setNull(2, Types.TIMESTAMP);
+
+ if (query instanceof FCPClientPut)
+ st.setByte(3,
TransferLogs.TRANSFER_TYPE_INSERTION);
+ else
+ st.setByte(3,
TransferLogs.TRANSFER_TYPE_DOWNLOAD);
+
+ if (qKey != null)
+ st.setString(4, qKey);
+ else
+ st.setNull(4, Types.VARCHAR);
+
+ st.setString(5, filename);
+ st.setLong(6, query.getFileSize());
+ st.setBoolean(7, TransferLogs.isDup(db,
query.getFileKey()));
+ st.setBoolean(8, query.isFinished() &&
query.isSuccessful());
+ st.execute();
+ }
+
+
+ } catch(SQLException e) {
+ Logger.error(this,
+ "Error while trying to find a
specific "+
+ "entry in the log: "+e.toString());
+ }
+ }
+
+ if (entryFound)
+ Logger.info(this, "Entry found");
+ else
+ Logger.info(this, "Entry added");
+
+ return entryFound;
+ }
+
+
+ private void updateKey(String qKey) {
+ Logger.info(this, "Updating key in logs");
+ try {
+ PreparedStatement st =
db.getConnection().prepareStatement("UPDATE transferLogs SET "+
+
"key = ? WHERE id = ?");
+ st.setString(1, qKey);
+ st.setInt(2, this.id);
+ st.execute();
+ } catch(SQLException e) {
+ Logger.error(this, "Unable to update key in transfer
logs because : "+e.toString());
+ }
+ }
+
+ private void updateSize(long size) {
+ Logger.info(this, "Updating file size in logs");
+
+ try {
+ PreparedStatement st =
db.getConnection().prepareStatement("UPDATE transferLogs SET "+
+
"size = ? WHERE id = ?");
+ st.setLong(1, size);
+ st.setInt(2, this.id);
+ st.execute();
+ } catch(SQLException e) {
+ Logger.error(this, "Unable to update size in transfer
logs because : "+e.toString());
+ }
+ }
+
+
+ private void updateDateEnd(boolean success) {
+ Logger.info(this, "Updating end date in logs");
+
+ try {
+ PreparedStatement st =
db.getConnection().prepareStatement("UPDATE transferLogs SET "+
+
"dateEnd = ?, isSuccess = ? "+
+
"WHERE id = ?");
+ st.setTimestamp(1, TransferLogs.getNow());
+ st.setBoolean(2, success);
+ st.setInt(3, this.id);
+ st.execute();
+ } catch(SQLException e) {
+ Logger.error(this, "Unable to update dateEnd in
transfer logs because : "+e.toString());
+ }
+ }
+
+
+ public Transfer(Hsqldb db,
+ int id,
+ Timestamp dateStart, Timestamp dateEnd,
+ byte transferType, String key, String filename, long
size,
+ boolean isDup, boolean isSuccess) {
+ this.db = db;
+ this.id = id;
+ this.dateStart = dateStart;
+ this.dateEnd = dateEnd;
+ this.transferType = transferType;
+ this.key = key;
+ this.filename = filename;
+ this.size = size;
+ this.isDup = isDup;
+ this.isSuccess = isSuccess;
+ }
+
+
+ public Timestamp getDateStart() {
+ return dateStart;
+ }
+
+ public Timestamp getDateEnd() {
+ return dateEnd;
+ }
+
+ public byte getTransferTypeByte() {
+ return transferType;
+ }
+
+ public String getTransferTypeStr() {
+ return TransferLogs.TRANSFER_TYPE_NAMES[transferType];
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getFilename() {
+ return filename;
+ }
+
+ public long getSize() {
+ return size;
+ }
+
+ public boolean isDup() {
+ return isDup;
+ }
+
+ public boolean isSuccess() {
+ return isSuccess;
+ }
+
+ /**
+ * @return a value in byte / s
+ */
+ public long getAverageSpeed() {
+ if (getDateEnd() == null || getSize() <= 0)
+ return -1;
+
+ long diff = (getDateEnd().getTime() -
getDateStart().getTime())/1000;
+
+ if (diff <= 0)
+ return -1;
+
+ return getSize() / diff;
+ }
+
+
+ protected FCPTransferQuery getQuery() {
+ return query;
+ }
+
+ protected int getId() {
+ return id;
+ }
+
+
+ public void delete() {
+ Logger.info(this, "Deleting transfer logs entry ...");
+
+ try {
+ synchronized(db.dbLock) {
+ PreparedStatement st;
+
+ st =
db.getConnection().prepareStatement("DELETE FROM transferLogs WHERE id = ?");
+ st.setInt(1, id);
+ st.execute();
+ }
+ } catch(SQLException e) {
+ Logger.error(this, "Can't delete transfer because:
"+e.toString());
+ }
+ }
+
+
+
+ public boolean equals(Object o) {
+ if (o == null || (!(o instanceof Transfer)))
+ return false;
+
+ return (id == ((Transfer)o).getId()
+ || query == ((Transfer)o).getQuery());
+ }
+
+
+ public void update(Observable o,
+ Object param) {
+ boolean hasChanged;
+
+ if (!(o instanceof FCPTransferQuery) || id < 0) {
+ return;
+ }
+
+ hasChanged = false;
+
+ final FCPTransferQuery query = (FCPTransferQuery)o;
+
+ if (query.isFinished()) {
+ o.deleteObserver(this);
+ updateDateEnd(query.isSuccessful());
+ hasChanged = true;
+ }
+
+ if (query.getFileKey() != null &&
+ (this.key == null
+ || !this.key.equals(query.getFileKey()))) {
+ updateKey(query.getFileKey());
+ key = query.getFileKey();
+ hasChanged = true;
+ }
+
+ if (query.getFileSize() != size) {
+ updateSize(query.getFileSize());
+ size = query.getFileSize();
+ hasChanged = true;
+ }
+
+ if (hasChanged && table != null)
+ table.refresh();
+ }
+
+}
Added:
trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java
(rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferManagementHelper.java
2007-07-06 16:33:03 UTC (rev 13956)
@@ -0,0 +1,104 @@
+package thaw.plugins.transferLogs;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractButton;
+
+import java.util.Vector;
+import java.util.Iterator;
+
+
+import thaw.gui.GUIHelper;
+
+
+public class TransferManagementHelper {
+
+ public interface TransferAction extends ActionListener {
+
+ /**
+ * Can disable the abstract button if required
+ * @param files can be null
+ */
+ public void setTarget(Vector transfers);
+ }
+
+
+ public static class TransferRemover implements TransferAction {
+ private AbstractButton b;
+ private Vector targets;
+ private TransferTable tt;
+
+ public TransferRemover(AbstractButton b, TransferTable t) {
+ this.b = b;
+ this.tt = t;
+
+ if (b != null) {
+ b.addActionListener(this);
+ }
+ }
+
+
+ public void setTarget(Vector transfers) {
+ targets = transfers;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (targets == null)
+ return;
+
+ if (b == null || e.getSource() == b) {
+
+ for (Iterator it = targets.iterator();
+ it.hasNext(); ) {
+ Transfer t = (Transfer)it.next();
+ t.delete();
+ }
+
+ }
+
+ if (tt != null)
+ tt.refresh();
+ }
+ }
+
+
+ public static class TransferKeyCopier implements TransferAction {
+ private AbstractButton b;
+ private Vector targets;
+
+
+ public TransferKeyCopier(AbstractButton b) {
+ this.b = b;
+
+ if (b != null) {
+ b.addActionListener(this);
+ }
+ }
+
+
+ public void setTarget(Vector transfers) {
+ targets = transfers;
+ }
+
+
+ public void actionPerformed(ActionEvent e) {
+ if (targets == null)
+ return;
+
+ if (b == null || e.getSource() == b) {
+ String keys = "";
+
+ for (Iterator it = targets.iterator();
+ it.hasNext(); ) {
+ Transfer t = (Transfer)it.next();
+
+ if (t.getKey() != null)
+ keys += t.getKey() + "\n";
+ }
+
+ thaw.gui.GUIHelper.copyToClipboard(keys);
+ }
+ }
+ }
+}
Added: trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java
(rev 0)
+++ trunk/apps/Thaw/src/thaw/plugins/transferLogs/TransferTable.java
2007-07-06 16:33:03 UTC (rev 13956)
@@ -0,0 +1,529 @@
+package thaw.plugins.transferLogs;
+
+import javax.swing.event.TableModelEvent;
+
+import java.awt.GridLayout;
+import java.awt.BorderLayout;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+import javax.swing.JComboBox;
+import javax.swing.JTable;
+import javax.swing.JScrollPane;
+import javax.swing.JButton;
+import javax.swing.JTextField;
+import javax.swing.JTextArea;
+import javax.swing.ImageIcon;
+import javax.swing.JComboBox;
+
+import javax.swing.JPopupMenu;
+import javax.swing.JMenuItem;
+
+import java.util.Vector;
+import java.util.Iterator;
+import java.text.DateFormat;
+
+import java.awt.Component;
+import java.awt.Color;
+import javax.swing.JComponent;
+
+import java.sql.*;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import thaw.gui.Table;
+import thaw.gui.IconBox;
+import thaw.core.I18n;
+import thaw.core.Config;
+import thaw.core.Logger;
+
+import thaw.plugins.TransferLogs;
+import thaw.plugins.Hsqldb;
+
+/**
+ * Allow to see entry page per page.
+ * columns : "dates" (start,end), transfer "type", "filename","key already
seen?" .
+ * A button "details" is added in each row of the column "filename".
+ * Button "details" add in the column "filename" the following informations:
+ * <ul>
+ * <li>Key</li>
+ * <li>Was finished ?</li>
+ * <li>If finished : Average speed</li>
+ * </ul>
+ * <br/>
+ * right click menu : copy key(s) to clipboard
+ */
+public class TransferTable implements MouseListener {
+ public final static int NMB_ELEMENTS_PER_PAGE = 20;
+ public final static int DEFAULT_LINE_HEIGHT = 18;
+
+ public final static String[] COLUMN_NAMES = {
+ I18n.getMessage("thaw.plugin.transferLogs.dates"),
+ I18n.getMessage("thaw.plugin.transferLogs.type"),
+ I18n.getMessage("thaw.plugin.transferLogs.file"),
+ I18n.getMessage("thaw.plugin.transferLogs.isDup")
+ };
+
+
+ private JPanel panel;
+
+ private TransferTableModel model;
+ private PageSelecter pageSelecter;
+ private Table table;
+
+ private JPopupMenu rightClickMenu;
+ private Vector rightClickActions;
+
+ private DateFormat dateFormat;
+
+
+ public TransferTable(Hsqldb db, Config config) {
+ this.dateFormat = DateFormat.getDateTimeInstance();
+
+ rightClickMenu = new JPopupMenu();
+ rightClickActions = new Vector();
+
+ JButton button;
+ JMenuItem item;
+
+ item = new JMenuItem(I18n.getMessage("thaw.common.remove"),
IconBox.minDelete);
+ rightClickMenu.add(item);
+ rightClickActions.add(new
TransferManagementHelper.TransferRemover(item, this));
+
+ item = new
JMenuItem(I18n.getMessage("thaw.common.copyKeysToClipboard"), IconBox.minCopy);
+ rightClickMenu.add(item);
+ rightClickActions.add(new
TransferManagementHelper.TransferKeyCopier(item));
+
+
+ panel = new JPanel(new BorderLayout(5, 5));
+
+ model = new TransferTableModel(db);
+ pageSelecter = new PageSelecter(db, model);
+ table = new Table(config, "table_transfer_logs", model);
+ table.setDefaultRenderer(table.getColumnClass(0), new
TransferTableRenderer());
+ table.addMouseListener(this);
+
+ panel.add(new JScrollPane(table), BorderLayout.CENTER);
+ panel.add(pageSelecter.getPanel(), BorderLayout.SOUTH);
+
+ refresh();
+ }
+
+
+ public JPanel getPanel() {
+ return panel;
+ }
+
+
+ protected class TransferTableRenderer extends DefaultTableCellRenderer {
+ private Color softGray;
+ private Color lightBlue;
+
+ public TransferTableRenderer() {
+ softGray = new Color(240,240,240);
+ lightBlue = new Color(220, 220, 255);
+ }
+
+ public Component getTableCellRendererComponent(final JTable
table, Object value,
+ final boolean
isSelected, final boolean hasFocus,
+ final int row,
final int column) {
+ Component cell;
+
+ if (value instanceof String &&
((String)value).indexOf("\n") >= 0) {
+ JTextArea area = new JTextArea((String)value);
+ area.setEditable(false);
+ area.setLineWrap(false);
+
+ cell = area;
+
+ } else if ((value instanceof String) &&
"X".equals((String)value) ) {
+ return new JLabel(IconBox.minClose);
+ } else if (value instanceof Integer) {
+ int val = ((Integer)value).intValue();
+
+ if (val == 0) {
+ value =
TransferLogs.TRANSFER_TYPE_NAMES[val];
+ cell =
super.getTableCellRendererComponent(table, value, isSelected,
+
hasFocus, row, column);
+ } else {
+ ImageIcon icon;
+
+ if (isSelected)
+ icon = (val ==
TransferLogs.TRANSFER_TYPE_DOWNLOAD) ?
+ IconBox.downloads :
IconBox.insertions;
+ else
+ icon = (val ==
TransferLogs.TRANSFER_TYPE_DOWNLOAD) ?
+ IconBox.minDownloads :
IconBox.minInsertions;
+
+ return new JLabel(icon);
+ }
+
+ } else {
+ cell =
super.getTableCellRendererComponent(table, value, isSelected,
+
hasFocus, row, column);
+ }
+
+
+ if (!isSelected) {
+ if (row % 2 == 0)
+ cell.setBackground(Color.WHITE);
+ else
+ cell.setBackground(softGray);
+ } else {
+ cell.setBackground(lightBlue);
+ }
+
+ if (isSelected) {
+ if (table.getRowHeight(row) <
(cell.getPreferredSize().getHeight()+5))
+
table.setRowHeight((int)cell.getPreferredSize().getHeight()+5);
+ } else {
+ if (table.getRowHeight(row) !=
DEFAULT_LINE_HEIGHT)
+ table.setRowHeight(row,
DEFAULT_LINE_HEIGHT);
+ }
+
+ return cell;
+ }
+
+ }
+
+
+
+ protected class TransferTableModel extends
javax.swing.table.AbstractTableModel {
+
+ private int page;
+
+ private Vector transfers = null;
+
+ private Hsqldb db;
+
+ public TransferTableModel(Hsqldb db) {
+ super();
+
+ this.db = db;
+ this.page = 0;
+ }
+
+ public int getRowCount() {
+ if (transfers != null)
+ return transfers.size();
+ else
+ return 0;
+ }
+
+ public int getColumnCount() {
+ return COLUMN_NAMES.length;
+ }
+
+ public String getColumnName(int col) {
+ return COLUMN_NAMES[col];
+ }
+
+ public String getAverageSpeed(Transfer t) {
+ long v = t.getAverageSpeed();
+
+ if (v < 0)
+ return I18n.getMessage("thaw.common.unknown");
+
+ return thaw.gui.GUIHelper.getPrintableSize(v) + "/s";
+ }
+
+ public Object getValueAt(final int row, int column) {
+ if (transfers == null)
+ return null;
+
+ if (row > transfers.size())
+ return null;
+
+ Transfer t = (Transfer)transfers.get(row);
+
+ if (column == 0) { /* dates */
+ String dates =
I18n.getMessage("thaw.plugin.transferLogs.dateStart")+" ";
+ dates +=
dateFormat.format(t.getDateStart())+"\n";
+ dates +=
I18n.getMessage("thaw.plugin.transferLogs.dateEnd")+" ";
+ if (t.getDateEnd() != null)
+ dates +=
dateFormat.format(t.getDateEnd());
+ else
+ dates +=
I18n.getMessage("thaw.common.unknown");
+ return dates;
+ }
+
+ if (column == 1) { /* type */
+ return new
Integer((int)t.getTransferTypeByte());
+ }
+
+ if (column == 2) { /* file */
+ String str = " "+t.getFilename()+"\n";
+ str +=
I18n.getMessage("thaw.plugin.transferLogs.key")+": ";
+ str += (t.getKey() != null ? t.getKey() :
I18n.getMessage("thaw.common.unknown"))+"\n";
+ str +=
I18n.getMessage("thaw.plugin.transferLogs.fileSize")+": ";
+ str +=
thaw.gui.GUIHelper.getPrintableSize(t.getSize())+"\n";
+ str +=
I18n.getMessage("thaw.plugin.transferLogs.isSuccess")+": ";
+ if (t.getDateEnd() != null)
+ str += (t.isSuccess() ?
I18n.getMessage("thaw.common.yes") : I18n.getMessage("thaw.common.no")) + "\n";
+ else
+ str +=
I18n.getMessage("thaw.common.unknown")+"\n";
+ str +=
I18n.getMessage("thaw.plugin.transferLogs.averageSpeed")+": ";
+ str += getAverageSpeed(t);
+ return str;
+ }
+
+ if (column == 3) { /* isDup ? */
+ return t.isDup() ? "X" : "";
+ }
+
+
+ return null;
+ }
+
+ public boolean isCellEditable(final int row, final int column) {
+ return false;
+ }
+
+
+ public void setPage(int page) {
+ this.page = page;
+ }
+
+ public int getPage() {
+ return page;
+ }
+
+
+ public void refresh(int row) {
+ fireTableChanged(new TableModelEvent(this, row));
+ }
+
+
+ public Vector getRows(int[] rows) {
+ if (transfers == null)
+ return null;
+
+ Vector v = new Vector();
+
+ for (int i = 0 ; i < rows.length ; i++) {
+ v.add(transfers.get(rows[i]));
+ }
+
+ return v;
+ }
+
+
+ public void refresh() {
+
+ try {
+ synchronized(db.dbLock) {
+ PreparedStatement st;
+
+ int offset = NMB_ELEMENTS_PER_PAGE *
page;
+
+ st =
db.getConnection().prepareStatement("SELECT id, dateStart, "+
+
"dateEnd, transferType, "+
+
"key, filename, size, "+
+
"isDup, isSuccess "+
+
"FROM transferLogs "+
+
"ORDER BY dateStart DESC "+
+
"LIMIT "+Integer.toString(NMB_ELEMENTS_PER_PAGE)+
+
" OFFSET "+Integer.toString(offset));
+ ResultSet res = st.executeQuery();
+
+ transfers = new Vector();
+
+ while(res.next()) {
+ transfers.add(new Transfer(db,
res.getInt("id"),
+
res.getTimestamp("dateStart"),
+
res.getTimestamp("dateEnd"),
+
res.getByte("transferType"),
+
res.getString("key"),
+
res.getString("filename"),
+
res.getLong("size"),
+
res.getBoolean("isDup"),
+
res.getBoolean("isSuccess")));
+ }
+ }
+ } catch(SQLException e) {
+ Logger.error(this, "Error while reading
transfer logs: "+e.toString());
+ return;
+ }
+
+ fireTableChanged(new TableModelEvent(this));
+ }
+
+ }
+
+
+ protected class PageSelecter implements ActionListener {
+ private JPanel panel;
+
+ private JButton leftButton;
+ private JComboBox pageSelecter;
+ private JButton rightButton;
+
+ private Hsqldb db;
+ private TransferTableModel model;
+
+ private int pageMax;
+
+
+ public PageSelecter(Hsqldb db, TransferTableModel m) {
+ this.db = db;
+ this.model = m;
+
+ panel = new JPanel(new BorderLayout(5, 5));
+
+ leftButton = new JButton("<");
+ pageSelecter = new JComboBox(new String[] { "0" });
+ rightButton = new JButton(">");
+
+ leftButton.addActionListener(this);
+ pageSelecter.addActionListener(this);
+ rightButton.addActionListener(this);
+
+ JPanel centerPanel = new JPanel();
+ centerPanel.add(new
JLabel(I18n.getMessage("thaw.common.page")));
+ centerPanel.add(pageSelecter);
+
+
+ panel.add(leftButton, BorderLayout.WEST);
+ panel.add(centerPanel, BorderLayout.CENTER);
+ panel.add(rightButton, BorderLayout.EAST);
+ }
+
+
+ public JPanel getPanel() {
+ return panel;
+ }
+
+
+ public void refresh() {
+ int nmb_elements = -1;
+
+ try {
+ synchronized(db.dbLock) {
+ PreparedStatement st;
+
+ st =
db.getConnection().prepareStatement("SELECT count(id) FROM transferLogs");
+ ResultSet res = st.executeQuery();
+ res.next();
+
+ nmb_elements = res.getInt(1);
+ }
+ } catch(SQLException e) {
+ Logger.error(this, "Unable to compute the
number of pages in the logs because : "+e.toString());
+ return;
+ }
+
+ pageMax = nmb_elements / NMB_ELEMENTS_PER_PAGE;
+
+ if (nmb_elements % NMB_ELEMENTS_PER_PAGE == 0)
+ pageMax--;
+
+ if (model.getPage() > pageMax)
+ model.setPage(0);
+
+ pageSelecter.removeAllItems();
+
+ for (int i = 0 ; i <= pageMax ; i++)
+ pageSelecter.addItem(Integer.toString(i));
+
+ /* should call actionPerformed() */
+
pageSelecter.setSelectedItem(Integer.toString(model.getPage()));
+
+ refreshButtonState();
+ }
+
+
+ private void refreshButtonState() {
+ leftButton.setEnabled(model.getPage() > 0);
+ rightButton.setEnabled(model.getPage() < pageMax);
+ }
+
+
+ public void actionPerformed(ActionEvent e) {
+ int targetPage = -1;
+
+ if (e.getSource() == leftButton) {
+ targetPage = model.getPage() - 1;
+ } else if (e.getSource() == rightButton) {
+ targetPage = model.getPage() + 1;
+ } else if (e.getSource() == pageSelecter) {
+ if (pageSelecter.getSelectedItem() == null
+ || !(pageSelecter.getSelectedItem()
instanceof String))
+ return;
+
+ targetPage =
Integer.parseInt((String)pageSelecter.getSelectedItem());
+ }
+
+ if (targetPage < 0 || targetPage > pageMax)
+ return;
+
+ model.setPage(targetPage);
+ model.refresh();
+
+ pageSelecter.removeActionListener(this);
+
pageSelecter.setSelectedItem(Integer.toString(targetPage));
+ pageSelecter.addActionListener(this);
+
+ refreshButtonState();
+ }
+ }
+
+
+ public void refresh() {
+ model.refresh();
+ pageSelecter.refresh();
+ }
+
+
+ private void updateToolbar(Vector selection) {
+
+ }
+
+ private void updateRightClickMenu(Vector selection) {
+ TransferManagementHelper.TransferAction action;
+
+ for(final Iterator it = rightClickActions.iterator();
+ it.hasNext();) {
+ action =
(TransferManagementHelper.TransferAction)it.next();
+ action.setTarget(selection);
+ }
+ }
+
+
+ public void mouseClicked(final MouseEvent e) {
+ Vector selection;
+
+ int[] selectedRows = table.getSelectedRows();
+
+ if (selectedRows == null)
+ return;
+
+ selection = model.getRows(selectedRows);
+
+ if (selection == null)
+ return;
+
+ if (e.getButton() == MouseEvent.BUTTON1) {
+ updateToolbar(selection);
+ }
+
+ if (e.getButton() == MouseEvent.BUTTON3) {
+ updateRightClickMenu(selection);
+ rightClickMenu.show(e.getComponent(), e.getX(),
e.getY());
+ }
+ }
+
+ public void mouseEntered(final MouseEvent e) { }
+
+ public void mouseExited(final MouseEvent e) { }
+
+ public void mousePressed(final MouseEvent e) { }
+
+ public void mouseReleased(final MouseEvent e) { }
+
+
+}