001    /*
002      GRANITE DATA SERVICES
003      Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004    
005      This file is part of Granite Data Services.
006    
007      Granite Data Services is free software; you can redistribute it and/or modify
008      it under the terms of the GNU Library General Public License as published by
009      the Free Software Foundation; either version 2 of the License, or (at your
010      option) any later version.
011    
012      Granite Data Services is distributed in the hope that it will be useful, but
013      WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014      FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015      for more details.
016    
017      You should have received a copy of the GNU Library General Public License
018      along with this library; if not, see <http://www.gnu.org/licenses/>.
019    */
020    
021    package org.granite.gravity;
022    
023    import java.util.concurrent.atomic.AtomicBoolean;
024    
025    /**
026     * @author Franck WOLFF
027     */
028    public abstract class AsyncChannelRunner implements Runnable {
029    
030            protected final Channel channel;
031            private final AtomicBoolean queued = new AtomicBoolean(false);
032            
033            public AsyncChannelRunner(Channel channel) {
034                    this.channel = channel;
035            }
036            
037            public final boolean queue(Gravity gravity) {
038                    if (queued.getAndSet(true))
039                            return false;
040                    gravity.execute(this);
041                    return true;
042            }
043            
044            public final void reset() {
045                    queued.set(false);
046            }
047            
048            protected abstract void doRun();
049            
050            public final void run() {
051                    try {
052                            doRun();
053                    }
054                    finally {
055                            queued.set(false);
056                    }
057            }
058    
059            @Override
060            public boolean equals(Object obj) {
061                    return getClass().isInstance(obj) && channel.equals(((AsyncChannelRunner)obj).channel);
062            }
063    
064            @Override
065            public int hashCode() {
066                    return channel.hashCode();
067            }
068    }