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 }