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.generic;
022    
023    import org.granite.gravity.AbstractChannel;
024    import org.granite.gravity.AsyncHttpContext;
025    import org.granite.gravity.Gravity;
026    import org.granite.gravity.MessageReceivingException;
027    import org.granite.logging.Logger;
028    
029    import flex.messaging.messages.AsyncMessage;
030    
031    /**
032     * @author William DRAI
033     */
034    public class GenericChannel extends AbstractChannel {
035    
036        private static final Logger log = Logger.getLogger(GenericChannel.class);
037    
038        private WaitingContinuation continuation = null;
039    
040        public GenericChannel(Gravity gravity, String id, GenericChannelFactory factory, String clientType) {
041            super(gravity, id, factory, clientType);
042        }
043    
044        public void setContinuation(WaitingContinuation continuation) {
045            try {
046                if (this.continuation != null && this.continuation.isPending()) {
047                    log.debug("Set pending continuation for client: %s", getId());
048                    this.continuation.resume();
049                }
050            }
051            finally {
052                this.continuation = continuation;
053            }
054        }
055        
056        public void close() {
057            try {
058                if (this.continuation != null)
059                    this.continuation.reset();
060            }
061            finally {
062                this.continuation = null;
063            }
064        }
065        
066    
067        public void resume() {
068            try {
069                if (this.continuation != null) {
070                    log.debug("Resume pending continuation for client: %s", getId());
071                    this.continuation.resume();
072                }
073            }
074            finally {
075                this.continuation = null;
076            }
077        }
078        
079        @Override
080            public void receive(AsyncMessage message) throws MessageReceivingException {
081                    if (message == null)
082                            throw new NullPointerException("message cannot be null");
083                    
084                    receivedQueueLock.lock();
085                    try {
086                            receivedQueue.add(message);
087                    }
088                    catch (Exception e) {
089                            throw new MessageReceivingException(message, "Could not queue message", e);
090                    }
091                    finally {
092                            receivedQueueLock.unlock();
093                    }
094                    
095                    synchronized (this) {
096                            resume();
097                    }
098            }
099    
100            @Override
101            protected boolean hasAsyncHttpContext() {
102                    return false;
103            }
104    
105            @Override
106            protected void releaseAsyncHttpContext(AsyncHttpContext context) {
107            }
108    
109            @Override
110            protected AsyncHttpContext acquireAsyncHttpContext() {
111            return null;
112        }
113    
114        public boolean isLocal() {
115            return true;
116        }
117    
118            @Override
119            public void destroy() {
120                    try {
121                            super.destroy();
122                    }
123                    finally {
124                            synchronized (this) {
125                                    close();
126                            }
127                    }
128            }
129    }