[Beepcore-java-commits] CVS: beepcore-java/src/org/beepcore/beep/core RequestHandler.java,NONE,1.1 C
Status: Beta
Brought to you by:
huston
From: Huston F. <hu...@us...> - 2003-06-10 18:59:56
|
Update of /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core In directory sc8-pr-cvs1:/tmp/cvs-serv21972/src/org/beepcore/beep/core Modified Files: Channel.java ChannelImpl.java Session.java SessionImpl.java TuningResetException.java Added Files: RequestHandler.java Removed Files: ThreadedMessageListener.java Log Message: More interface cleanup, added RequestHandler to replace MessageListener. --- NEW FILE: RequestHandler.java --- /* * RequestHandler.java $Revision: 1.1 $ $Date: 2003/06/10 18:59:19 $ * * Copyright (c) 2003 Huston Franklin. All rights reserved. * * The contents of this file are subject to the Blocks Public License (the * "License"); You may not use this file except in compliance with the License. * * You may obtain a copy of the License at http://www.beepcore.org/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * */ package org.beepcore.beep.core; /** * This interface is used by profiles to receive MSG messages. This handler is * registered with a channel using the <code>setRequestHandler()</code> method. * * @author Huston Franklin * @version $Revision: 1.1 $, $Date: 2003/06/10 18:59:19 $ * */ public interface RequestHandler { /** * Called to process the request in received MSG message. * * @param message MSG Message received. * * @see MessageMSG */ public void receiveMSG(MessageMSG message); } Index: Channel.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/Channel.java,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -r1.32 -r1.33 *** Channel.java 21 Apr 2003 15:09:10 -0000 1.32 --- Channel.java 10 Jun 2003 18:59:16 -0000 1.33 *************** *** 60,63 **** --- 60,64 ---- * @param listener * @return The previous MessageListener or null if none was set. + * @deprecated */ public MessageListener setMessageListener(MessageListener listener); *************** *** 65,72 **** --- 66,103 ---- /** * Returns the message listener for this channel. + * @deprecated */ public MessageListener getMessageListener(); /** + * Returns the <code>RequestHandler</code> registered with this channel. + */ + public RequestHandler getRequestHandler(); + + /** + * Sets the MSG handler for this <code>Channel</code>. + * + * @param handler <code>RequestHandler</code> to handle received + * MSG messages. + * @return The previous <code>RequestHandler</code> or <code>null</code> if + * one wasn't set. + */ + public RequestHandler setRequestHandler(RequestHandler handler); + + /** + * Sets the MSG handler for this <code>Channel</code>. + * + * @param handler <code>RequestHandler</code> to handle received + * MSG messages. + * @param tuningReset flag indicating that the profile will request a + * tuning reset. + * + * @return The previous <code>RequestHandler</code> or <code>null</code> if + * one wasn't set. + */ + public RequestHandler setRequestHandler(RequestHandler handler, + boolean tuningReset); + + /** * Returns the session for this channel. * *************** *** 92,97 **** --- 123,134 ---- throws BEEPException; + /** + * @deprecated + */ public void setStartData(String data); + /** + * @deprecated + */ public String getStartData(); Index: ChannelImpl.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/ChannelImpl.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** ChannelImpl.java 3 Jun 2003 16:38:35 -0000 1.6 --- ChannelImpl.java 10 Jun 2003 18:59:17 -0000 1.7 *************** *** 21,24 **** --- 21,26 ---- import java.util.*; + import edu.oswego.cs.dl.util.concurrent.PooledExecutor; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; *************** *** 38,42 **** * */ ! class ChannelImpl implements Channel { // class variables --- 40,44 ---- * */ ! class ChannelImpl implements Channel, Runnable { // class variables *************** *** 54,57 **** --- 56,62 ---- new BufferSegment(new byte[0]); + private static final PooledExecutor callbackQueue = + new PooledExecutor(); + /** @todo check this */ *************** *** 59,62 **** --- 64,69 ---- static final int DEFAULT_WINDOW_SIZE = 4096; + static final RequestHandler defaultHandler = new DefaultMSGHandler(); + // instance variables *************** *** 75,80 **** private String startData; ! /** receiver of messages (or partial messages) */ ! private MessageListener listener; /** number of last message sent */ --- 82,87 ---- private String startData; ! /** receiver of MSG messages */ ! private RequestHandler handler; /** number of last message sent */ *************** *** 117,153 **** private int recvWindowFreed; - private boolean notifyOnFirstFrame = true; - private Object applicationData = null; - private boolean blockingMessageListener = false; - // tuningProfile indicates that the profile for this channel will // request a tuning reset private boolean tuningProfile = false; ! // in shutting down the session ! // something for waiting synchronous messages (semaphores or something) ! ! /** ! * Create a <code>Channel</code> object. ! * ! * @param profile URI string of the profile that this channel will "speak". ! * @param number The channel number. ! * @param listener message listener that will receive callbacks for ! * messages received on this channel ! * @param session <code>Session</code> over which this channel ! * sends/receives messages ! * ! * @see org.beepcore.beep.core.Session ! * @see org.beepcore.beep.core.MessageListener ! */ ! protected ChannelImpl(String profile, String number, MessageListener listener, ! boolean blocking, SessionImpl session) { this.profile = profile; this.encoding = Constants.ENCODING_DEFAULT; this.number = number; ! this.setMessageListener(listener, blocking); this.session = session; sentSequence = 0; --- 124,140 ---- private int recvWindowFreed; private Object applicationData = null; // tuningProfile indicates that the profile for this channel will // request a tuning reset private boolean tuningProfile = false; ! ChannelImpl(String profile, String number, ! RequestHandler handler, boolean tuningReset, SessionImpl session) { this.profile = profile; this.encoding = Constants.ENCODING_DEFAULT; this.number = number; ! this.setRequestHandler(handler, tuningReset); this.session = session; sentSequence = 0; *************** *** 166,192 **** } ! protected ChannelImpl(String profile, String number, SessionImpl session) { ! this(profile, number, null, false, session); } ! /** ! * This is a special constructor for Channel Zero ! * ! * @param Session ! * @param ReplyListener ! * ! */ ! ChannelImpl(SessionImpl session, String number, ReplyListener rl) { ! this(null, number, null, false, session); // Add a MSG to the SentMSGQueue to fake channel into accepting the // greeting which comes in an unsolicited RPY. ! sentMSGQueue.add(new MessageStatus(this, Message.MESSAGE_TYPE_MSG, 0, ! null, rl)); ! recvMSGQueue.add(new MessageMSGImpl(this, 0, null)); ! state = STATE_ACTIVE; } --- 153,178 ---- } ! ChannelImpl(String profile, String number, SessionImpl session) { ! this(profile, number, defaultHandler, false, session); } ! static ChannelImpl createChannelZero(SessionImpl session, ! ReplyListener reply, ! RequestHandler handler) { ! ChannelImpl channel = new ChannelImpl(null, "0", handler, ! true, session); // Add a MSG to the SentMSGQueue to fake channel into accepting the // greeting which comes in an unsolicited RPY. ! channel.sentMSGQueue.add(new MessageStatus(channel, ! Message.MESSAGE_TYPE_MSG, 0, ! null, reply)); ! channel.recvMSGQueue.add(new MessageMSGImpl(channel, 0, null)); ! ! channel.state = STATE_ACTIVE; ! return channel; } *************** *** 301,325 **** public MessageListener setMessageListener(MessageListener ml) { - return setMessageListener(ml, true); - } - - MessageListener setMessageListener(MessageListener ml, - boolean blocking) - { MessageListener tmp = getMessageListener(); ! if (ml == null) { ! this.listener = null; ! this.blockingMessageListener = false; ! return tmp; ! } ! ! if (blocking) { ! this.listener = new ThreadedMessageListener(this, ml); ! } else { ! this.listener = ml; ! } - this.blockingMessageListener = blocking; return tmp; } --- 287,294 ---- public MessageListener setMessageListener(MessageListener ml) { MessageListener tmp = getMessageListener(); ! this.handler = new MessageListenerAdapter(ml); return tmp; } *************** *** 330,339 **** public MessageListener getMessageListener() { ! if (this.blockingMessageListener) { ! return ! ((ThreadedMessageListener)this.listener).getMessageListener(); ! } else { ! return this.listener; } } --- 299,346 ---- public MessageListener getMessageListener() { ! if (!(this.handler instanceof MessageListenerAdapter)) { ! return null; } + + return ((MessageListenerAdapter)this.handler).getMessageListener(); + } + + /** + * Returns the <code>RequestHandler</code> registered with this channel. + */ + public RequestHandler getRequestHandler() + { + return this.handler; + } + + /** + * Sets the MSG handler for this <code>Channel</code>. + * + * @param handler <code>RequestHandler</code> to handle received MSG messages. + * @return The previous <code>RequestHandler</code> or <code>null</code> if + * one wasn't set. + */ + public RequestHandler setRequestHandler(RequestHandler handler) + { + return this.setRequestHandler(handler, false); + } + + /** + * Sets the MSG handler for this <code>Channel</code>. + * + * @param handler <code>RequestHandler</code> to handle received MSG messages. + * @param tuningReset flag indicating that the profile will request a + * tuning reset. + * @return The previous <code>RequestHandler</code> or <code>null</code> if + * one wasn't set. + */ + public RequestHandler setRequestHandler(RequestHandler handler, boolean tuningReset) + { + RequestHandler tmp = this.handler; + + this.handler = handler; + this.tuningProfile = tuningReset; + + return tmp; } *************** *** 347,350 **** --- 354,369 ---- } + public void run() { + MessageMSGImpl m; + synchronized (recvMSGQueue) { + m = (MessageMSGImpl) recvMSGQueue.getFirst(); + synchronized (m) { + m.setNotified(); + } + } + + handler.receiveMSG(m); + } + /** * Sends a message of type MSG. *************** *** 470,487 **** if (recvMSGQueue.size() == 1) { try { ! listener.receiveMSG(m); ! } catch (BEEPError e) { ! try { ! m.sendERR(e); ! } catch (BEEPException e2) { ! log.error("Error sending ERR", e2); ! } ! } catch (AbortChannelException e) { ! try { ! /* @todo change this to abort or something else */ ! ChannelImpl.this.close(); ! } catch (BEEPException e2) { ! log.error("Error closing channel", e2); ! } } } --- 489,496 ---- if (recvMSGQueue.size() == 1) { try { ! callbackQueue.execute(this); ! } catch (InterruptedException e) { ! /** @TODO handle this better */ ! throw new BEEPException(e); } } *************** *** 628,634 **** } ! // notify message listener if this message has not been ! // notified before and notifyOnFirstFrame is set, the ! // window is full, this is the last frame. synchronized (m) { if (m.isNotified()) { --- 637,641 ---- } ! // notify message listener if this message has not been notified before synchronized (m) { if (m.isNotified()) { *************** *** 682,687 **** receiveFrame(frame); ! return !(frame.isLast() == true && ! getState() == STATE_TUNING || tuningProfile == true); } --- 689,697 ---- receiveFrame(frame); ! if (frame.getMessageType() == Message.MESSAGE_TYPE_MSG) { ! return !(frame.isLast() == true && tuningProfile == true); ! } else { ! return !(frame.isLast() == true && getState() == STATE_TUNING); ! } } *************** *** 830,847 **** if (m != null) { try { ! listener.receiveMSG(m); ! } catch (BEEPError e) { ! try { ! m.sendERR(e); ! } catch (BEEPException e2) { ! log.error("Error sending ERR", e2); ! } ! } catch (AbortChannelException e) { ! try { ! /* @todo change this to abort or something else */ ! ChannelImpl.this.close(); ! } catch (BEEPException e2) { ! log.error("Error closing channel", e2); ! } } } --- 840,847 ---- if (m != null) { try { ! callbackQueue.execute(this); ! } catch (InterruptedException e) { ! /** @TODO handle this better */ ! throw new BEEPException(e); } } *************** *** 1081,1084 **** --- 1081,1132 ---- { return startData; + } + + static class MessageListenerAdapter implements RequestHandler { + MessageListenerAdapter(MessageListener listener) { + this.listener = listener; + } + + public void receiveMSG(MessageMSG message) { + try { + listener.receiveMSG(message); + } catch (BEEPError e) { + try { + message.sendERR(e); + } catch (BEEPException e2) { + log.error("Error sending ERR", e2); + } + } catch (AbortChannelException e) { + try { + message.getChannel().close(); + } catch (BEEPException e2) { + log.error("Error closing channel", e2); + } + } + } + + public MessageListener getMessageListener() { + return this.listener; + } + + private Log log = LogFactory.getLog(this.getClass()); + private MessageListener listener; + } + + private static class DefaultMSGHandler implements RequestHandler { + public void receiveMSG(MessageMSG message) { + log.error("No handler registered to process MSG received on " + + "channel " + message.getChannel().getNumber()); + try { + message.sendERR(BEEPError.CODE_REQUESTED_ACTION_ABORTED, + "No MSG handler registered"); + } catch (BEEPException e) { + log.error("Error sending ERR", e); + } + } + + + private Log log = LogFactory.getLog(this.getClass()); + private MessageListener listener; } } Index: Session.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/Session.java,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -r1.35 -r1.36 *** Session.java 23 Apr 2003 15:23:04 -0000 1.35 --- Session.java 10 Jun 2003 18:59:18 -0000 1.36 *************** *** 163,166 **** --- 163,167 ---- * state to create a new Channel). * @see MessageListener + * @deprecated */ public Channel startChannel(String profile, MessageListener listener) *************** *** 170,173 **** --- 171,194 ---- * Sends a request to start a new Channel on this Session for the * specified profile. This version of <code>startChannel</code> allows a + * <code>RequestHandler</code> to be specified to be registered once the + * Channel is started. This is useful for profiles that are peer-to-peer in + * nature. + * + * @param profile The URI of the profile for the new Channel. + * @param handler A <code>RequestHandler</code> to receive MSG messages + * sent by the remote peer of this Session. + * + * @throws BEEPError Thrown if the remote peer is unable or refuses to + * start a new Channel for the requested profile. + * @throws BEEPException Thrown for errors other than those defined by + * the BEEP protocol (e.g. the Session is not in a + * state to create a new Channel). + */ + public Channel startChannel(String profile, RequestHandler handler) + throws BEEPException, BEEPError; + + /** + * Sends a request to start a new Channel on this Session for the + * specified profile. This version of <code>startChannel</code> allows a * <code>MessageListener</code> to be specified to be registered once the * Channel is started. This is useful for profiles that are peer-to-peer in *************** *** 218,221 **** --- 239,243 ---- * state to create a new Channel). * @see MessageListener + * @deprecated */ public Channel startChannel(String profile, boolean base64Encoding, *************** *** 224,227 **** --- 246,268 ---- /** + * Sends a request to start a new Channel on this Session for the + * specified profile. This version of <code>startChannel</code> allows a + * <code>RequestHandler</code> to be specified to be registered once the + * Channel is started. + * + * @param profile + * @param handler A <code>RequestHandler</code> to receive MSG messages + * sent by the remote peer of this Session. + * + * @throws BEEPError Thrown if the remote peer is unable or refuses to + * start a new Channel for the requested profile. + * @throws BEEPException Thrown for errors other than those defined by + * the BEEP protocol (e.g. the Session is not in a + * state to create a new Channel). + */ + public Channel startChannel(StartChannelProfile profile, RequestHandler handler) + throws BEEPException, BEEPError; + + /** * Sends a start channel request using the given list of profiles. * *************** *** 237,244 **** --- 278,303 ---- * @see StartChannelProfile * @see MessageListener + * @deprecated */ public Channel startChannel(Collection profiles, MessageListener listener) throws BEEPException, BEEPError; + /** + * Sends a start channel request using the given list of profiles. + * + * @param profiles A collection of <code>StartChannelProfile</code>(s). + * @param handler A <code>RequestHandler</code> to receive MSG messages + * sent by the remote peer of this Session. + * + * @throws BEEPError Thrown if the remote peer is unable or refuses to + * start a new Channel for the requested profile. + * @throws BEEPException Thrown for errors other than those defined by + * the BEEP protocol (e.g. the Session is not in a + * state to create a new Channel). + * @see StartChannelProfile + * @see RequestHandler + */ + public Channel startChannel(Collection profiles, RequestHandler handler) + throws BEEPException, BEEPError; /** Index: SessionImpl.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/SessionImpl.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -r1.7 -r1.8 *** SessionImpl.java 3 Jun 2003 16:38:35 -0000 1.7 --- SessionImpl.java 10 Jun 2003 18:59:19 -0000 1.8 *************** *** 173,178 **** GreetingListener greetingListener = new GreetingListener(); ! zero = new ChannelImpl(this, CHANNEL_ZERO, greetingListener); ! zero.setMessageListener(new ChannelZeroListener(), false); channels.put(CHANNEL_ZERO, zero); --- 173,178 ---- GreetingListener greetingListener = new GreetingListener(); ! zero = ChannelImpl.createChannelZero(this, greetingListener, ! new ChannelImpl.MessageListenerAdapter(new ChannelZeroListener())); channels.put(CHANNEL_ZERO, zero); *************** *** 224,229 **** GreetingListener greetingListener = new GreetingListener(); ! zero = new ChannelImpl(this, CHANNEL_ZERO, greetingListener); ! zero.setMessageListener(new ChannelZeroListener(), false); channels.put(CHANNEL_ZERO, zero); --- 224,229 ---- GreetingListener greetingListener = new GreetingListener(); ! zero = ChannelImpl.createChannelZero(this, greetingListener, ! new ChannelImpl.MessageListenerAdapter(new ChannelZeroListener())); channels.put(CHANNEL_ZERO, zero); *************** *** 420,455 **** } - /** - * Sends a start channel request using the specified profile. - * - * @param profile The uri of the profile for the channel you wish to start. - * - * @return A <code>Channel</code> for the specified profile. - * - * @throws BEEPError Thrown if an error occurs in the under lying transport. - * @throws BEEPException Thrown if any of the parameters are invalid, - * or if the profile is unavailable on this <code>Session</code>. - */ public Channel startChannel(String profile) throws BEEPException, BEEPError { ! return startChannel(profile, null); } - /** - * Sends a start channel request using the specified profile. - * - * @param profile The uri of the profile for the channel you wish to start. - * @param listener An implementation of <code>MessageListener</code> that - * is to receive message callbacks for this channel. It can be null, but - * don't expect to be called back. - * - * @return A <code>Channel</code> for the specified profile. - * - * @throws BEEPError Thrown if an error occurs in the under lying transport. - * @throws BEEPException Thrown if any of the parameters are invalid, - * or if the profile is unavailable on this <code>Session</code>. - * @see MessageListener - */ public Channel startChannel(String profile, MessageListener listener) throws BEEPException, BEEPError --- 420,429 ---- } public Channel startChannel(String profile) throws BEEPException, BEEPError { ! return startChannel(profile, (RequestHandler)null); } public Channel startChannel(String profile, MessageListener listener) throws BEEPException, BEEPError *************** *** 463,493 **** } public Channel startChannel(String profile, boolean base64Encoding, String data) throws BEEPException, BEEPError { ! return startChannel(profile, base64Encoding, data, null); } - /** - * Sends a start channel request using the specified profile. - * - * @param profile The uri of the profile for the channel you wish to start. - * @param base64Encoding Indicates whether or not the data is base64 - * encoded. - * @param data The associated data or initial element for the profile of - * the channel you wish to start. - * @param listener An implementation of <code>MessageListener</code> that - * is to receive message callbacks for this channel. It can be null, but - * don't expect to be called back. - * - * @return A <code>Channel<code> for the specified profile. - * - * @throws BEEPError Thrown if an error occurs in the under lying - * transport. - * @throws BEEPException Thrown if any of the parameters are invalid, - * or if the profile is unavailable on this <code>Session</code>. - * @see MessageListener - */ public Channel startChannel(String profile, boolean base64Encoding, String data, MessageListener listener) --- 437,460 ---- } + public Channel startChannel(String profile, RequestHandler handler) + throws BEEPException, BEEPError + { + StartChannelProfile p = new StartChannelProfile(profile); + LinkedList l = new LinkedList(); + + l.add(p); + + return startChannelRequest(l, handler, false); + } + public Channel startChannel(String profile, boolean base64Encoding, String data) throws BEEPException, BEEPError { ! StartChannelProfile p = new StartChannelProfile(profile, ! base64Encoding, data); ! return startChannel(p, null); } public Channel startChannel(String profile, boolean base64Encoding, String data, MessageListener listener) *************** *** 502,523 **** return startChannelRequest(l, listener, false); } - /** - * Sends a start channel request using the given list of profiles. - * - * @param profiles A collection of <code>StartChannelProfile</code>(s). - * @param listener An implementation of <code>MessageListener</code> - * that is to receive message callbacks for this channel. - * It can be null, but don't expect to be called back. - * - * @return a started channel for the profile selected by the listener - * - * @throws BEEPError Thrown if an error occurs in the under lying - * transport. - * @throws BEEPException Thrown if any of the parameters are invalid, - * or if the profile is unavailable on this <code>Session</code>. - * @see StartChannelProfile - * @see MessageListener - */ public Channel startChannel(Collection profiles, MessageListener listener) throws BEEPException, BEEPError --- 469,483 ---- return startChannelRequest(l, listener, false); } + + public Channel startChannel(StartChannelProfile profile, RequestHandler handler) + throws BEEPException, BEEPError + { + LinkedList l = new LinkedList(); + + l.add(profile); + + return startChannelRequest(l, handler, false); + } public Channel startChannel(Collection profiles, MessageListener listener) throws BEEPException, BEEPError *************** *** 526,539 **** } - /** - * You should not see this. - */ Channel startChannelRequest(Collection profiles, MessageListener listener, boolean tuning) throws BEEPException, BEEPError { - // Block here if there's an exclusive lock, which - // would change our channel #... String channelNumber = getNextFreeChannelNumber(); --- 486,509 ---- } Channel startChannelRequest(Collection profiles, MessageListener listener, boolean tuning) + throws BEEPException, BEEPError + { + return startChannelRequest(profiles, + listener == null ? null : new ChannelImpl.MessageListenerAdapter(listener), + tuning); + } + + public Channel startChannel(Collection profiles, RequestHandler handler) + throws BEEPException, BEEPError + { + return startChannelRequest(profiles, handler, false); + } + + Channel startChannelRequest(Collection profiles, RequestHandler handler, + boolean tuning) throws BEEPException, BEEPError { String channelNumber = getNextFreeChannelNumber(); *************** *** 576,580 **** // @todo handle the data element // Create a channel ! ChannelImpl ch = new ChannelImpl(null, channelNumber, listener, true, this); // Make a message --- 546,551 ---- // @todo handle the data element // Create a channel ! ChannelImpl ch = new ChannelImpl(null, channelNumber, handler, false, ! this); // Make a message *************** *** 991,995 **** ch.setState(ChannelImpl.STATE_ACTIVE); channels.put(ch.getNumberAsString(), ch); ! ((Message)zero.getAppData()).sendRPY(ds); } --- 962,966 ---- ch.setState(ChannelImpl.STATE_ACTIVE); channels.put(ch.getNumberAsString(), ch); ! ((MessageMSG)zero.getAppData()).sendRPY(ds); } *************** *** 1089,1092 **** --- 1060,1065 ---- } + enableIO(); + ChannelImpl channel = (ChannelImpl) channels.get(channelNumber); *************** *** 1115,1119 **** try { ! ((Message)zero.getAppData()).sendRPY(sds); } catch (BEEPException x) { terminate("Error sending RPY for <close>"); --- 1088,1092 ---- try { ! ((MessageMSG)zero.getAppData()).sendRPY(sds); } catch (BEEPException x) { terminate("Error sending RPY for <close>"); *************** *** 1167,1170 **** --- 1140,1144 ---- changeState(SESSION_STATE_ACTIVE); + enableIO(); throw e; } catch (BEEPException x) { *************** *** 1182,1186 **** try { ! ((Message)zero.getAppData()).sendRPY(sds); } catch (BEEPException x) { terminate("Error sending RPY for <close> for channel 0"); --- 1156,1160 ---- try { ! ((MessageMSG)zero.getAppData()).sendRPY(sds); } catch (BEEPException x) { terminate("Error sending RPY for <close> for channel 0"); *************** *** 1189,1194 **** } - this.disableIO(); - try { this.changeState(SESSION_STATE_CLOSED); --- 1163,1166 ---- *************** *** 1240,1245 **** * we've received a start channel request over the wire. */ ! private boolean processStartChannel(String channelNumber, ! Collection profiles) throws BEEPError { --- 1212,1217 ---- * we've received a start channel request over the wire. */ ! private void processStartChannel(String channelNumber, ! Collection profiles) throws BEEPError { *************** *** 1270,1282 **** fireChannelStarted(ch); ! return true; } catch (StartChannelException e) { try { ! ((Message)zero.getAppData()).sendERR(e); } catch (BEEPException x) { terminate("Error sending ERR response to start channel"); } ! return false; } --- 1242,1254 ---- fireChannelStarted(ch); ! return; } catch (StartChannelException e) { try { ! ((MessageMSG)zero.getAppData()).sendERR(e); } catch (BEEPException x) { terminate("Error sending ERR response to start channel"); } ! return; } *************** *** 1286,1304 **** terminate("Error sending profile. " + e.getMessage()); ! return false; } fireChannelStarted(ch); ! return true; } try { ! ((Message)zero.getAppData()).sendERR(BEEPError.CODE_REQUESTED_ACTION_NOT_TAKEN2, "all requested profiles are unsupported"); } catch (Exception x) { terminate("Error sending error. " + x.getMessage()); } - - return false; } --- 1258,1278 ---- terminate("Error sending profile. " + e.getMessage()); ! return; } fireChannelStarted(ch); ! if (p.data == null || ch.getState() != ChannelImpl.STATE_TUNING) { ! this.enableIO(); ! } ! ! return; } try { ! ((MessageMSG)zero.getAppData()).sendERR(BEEPError.CODE_REQUESTED_ACTION_NOT_TAKEN2, "all requested profiles are unsupported"); } catch (Exception x) { terminate("Error sending error. " + x.getMessage()); } } *************** *** 1441,1477 **** else if (elementName.equals("close")) { log.debug("Received a channel close request"); ! String channelNumber = topElement.getAttribute("number"); ! ! if (channelNumber == null) { ! throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, ! "Malformed <close>: no channel number"); ! } ! String code = topElement.getAttribute("code"); ! if (code == null) { ! throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, ! "Malformed <close>: no code attribute"); ! } ! // this attribute is implied ! String xmlLang = topElement.getAttribute("xml:lang"); ! String data = null; ! Node dataNode = topElement.getFirstChild(); ! if (dataNode != null) { ! data = dataNode.getNodeValue(); ! if (data.length() > MAX_PCDATA_SIZE) { ! throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, ! "Element's PCDATA exceeds " + ! "the maximum size"); } } - SessionImpl.this.zero.setAppData(message); - SessionImpl.this.receiveCloseChannel(channelNumber, code, - xmlLang, data); } else { throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, --- 1415,1456 ---- else if (elementName.equals("close")) { log.debug("Received a channel close request"); + + try { + String channelNumber = topElement.getAttribute("number"); ! if (channelNumber == null) { ! throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, ! "Malformed <close>: no channel number"); ! } ! String code = topElement.getAttribute("code"); ! if (code == null) { ! throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, ! "Malformed <close>: no code attribute"); ! } ! // this attribute is implied ! String xmlLang = topElement.getAttribute("xml:lang"); ! String data = null; ! Node dataNode = topElement.getFirstChild(); ! if (dataNode != null) { ! data = dataNode.getNodeValue(); ! if (data.length() > MAX_PCDATA_SIZE) { ! throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, ! "Element's PCDATA exceeds " + ! "the maximum size"); ! } } + SessionImpl.this.zero.setAppData(message); + SessionImpl.this.receiveCloseChannel(channelNumber, code, + xmlLang, data); + } catch (BEEPError e) { + enableIO(); + throw e; } } else { throw new BEEPError(BEEPError.CODE_PARAMETER_ERROR, *************** *** 1938,1942 **** static class CLOSED_SessionOperations implements SessionOperations { public void changeState(SessionImpl s, int newState) throws BEEPException { ! throw new BEEPException("Illegal session state transition"); } --- 1917,1922 ---- static class CLOSED_SessionOperations implements SessionOperations { public void changeState(SessionImpl s, int newState) throws BEEPException { ! throw new BEEPException("Illegal session state transition (" + ! newState + ")"); } Index: TuningResetException.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/TuningResetException.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** TuningResetException.java 8 Nov 2001 05:51:34 -0000 1.2 --- TuningResetException.java 10 Jun 2003 18:59:20 -0000 1.3 *************** *** 37,40 **** --- 37,41 ---- * @param message * + * @TODO remove this class */ public TuningResetException(String message) --- ThreadedMessageListener.java DELETED --- |