001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.resource.adapter.mail.inflow;
023:
024: import java.lang.reflect.Method;
025: import javax.resource.spi.endpoint.MessageEndpointFactory;
026: import javax.resource.spi.endpoint.MessageEndpoint;
027: import javax.resource.spi.work.Work;
028: import javax.mail.Message;
029:
030: import org.jboss.resource.adapter.mail.MailResourceAdapter;
031: import org.jboss.logging.Logger;
032:
033: /**
034: * The MailActivation encapsulates a MailResourceAdapter#endpointActivation
035: * {@link javax.resource.spi.ResourceAdapter#endpointActivation(MessageEndpointFactory,javax.resource.spi.ActivationSpec)}
036: *
037: * @author Scott.Stark@jboss.org
038: * @version $Revision: 57754 $
039: */
040: public class MailActivation implements Comparable, Work {
041: private static final Logger log = Logger
042: .getLogger(MailActivation.class);
043: /**
044: * The MailListener.onMessage method
045: */
046: public static final Method ON_MESSAGE;
047:
048: static {
049: try {
050: Class[] sig = { Message.class };
051: ON_MESSAGE = MailListener.class.getMethod("onMessage", sig);
052: } catch (Exception e) {
053: throw new RuntimeException(e);
054: }
055: }
056:
057: /** A flag indicated if the unit of work has been released */
058: private boolean released;
059: /** The logging trace level flag */
060: private boolean trace;
061: /** The time at which the next new msgs check should be performed */
062: private long nextNewMsgCheckTime;
063: /** The resource adapter */
064: protected MailResourceAdapter ra;
065: /** The activation spec for the mail folder */
066: protected MailActivationSpec spec;
067: /** The message endpoint factory */
068: protected MessageEndpointFactory endpointFactory;
069:
070: public MailActivation(MailResourceAdapter ra,
071: MessageEndpointFactory endpointFactory,
072: MailActivationSpec spec) {
073: this .ra = ra;
074: this .endpointFactory = endpointFactory;
075: this .spec = spec;
076: this .trace = log.isTraceEnabled();
077: }
078:
079: public long getNextNewMsgCheckTime() {
080: return nextNewMsgCheckTime;
081: }
082:
083: public void updateNextNewMsgCheckTime(long now) {
084: nextNewMsgCheckTime = now + spec.getPollingInterval();
085: }
086:
087: public int compareTo(Object obj) {
088: MailActivation ma = (MailActivation) obj;
089: long compareTo = nextNewMsgCheckTime
090: - ma.getNextNewMsgCheckTime();
091: return (int) compareTo;
092: }
093:
094: public boolean isReleased() {
095: return released;
096: }
097:
098: // --- Begin Work interface
099: public void release() {
100: released = true;
101: if (trace)
102: log.trace("released");
103: }
104:
105: public void run() {
106: released = false;
107: if (trace)
108: log.trace("Begin new msgs check");
109: try {
110: MailFolder mailFolder = new MailFolder(spec);
111: mailFolder.open();
112: Message[] msgs = mailFolder.getNewMessages();
113: for (int n = 0; released == false && n < msgs.length; n++) {
114: Message msg = msgs[n];
115: deliverMsg(msg);
116: }
117: mailFolder.close();
118: } catch (Exception e) {
119: log
120: .error("Failed to execute folder check, spec="
121: + spec, e);
122: }
123:
124: if (trace)
125: log.trace("End new msgs check");
126: }
127:
128: // --- End Work interface
129:
130: private void deliverMsg(Message msg) {
131: MessageEndpoint endpoint = null;
132: try {
133: endpoint = endpointFactory.createEndpoint(null);
134: if (endpoint != null) {
135: if (trace)
136: log.trace("deliverMsg, msg subject="
137: + msg.getSubject());
138: MailListener listener = (MailListener) endpoint;
139: listener.onMessage(msg);
140: }
141: } catch (Throwable e) {
142: log.debug("onMessage delivery failure", e);
143: } finally {
144: if (endpoint != null) {
145: endpoint.release();
146: }
147: }
148: }
149:
150: }
|