/* * Copyright 2004 - 2008 Christian Sprajc, Dennis Waldherr. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder 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. * * PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id$ */ package de.dal33t.powerfolder.task; import de.dal33t.powerfolder.Member; import de.dal33t.powerfolder.event.NodeManagerAdapter; import de.dal33t.powerfolder.event.NodeManagerEvent; import de.dal33t.powerfolder.event.NodeManagerListener; import de.dal33t.powerfolder.message.Message; /** * This task tries to send a message to another user. The task remains active * even when PF is closed and will try to perform it's work on the next PF * session. * * @author Dennis "Bytekeeper" Waldherr </a> * @version $Revision:$ */ public class SendMessageTask extends PersistentTask { private static final long serialVersionUID = 1L; private Message message; private String targetID; private transient NodeManagerListener listener; public SendMessageTask(Message message, String targetID) { super(DEFAULT_DAYS_TO_EXIPRE); this.message = message; this.targetID = targetID; } @Override public void initialize() { if (message == null || targetID == null || isExpired()) { remove(); return; } listener = new MessageTrigger(); // Try to execute the task immediately if (!execute()) { getController().getNodeManager().addNodeManagerListener(listener); Member node = getController().getNodeManager().getNode(targetID); if (node != null) { node.markForImmediateConnect(); } } } private boolean execute() { Member node = getController().getNodeManager().getNode(targetID); if (node != null && node.isCompletelyConnected()) { node.sendMessageAsynchron(message); remove(); return true; } return false; } @Override public void shutdown() { try { if (getController() != null && getController().getNodeManager() != null && listener != null) { getController().getNodeManager().removeNodeManagerListener( listener); } } finally { super.shutdown(); } } /** * @return this task's message. */ public Message getMessage() { return message; } /** * @return the target user who should receive the message. */ public String getTargetID() { return targetID; } @Override public String toString() { return "SendMessageTask trying to send " + message + " to " + targetID + " until " + getExpires().getTime(); } private class MessageTrigger extends NodeManagerAdapter { public void nodeConnected(NodeManagerEvent e) { if (e.getNode().getId().equals(targetID)) { execute(); } } public boolean fireInEventDispatchThread() { return false; } } }