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();
+ }
+
+}