Jtimer-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
July 2012
- 1 participants
- 2 discussions
r2884 - in branches/2.0.0-evol-499-storage: . src/main/java/org/chorem/jtimer src/main/java/org/chorem/jtimer/data src/main/java/org/chorem/jtimer/storage src/main/java/org/chorem/jtimer/ui/treetable src/test/java/org/chorem/jtimer src/test/java/org/chorem/jtimer/storage
by echatellier@users.chorem.org 13 Jul '12
by echatellier@users.chorem.org 13 Jul '12
13 Jul '12
Author: echatellier
Date: 2012-07-13 11:13:42 +0200 (Fri, 13 Jul 2012)
New Revision: 2884
Url: http://chorem.org/repositories/revision/jtimer/2884
Log:
refs #498 : begin sql storage
Added:
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/Storage.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/StorageException.java
branches/2.0.0-evol-499-storage/src/test/java/org/chorem/jtimer/storage/
branches/2.0.0-evol-499-storage/src/test/java/org/chorem/jtimer/storage/StorageTest.java
Modified:
branches/2.0.0-evol-499-storage/pom.xml
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/JTimerConfig.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerCore.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerDataManager.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java
Modified: branches/2.0.0-evol-499-storage/pom.xml
===================================================================
--- branches/2.0.0-evol-499-storage/pom.xml 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/pom.xml 2012-07-13 09:13:42 UTC (rev 2884)
@@ -259,7 +259,7 @@
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
- <version>1.3.163</version>
+ <version>1.3.167</version>
<scope>runtime</scope>
</dependency>
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/JTimerConfig.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/JTimerConfig.java 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/JTimerConfig.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -96,6 +96,14 @@
}
}
+ public String getStorageDatabaseLocation() {
+ return appConfig.getOption(JTimerOption.STORAGE_DATABASE_LOCATION.key);
+ }
+
+ public void setStrorageDatabaseLocation(String location) {
+ appConfig.setOption(JTimerOption.STORAGE_DATABASE_LOCATION.key, location);
+ }
+
public Class getIOSaverClass() {
return appConfig.getOptionAsClass(JTimerOption.IO_SAVER_CLASS.key);
}
@@ -185,6 +193,7 @@
IO_SAVER_CLASS("jtimer.io.saver.class", "org.chorem.jtimer.io.GTimerIncrementalSaver"),
IO_SAVER_DIRECTORY("jtimer.io.saver.directory", "${user.home}/.gtimer"),
IO_SAVER_AUTOSAVEDELAY("jtimer.io.saver.autosavedelay", "300"),
+ STORAGE_DATABASE_LOCATION("jtimer.io.saver.directory", "${user.home}/.jtimer/db"),
UI_IDLE_TIME("jtimer.ui.idletime", "300"),
UI_SHOW_CLOSED("jtimer.ui.showclosed", "false"),
UI_CLOSE_TO_SYSTRAY("jtimer.ui.closetosystray", "true"),
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerCore.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerCore.java 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerCore.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -32,10 +32,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.chorem.jtimer.JTimer;
import org.chorem.jtimer.JTimerFactory;
import org.chorem.jtimer.entities.TimerProject;
import org.chorem.jtimer.io.DataLockingException;
import org.chorem.jtimer.io.Saver;
+import org.chorem.jtimer.storage.Storage;
/**
* TimerCore
@@ -54,6 +56,8 @@
/** Timer data. */
protected TimerDataManager data;
+ protected Storage storage;
+
/** saver io controller. */
protected Saver saver;
@@ -65,6 +69,10 @@
// init data
data = new TimerDataManager();
+ // init storage
+ storage = new Storage(JTimer.config);
+ data.addDataEventListener(storage);
+
// add commmon vetoable
CommonVetoable commonVetoable = new CommonVetoable(data);
data.addVetoableDataEventListener(commonVetoable);
@@ -117,6 +125,15 @@
}
/**
+ * Get task storage.
+ *
+ * @return task storage
+ */
+ public Storage getStorage() {
+ return storage;
+ }
+
+ /**
* Load project list from.
*/
protected void load() {
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerDataManager.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2010 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -40,7 +40,6 @@
import org.chorem.jtimer.entities.TimerAlert;
import org.chorem.jtimer.entities.TimerProject;
import org.chorem.jtimer.entities.TimerTask;
-import org.nuiton.util.ArrayUtil;
/**
* Gere les donnees. Des objets peuvent s'enregistrer pour etre notifies des
@@ -246,7 +245,9 @@
}
// task deletion
+ if (false) {
task.getParent().getSubTasks().remove(task);
+ }
// send notification
Iterator<DataEventListener> itDataEventListener = dataEventListeners.iterator();
Added: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/Storage.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/Storage.java (rev 0)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/Storage.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -0,0 +1,407 @@
+package org.chorem.jtimer.storage;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.jtimer.JTimerConfig;
+import org.chorem.jtimer.data.DataEventListener;
+import org.chorem.jtimer.entities.TimerProject;
+import org.chorem.jtimer.entities.TimerTask;
+
+/**
+ * Implementation du stockage des taches en base de données basée sur h2.
+ *
+ * Le schema est composé des tables:
+ * <ul>
+ * <li>Task
+ * <li>TaskTime
+ * <li>Version (contenant la version du shema en cas de migration)</li>
+ * </ul>
+ *
+ * @author echatellier
+ */
+public class Storage implements DataEventListener {
+
+ private static final Log log = LogFactory.getLog(Storage.class);
+
+ protected static final String TABLE_TASK = "task";
+ protected static final String TABLE_VERSION = "version";
+
+ protected JTimerConfig config;
+
+ protected Connection connection;
+
+ public Storage(JTimerConfig config) {
+ this.config = config;
+
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Registering jdbc driver");
+ }
+ Class.forName("org.h2.Driver");
+ } catch (ClassNotFoundException e) {
+ if (log.isErrorEnabled()) {
+ log.fatal("Can't find h2 driver");
+ }
+ }
+
+ try {
+ connection = getConnection();
+ } catch (SQLException ex) {
+ throw new StorageException("Can't open database", ex);
+ }
+
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ connection.close();
+ }
+
+ protected Connection getConnection() throws SQLException {
+
+ String url = config.getStorageDatabaseLocation() + "/jtimer";
+ if (log.isInfoEnabled()) {
+ log.info("Opening connection to database : " + url);
+ }
+ Connection conn = DriverManager.getConnection("jdbc:h2:" + url, "sa",
+ "");
+ conn.setAutoCommit(true);
+
+ // test to create schema if it not already exists
+ boolean schemaExists = shemaExists(conn);
+ if (!schemaExists) {
+ if (log.isInfoEnabled()) {
+ log.info("Creating new database schema");
+ }
+ createSchema(conn);
+
+ // set new version in schema
+ Statement statement = conn.createStatement();
+ statement.executeUpdate("INSERT INTO VERSION VALUES('2.0')");
+ }
+
+ return conn;
+ }
+
+ protected void closeConnection(Connection conn) throws SQLException {
+ if (conn != null) {
+ conn.close();
+ }
+ }
+
+ protected void closeStatement(Statement stmt) {
+ if (stmt != null) {
+ try {
+ stmt.close();
+ } catch (SQLException ex) {
+ throw new StorageException("Can't close statement", ex);
+ }
+ }
+ }
+
+ /**
+ * Test if table "version" exists in database list.
+ *
+ * @param conn sql connection
+ * @return schema exists
+ */
+ protected boolean shemaExists(Connection conn) {
+ boolean found = false;
+ Statement statement = null;
+ try {
+ statement = conn.createStatement();
+ ResultSet rs = statement.executeQuery("SELECT table_name FROM information_schema.tables;");
+ while (rs.next()) {
+ String name = rs.getString(1);
+ if (TABLE_VERSION.equalsIgnoreCase(name)) {
+ found = true;
+ }
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't test schema", ex);
+ } finally {
+ closeStatement(statement);
+ }
+
+ return found;
+ }
+
+ protected void createSchema(Connection conn) {
+ Statement statement = null;
+ try {
+ statement = conn.createStatement();
+ statement.executeUpdate("CREATE TABLE " + TABLE_VERSION +
+ "(VERSION VARCHAR(10))");
+ statement.executeUpdate("CREATE TABLE " + TABLE_TASK +
+ "(ID LONG NOT NULL AUTO_INCREMENT PRIMARY KEY," +
+ " NAME VARCHAR(255) NOT NULL," +
+ " PARENT LONG DEFAULT 0," +
+ " HIDDEN BOOLEAN," +
+ " NOTE TEXT)");
+ } catch (SQLException ex) {
+ throw new StorageException("Can't create schema", ex);
+ } finally {
+ closeStatement(statement);
+ }
+
+ }
+
+ /**
+ * Find all project. (task with no parent, parent = 0).
+ *
+ * @return all projects
+ */
+ public int getProjectsCount() {
+ int result = 0;
+ Statement statement = null;
+ try {
+ statement = connection.createStatement();
+ ResultSet rs = statement.executeQuery("SELECT count(*) FROM " + TABLE_TASK +
+ " WHERE parent = 0");
+ if (rs.next()) {
+ result = rs.getInt(1);
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't get project count", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ return result;
+ }
+
+ /**
+ * Find all project. (task with no parent, parent = 0).
+ *
+ * @return all projects
+ */
+ public TimerProject getProject(int offset) {
+ TimerProject project = null;
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("SELECT * FROM " + TABLE_TASK +
+ " WHERE parent = 0 ORDER BY id LIMIT 1 OFFSET ?");
+ statement.setInt(1, offset);
+ ResultSet rs = statement.executeQuery();
+ if (rs.next()) {
+ project = new TimerProject();
+ project.setNumber(rs.getInt("id"));
+ project.setName(rs.getString("name"));
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't get project", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ return project;
+ }
+
+ /**
+ * Find all project. (task with no parent, parent = 0).
+ *
+ * @return all projects
+ */
+ public int getTasksCount(TimerTask parent) {
+ int result = 0;
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("SELECT count(*) FROM " + TABLE_TASK +
+ " WHERE parent = ?");
+ statement.setInt(1, parent.getNumber());
+ ResultSet rs = statement.executeQuery();
+ if (rs.next()) {
+ result = rs.getInt(1);
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't get task count", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ return result;
+ }
+
+ public TimerTask getTask(TimerTask parent, int offset) {
+ TimerTask task = null;
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("SELECT * FROM " + TABLE_TASK +
+ " WHERE parent = ? ORDER BY ID LIMIT 1 OFFSET ?");
+ statement.setLong(1, parent.getNumber());
+ statement.setLong(2, offset);
+ ResultSet rs = statement.executeQuery();
+ while (rs.next()) {
+ task = new TimerTask();
+ task.setNumber(rs.getInt("id"));
+ task.setName(rs.getString("name"));
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't get task", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ return task;
+ }
+
+ @Override
+ public void addProject(TimerProject project) {
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("INSERT INTO " +
+ TABLE_TASK + "(name, parent, hidden, note)" +
+ " VALUES (?, ?, ?, ?)");
+ statement.setString(1, project.getName());
+ statement.setLong(2, 0);
+ statement.setBoolean(3, project.isClosed());
+ statement.setString(4, null /*project.getNote()*/);
+ statement.executeUpdate();
+
+ // get generated id
+ ResultSet rs = statement.getGeneratedKeys();
+ if (rs.next()) {
+ project.setNumber(rs.getInt(1));
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't add project", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ }
+
+ @Override
+ public void addTask(TimerTask task) {
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("INSERT INTO " +
+ TABLE_TASK + "(name, parent, hidden, note)" +
+ " VALUES (?, ?, ?, ?)");
+ statement.setString(1, task.getName());
+ statement.setLong(2, task.getParent().getNumber());
+ statement.setBoolean(3, task.isClosed());
+ statement.setString(4, null /*project.getNote()*/);
+ statement.executeUpdate();
+
+ // get generated id
+ ResultSet rs = statement.getGeneratedKeys();
+ if (rs.next()) {
+ task.setNumber(rs.getInt(1));
+ }
+ } catch (SQLException ex) {
+ throw new StorageException("Can't add project", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ }
+
+ @Override
+ public void modifyProject(TimerProject project) {
+ modifyTask(project);
+ }
+
+ @Override
+ public void modifyTask(TimerTask task) {
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("UPDATE " +
+ TABLE_TASK + " SET name=?, parent=?, hidden=?, note=?" +
+ " WHERE id = ?");
+ statement.setString(1, task.getName());
+ if (task.getParent() == null) {
+ statement.setLong(2, 0);
+ } else {
+ statement.setLong(2, task.getParent().getNumber());
+ }
+ statement.setBoolean(3, task.isClosed());
+ statement.setString(4, null /*project.getNote()*/);
+ statement.setLong(5, task.getNumber());
+ statement.executeUpdate();
+ } catch (SQLException ex) {
+ throw new StorageException("Can't add project", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ }
+
+ @Override
+ public void deleteProject(TimerProject project) {
+ deleteProject(project);
+ }
+
+ @Override
+ public void deleteTask(TimerTask task) {
+ PreparedStatement statement = null;
+ try {
+ statement = connection.prepareStatement("DELETE FROM " +
+ TABLE_TASK + " WHERE id = ?");
+ statement.setLong(1, task.getNumber());
+ statement.executeUpdate();
+ } catch (SQLException ex) {
+ throw new StorageException("Can't add project", ex);
+ } finally {
+ closeStatement(statement);
+ }
+ }
+
+ @Override
+ public void setAnnotation(TimerTask task, Date date, String annotation) {
+
+ }
+
+ @Override
+ public void setTaskTime(TimerTask task, Date date, Long time) {
+
+ }
+
+ @Override
+ public void changeClosedState(TimerTask task) {
+ modifyTask(task);
+ }
+
+ @Override
+ public void preMoveTask(TimerTask task) {
+
+ }
+
+ @Override
+ public void moveTask(TimerTask task) {
+ modifyTask(task);
+ }
+
+ @Override
+ public void preMergeTasks(TimerTask destinationTask,
+ List<TimerTask> otherTasks) {
+
+ }
+
+ @Override
+ public void postMergeTasks(TimerTask destinationTask,
+ List<TimerTask> otherTasks) {
+ modifyTask(destinationTask);
+ for (TimerTask task : otherTasks) {
+ deleteTask(task);
+ }
+ }
+
+ @Override
+ public void startTask(TimerTask task) {
+
+ }
+
+ @Override
+ public void stopTask(TimerTask task) {
+
+ }
+
+ @Override
+ public void dataLoaded(Collection<TimerProject> projects) {
+
+ }
+}
Property changes on: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/Storage.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/StorageException.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/StorageException.java (rev 0)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/StorageException.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -0,0 +1,15 @@
+package org.chorem.jtimer.storage;
+
+public class StorageException extends RuntimeException {
+
+ /** serialVersionUID. */
+ private static final long serialVersionUID = -6544441950983775434L;
+
+ public StorageException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public StorageException(String message) {
+ super(message);
+ }
+}
Property changes on: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/storage/StorageException.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -41,6 +41,7 @@
import javax.swing.ImageIcon;
import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.apache.commons.logging.Log;
@@ -89,7 +90,7 @@
* @param treeTable Tree table reference for image observer
* @param core TimerCore
*/
- public ProjectsAndTasksCellRenderer(JXTreeTable treeTable, TimerCore core) {
+ public ProjectsAndTasksCellRenderer(JXTreeTable treeTable) {
this.treeTable = treeTable;
// init
@@ -100,9 +101,6 @@
runningIcon = new ImageIcon(runnigIconUrl);
nodeObserver = new NodeImageObserver();
runningIcon.setImageObserver(nodeObserver);
-
- // be notified on events
- core.getData().addDataEventListener(this);
}
/*
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -34,19 +34,17 @@
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;
+import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Predicate;
import org.apache.commons.lang3.time.DurationFormatUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.jtimer.data.DataEventListener;
-import org.chorem.jtimer.data.TimerCore;
-import org.chorem.jtimer.data.TimerDataManager;
import org.chorem.jtimer.entities.TimerProject;
import org.chorem.jtimer.entities.TimerTask;
import org.chorem.jtimer.entities.TimerTaskHelper;
+import org.chorem.jtimer.storage.Storage;
import org.jdesktop.swingx.treetable.AbstractTreeTableModel;
/**
@@ -86,12 +84,11 @@
/** Delete Node operation. */
public static final int OPERATION_DELETE = 2;
+ protected Storage storage;
+
/** Tree managed by this model. */
protected ProjectsAndTasksTable projectsAndTaskTable;
- /** Data. */
- protected TimerDataManager dataManager;
-
/** Tree column identifiers. */
protected List<String> columnIdentifiers;
@@ -109,12 +106,12 @@
* @param columnIdentifiers column identifiers
*/
public ProjectsAndTasksModel(ProjectsAndTasksTable projectsAndTaskTable,
- TimerCore core, List<String> columnIdentifiers) {
- super(new TimerProject("root"));
+ Storage storage, List<String> columnIdentifiers) {
+ super(new TimerProject());
// remember
this.projectsAndTaskTable = projectsAndTaskTable;
- this.dataManager = core.getData();
+ this.storage = storage;
this.columnIdentifiers = columnIdentifiers;
taskNameCache = new HashMap<TimerTask, String>();
@@ -154,12 +151,10 @@
value = task.getName();
break;
case 1:
- value = DurationFormatUtils.formatDuration(TimerTaskHelper
- .getTotalTime(task, new Date()), "HH:mm:ss");
+ value = DurationFormatUtils.formatDuration(TimerTaskHelper.getTotalTime(task, new Date()), "HH:mm:ss");
break;
case 2:
- value = DurationFormatUtils.formatDuration(TimerTaskHelper
- .getAllTotalTime(task), "HH:mm:ss");
+ value = DurationFormatUtils.formatDuration(TimerTaskHelper.getAllTotalTime(task), "HH:mm:ss");
break;
}
} else {
@@ -188,8 +183,16 @@
@Override
public Object getChild(Object parent, int index) {
- TimerTask t = getFiteredSubListFor(parent).get(index);
- return t;
+ Object child = null;
+ if (parent == root) {
+ TimerProject p = storage.getProject(index);
+ child = p;
+ } else {
+ TimerTask parentTask = (TimerTask)parent;
+ TimerTask t = storage.getTask(parentTask, index);
+ child = t;
+ }
+ return child;
}
/*
@@ -198,73 +201,15 @@
@Override
public int getChildCount(Object parent) {
- int childCount = getFiteredSubListFor(parent).size();
- return childCount;
- }
-
- /**
- * Recupere la sous liste: data.getProjectsList() si parent = root
- * getSubTasks() sinon (cache results).
- *
- * @param parent parent to task sublist
- * @return filtered list
- */
- protected List<TimerTask> getFiteredSubListFor(Object parent) {
- return getFiteredSubListFor(parent, false);
- }
-
- /**
- * Recupere la sous liste: data.getProjectsList() si parent = root
- * getSubTasks() sinon.
- *
- * @param parent parent to task sublist
- * @param noCache disable use of cached result and result caching
- * @return filtered list
- */
- protected List<TimerTask> getFiteredSubListFor(Object parent, boolean noCache) {
-
- List<TimerTask> result = subTasksCache.get(parent);
- if (result == null || noCache) {
- result = new ArrayList<TimerTask>();
-
- // get correct list
- if (parent == root) { // case root node
- List<TimerProject> projects = dataManager.getProjectsList();
- result.addAll(projects);
- } else { // not root node
- TimerTask task = (TimerTask) parent;
- result.addAll(task.getSubTasks());
- }
-
- // filter list, if only show closed
- if (!showClosedTask) {
- CollectionUtils.filter(result, new Predicate() {
- @Override
- public boolean evaluate(Object object) {
- boolean result = false;
- if (object instanceof TimerTask) {
- TimerTask task = (TimerTask) object;
- result = !task.isClosed();
- }
- return result;
- }
- });
- }
-
- // Since sort is not supported by the table, do a manual sorting.
- result = TimerTaskHelper.sortTask(result);
-
- if (!noCache) {
- // cache tasks name
- for (TimerTask task : result) {
- taskNameCache.put(task, task.getName());
- }
-
- subTasksCache.put(parent, result);
- }
+ int childCount = 0;
+ if (parent == root) {
+ childCount = storage.getProjectsCount();
+ } else {
+ TimerTask parentTask = (TimerTask)parent;
+ childCount = storage.getTasksCount(parentTask);
}
- return result;
+ return childCount;
}
/*
@@ -272,9 +217,7 @@
*/
@Override
public int getIndexOfChild(Object parent, Object child) {
-
- int childIndex = getFiteredSubListFor(parent).indexOf(child);
- return childIndex;
+ throw new RuntimeException("Not yet implemented");
}
/*
@@ -312,10 +255,9 @@
boolean updated = false;
// get childreen without cache in case of add operation
// delete operation MUST use cached result
- List<TimerTask> subTask = getFiteredSubListFor(pathLastComponent, operation == OPERATION_ADD);
- int childCount = subTask.size();
+ int childCount = getChildCount(pathLastComponent);
for (int childIndex = 0; !updated && childIndex < childCount; ++childIndex) {
- TimerTask taskUO = subTask.get(childIndex);
+ TimerTask taskUO = (TimerTask)getChild(pathLastComponent, childIndex);
if (task.equals(taskUO)) {
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java 2012-07-12 12:51:48 UTC (rev 2883)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -34,6 +34,7 @@
import org.chorem.jtimer.data.TimerCore;
import org.chorem.jtimer.entities.TimerProject;
import org.chorem.jtimer.entities.TimerTask;
+import org.chorem.jtimer.storage.Storage;
import org.chorem.jtimer.ui.treetable.dnd.TimerTaskTransferHandler;
import org.jdesktop.application.Application;
import org.jdesktop.application.ApplicationContext;
@@ -76,20 +77,19 @@
// start with init i18n of table column name
ApplicationContext ctxt = application.getContext();
ResourceManager mgr = ctxt.getResourceManager();
- ResourceMap resourceMap = mgr
- .getResourceMap(ProjectsAndTasksTable.class);
+ ResourceMap resourceMap = mgr.getResourceMap(ProjectsAndTasksTable.class);
+
// init list
List<String> columnIdentifiers = new ArrayList<String>();
- columnIdentifiers.add(resourceMap
- .getString("projectsAndTaskColumnName"));
+ columnIdentifiers.add(resourceMap.getString("projectsAndTaskColumnName"));
columnIdentifiers.add(resourceMap.getString("todayTimeColumnName"));
columnIdentifiers.add(resourceMap.getString("totalTimeColumnName"));
// set model
- treeTableModel = new ProjectsAndTasksModel(this, core, columnIdentifiers);
+ treeTableModel = new ProjectsAndTasksModel(this, core.getStorage(), columnIdentifiers);
// set renderer
- treeCellRenderer = new ProjectsAndTasksCellRenderer(this, core);
+ treeCellRenderer = new ProjectsAndTasksCellRenderer(this);
setTreeCellRenderer(treeCellRenderer);
setTreeTableModel(treeTableModel);
@@ -100,6 +100,7 @@
//treeTableModel.setSortColumn("Projects & Tasks");
core.getData().addDataEventListener(treeTableModel);
+ core.getData().addDataEventListener(treeCellRenderer);
// enable drag n drop
setDragEnabled(true);
@@ -168,7 +169,7 @@
if (path != null) {
Object[] pathWay = path.getPath();
- if (pathWay.length >= 2) { // 1 = root, 2=project , 3+=task
+ if (pathWay.length >= 2) { // 1= root, 2=project , 3+=task
// le last est la derniere feuille selectionnee, donc la
// tache
TimerTask task = (TimerTask) pathWay[pathWay.length - 1];
Added: branches/2.0.0-evol-499-storage/src/test/java/org/chorem/jtimer/storage/StorageTest.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/test/java/org/chorem/jtimer/storage/StorageTest.java (rev 0)
+++ branches/2.0.0-evol-499-storage/src/test/java/org/chorem/jtimer/storage/StorageTest.java 2012-07-13 09:13:42 UTC (rev 2884)
@@ -0,0 +1,32 @@
+package org.chorem.jtimer.storage;
+
+import java.io.File;
+
+import org.chorem.jtimer.AbstractJTimerTest;
+import org.chorem.jtimer.JTimer;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * Test du stockage sql seulement.
+ *
+ * @author echatellier
+ */
+public class StorageTest extends AbstractJTimerTest {
+
+ protected Storage storage;
+
+ @BeforeMethod
+ public void setUp() {
+ String location = System.getProperty("java.io.tmpdir") + File.separator + "jtimer";
+ JTimer.config.setStrorageDatabaseLocation(location);
+
+ storage = new Storage(JTimer.config);
+ }
+
+ @Test
+ public void testGetSubTask() {
+ Assert.assertEquals(storage.getProjectsCount(), 0);
+ }
+}
Property changes on: branches/2.0.0-evol-499-storage/src/test/java/org/chorem/jtimer/storage/StorageTest.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
1
0
r2883 - in branches/2.0.0-evol-499-storage: . src/main/java/org/chorem/jtimer/ui/system src/main/java/org/chorem/jtimer/ui/system/macos src/main/java/org/chorem/jtimer/ui/system/unix src/main/java/org/chorem/jtimer/ui/system/win32
by echatellier@users.chorem.org 12 Jul '12
by echatellier@users.chorem.org 12 Jul '12
12 Jul '12
Author: echatellier
Date: 2012-07-12 14:51:48 +0200 (Thu, 12 Jul 2012)
New Revision: 2883
Url: http://chorem.org/repositories/revision/jtimer/2883
Log:
Merge branche 1.4.x-evol-657-bridj
Added:
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/X11.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Kernel32.java
Modified:
branches/2.0.0-evol-499-storage/
branches/2.0.0-evol-499-storage/pom.xml
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/SystemInfoFactory.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/ApplicationServices.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/MacOSSystemInfo.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/package-info.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/UnixSystemInfo.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/Xss.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/package-info.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/User32.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Win32SystemInfo.java
branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/package-info.java
Property changes on: branches/2.0.0-evol-499-storage
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/1.4.0-ttalgo:2840-2847
+ /branches/1.4.0-ttalgo:2840-2847
/branches/1.4.x-evol-657-bridj:2876-2882
Modified: branches/2.0.0-evol-499-storage/pom.xml
===================================================================
--- branches/2.0.0-evol-499-storage/pom.xml 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/pom.xml 2012-07-12 12:51:48 UTC (rev 2883)
@@ -90,8 +90,6 @@
<!--Multilanguage maven-site -->
<locales>fr,en</locales>
-
- <xmrpcVersion>3.1.3</xmrpcVersion>
<!-- files to deploy to redmine -->
<redmine.releaseFiles>
@@ -201,7 +199,7 @@
<dependency>
<groupId>org.nuiton</groupId>
<artifactId>nuiton-utils</artifactId>
- <version>2.4.8</version>
+ <version>2.5.1</version>
<scope>compile</scope>
<exclusions>
<exclusion>
@@ -237,18 +235,18 @@
<scope>compile</scope>
</dependency>
<dependency>
- <groupId>net.java.dev.jna</groupId>
- <artifactId>jna</artifactId>
- <version>3.4.0</version>
+ <groupId>com.nativelibs4java</groupId>
+ <artifactId>bridj</artifactId>
+ <version>0.6.1</version>
<scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>com.google.android.tools</groupId>
+ <artifactId>dx</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
- <groupId>net.java.dev.jna</groupId>
- <artifactId>platform</artifactId>
- <version>3.4.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>runtime</scope>
@@ -258,9 +256,14 @@
<artifactId>freemarker</artifactId>
<version>2.3.19</version>
</dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>1.3.163</version>
+ <scope>runtime</scope>
+ </dependency>
<!-- commons-xxx lib -->
-
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
@@ -277,14 +280,8 @@
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
- <dependency>
- <groupId>commons-httpclient</groupId>
- <artifactId>commons-httpclient</artifactId>
- <scope>runtime</scope>
- </dependency>
<!-- tests dependencies -->
-
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/SystemInfoFactory.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/SystemInfoFactory.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/SystemInfoFactory.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -27,12 +27,11 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.bridj.Platform;
import org.chorem.jtimer.ui.system.macos.MacOSSystemInfo;
import org.chorem.jtimer.ui.system.unix.UnixSystemInfo;
import org.chorem.jtimer.ui.system.win32.Win32SystemInfo;
-import com.sun.jna.Platform;
-
/**
* Build system info determined from system.
*
@@ -81,7 +80,7 @@
instance = new Win32SystemInfo();
} else if (Platform.isLinux()) {
instance = new UnixSystemInfo();
- } else if (Platform.isMac()) {
+ } else if (Platform.isMacOSX()) {
instance = new MacOSSystemInfo();
} else {
// system unknown
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/ApplicationServices.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/ApplicationServices.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/ApplicationServices.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2010 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2010 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -25,11 +25,11 @@
package org.chorem.jtimer.ui.system.macos;
-import com.sun.jna.Library;
-import com.sun.jna.Native;
+import org.bridj.BridJ;
+import org.bridj.ann.Library;
/**
- * Quartz 2D API.
+ * Mac OS X Bridj library.
*
* @author chatellier
* @version $Revision$
@@ -38,21 +38,22 @@
* Last update : $Date$
* By : $Author: chatellier $
*/
-public interface ApplicationServices extends Library {
-
- ApplicationServices INSTANCE = (ApplicationServices) Native.loadLibrary(
- "ApplicationServices", ApplicationServices.class);
-
- /** Constants that specify an input event. */
- int kCGAnyInputEventType = -1;
- /** Specifies that an event source should use a private event state table. */
- int kCGEventSourceStatePrivate = -1;
- /** Specifies that an event source should use the event state table that reflects the combined state of all event sources posting to the current user login session. */
- int kCGEventSourceStateCombinedSessionState = 0;
- /** Specifies that an event source should use the event state table that reflects the combined state of all hardware event sources posting from the HID system. */
- int kCGEventSourceStateHIDSystemState = 1;
-
- /**
+@Library("ApplicationServices")
+public class ApplicationServices {
+ static {
+ BridJ.register();
+ }
+
+ /** Constants that specify an input event. */
+ public static final int kCGAnyInputEventType = ~0;
+ /** Specifies that an event source should use a private event state table. */
+ public static final int kCGEventSourceStatePrivate = -1;
+ /** Specifies that an event source should use the event state table that reflects the combined state of all event sources posting to the current user login session. */
+ public static final int kCGEventSourceStateCombinedSessionState = 0;
+ /** Specifies that an event source should use the event state table that reflects the combined state of all hardware event sources posting from the HID system. */
+ public static final int kCGEventSourceStateHIDSystemState = 1;
+
+ /**
* Returns the elapsed time since the last event for a Quartz event source.
*
* @param sourceStateId The source state to access
@@ -61,6 +62,5 @@
*
* @see <a href="http://developer.apple.com/mac/library/documentation/Carbon/Reference/Quart…">Quartz API</a>
*/
- public double CGEventSourceSecondsSinceLastEventType(int sourceStateId,
- int eventType);
-}
\ No newline at end of file
+ public static native double CGEventSourceSecondsSinceLastEventType(int source, int eventType);
+}
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/MacOSSystemInfo.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/MacOSSystemInfo.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/macos/MacOSSystemInfo.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2010 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2010 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -46,7 +46,7 @@
*/
@Override
public long getIdleTime() {
- double idleTimeSeconds = ApplicationServices.INSTANCE
+ double idleTimeSeconds = ApplicationServices
.CGEventSourceSecondsSinceLastEventType(
ApplicationServices.kCGEventSourceStateCombinedSessionState,
ApplicationServices.kCGAnyInputEventType);
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/package-info.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/package-info.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/package-info.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -23,6 +23,6 @@
* #L%
*/
/**
- * System interface using JNA to get system information.
+ * System interface using Bridj to get system information.
*/
package org.chorem.jtimer.ui.system;
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/UnixSystemInfo.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/UnixSystemInfo.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/UnixSystemInfo.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -27,11 +27,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.bridj.Pointer;
import org.chorem.jtimer.ui.system.SystemInfo;
-import com.sun.jna.platform.unix.X11;
-import com.sun.jna.ptr.IntByReference;
-
/**
* Linux system info.
*
@@ -80,58 +78,31 @@
long idleTime = 0;
// get X11 display
- X11.Display display = X11.INSTANCE.XOpenDisplay(null);
+ X11.Display display = X11.XOpenDisplay(null);
if (display == null) {
log.error("Can't open X11 display");
} else {
// Display is opened
+ Pointer<Xss.XScreenSaverInfo> screenSaverInfo = Xss.XScreenSaverAllocInfo();
- // check if screensaver extension is enabled
- IntByReference eventBase = new IntByReference();
- IntByReference errorBase = new IntByReference();
-
- if (!Xss.INSTANCE.XScreenSaverQueryExtension(display, eventBase,
- errorBase)) {
- if (log.isErrorEnabled()) {
- log.error("Can't find xscreensaver extension, "
- + "idle time can't be detected");
- }
+ if (screenSaverInfo == null) {
+ log.error("Could not alloc screen saver info");
} else {
- // screensaver is enabled
-
- Xss.XScreenSaverInfo screenSaverInfo = Xss.INSTANCE
- .XScreenSaverAllocInfo();
-
- if (screenSaverInfo == null) {
- log.error("Could not alloc screen saver info");
+ // get root window
+ X11.Window rootWindow = X11.XDefaultRootWindow(display);
+ int flag = Xss.XScreenSaverQueryInfo(display, rootWindow, screenSaverInfo);
+ if (flag == 0) {
+ log.error("Can't get user idle time");
} else {
- // get root window
- X11.Window rootWindow = X11.INSTANCE
- .XDefaultRootWindow(display);
-
- if (rootWindow == null) {
- log.error("Could not query root window");
- } else {
-
- // FIX : without this, cause random NPE
- screenSaverInfo.window = rootWindow;
-
- Xss.INSTANCE.XScreenSaverQueryInfo(display, rootWindow,
- screenSaverInfo);
- if (screenSaverInfo.idle == null) {
- log.error("screenSaverInfo.idle is null");
- } else {
- idleTime = screenSaverInfo.idle.longValue();
- }
- }
-
- // free resources
- X11.INSTANCE.XFree(screenSaverInfo.getPointer());
+ idleTime = screenSaverInfo.get().idle();
}
+
+ // free resources
+ X11.XFree(screenSaverInfo);
}
// free resources
- X11.INSTANCE.XCloseDisplay(display);
+ X11.XCloseDisplay(display);
}
return idleTime;
Copied: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/X11.java (from rev 2882, branches/1.4.x-evol-657-bridj/src/main/java/org/chorem/jtimer/ui/system/unix/X11.java)
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/X11.java (rev 0)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/X11.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -0,0 +1,60 @@
+package org.chorem.jtimer.ui.system.unix;
+
+import org.bridj.BridJ;
+import org.bridj.Pointer;
+import org.bridj.TypedPointer;
+import org.bridj.ann.Library;
+
+/**
+ * Unix X11 Bridj library.
+ *
+ * @author chatellier
+ * @version $Revision: 2778 $
+ *
+ * Last update : $Date: 2011-09-05 10:12:54 +0200 (lun. 05 sept. 2011) $
+ * By : $Author: echatellier $
+ */
+@Library("X11")
+public class X11 {
+ static {
+ BridJ.register();
+ }
+
+ public static class Drawable extends TypedPointer {
+ public Drawable(long peer) {
+ super(peer);
+ }
+
+ public Drawable(Pointer<?> ptr) {
+ super(ptr);
+ }
+ }
+
+ public static class Window extends Drawable {
+ public Window(long peer) {
+ super(peer);
+ }
+
+ public Window(Pointer<?> ptr) {
+ super(ptr);
+ }
+ }
+
+ public static class Display extends TypedPointer {
+ public Display(long peer) {
+ super(peer);
+ }
+
+ public Display(Pointer<?> ptr) {
+ super(ptr);
+ }
+ }
+
+ public static native Display XOpenDisplay(Pointer<Byte> name);
+
+ public static native Window XDefaultRootWindow(Display display);
+
+ public static native int XFree(Pointer data);
+
+ public static native int XCloseDisplay(Display display);
+}
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/Xss.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/Xss.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/Xss.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2010 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -25,70 +25,132 @@
package org.chorem.jtimer.ui.system.unix;
-import com.sun.jna.Library;
-import com.sun.jna.Native;
-import com.sun.jna.NativeLong;
-import com.sun.jna.Structure;
-import com.sun.jna.platform.unix.X11;
-import com.sun.jna.ptr.IntByReference;
+import org.bridj.BridJ;
+import org.bridj.Pointer;
+import org.bridj.StructObject;
+import org.bridj.ann.Field;
+import org.bridj.ann.Library;
+import org.bridj.ann.Ptr;
/**
- * libXss JNA interface.
+ * Unix Xss Bridj library.
*
- * Incomplete definition.
- *
* @author chatellier
* @version $Revision$
*
* Last update : $Date$
* By : $Author$
*/
-public interface Xss extends Library {
+@Library("Xss")
+public class Xss {
+ static {
+ BridJ.register();
+ }
- /** Xss Instance */
- Xss INSTANCE = (Xss) Native.loadLibrary("Xss", Xss.class);
+ public static class XScreenSaverInfo extends StructObject {
+ public XScreenSaverInfo() {
+ super();
+ }
- /**
- * XScreenSaverInfo struct
- */
- public static class XScreenSaverInfo extends Structure {
- public X11.Window window; /* screen saver window - may not exist */
- public int state; /* ScreenSaverOff, ScreenSaverOn, ScreenSaverDisabled */
- public int kind; /* ScreenSaverBlanked, ...Internal, ...External */
- public NativeLong til_or_since; /* time til or since screen saver */
- public NativeLong idle; /* total time since last user input */
- public NativeLong eventMask; /* currently selected events for this client */
+ public XScreenSaverInfo(Pointer pointer) {
+ super(pointer);
+ }
+
+ /**
+ * screen saver window<br>
+ * C type : Window
+ */
+ @Ptr
+ @Field(0)
+ public long window() {
+ return this.io.getSizeTField(this, 0);
+ }
+
+ /**
+ * screen saver window<br>
+ * C type : Window
+ */
+ @Ptr
+ @Field(0)
+ public XScreenSaverInfo window(long window) {
+ this.io.setSizeTField(this, 0, window);
+ return this;
+ }
+
+ // ScreenSaver{Off,On,Disabled}
+ @Field(1)
+ public int state() {
+ return this.io.getIntField(this, 1);
+ }
+
+ // ScreenSaver{Off,On,Disabled}
+ @Field(1)
+ public XScreenSaverInfo state(int state) {
+ this.io.setIntField(this, 1, state);
+ return this;
+ }
+
+ // ScreenSaver{Blanked,Internal,External}
+ @Field(2)
+ public int kind() {
+ return this.io.getIntField(this, 2);
+ }
+
+ // ScreenSaver{Blanked,Internal,External}
+ @Field(2)
+ public XScreenSaverInfo kind(int kind) {
+ this.io.setIntField(this, 2, kind);
+ return this;
+ }
+
+ // milliseconds
+ @org.bridj.ann.CLong
+ @Field(3)
+ public long til_or_since() {
+ return this.io.getCLongField(this, 3);
+ }
+
+ // milliseconds
+ @org.bridj.ann.CLong
+ @Field(3)
+ public XScreenSaverInfo til_or_since(long til_or_since) {
+ this.io.setCLongField(this, 3, til_or_since);
+ return this;
+ }
+
+ // milliseconds
+ @org.bridj.ann.CLong
+ @Field(4)
+ public long idle() {
+ return this.io.getCLongField(this, 4);
+ }
+
+ // milliseconds
+ @org.bridj.ann.CLong
+ @Field(4)
+ public XScreenSaverInfo idle(long idle) {
+ this.io.setCLongField(this, 4, idle);
+ return this;
+ }
+
+ // events
+ @org.bridj.ann.CLong
+ @Field(5)
+ public long event_mask() {
+ return this.io.getCLongField(this, 5);
+ }
+
+ // events
+ @org.bridj.ann.CLong
+ @Field(5)
+ public XScreenSaverInfo event_mask(long event_mask) {
+ this.io.setCLongField(this, 5, event_mask);
+ return this;
+ }
}
- /**
- * Information sur l'activation de l'ecran de veille de X11.
- *
- * @param display display
- * @param event_base event_base
- * @param error_base error_base
- *
- * @return true if XScreenSaver extension is loaded
- *
- * @see IntByReference
- */
- public boolean XScreenSaverQueryExtension(X11.Display display,
- IntByReference event_base, IntByReference error_base);
+ public static native Pointer<XScreenSaverInfo> XScreenSaverAllocInfo();
- /**
- * XScreenSaverAllocInfo.
- *
- * @return XScreenSaverInfo instance
- */
- public XScreenSaverInfo XScreenSaverAllocInfo();
-
- /**
- * XScreenSaverQueryInfo.
- *
- * @param display
- * @param drawable
- * @param infos
- * @return status flag
- */
- public int XScreenSaverQueryInfo(X11.Display display,
- X11.Drawable drawable, XScreenSaverInfo infos);
+ public static native int XScreenSaverQueryInfo(X11.Display dpy,
+ X11.Drawable drawable, Pointer<XScreenSaverInfo> saver_info);
}
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/package-info.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/package-info.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/unix/package-info.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
Copied: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Kernel32.java (from rev 2882, branches/1.4.x-evol-657-bridj/src/main/java/org/chorem/jtimer/ui/system/win32/Kernel32.java)
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Kernel32.java (rev 0)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Kernel32.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -0,0 +1,58 @@
+/*
+ * #%L
+ * jTimer
+ *
+ * $Id: UnixSystemInfo.java 2828 2012-03-16 11:00:21Z echatellier $
+ * $HeadURL$
+ * %%
+ * Copyright (C) 2010 - 2012 CodeLutin, Chatellier Eric
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+package org.chorem.jtimer.ui.system.win32;
+
+import org.bridj.*;
+import org.bridj.ann.*;
+
+/**
+ * Win Kernel32 Bridj library.
+ *
+ * @author chatellier
+ * @version $Revision: 2778 $
+ *
+ * Last update : $Date: 2011-09-05 10:12:54 +0200 (lun. 05 sept. 2011) $
+ * By : $Author: echatellier $
+ */
+(a)Convention(Convention.Style.StdCall)
+@Library("kernel32")
+public class Kernel32 {
+ static {
+ BridJ.register();
+ }
+
+ /**
+ * Retrieves the number of milliseconds that have elapsed since the system
+ * was started.
+ *
+ * @see <a
+ * href="http://msdn2.microsoft.com/en-us/library/ms724408.aspx">MSDN
+ * GetTickCount function</a>
+ * @return number of milliseconds that have elapsed since the system was
+ * started.
+ */
+ public static native int GetTickCount();
+}
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/User32.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/User32.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/User32.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
@@ -25,43 +25,56 @@
package org.chorem.jtimer.ui.system.win32;
-import com.sun.jna.Native;
-import com.sun.jna.Structure;
-import com.sun.jna.win32.StdCallLibrary;
+import org.bridj.BridJ;
+import org.bridj.Pointer;
+import org.bridj.StructObject;
+import org.bridj.ann.Convention;
+import org.bridj.ann.Field;
+import org.bridj.ann.Library;
/**
- * Win User32 JNA Interface.
+ * Win User32 Bridj library.
*
- * TODO it not the same code as jna's User32 class.
- *
* @author chatellier
* @version $Revision$
- *
- * @see <a href="http://msdn.microsoft.com/en-us/library/ms646272">Windows API</a>
*
* Last update : $Date$
* By : $Author$
*/
-public interface User32 extends StdCallLibrary {
+(a)Convention(Convention.Style.StdCall)
+@Library("user32")
+public class User32 {
+ static {
+ BridJ.register();
+ }
- /** Instance. */
- User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
-
/**
* Contains the time of the last input.
+ *
+ * @see <a
+ * href="http://msdn.microsoft.com/en-us/library/ms646272">MSDN
+ * LASTINPUTINFO structure</a>
*/
- class LASTINPUTINFO extends Structure {
- public int cbSize = 8;
+ public static class LASTINPUTINFO extends StructObject {
+ @Field(0)
+ public int cbSize() {
+ return this.io.getIntField(this, 0);
+ }
// / Tick count of when the last input event was received.
- public int dwTime;
+ @Field(1)
+ public int dwTime() {
+ return this.io.getIntField(this, 1);
+ }
}
/**
* Retrieves the time of the last input event.
*
- * @param result time of the last input event, in milliseconds
- * @return boolean flag
+ * @see <a
+ * href="http://msdn.microsoft.com/en-us/library/ms646272">MSDN
+ * GetLastInputInfo function</a>
+ * @return time of the last input event, in milliseconds
*/
- boolean GetLastInputInfo(LASTINPUTINFO result);
+ public static native boolean GetLastInputInfo(Pointer<LASTINPUTINFO> result);
}
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Win32SystemInfo.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Win32SystemInfo.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/Win32SystemInfo.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -25,14 +25,13 @@
package org.chorem.jtimer.ui.system.win32;
+import org.bridj.Pointer;
import org.chorem.jtimer.ui.system.SystemInfo;
-import com.sun.jna.platform.win32.Kernel32;
-
/**
* Win32 System info.
*
- * From http://ochafik.free.fr/blog/?p=98
+ * From https://github.com/ochafik/nativelibs4java.
*
* @author chatellier
* @version $Revision$
@@ -61,8 +60,9 @@
* @return idle time in milliseconds
*/
public int getIdleTimeMillisWin32() {
- User32.INSTANCE.GetLastInputInfo(lastInputInfo);
- return Kernel32.INSTANCE.GetTickCount() - lastInputInfo.dwTime;
+ User32.LASTINPUTINFO lastInputInfo = new User32.LASTINPUTINFO();
+ User32.GetLastInputInfo(Pointer.pointerTo(lastInputInfo));
+ return Kernel32.GetTickCount() - lastInputInfo.dwTime();
}
/*
Modified: branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/package-info.java
===================================================================
--- branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/package-info.java 2012-06-30 12:14:40 UTC (rev 2882)
+++ branches/2.0.0-evol-499-storage/src/main/java/org/chorem/jtimer/ui/system/win32/package-info.java 2012-07-12 12:51:48 UTC (rev 2883)
@@ -5,7 +5,7 @@
* $Id$
* $HeadURL$
* %%
- * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric
+ * Copyright (C) 2007 - 2012 CodeLutin, Chatellier Eric
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
1
0