mirror of
https://github.com/igniterealtime/Spark.git
synced 2025-12-01 12:27:58 +00:00
Adding in new TaskEngine (I stole it from Matt)
git-svn-id: http://svn.igniterealtime.org/svn/repos/spark/trunk@7571 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
@ -11,6 +11,7 @@
|
|||||||
package org.jivesoftware.spark;
|
package org.jivesoftware.spark;
|
||||||
|
|
||||||
import org.jivesoftware.resource.SoundsRes;
|
import org.jivesoftware.resource.SoundsRes;
|
||||||
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
|
|
||||||
import java.applet.Applet;
|
import java.applet.Applet;
|
||||||
@ -59,13 +60,20 @@ public class SoundManager {
|
|||||||
*
|
*
|
||||||
* @param clip the audioclip to play.
|
* @param clip the audioclip to play.
|
||||||
*/
|
*/
|
||||||
public void playClip(AudioClip clip) {
|
public void playClip(final AudioClip clip) {
|
||||||
try {
|
|
||||||
clip.play();
|
final Runnable playThread = new Runnable() {
|
||||||
}
|
public void run() {
|
||||||
catch (Exception ex) {
|
try {
|
||||||
System.err.println("Unable to load sound file");
|
clip.play();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
System.err.println("Unable to load sound file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TaskEngine.getInstance().submit(playThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -89,7 +97,7 @@ public class SoundManager {
|
|||||||
* @param soundFile the File object representing the wav file.
|
* @param soundFile the File object representing the wav file.
|
||||||
*/
|
*/
|
||||||
public void playClip(final File soundFile) {
|
public void playClip(final File soundFile) {
|
||||||
Thread soundThread = new Thread(new Runnable() {
|
final Runnable playThread = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
final URL url = soundFile.toURL();
|
final URL url = soundFile.toURL();
|
||||||
@ -104,9 +112,9 @@ public class SoundManager {
|
|||||||
Log.error(e);
|
Log.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
soundThread.start();
|
TaskEngine.getInstance().submit(playThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -23,6 +23,7 @@ import org.jivesoftware.smackx.debugger.EnhancedDebuggerWindow;
|
|||||||
import org.jivesoftware.smackx.packet.DelayInformation;
|
import org.jivesoftware.smackx.packet.DelayInformation;
|
||||||
import org.jivesoftware.spark.component.tabbedPane.SparkTabbedPane;
|
import org.jivesoftware.spark.component.tabbedPane.SparkTabbedPane;
|
||||||
import org.jivesoftware.spark.filetransfer.SparkTransferManager;
|
import org.jivesoftware.spark.filetransfer.SparkTransferManager;
|
||||||
|
import org.jivesoftware.spark.phone.PhoneManager;
|
||||||
import org.jivesoftware.spark.search.SearchManager;
|
import org.jivesoftware.spark.search.SearchManager;
|
||||||
import org.jivesoftware.spark.ui.ChatContainer;
|
import org.jivesoftware.spark.ui.ChatContainer;
|
||||||
import org.jivesoftware.spark.ui.ChatRoom;
|
import org.jivesoftware.spark.ui.ChatRoom;
|
||||||
@ -32,9 +33,8 @@ import org.jivesoftware.spark.ui.ContactItem;
|
|||||||
import org.jivesoftware.spark.ui.ContactList;
|
import org.jivesoftware.spark.ui.ContactList;
|
||||||
import org.jivesoftware.spark.ui.conferences.ConferencePlugin;
|
import org.jivesoftware.spark.ui.conferences.ConferencePlugin;
|
||||||
import org.jivesoftware.spark.ui.status.StatusBar;
|
import org.jivesoftware.spark.ui.status.StatusBar;
|
||||||
import org.jivesoftware.spark.util.SwingWorker;
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
import org.jivesoftware.spark.phone.PhoneManager;
|
|
||||||
import org.jivesoftware.sparkimpl.plugin.manager.Enterprise;
|
import org.jivesoftware.sparkimpl.plugin.manager.Enterprise;
|
||||||
import org.jivesoftware.sparkimpl.plugin.transcripts.ChatTranscriptPlugin;
|
import org.jivesoftware.sparkimpl.plugin.transcripts.ChatTranscriptPlugin;
|
||||||
|
|
||||||
@ -45,9 +45,7 @@ import java.awt.GridBagLayout;
|
|||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
@ -236,32 +234,17 @@ public class Workspace extends JPanel implements PacketListener {
|
|||||||
final Presence presence = SparkManager.getWorkspace().getStatusBar().getPresence();
|
final Presence presence = SparkManager.getWorkspace().getStatusBar().getPresence();
|
||||||
SparkManager.getSessionManager().changePresence(presence);
|
SparkManager.getSessionManager().changePresence(presence);
|
||||||
|
|
||||||
// Load Plugins
|
// Schedule loading of the plugins after two seconds.
|
||||||
SwingWorker worker = new SwingWorker() {
|
TaskEngine.getInstance().schedule(new TimerTask() {
|
||||||
public Object construct() {
|
public void run() {
|
||||||
try {
|
|
||||||
Thread.sleep(2000);
|
|
||||||
}
|
|
||||||
catch (InterruptedException e) {
|
|
||||||
Log.error("Unable to sleep thread.", e);
|
|
||||||
}
|
|
||||||
return "ok";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void finished() {
|
|
||||||
final PluginManager pluginManager = PluginManager.getInstance();
|
final PluginManager pluginManager = PluginManager.getInstance();
|
||||||
pluginManager.loadPlugins();
|
pluginManager.loadPlugins();
|
||||||
pluginManager.initializePlugins();
|
pluginManager.initializePlugins();
|
||||||
}
|
}
|
||||||
};
|
}, 2000);
|
||||||
worker.start();
|
|
||||||
|
|
||||||
|
// Load the offline messages after 10 seconds.
|
||||||
int numberOfMillisecondsInTheFuture = 10000; // 5 sec
|
TaskEngine.getInstance().schedule(new TimerTask() {
|
||||||
Date timeToRun = new Date(System.currentTimeMillis() + numberOfMillisecondsInTheFuture);
|
|
||||||
Timer timer = new Timer();
|
|
||||||
|
|
||||||
timer.schedule(new TimerTask() {
|
|
||||||
public void run() {
|
public void run() {
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
SwingUtilities.invokeLater(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -273,7 +256,7 @@ public class Workspace extends JPanel implements PacketListener {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, timeToRun);
|
}, 10000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@ import org.jivesoftware.spark.PresenceManager;
|
|||||||
import org.jivesoftware.spark.SparkManager;
|
import org.jivesoftware.spark.SparkManager;
|
||||||
import org.jivesoftware.spark.util.GraphicUtils;
|
import org.jivesoftware.spark.util.GraphicUtils;
|
||||||
import org.jivesoftware.spark.util.ModelUtil;
|
import org.jivesoftware.spark.util.ModelUtil;
|
||||||
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
import org.jivesoftware.sparkimpl.profile.VCardManager;
|
import org.jivesoftware.sparkimpl.profile.VCardManager;
|
||||||
|
|
||||||
@ -295,7 +296,7 @@ public class ContactItem extends JPanel {
|
|||||||
* @param hash the new hash.
|
* @param hash the new hash.
|
||||||
*/
|
*/
|
||||||
private void updateAvatar(final String hash) {
|
private void updateAvatar(final String hash) {
|
||||||
Thread updateAvatarThread = new Thread(new Runnable() {
|
Runnable updateRunnable = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
contactsDir.mkdirs();
|
contactsDir.mkdirs();
|
||||||
|
|
||||||
@ -318,9 +319,9 @@ public class ContactItem extends JPanel {
|
|||||||
Log.error("Unable to update avatar in Contact Item.", e);
|
Log.error("Unable to update avatar in Contact Item.", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
updateAvatarThread.start();
|
TaskEngine.getInstance().submit(updateRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|||||||
307
src/java/org/jivesoftware/spark/util/TaskEngine.java
Normal file
307
src/java/org/jivesoftware/spark/util/TaskEngine.java
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
/**
|
||||||
|
* $Revision: 4005 $
|
||||||
|
* $Date: 2006-06-16 08:58:27 -0700 (Fri, 16 Jun 2006) $
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006 Jive Software. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is published under the terms of the GNU Public License (GPL),
|
||||||
|
* a copy of which is included in this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jivesoftware.spark.util;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs tasks using worker threads. It also allows tasks to be scheduled to be
|
||||||
|
* run at future dates. This class mimics relevant methods in both
|
||||||
|
* {@link ExecutorService} and {@link Timer}. Any {@link TimerTask} that's
|
||||||
|
* scheduled to be run in the future will automatically be run using the thread
|
||||||
|
* executor's thread pool. This means that the standard restriction that TimerTasks
|
||||||
|
* should run quickly does not apply.
|
||||||
|
*
|
||||||
|
* @author Matt Tucker
|
||||||
|
*/
|
||||||
|
public class TaskEngine {
|
||||||
|
|
||||||
|
private static TaskEngine instance = new TaskEngine();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a task engine instance (singleton).
|
||||||
|
*
|
||||||
|
* @return a task engine.
|
||||||
|
*/
|
||||||
|
public static TaskEngine getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Timer timer;
|
||||||
|
private ExecutorService executor;
|
||||||
|
private Map<TimerTask, TimerTaskWrapper> wrappedTasks = new ConcurrentHashMap<TimerTask, TimerTaskWrapper>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new task engine.
|
||||||
|
*/
|
||||||
|
private TaskEngine() {
|
||||||
|
timer = new Timer("timer-spark", true);
|
||||||
|
executor = Executors.newCachedThreadPool(new ThreadFactory() {
|
||||||
|
|
||||||
|
final AtomicInteger threadNumber = new AtomicInteger(1);
|
||||||
|
|
||||||
|
public Thread newThread(Runnable runnable) {
|
||||||
|
// Use our own naming scheme for the threads.
|
||||||
|
Thread thread = new Thread(Thread.currentThread().getThreadGroup(), runnable,
|
||||||
|
"pool-spark" + threadNumber.getAndIncrement(), 0);
|
||||||
|
// Make workers daemon threads.
|
||||||
|
thread.setDaemon(true);
|
||||||
|
if (thread.getPriority() != Thread.NORM_PRIORITY) {
|
||||||
|
thread.setPriority(Thread.NORM_PRIORITY);
|
||||||
|
}
|
||||||
|
return thread;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submits a Runnable task for execution and returns a Future
|
||||||
|
* representing that task.
|
||||||
|
*
|
||||||
|
* @param task the task to submit.
|
||||||
|
* @return a Future representing pending completion of the task,
|
||||||
|
* and whose <tt>get()</tt> method will return <tt>null</tt>
|
||||||
|
* upon completion.
|
||||||
|
* @throws java.util.concurrent.RejectedExecutionException
|
||||||
|
* if task cannot be scheduled
|
||||||
|
* for execution.
|
||||||
|
* @throws NullPointerException if task null.
|
||||||
|
*/
|
||||||
|
public Future<?> submit(Runnable task) {
|
||||||
|
return executor.submit(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the specified task for execution after the specified delay.
|
||||||
|
*
|
||||||
|
* @param task task to be scheduled.
|
||||||
|
* @param delay delay in milliseconds before task is to be executed.
|
||||||
|
* @throws IllegalArgumentException if <tt>delay</tt> is negative, or
|
||||||
|
* <tt>delay + System.currentTimeMillis()</tt> is negative.
|
||||||
|
* @throws IllegalStateException if task was already scheduled or
|
||||||
|
* cancelled, or timer was cancelled.
|
||||||
|
*/
|
||||||
|
public void schedule(TimerTask task, long delay) {
|
||||||
|
timer.schedule(new TimerTaskWrapper(task), delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the specified task for execution at the specified time. If
|
||||||
|
* the time is in the past, the task is scheduled for immediate execution.
|
||||||
|
*
|
||||||
|
* @param task task to be scheduled.
|
||||||
|
* @param time time at which task is to be executed.
|
||||||
|
* @throws IllegalArgumentException if <tt>time.getTime()</tt> is negative.
|
||||||
|
* @throws IllegalStateException if task was already scheduled or
|
||||||
|
* cancelled, timer was cancelled, or timer thread terminated.
|
||||||
|
*/
|
||||||
|
public void schedule(TimerTask task, Date time) {
|
||||||
|
timer.schedule(new TimerTaskWrapper(task), time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the specified task for repeated <i>fixed-delay execution</i>,
|
||||||
|
* beginning after the specified delay. Subsequent executions take place
|
||||||
|
* at approximately regular intervals separated by the specified period.
|
||||||
|
* <p/>
|
||||||
|
* <p>In fixed-delay execution, each execution is scheduled relative to
|
||||||
|
* the actual execution time of the previous execution. If an execution
|
||||||
|
* is delayed for any reason (such as garbage collection or other
|
||||||
|
* background activity), subsequent executions will be delayed as well.
|
||||||
|
* In the long run, the frequency of execution will generally be slightly
|
||||||
|
* lower than the reciprocal of the specified period (assuming the system
|
||||||
|
* clock underlying <tt>Object.wait(long)</tt> is accurate).
|
||||||
|
* <p/>
|
||||||
|
* <p>Fixed-delay execution is appropriate for recurring activities
|
||||||
|
* that require "smoothness." In other words, it is appropriate for
|
||||||
|
* activities where it is more important to keep the frequency accurate
|
||||||
|
* in the short run than in the long run. This includes most animation
|
||||||
|
* tasks, such as blinking a cursor at regular intervals. It also includes
|
||||||
|
* tasks wherein regular activity is performed in response to human
|
||||||
|
* input, such as automatically repeating a character as long as a key
|
||||||
|
* is held down.
|
||||||
|
*
|
||||||
|
* @param task task to be scheduled.
|
||||||
|
* @param delay delay in milliseconds before task is to be executed.
|
||||||
|
* @param period time in milliseconds between successive task executions.
|
||||||
|
* @throws IllegalArgumentException if <tt>delay</tt> is negative, or
|
||||||
|
* <tt>delay + System.currentTimeMillis()</tt> is negative.
|
||||||
|
* @throws IllegalStateException if task was already scheduled or
|
||||||
|
* cancelled, timer was cancelled, or timer thread terminated.
|
||||||
|
*/
|
||||||
|
public void schedule(TimerTask task, long delay, long period) {
|
||||||
|
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
|
||||||
|
wrappedTasks.put(task, taskWrapper);
|
||||||
|
timer.schedule(taskWrapper, delay, period);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the specified task for repeated <i>fixed-delay execution</i>,
|
||||||
|
* beginning at the specified time. Subsequent executions take place at
|
||||||
|
* approximately regular intervals, separated by the specified period.
|
||||||
|
* <p/>
|
||||||
|
* <p>In fixed-delay execution, each execution is scheduled relative to
|
||||||
|
* the actual execution time of the previous execution. If an execution
|
||||||
|
* is delayed for any reason (such as garbage collection or other
|
||||||
|
* background activity), subsequent executions will be delayed as well.
|
||||||
|
* In the long run, the frequency of execution will generally be slightly
|
||||||
|
* lower than the reciprocal of the specified period (assuming the system
|
||||||
|
* clock underlying <tt>Object.wait(long)</tt> is accurate).
|
||||||
|
* <p/>
|
||||||
|
* <p>Fixed-delay execution is appropriate for recurring activities
|
||||||
|
* that require "smoothness." In other words, it is appropriate for
|
||||||
|
* activities where it is more important to keep the frequency accurate
|
||||||
|
* in the short run than in the long run. This includes most animation
|
||||||
|
* tasks, such as blinking a cursor at regular intervals. It also includes
|
||||||
|
* tasks wherein regular activity is performed in response to human
|
||||||
|
* input, such as automatically repeating a character as long as a key
|
||||||
|
* is held down.
|
||||||
|
*
|
||||||
|
* @param task task to be scheduled.
|
||||||
|
* @param firstTime First time at which task is to be executed.
|
||||||
|
* @param period time in milliseconds between successive task executions.
|
||||||
|
* @throws IllegalArgumentException if <tt>time.getTime()</tt> is negative.
|
||||||
|
* @throws IllegalStateException if task was already scheduled or
|
||||||
|
* cancelled, timer was cancelled, or timer thread terminated.
|
||||||
|
*/
|
||||||
|
public void schedule(TimerTask task, Date firstTime, long period) {
|
||||||
|
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
|
||||||
|
wrappedTasks.put(task, taskWrapper);
|
||||||
|
timer.schedule(taskWrapper, firstTime, period);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the specified task for repeated <i>fixed-rate execution</i>,
|
||||||
|
* beginning after the specified delay. Subsequent executions take place
|
||||||
|
* at approximately regular intervals, separated by the specified period.
|
||||||
|
* <p/>
|
||||||
|
* <p>In fixed-rate execution, each execution is scheduled relative to the
|
||||||
|
* scheduled execution time of the initial execution. If an execution is
|
||||||
|
* delayed for any reason (such as garbage collection or other background
|
||||||
|
* activity), two or more executions will occur in rapid succession to
|
||||||
|
* "catch up." In the long run, the frequency of execution will be
|
||||||
|
* exactly the reciprocal of the specified period (assuming the system
|
||||||
|
* clock underlying <tt>Object.wait(long)</tt> is accurate).
|
||||||
|
* <p/>
|
||||||
|
* <p>Fixed-rate execution is appropriate for recurring activities that
|
||||||
|
* are sensitive to <i>absolute</i> time, such as ringing a chime every
|
||||||
|
* hour on the hour, or running scheduled maintenance every day at a
|
||||||
|
* particular time. It is also appropriate for recurring activities
|
||||||
|
* where the total time to perform a fixed number of executions is
|
||||||
|
* important, such as a countdown timer that ticks once every second for
|
||||||
|
* ten seconds. Finally, fixed-rate execution is appropriate for
|
||||||
|
* scheduling multiple repeating timer tasks that must remain synchronized
|
||||||
|
* with respect to one another.
|
||||||
|
*
|
||||||
|
* @param task task to be scheduled.
|
||||||
|
* @param delay delay in milliseconds before task is to be executed.
|
||||||
|
* @param period time in milliseconds between successive task executions.
|
||||||
|
* @throws IllegalArgumentException if <tt>delay</tt> is negative, or
|
||||||
|
* <tt>delay + System.currentTimeMillis()</tt> is negative.
|
||||||
|
* @throws IllegalStateException if task was already scheduled or
|
||||||
|
* cancelled, timer was cancelled, or timer thread terminated.
|
||||||
|
*/
|
||||||
|
public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
|
||||||
|
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
|
||||||
|
wrappedTasks.put(task, taskWrapper);
|
||||||
|
timer.scheduleAtFixedRate(taskWrapper, delay, period);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedules the specified task for repeated <i>fixed-rate execution</i>,
|
||||||
|
* beginning at the specified time. Subsequent executions take place at
|
||||||
|
* approximately regular intervals, separated by the specified period.
|
||||||
|
* <p/>
|
||||||
|
* <p>In fixed-rate execution, each execution is scheduled relative to the
|
||||||
|
* scheduled execution time of the initial execution. If an execution is
|
||||||
|
* delayed for any reason (such as garbage collection or other background
|
||||||
|
* activity), two or more executions will occur in rapid succession to
|
||||||
|
* "catch up." In the long run, the frequency of execution will be
|
||||||
|
* exactly the reciprocal of the specified period (assuming the system
|
||||||
|
* clock underlying <tt>Object.wait(long)</tt> is accurate).
|
||||||
|
* <p/>
|
||||||
|
* <p>Fixed-rate execution is appropriate for recurring activities that
|
||||||
|
* are sensitive to <i>absolute</i> time, such as ringing a chime every
|
||||||
|
* hour on the hour, or running scheduled maintenance every day at a
|
||||||
|
* particular time. It is also appropriate for recurring activities
|
||||||
|
* where the total time to perform a fixed number of executions is
|
||||||
|
* important, such as a countdown timer that ticks once every second for
|
||||||
|
* ten seconds. Finally, fixed-rate execution is appropriate for
|
||||||
|
* scheduling multiple repeating timer tasks that must remain synchronized
|
||||||
|
* with respect to one another.
|
||||||
|
*
|
||||||
|
* @param task task to be scheduled.
|
||||||
|
* @param firstTime First time at which task is to be executed.
|
||||||
|
* @param period time in milliseconds between successive task executions.
|
||||||
|
* @throws IllegalArgumentException if <tt>time.getTime()</tt> is negative.
|
||||||
|
* @throws IllegalStateException if task was already scheduled or
|
||||||
|
* cancelled, timer was cancelled, or timer thread terminated.
|
||||||
|
*/
|
||||||
|
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) {
|
||||||
|
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
|
||||||
|
wrappedTasks.put(task, taskWrapper);
|
||||||
|
timer.scheduleAtFixedRate(taskWrapper, firstTime, period);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancels the execution of a scheduled task. {@link java.util.TimerTask#cancel()}
|
||||||
|
*
|
||||||
|
* @param task the scheduled task to cancel.
|
||||||
|
*/
|
||||||
|
public void cancelScheduledTask(TimerTask task) {
|
||||||
|
TaskEngine.TimerTaskWrapper taskWrapper = wrappedTasks.remove(task);
|
||||||
|
if (taskWrapper != null) {
|
||||||
|
taskWrapper.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shuts down the task engine service.
|
||||||
|
*/
|
||||||
|
public void shutdown() {
|
||||||
|
if (executor != null) {
|
||||||
|
executor.shutdownNow();
|
||||||
|
executor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timer != null) {
|
||||||
|
timer.cancel();
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for a standard TimerTask. It simply executes the TimerTask
|
||||||
|
* using the executor's thread pool.
|
||||||
|
*/
|
||||||
|
private class TimerTaskWrapper extends TimerTask {
|
||||||
|
|
||||||
|
private TimerTask task;
|
||||||
|
|
||||||
|
public TimerTaskWrapper(TimerTask task) {
|
||||||
|
this.task = task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
executor.submit(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -23,6 +23,7 @@ import org.jivesoftware.smackx.ServiceDiscoveryManager;
|
|||||||
import org.jivesoftware.smackx.packet.DiscoverInfo;
|
import org.jivesoftware.smackx.packet.DiscoverInfo;
|
||||||
import org.jivesoftware.spark.SparkManager;
|
import org.jivesoftware.spark.SparkManager;
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
import org.jivesoftware.sparkimpl.plugin.gateways.GatewayPrivateData;
|
import org.jivesoftware.sparkimpl.plugin.gateways.GatewayPrivateData;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -43,13 +44,19 @@ public class TransportUtils {
|
|||||||
static {
|
static {
|
||||||
PrivateDataManager.addPrivateDataProvider(GatewayPrivateData.ELEMENT, GatewayPrivateData.NAMESPACE, new GatewayPrivateData.ConferencePrivateDataProvider());
|
PrivateDataManager.addPrivateDataProvider(GatewayPrivateData.ELEMENT, GatewayPrivateData.NAMESPACE, new GatewayPrivateData.ConferencePrivateDataProvider());
|
||||||
|
|
||||||
PrivateDataManager pdm = SparkManager.getSessionManager().getPersonalDataManager();
|
final Runnable loadGateways = new Runnable() {
|
||||||
try {
|
public void run() {
|
||||||
gatewayPreferences = (GatewayPrivateData)pdm.getPrivateData(GatewayPrivateData.ELEMENT, GatewayPrivateData.NAMESPACE);
|
try {
|
||||||
}
|
PrivateDataManager pdm = SparkManager.getSessionManager().getPersonalDataManager();
|
||||||
catch (XMPPException e) {
|
gatewayPreferences = (GatewayPrivateData)pdm.getPrivateData(GatewayPrivateData.ELEMENT, GatewayPrivateData.NAMESPACE);
|
||||||
Log.error("Unable to load private data for Gateways", e);
|
}
|
||||||
}
|
catch (XMPPException e) {
|
||||||
|
Log.error("Unable to load private data for Gateways", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TaskEngine.getInstance().submit(loadGateways);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean autoJoinService(String serviceName) {
|
public static boolean autoJoinService(String serviceName) {
|
||||||
@ -178,7 +185,7 @@ public class TransportUtils {
|
|||||||
public String toXML() {
|
public String toXML() {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append(
|
builder.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append(
|
||||||
"\"/>");
|
"\"/>");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,9 +35,16 @@ import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;
|
|||||||
import org.jivesoftware.spark.util.ModelUtil;
|
import org.jivesoftware.spark.util.ModelUtil;
|
||||||
import org.jivesoftware.spark.util.ResourceUtils;
|
import org.jivesoftware.spark.util.ResourceUtils;
|
||||||
import org.jivesoftware.spark.util.SwingWorker;
|
import org.jivesoftware.spark.util.SwingWorker;
|
||||||
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
import org.jivesoftware.sparkimpl.plugin.alerts.SparkToaster;
|
import org.jivesoftware.sparkimpl.plugin.alerts.SparkToaster;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.KeyAdapter;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
@ -45,12 +52,6 @@ import javax.swing.JMenu;
|
|||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.awt.event.KeyAdapter;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
|
|
||||||
public class PhonePlugin implements Plugin {
|
public class PhonePlugin implements Plugin {
|
||||||
public static PhoneClient phoneClient;
|
public static PhoneClient phoneClient;
|
||||||
private DialPanel dialPanel;
|
private DialPanel dialPanel;
|
||||||
@ -260,7 +261,7 @@ public class PhonePlugin implements Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void callExtension(final String number) {
|
public void callExtension(final String number) {
|
||||||
Thread thread = new Thread(new Runnable() {
|
final Runnable caller = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
phoneClient.dialByExtension(number);
|
phoneClient.dialByExtension(number);
|
||||||
@ -269,13 +270,13 @@ public class PhonePlugin implements Plugin {
|
|||||||
Log.error(e);
|
Log.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
thread.start();
|
TaskEngine.getInstance().submit(caller);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void callJID(final String jid) {
|
public void callJID(final String jid) {
|
||||||
Thread thread = new Thread(new Runnable() {
|
final Runnable caller = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
phoneClient.dialByJID(jid);
|
phoneClient.dialByJID(jid);
|
||||||
@ -284,11 +285,9 @@ public class PhonePlugin implements Plugin {
|
|||||||
Log.error(e);
|
Log.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
thread.start();
|
TaskEngine.getInstance().submit(caller);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import org.jivesoftware.spark.plugin.Plugin;
|
|||||||
import org.jivesoftware.spark.ui.ChatRoom;
|
import org.jivesoftware.spark.ui.ChatRoom;
|
||||||
import org.jivesoftware.spark.ui.ChatRoomListener;
|
import org.jivesoftware.spark.ui.ChatRoomListener;
|
||||||
import org.jivesoftware.spark.ui.MessageListener;
|
import org.jivesoftware.spark.ui.MessageListener;
|
||||||
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
@ -53,13 +54,14 @@ public class SoundPlugin implements Plugin, MessageListener, ChatRoomListener {
|
|||||||
}
|
}
|
||||||
}, new PacketTypeFilter(Presence.class));
|
}, new PacketTypeFilter(Presence.class));
|
||||||
|
|
||||||
Thread thread = new Thread(new Runnable() {
|
// Load sound preferences.
|
||||||
|
final Runnable soundLoader = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
soundPreference.loadFromFile();
|
soundPreference.loadFromFile();
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
thread.start();
|
|
||||||
|
|
||||||
|
TaskEngine.getInstance().submit(soundLoader);
|
||||||
|
|
||||||
MultiUserChat.addInvitationListener(SparkManager.getConnection(), new InvitationListener() {
|
MultiUserChat.addInvitationListener(SparkManager.getConnection(), new InvitationListener() {
|
||||||
public void invitationReceived(XMPPConnection xmppConnection, String string, String string1, String string2, String string3, Message message) {
|
public void invitationReceived(XMPPConnection xmppConnection, String string, String string1, String string2, String string3, Message message) {
|
||||||
|
|||||||
@ -30,6 +30,7 @@ import org.jivesoftware.spark.util.GraphicUtils;
|
|||||||
import org.jivesoftware.spark.util.ModelUtil;
|
import org.jivesoftware.spark.util.ModelUtil;
|
||||||
import org.jivesoftware.spark.util.ResourceUtils;
|
import org.jivesoftware.spark.util.ResourceUtils;
|
||||||
import org.jivesoftware.spark.util.SwingWorker;
|
import org.jivesoftware.spark.util.SwingWorker;
|
||||||
|
import org.jivesoftware.spark.util.TaskEngine;
|
||||||
import org.jivesoftware.spark.util.log.Log;
|
import org.jivesoftware.spark.util.log.Log;
|
||||||
import org.jivesoftware.sparkimpl.plugin.manager.Enterprise;
|
import org.jivesoftware.sparkimpl.plugin.manager.Enterprise;
|
||||||
import org.jivesoftware.sparkimpl.profile.ext.JabberAvatarExtension;
|
import org.jivesoftware.sparkimpl.profile.ext.JabberAvatarExtension;
|
||||||
@ -38,13 +39,6 @@ import org.xmlpull.mxp1.MXParser;
|
|||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import javax.swing.ImageIcon;
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JMenu;
|
|
||||||
import javax.swing.JMenuItem;
|
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
|
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
@ -63,6 +57,13 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VCardManager handles all VCard loading/caching within Spark.
|
* VCardManager handles all VCard loading/caching within Spark.
|
||||||
*
|
*
|
||||||
@ -154,7 +155,7 @@ public class VCardManager {
|
|||||||
* Listens for new VCards to lookup in a queue.
|
* Listens for new VCards to lookup in a queue.
|
||||||
*/
|
*/
|
||||||
private void startQueueListener() {
|
private void startQueueListener() {
|
||||||
final Thread thread = new Thread(new Runnable() {
|
final Runnable queueListener = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
@ -165,10 +166,10 @@ public class VCardManager {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
thread.start();
|
|
||||||
|
TaskEngine.getInstance().submit(queueListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -449,7 +450,7 @@ public class VCardManager {
|
|||||||
vcard.setError(new XMPPError(409));
|
vcard.setError(new XMPPError(409));
|
||||||
vcards.put(jid, vcard);
|
vcards.put(jid, vcard);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Persist XML
|
// Persist XML
|
||||||
persistVCard(jid, vcard);
|
persistVCard(jid, vcard);
|
||||||
|
|
||||||
@ -537,8 +538,8 @@ public class VCardManager {
|
|||||||
|
|
||||||
String query = getNumbersFromPhone(phoneNumber);
|
String query = getNumbersFromPhone(phoneNumber);
|
||||||
if ((homePhone != null && homePhone.contains(query)) ||
|
if ((homePhone != null && homePhone.contains(query)) ||
|
||||||
(workPhone != null && workPhone.contains(query)) ||
|
(workPhone != null && workPhone.contains(query)) ||
|
||||||
(cellPhone != null && cellPhone.contains(query))) {
|
(cellPhone != null && cellPhone.contains(query))) {
|
||||||
return vcard;
|
return vcard;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user