You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ma...@apache.org on 2007/11/21 11:44:27 UTC

svn commit: r597025 - in /mina/trunk/example/src/main/java/org/apache/mina/example/imagine: ./ step1/ step1/client/ step1/codec/ step1/server/

Author: maarten
Date: Wed Nov 21 02:44:26 2007
New Revision: 597025

URL: http://svn.apache.org/viewvc?rev=597025&view=rev
Log:
added code for tutorial on ProtocolCodecFactory

Added:
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageRequest.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageResponse.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/GraphicalCharGenClient.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageClient.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageListener.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImagePanel.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageCodecFactory.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestDecoder.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestEncoder.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseDecoder.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseEncoder.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java
    mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServerIoHandler.java

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageRequest.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageRequest.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageRequest.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageRequest.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,26 @@
+package org.apache.mina.example.imagine.step1;
+
+public class ImageRequest {
+
+    private int width;
+    private int height;
+    private int numberOfCharacters;
+
+    public ImageRequest(int width, int height, int numberOfCharacters) {
+        this.width = width;
+        this.height = height;
+        this.numberOfCharacters = numberOfCharacters;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public int getNumberOfCharacters() {
+        return numberOfCharacters;
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageResponse.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageResponse.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageResponse.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/ImageResponse.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,23 @@
+package org.apache.mina.example.imagine.step1;
+
+import java.awt.image.BufferedImage;
+
+public class ImageResponse {
+
+    private BufferedImage image1;
+
+    private BufferedImage image2;
+
+    public ImageResponse(BufferedImage image1, BufferedImage image2) {
+        this.image1 = image1;
+        this.image2 = image2;
+    }
+
+    public BufferedImage getImage1() {
+        return image1;
+    }
+
+    public BufferedImage getImage2() {
+        return image2;
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/GraphicalCharGenClient.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/GraphicalCharGenClient.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/GraphicalCharGenClient.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/GraphicalCharGenClient.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,278 @@
+package org.apache.mina.example.imagine.step1.client;
+
+import org.apache.mina.example.imagine.step1.ImageRequest;
+
+import javax.swing.JOptionPane;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.UIManager;
+import java.awt.image.BufferedImage;
+import java.awt.Checkbox;
+
+/**
+ * @author Maarten Bosteels
+ */
+@SuppressWarnings({"FieldCanBeLocal"})
+public class GraphicalCharGenClient extends javax.swing.JFrame implements ImageListener {
+    public static final int PORT = 33789;
+    public static final String HOST = "localhost";
+
+    public GraphicalCharGenClient() {
+        initComponents();
+    }
+
+    private void jButtonConnectActionPerformed() {
+        setTitle("connecting...");
+        imageClient.connect();
+    }
+
+    private void jButtonDisconnectActionPerformed() {
+        setTitle("disconnecting");
+        imageClient.disconnect();
+    }
+
+    private void jButtonSendRequestActionPerformed() {
+        sendRequest();
+    }
+
+    private void sendRequest() {
+        int chars = spinnerCharsModel.getNumber().intValue();
+        int height = spinnerHeightModel.getNumber().intValue();
+        int width = spinnerWidthModel.getNumber().intValue();
+        imageClient.sendRequest(new ImageRequest(width, height, chars));
+    }
+
+    public void onImages(BufferedImage image1, BufferedImage image2) {
+        if (checkboxContinous.getState()) {
+            // already request next image
+            sendRequest();
+        }
+        imagePanel1.setImages(image1, image2);
+    }
+
+    public void onException(Throwable throwable) {
+        Throwable cause = throwable;
+        while (cause.getCause() != null) {
+            cause = cause.getCause();
+        }
+        JOptionPane.showMessageDialog(
+            this,
+            cause.getMessage(),
+            throwable.getMessage(),
+            JOptionPane.ERROR_MESSAGE);
+    }
+
+    public void sessionOpened() {
+        jButtonDisconnect.setEnabled(true);
+        jButtonSendRequest.setEnabled(true);
+        jButtonConnect.setEnabled(false);
+        setTitle("connected");
+    }
+
+    public void sessionClosed() {
+        jButtonDisconnect.setEnabled(false);
+        jButtonSendRequest.setEnabled(false);
+        jButtonConnect.setEnabled(true);
+        setTitle("not connected");
+    }
+
+    public void setTitle(String title) {
+        super.setTitle("MINA - Chargen client - " + title);
+    }
+
+    private void initComponents() {
+        setTitle("");
+        jPanel1 = new javax.swing.JPanel();
+        jTextFieldHost = new javax.swing.JTextField();
+        jTextFieldPort = new javax.swing.JTextField();
+        jButtonConnect = new javax.swing.JButton();
+        jButtonDisconnect = new javax.swing.JButton();
+        jSpinnerWidth = new javax.swing.JSpinner();
+        jSpinnerHeight = new javax.swing.JSpinner();
+        jButtonSendRequest = new javax.swing.JButton();
+        jLabel1 = new javax.swing.JLabel();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jLabel4 = new javax.swing.JLabel();
+        jSpinnerChars = new javax.swing.JSpinner();
+        jLabel5 = new javax.swing.JLabel();
+        checkboxContinous = new java.awt.Checkbox();
+        imagePanel1 = new ImagePanel();
+
+        jSpinnerHeight.setModel(spinnerHeightModel);
+        jSpinnerWidth.setModel(spinnerWidthModel);
+        jSpinnerChars.setModel(spinnerCharsModel);
+
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+        jTextFieldHost.setText("localhost");
+
+        jTextFieldPort.setText("33789");
+
+        checkboxContinous.setLabel("continuous");
+        jButtonConnect.setText("Connect");
+        jButtonConnect.setName("connectButton");
+        jButtonConnect.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonConnectActionPerformed();
+            }
+        });
+
+        jButtonDisconnect.setText("Disconnect");
+        jButtonDisconnect.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonDisconnectActionPerformed();
+            }
+        });
+
+        jButtonSendRequest.setText("Send Request");
+        jButtonSendRequest.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonSendRequestActionPerformed();
+            }
+        });
+
+        jLabel1.setText("Host");
+        jLabel2.setText("Port");
+        jLabel3.setText("Width");
+        jLabel4.setText("Height");
+        jLabel5.setText("characters");
+        jButtonDisconnect.setEnabled(false);
+        jButtonSendRequest.setEnabled(false);
+
+        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                .addGroup(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(jLabel1)
+                    .addComponent(jLabel2))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+                    .addComponent(jTextFieldPort, javax.swing.GroupLayout.Alignment.LEADING)
+                    .addComponent(jTextFieldHost, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+                    .addComponent(jButtonConnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addComponent(jButtonDisconnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                .addGap(39, 39, 39)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(jLabel3)
+                    .addComponent(jLabel4))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+                    .addComponent(jSpinnerHeight)
+                    .addComponent(jSpinnerWidth, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(14, 14, 14)
+                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+                    .addGroup(jPanel1Layout.createSequentialGroup()
+                        .addComponent(jLabel5)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(jSpinnerChars))
+                    .addComponent(jButtonSendRequest))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 39, Short.MAX_VALUE)
+                .addComponent(checkboxContinous, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap())
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                .addGroup(jPanel1Layout.createSequentialGroup()
+                    .addContainerGap()
+                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                        .addComponent(jTextFieldHost, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jButtonConnect)
+                        .addComponent(jLabel1))
+                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE)
+                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jTextFieldPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jButtonDisconnect)
+                    .addComponent(jLabel2)))
+                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
+                    .addGap(12, 12, 12)
+                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                        .addComponent(jSpinnerWidth, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addComponent(jLabel3)
+                        .addComponent(jLabel5)
+                        .addComponent(jSpinnerChars, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 12, Short.MAX_VALUE)
+                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jSpinnerHeight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(jLabel4)
+                    .addComponent(jButtonSendRequest)))
+                .addGroup(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(checkboxContinous, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(35, Short.MAX_VALUE))
+        );
+
+        javax.swing.GroupLayout imagePanel1Layout = new javax.swing.GroupLayout(imagePanel1);
+        imagePanel1.setLayout(imagePanel1Layout);
+        imagePanel1Layout.setHorizontalGroup(
+            imagePanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                .addGap(0, 544, Short.MAX_VALUE)
+        );
+        imagePanel1Layout.setVerticalGroup(
+            imagePanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                .addGap(0, 308, Short.MAX_VALUE)
+        );
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                .addGroup(layout.createSequentialGroup()
+                    .addContainerGap()
+                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                    .addContainerGap())
+                .addComponent(imagePanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                .addGroup(layout.createSequentialGroup()
+                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(imagePanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        pack();
+    }
+
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String args[]) {
+        try {
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+        } catch (Exception e) {
+            // ignore
+        }
+        java.awt.EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                new GraphicalCharGenClient().setVisible(true);
+            }
+        });
+    }
+
+    private ImagePanel imagePanel1;
+    private javax.swing.JButton jButtonConnect;
+    private javax.swing.JButton jButtonDisconnect;
+    private javax.swing.JButton jButtonSendRequest;
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JSpinner jSpinnerChars;
+    private javax.swing.JSpinner jSpinnerHeight;
+    private javax.swing.JSpinner jSpinnerWidth;
+    private javax.swing.JTextField jTextFieldHost;
+    private javax.swing.JTextField jTextFieldPort;
+    private SpinnerNumberModel spinnerHeightModel = new SpinnerNumberModel(100, 50, 600, 25);
+    private SpinnerNumberModel spinnerWidthModel = new SpinnerNumberModel(175, 50, 1000, 25);
+    private SpinnerNumberModel spinnerCharsModel = new SpinnerNumberModel(10, 1, 60, 1);
+    private Checkbox checkboxContinous;
+    private ImageClient imageClient = new ImageClient(HOST, PORT, this);
+
+}
+

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageClient.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageClient.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageClient.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageClient.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,78 @@
+package org.apache.mina.example.imagine.step1.client;
+
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.IoHandlerAdapter;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.RuntimeIoException;
+import org.apache.mina.example.imagine.step1.ImageRequest;
+import org.apache.mina.example.imagine.step1.ImageResponse;
+import org.apache.mina.example.imagine.step1.codec.ImageCodecFactory;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.transport.socket.SocketConnector;
+import org.apache.mina.transport.socket.nio.NioSocketConnector;
+
+import java.net.InetSocketAddress;
+
+public class ImageClient extends IoHandlerAdapter {
+    public static final int CONNECT_TIMEOUT = 3000;
+
+    private String host;
+    private int port;
+    private SocketConnector connector;
+    private IoSession session;
+    private ImageListener imageListener;
+
+    public ImageClient(String host, int port, ImageListener imageListener) {
+        this.host = host;
+        this.port = port;
+        this.imageListener = imageListener;
+        connector = new NioSocketConnector();
+        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ImageCodecFactory(true)));
+        connector.setHandler(this);
+    }
+
+    public void connect() {
+        ConnectFuture connectFuture = connector.connect(new InetSocketAddress(host, port));
+        connectFuture.awaitUninterruptibly(CONNECT_TIMEOUT);
+        try {
+            session = connectFuture.getSession();
+        }
+        catch (RuntimeIoException e) {
+            imageListener.onException(e);
+        }
+    }
+
+    public void disconnect() {
+        if (session != null) {
+            session.close().awaitUninterruptibly(CONNECT_TIMEOUT);
+            session = null;
+        }
+    }
+
+    public void sessionOpened(IoSession session) throws Exception {
+        imageListener.sessionOpened();
+    }
+
+    public void sessionClosed(IoSession session) throws Exception {
+        imageListener.sessionClosed();
+    }
+
+    public void sendRequest(ImageRequest imageRequest) {
+        if (session == null) {
+            //noinspection ThrowableInstanceNeverThrown
+            imageListener.onException(new Throwable("not connected"));
+        } else {
+            session.write(imageRequest);
+        }
+    }
+
+    public void messageReceived(IoSession session, Object message) throws Exception {
+        ImageResponse response = (ImageResponse) message;
+        imageListener.onImages(response.getImage1(), response.getImage2());
+    }
+
+    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
+        imageListener.onException(cause);
+    }
+
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageListener.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageListener.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageListener.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImageListener.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,13 @@
+package org.apache.mina.example.imagine.step1.client;
+
+import java.awt.image.BufferedImage;
+
+public interface ImageListener {
+    void onImages(BufferedImage image1, BufferedImage image2);
+
+    void onException(Throwable throwable);
+
+    void sessionOpened();
+
+    void sessionClosed();
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImagePanel.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImagePanel.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImagePanel.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/client/ImagePanel.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,31 @@
+package org.apache.mina.example.imagine.step1.client;
+
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import javax.swing.JPanel;
+
+/**
+ * @author Maarten
+ */
+public class ImagePanel extends JPanel {
+
+    private BufferedImage image1;
+    private BufferedImage image2;
+
+    public void paintComponent(Graphics g) {
+        super.paintComponent(g);
+        if (image1 != null) {
+            g.drawImage(image1, 20, 20, null);
+            if (image2 != null) {
+                g.drawImage(image2, 20, image1.getHeight() + 80, null);
+            }
+        }
+    }
+
+    public void setImages(BufferedImage image1, BufferedImage image2) {
+        this.image1 = image1;
+        this.image2 = image2;
+        repaint();
+    }
+
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageCodecFactory.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageCodecFactory.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageCodecFactory.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageCodecFactory.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,29 @@
+package org.apache.mina.example.imagine.step1.codec;
+
+import org.apache.mina.filter.codec.ProtocolCodecFactory;
+import org.apache.mina.filter.codec.ProtocolEncoder;
+import org.apache.mina.filter.codec.ProtocolDecoder;
+import org.apache.mina.common.IoSession;
+
+public class ImageCodecFactory implements ProtocolCodecFactory {
+    private ProtocolEncoder encoder;
+    private ProtocolDecoder decoder;
+
+    public ImageCodecFactory(boolean client) {
+        if (client) {
+            encoder = new ImageRequestEncoder();
+            decoder = new ImageResponseDecoder();
+        } else {
+            encoder = new ImageResponseEncoder();
+            decoder = new ImageRequestDecoder();
+        }
+    }
+
+    public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception {
+        return encoder;
+    }
+
+    public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception {
+        return decoder;
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestDecoder.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestDecoder.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestDecoder.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestDecoder.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,23 @@
+package org.apache.mina.example.imagine.step1.codec;
+
+import org.apache.mina.common.IoBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.example.imagine.step1.ImageRequest;
+import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+
+public class ImageRequestDecoder extends CumulativeProtocolDecoder {
+    
+    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
+        if (in.remaining() >= 12) {
+            int width = in.getInt();
+            int height = in.getInt();
+            int numberOfCharachters = in.getInt();
+            ImageRequest request = new ImageRequest(width, height, numberOfCharachters);
+            out.write(request);
+            return true;
+        } else {
+            return false;
+        }
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestEncoder.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestEncoder.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestEncoder.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageRequestEncoder.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,24 @@
+package org.apache.mina.example.imagine.step1.codec;
+
+import org.apache.mina.common.IoBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.example.imagine.step1.ImageRequest;
+import org.apache.mina.filter.codec.ProtocolEncoder;
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
+
+public class ImageRequestEncoder implements ProtocolEncoder {
+
+    public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
+        ImageRequest request = (ImageRequest) message;
+        IoBuffer buffer = IoBuffer.allocate(12, false);
+        buffer.putInt(request.getWidth());
+        buffer.putInt(request.getHeight());
+        buffer.putInt(request.getNumberOfCharacters());
+        buffer.flip();
+        out.write(buffer);
+    }
+
+    public void dispose(IoSession session) throws Exception {
+        // nothing to dispose
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseDecoder.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseDecoder.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseDecoder.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseDecoder.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,63 @@
+package org.apache.mina.example.imagine.step1.codec;
+
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoBuffer;
+import org.apache.mina.example.imagine.step1.ImageResponse;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+public class ImageResponseDecoder extends CumulativeProtocolDecoder {
+
+    private static final String DECODER_STATE_KEY = ImageResponseDecoder.class.getName() + ".STATE";
+
+    public static final int MAX_IMAGE_SIZE = 5 * 1024 * 1024;
+
+    private static class DecoderState {
+        BufferedImage image1;
+    }
+
+    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
+        DecoderState decoderState = (DecoderState) session.getAttribute(DECODER_STATE_KEY);
+        if (decoderState == null) {
+            decoderState = new DecoderState();
+            session.setAttribute(DECODER_STATE_KEY, decoderState);
+        }
+        if (decoderState.image1 == null) {
+            // try to read first image
+            if (in.prefixedDataAvailable(4, MAX_IMAGE_SIZE)) {
+                decoderState.image1 = readImage(in);
+            } else {
+                // not enough data available to read first image
+                return false;
+            }
+        }
+        if (decoderState.image1 != null) {
+            // try to read second image
+            if (in.prefixedDataAvailable(4, MAX_IMAGE_SIZE)) {
+                BufferedImage image2 = readImage(in);
+                ImageResponse imageResponse = new ImageResponse(decoderState.image1, image2);
+                out.write(imageResponse);
+                decoderState.image1 = null;
+                return true;
+            } else {
+                // not enough data available to read second image
+                return false;
+            }
+        }
+        return false;
+    }
+
+    private BufferedImage readImage(IoBuffer in) throws IOException {
+        int length = in.getInt();
+        byte[] bytes = new byte[length];
+        in.get(bytes);
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        return ImageIO.read(bais);
+    }
+    
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseEncoder.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseEncoder.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseEncoder.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/codec/ImageResponseEncoder.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,36 @@
+package org.apache.mina.example.imagine.step1.codec;
+
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
+import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoBuffer;
+import org.apache.mina.example.imagine.step1.ImageResponse;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class ImageResponseEncoder extends ProtocolEncoderAdapter {
+
+    public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
+        ImageResponse imageResponse = (ImageResponse) message;
+        byte[] bytes1 = getBytes(imageResponse.getImage1());
+        byte[] bytes2 = getBytes(imageResponse.getImage2());
+        int capacity = bytes1.length + bytes2.length + 8;
+        IoBuffer buffer = IoBuffer.allocate(capacity, false);
+        buffer.setAutoExpand(true);
+        buffer.putInt(bytes1.length);
+        buffer.put(bytes1);
+        buffer.putInt(bytes2.length);
+        buffer.put(bytes2);
+        buffer.flip();
+        out.write(buffer);
+    }
+
+    private byte[] getBytes(BufferedImage image) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(image, "PNG", baos);
+        return baos.toByteArray();
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServer.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,22 @@
+package org.apache.mina.example.imagine.step1.server;
+
+import org.apache.mina.example.imagine.step1.codec.ImageCodecFactory;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+public class ImageServer {
+    public static final int PORT = 33789;
+
+    public static void main(String[] args) throws IOException {
+        ImageServerIoHandler handler = new ImageServerIoHandler();
+        NioSocketAcceptor acceptor = new NioSocketAcceptor();
+        acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new ImageCodecFactory(false)));
+        acceptor.setLocalAddress(new InetSocketAddress(PORT));
+        acceptor.setHandler(handler);
+        acceptor.bind();
+        System.out.println("server is listenig at port " + PORT);
+    }
+}

Added: mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServerIoHandler.java
URL: http://svn.apache.org/viewvc/mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServerIoHandler.java?rev=597025&view=auto
==============================================================================
--- mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServerIoHandler.java (added)
+++ mina/trunk/example/src/main/java/org/apache/mina/example/imagine/step1/server/ImageServerIoHandler.java Wed Nov 21 02:44:26 2007
@@ -0,0 +1,69 @@
+package org.apache.mina.example.imagine.step1.server;
+
+import org.apache.mina.common.IoHandlerAdapter;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoSessionLogger;
+import org.apache.mina.example.imagine.step1.ImageRequest;
+import org.apache.mina.example.imagine.step1.ImageResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+
+public class ImageServerIoHandler extends IoHandlerAdapter {
+
+    private final static String characters = "mina rocks abcdefghijklmnopqrstuvwxyz0123456789";
+
+    public static final String INDEX_KEY = ImageServerIoHandler.class.getName() + ".INDEX";
+
+    private Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    public void sessionOpened(IoSession session) throws Exception {
+        session.setAttribute(INDEX_KEY, 0);
+    }
+
+    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
+        IoSessionLogger sessionLogger = IoSessionLogger.getLogger(session, logger);
+        sessionLogger.warn(cause.getMessage(), cause);
+    }
+
+    public void messageReceived(IoSession session, Object message) throws Exception {
+        ImageRequest request = (ImageRequest) message;
+        String text1 = generateString(session, request.getNumberOfCharacters());
+        String text2 = generateString(session, request.getNumberOfCharacters());
+        BufferedImage image1 = createImage(request, text1);
+        BufferedImage image2 = createImage(request, text2);
+        ImageResponse response = new ImageResponse(image1, image2);
+        session.write(response);
+    }
+
+    private BufferedImage createImage(ImageRequest request, String text) {
+        BufferedImage image = new BufferedImage(request.getWidth(), request.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
+        Graphics graphics = image.createGraphics();
+        graphics.setColor(Color.YELLOW);
+        graphics.fillRect(0, 0, image.getWidth(), image.getHeight());
+        Font serif = new Font("serif", Font.PLAIN, 30);
+        graphics.setFont(serif);
+        graphics.setColor(Color.BLUE);
+        graphics.drawString(text, 10, 50);
+        return image;
+    }
+
+    private String generateString(IoSession session, int length) {
+        Integer index = (Integer) session.getAttribute(INDEX_KEY);
+        StringBuffer buffer = new StringBuffer(length);
+        while (buffer.length() < length) {
+            buffer.append(characters.charAt(index));
+            index++;
+            if (index >= characters.length()) {
+                index = 0;
+            }
+        }
+        session.setAttribute(INDEX_KEY, index);
+        return buffer.toString();
+    }
+
+}