Author: trustin Date: Wed Dec 8 04:50:37 2004 New Revision: 111267 URL: http://svn.apache.org/viewcvs?view=rev&rev=111267 Log: * Added 'reverser' example server which demonstrates protocol layer. * Implemented protocol layer (see FIXME) Added: incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/Main.java (contents, props changed) incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolProvider.java (contents, props changed) incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolSessionHandler.java (contents, props changed) incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/TextLineCodec.java (contents, props changed)
Added: incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/Main.java Url: http://svn.apache.org/viewcvs/incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/Main.java?view=auto&rev=111267 ============================================================================== --- (empty file) +++ incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/Main.java Wed Dec 8 04:50:37 2004 @@ -0,0 +1,44 @@ +/* + * Copyright 2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +/* + * @(#) $Id$ + */ +package org.apache.mina.examples.reverser; + +import java.net.InetSocketAddress; + +import org.apache.mina.core.Acceptor; +import org.apache.mina.core.socket.TcpAcceptor; +import org.apache.mina.protocol.CoreAdapter; + + +/** + * TODO Document me. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class Main { + private static final int PORT = 8080; + + public static void main(String[] args) throws Exception { + Acceptor acceptor = new TcpAcceptor(); + acceptor.bind(new InetSocketAddress(PORT), + CoreAdapter.adapt(new ReverseProtocolProvider())); + System.out.println("Listening on port " + PORT); + } +} Added: incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolProvider.java Url: http://svn.apache.org/viewcvs/incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolProvider.java?view=auto&rev=111267 ============================================================================== --- (empty file) +++ incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolProvider.java Wed Dec 8 04:50:37 2004 @@ -0,0 +1,28 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.examples.reverser; + +import org.apache.mina.protocol.ProtocolCodec; +import org.apache.mina.protocol.ProtocolProvider; +import org.apache.mina.protocol.ProtocolSessionHandler; + +/** + * TODO Document me. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class ReverseProtocolProvider implements ProtocolProvider { + + private static ProtocolSessionHandler HANDLER = new ReverseProtocolSessionHandler(); + + public ProtocolCodec newCodec() { + return new TextLineCodec(); + } + + public ProtocolSessionHandler getHandler() { + return HANDLER; + } + +} Added: incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolSessionHandler.java Url: http://svn.apache.org/viewcvs/incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolSessionHandler.java?view=auto&rev=111267 ============================================================================== --- (empty file) +++ incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/ReverseProtocolSessionHandler.java Wed Dec 8 04:50:37 2004 @@ -0,0 +1,51 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.examples.reverser; + +import org.apache.mina.core.IdleStatus; +import org.apache.mina.protocol.ProtocolSession; +import org.apache.mina.protocol.ProtocolSessionHandler; + +/** + * TODO Document me. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class ReverseProtocolSessionHandler implements ProtocolSessionHandler { + + public void sessionOpened(ProtocolSession session) { + System.out.println(session.getRemoteAddress() + " OPENED"); + } + + public void sessionClosed(ProtocolSession session) { + System.out.println(session.getRemoteAddress() + " CLOSED"); + } + + public void sessionIdle(ProtocolSession session, IdleStatus status) { + System.out.println(session.getRemoteAddress() + " IDLE(" + status + ")"); + } + + public void exceptionCaught(ProtocolSession session, Throwable cause) { + System.out.println(session.getRemoteAddress() + " EXCEPTION"); + cause.printStackTrace(System.out); + session.close(); + } + + public void messageReceived(ProtocolSession session, Object message) { + System.out.println(session.getRemoteAddress() + " RCVD: " + message); + + String str = message.toString(); + StringBuffer buf = new StringBuffer(str.length()); + for (int i = str.length()-1; i >= 0; i--) { + buf.append(str.charAt(i)); + } + + session.write(buf.toString()); + } + + public void messageSent(ProtocolSession session, Object message) { + System.out.println(session.getRemoteAddress() + " SENT: " + message); + } +} Added: incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/TextLineCodec.java Url: http://svn.apache.org/viewcvs/incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/TextLineCodec.java?view=auto&rev=111267 ============================================================================== --- (empty file) +++ incubator/directory/seda/branches/trustin/src/examples/org/apache/mina/examples/reverser/TextLineCodec.java Wed Dec 8 04:50:37 2004 @@ -0,0 +1,71 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.examples.reverser; + +import org.apache.mina.core.ReadBuffer; +import org.apache.mina.core.WriteBuffer; +import org.apache.mina.protocol.ProtocolCodec; +import org.apache.mina.protocol.ProtocolSession; +import org.apache.mina.protocol.ProtocolViolationException; + +/** + * TODO Document me. + * + * @author Trustin Lee ([EMAIL PROTECTED]) + * @version $Rev$, $Date$, + */ +public class TextLineCodec implements ProtocolCodec { + + private String encodeData; + private int encodePos; + private StringBuffer decodeBuf = new StringBuffer(); + + public boolean encode(ProtocolSession session, Object message, + WriteBuffer out) throws ProtocolViolationException { + + if (message != encodeData) { + String val = message.toString(); + if (val.length() > 256) { + throw new ProtocolViolationException("Cannot encode too long string."); + } + encodeData = val + "\r\n"; + encodePos = 0; + } + + for (; encodePos < encodeData.length(); encodePos++) { + if (out.hasRemaining()) { + out.put((byte) encodeData.charAt(encodePos)); + } else { + return false; + } + } + + encodeData = null; + return true; + } + + public Object decode(ProtocolSession session, ReadBuffer in) + throws ProtocolViolationException { + do { + byte b = in.get(); + switch (b) { + case '\r': + break; + case '\n': + String result = decodeBuf.toString(); + decodeBuf.delete(0, decodeBuf.length()); + return result; + default: + decodeBuf.append((char) b); + } + + if (decodeBuf.length() > 256) { + decodeBuf.delete(0, decodeBuf.length()); + throw new ProtocolViolationException("The line is too long."); + } + } while (in.hasRemaining()); + + return null; + } +}
