trying new codec idea, apated HTTP codec for using it
diff --git a/codec/pom.xml b/codec/pom.xml
new file mode 100644
index 0000000..2ed93ad
--- /dev/null
+++ b/codec/pom.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you 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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.mina</groupId>
+ <artifactId>mina-parent</artifactId>
+ <version>3.0.0-M1-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>mina-codec</artifactId>
+ <name>Apache MINA Codec ${project.version}</name>
+ <packaging>bundle</packaging>
+
+ <properties>
+ <symbolicName>${project.groupId}.codec</symbolicName>
+ <exportedPackage>${project.groupId}</exportedPackage>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.logging.log4j.adapters</groupId>
+ <artifactId>slf4j-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
+
diff --git a/codec/src/main/java/org/apache/mina/codec/ProtocolDecoder.java b/codec/src/main/java/org/apache/mina/codec/ProtocolDecoder.java
new file mode 100644
index 0000000..8c4ffdd
--- /dev/null
+++ b/codec/src/main/java/org/apache/mina/codec/ProtocolDecoder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ *
+ */
+package org.apache.mina.codec;
+
+/**
+ * Decodes binary or protocol-specific data into higher-level message objects.
+ *
+ * Should be state-full, and have one instance per new session.
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ *
+ */
+public interface ProtocolDecoder<INPUT, OUTPUT> {
+
+ /**
+ * Decode binary or protocol-specific content of type <code>INPUT</code> into higher-level protocol message objects,
+ * of type OUTPUT
+ *
+ * @param input the received message to decode
+ * @return the decoded messages or <code>null</code> if nothing was decoded
+ * @throws ProtocolDecoderException if something wrong happen during decoding (e.g. : a malformed input message)
+ */
+ OUTPUT[] decode(INPUT input) throws ProtocolDecoderException;
+
+ /**
+ * Finish decoding, for example if the decoder accumulated some unused input, it should discard it, or throw an
+ * Exception
+ */
+ void finishDecode();
+}
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java b/codec/src/main/java/org/apache/mina/codec/ProtocolDecoderException.java
similarity index 61%
copy from core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
copy to codec/src/main/java/org/apache/mina/codec/ProtocolDecoderException.java
index 6bbc55e..e098b27 100644
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
+++ b/codec/src/main/java/org/apache/mina/codec/ProtocolDecoderException.java
@@ -17,23 +17,29 @@
* under the License.
*
*/
-package org.apache.mina.filter.codec;
-
-import java.nio.ByteBuffer;
-
-import org.apache.mina.api.IoSession;
+package org.apache.mina.codec;
/**
- * In charge of encoding a message of type MESSAGE into another form (could be a {@link ByteBuffer} or any other protocol level construction.
+ * Exception thrown by a {@link ProtocolDecoder} if something wrong happen during decoding.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
- *
*/
-public interface ProtocolEncoder<INPUT /* message type */, OUTPUT> {
+@SuppressWarnings("serial")
+public class ProtocolDecoderException extends Exception {
- /**
- * Encodes higher-level message objects of type <code>INPUT</code> into binary or protocol-specific data of type <code>OUTPUT</code>.
- */
- OUTPUT encode(IoSession session, INPUT message);
+ public ProtocolDecoderException() {
+ super();
+ }
+ public ProtocolDecoderException(String message) {
+ super(message);
+ }
+
+ public ProtocolDecoderException(Throwable cause) {
+ super(cause);
+ }
+
+ public ProtocolDecoderException(String message, Throwable cause) {
+ super(message, cause);
+ }
}
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java b/codec/src/main/java/org/apache/mina/codec/ProtocolEncoder.java
similarity index 80%
rename from core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
rename to codec/src/main/java/org/apache/mina/codec/ProtocolEncoder.java
index 6bbc55e..f439f51 100644
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
+++ b/codec/src/main/java/org/apache/mina/codec/ProtocolEncoder.java
@@ -17,14 +17,13 @@
* under the License.
*
*/
-package org.apache.mina.filter.codec;
+package org.apache.mina.codec;
import java.nio.ByteBuffer;
-import org.apache.mina.api.IoSession;
-
/**
- * In charge of encoding a message of type MESSAGE into another form (could be a {@link ByteBuffer} or any other protocol level construction.
+ * In charge of encoding a message of type MESSAGE into another form (could be a {@link ByteBuffer} or any other
+ * protocol level construction.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*
@@ -32,8 +31,9 @@
public interface ProtocolEncoder<INPUT /* message type */, OUTPUT> {
/**
- * Encodes higher-level message objects of type <code>INPUT</code> into binary or protocol-specific data of type <code>OUTPUT</code>.
+ * Encodes higher-level message objects of type <code>INPUT</code> into binary or protocol-specific data of type
+ * <code>OUTPUT</code>.
*/
- OUTPUT encode(IoSession session, INPUT message);
+ OUTPUT encode(INPUT message);
}
\ No newline at end of file
diff --git a/core/pom.xml b/core/pom.xml
index fb85ba1..7e75056 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -38,6 +38,13 @@
<dependencies>
<dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>mina-codec</artifactId>
+ <version>${project.version}</version>
+ <type>bundle</type>
+ </dependency>
+
+ <dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFactory.java b/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFactory.java
index 7406b41..1f72812 100644
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFactory.java
+++ b/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFactory.java
@@ -20,6 +20,8 @@
package org.apache.mina.filter.codec;
import org.apache.mina.api.IoSession;
+import org.apache.mina.codec.ProtocolDecoder;
+import org.apache.mina.codec.ProtocolEncoder;
/**
* Provides {@link ProtocolEncoder} and {@link ProtocolDecoder} which translates
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java b/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
index 2938cf3..e7970c0 100644
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
+++ b/core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java
@@ -22,6 +22,9 @@
import org.apache.mina.api.AbstractIoFilter;
import org.apache.mina.api.IoFilter;
import org.apache.mina.api.IoSession;
+import org.apache.mina.codec.ProtocolDecoder;
+import org.apache.mina.codec.ProtocolDecoderException;
+import org.apache.mina.codec.ProtocolEncoder;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.filterchain.WriteFilterChainController;
import org.apache.mina.session.AttributeKey;
@@ -36,7 +39,7 @@
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
-public class ProtocolCodecFilter<MESSAGE,ENCODED> extends AbstractIoFilter {
+public class ProtocolCodecFilter<MESSAGE, ENCODED> extends AbstractIoFilter {
/** A logger for this class */
private static final Logger LOGGER = LoggerFactory.getLogger(ProtocolCodecFilter.class);
@@ -44,16 +47,16 @@
/** key for session attribute holding the encoder */
@SuppressWarnings("rawtypes")
- private final AttributeKey<ProtocolEncoder> ENCODER = new AttributeKey<ProtocolEncoder>(ProtocolEncoder.class,
+ private final AttributeKey<ProtocolEncoder> ENCODER = new AttributeKey<ProtocolEncoder>(ProtocolEncoder.class,
"internal_encoder");
/** key for session attribute holding the decoder */
@SuppressWarnings("rawtypes")
- private final AttributeKey<ProtocolDecoder> DECODER = new AttributeKey<ProtocolDecoder>(ProtocolDecoder.class,
+ private final AttributeKey<ProtocolDecoder> DECODER = new AttributeKey<ProtocolDecoder>(ProtocolDecoder.class,
"internal_decoder");
/** The factory responsible for creating the encoder and decoder */
- private final ProtocolCodecFactory<MESSAGE,ENCODED> factory;
+ private final ProtocolCodecFactory<MESSAGE, ENCODED> factory;
/**
*
@@ -61,7 +64,7 @@
*
* @param factory The associated factory
*/
- public ProtocolCodecFilter(final ProtocolCodecFactory<MESSAGE,ENCODED> factory) {
+ public ProtocolCodecFilter(final ProtocolCodecFactory<MESSAGE, ENCODED> factory) {
if (factory == null) {
throw new IllegalArgumentException("factory");
}
@@ -71,44 +74,14 @@
/**
* Creates a new instance of ProtocolCodecFilter, without any factory. The encoder/decoder factory will be created
- * as an inner class, using the two parameters (encoder and decoder).
- *
- * @param encoder The class responsible for encoding the message
- * @param decoder The class responsible for decoding the message
- */
- public ProtocolCodecFilter(final ProtocolEncoder<MESSAGE,ENCODED> encoder, final ProtocolDecoder<ENCODED,MESSAGE> decoder) {
- if (encoder == null) {
- throw new IllegalArgumentException("encoder");
- }
-
- if (decoder == null) {
- throw new IllegalArgumentException("decoder");
- }
-
- // Create the inner Factory based on the two parameters
- this.factory = new ProtocolCodecFactory<MESSAGE,ENCODED>() {
- @Override
- public ProtocolEncoder<MESSAGE,ENCODED> getEncoder(final IoSession session) {
- return encoder;
- }
-
- @Override
- public ProtocolDecoder<ENCODED,MESSAGE> getDecoder(final IoSession session) {
- return decoder;
- }
- };
- }
-
- /**
- * Creates a new instance of ProtocolCodecFilter, without any factory. The encoder/decoder factory will be created
* as an anonymous class, using the two parameters (encoder and decoder), which are class names. Instances for those
* classes will be created in this constructor.
*
* @param encoderClass The class responsible for encoding the message
* @param decoderClass The class responsible for decoding the message
*/
- public ProtocolCodecFilter(final Class<? extends ProtocolEncoder<MESSAGE,ENCODED>> encoderClass,
- final Class<? extends ProtocolDecoder<ENCODED,MESSAGE>> decoderClass) {
+ public ProtocolCodecFilter(final Class<? extends ProtocolEncoder<MESSAGE, ENCODED>> encoderClass,
+ final Class<? extends ProtocolDecoder<ENCODED, MESSAGE>> decoderClass) {
Assert.assertNotNull(encoderClass, "Encoder Class");
Assert.assertNotNull(decoderClass, "Decoder Class");
@@ -124,7 +97,7 @@
throw new IllegalArgumentException("decoderClass doesn't have a public default constructor.");
}
- final ProtocolEncoder<MESSAGE,ENCODED> encoder;
+ final ProtocolEncoder<MESSAGE, ENCODED> encoder;
try {
encoder = encoderClass.newInstance();
@@ -132,7 +105,7 @@
throw new IllegalArgumentException("encoderClass cannot be initialized");
}
- final ProtocolDecoder<ENCODED,MESSAGE> decoder;
+ final ProtocolDecoder<ENCODED, MESSAGE> decoder;
try {
decoder = decoderClass.newInstance();
@@ -141,14 +114,14 @@
}
// Create the inner factory based on the two parameters.
- this.factory = new ProtocolCodecFactory<MESSAGE,ENCODED>() {
+ this.factory = new ProtocolCodecFactory<MESSAGE, ENCODED>() {
@Override
- public ProtocolEncoder<MESSAGE,ENCODED> getEncoder(final IoSession session) {
+ public ProtocolEncoder<MESSAGE, ENCODED> getEncoder(final IoSession session) {
return encoder;
}
@Override
- public ProtocolDecoder<ENCODED,MESSAGE> getDecoder(final IoSession session) {
+ public ProtocolDecoder<ENCODED, MESSAGE> getDecoder(final IoSession session) {
return decoder;
}
};
@@ -160,7 +133,7 @@
* @param session The associated session we will get the encoder from
* @return The encoder instance, if any
*/
- public ProtocolEncoder<MESSAGE,ENCODED> getEncoder(final IoSession session) {
+ public ProtocolEncoder<MESSAGE, ENCODED> getEncoder(final IoSession session) {
return factory.getEncoder(session);
}
@@ -170,7 +143,7 @@
* @param session The associated session we will get the decoder from
* @return The decoder instance, if any
*/
- public ProtocolDecoder<ENCODED,MESSAGE> getDecoder(final IoSession session) {
+ public ProtocolDecoder<ENCODED, MESSAGE> getDecoder(final IoSession session) {
return factory.getDecoder(session);
}
@@ -184,31 +157,38 @@
* break;
* </code>
*/
+ @SuppressWarnings("unchecked")
@Override
- public void messageReceived(final IoSession session, final Object in,
- final ReadFilterChainController controller) {
+ public void messageReceived(final IoSession session, final Object in, final ReadFilterChainController controller) {
LOGGER.debug("Processing a MESSAGE_RECEIVED for session {}", session);
- final ProtocolDecoder<ENCODED,MESSAGE> decoder = getDecoder(session);
+ final ProtocolDecoder<ENCODED, MESSAGE> decoder = getDecoder(session);
// Loop until the codec cannot decode more
- MESSAGE msg;
- while ( (msg = decoder.decode(session, (ENCODED)in)) != null) {
- controller.callReadNextFilter(msg);
+ MESSAGE[] msg;
+ try {
+ while ((msg = decoder.decode((ENCODED) in)) != null) {
+ for (MESSAGE m : msg) {
+ controller.callReadNextFilter(m);
+ }
+ }
+ } catch (ProtocolDecoderException e) {
+ LOGGER.debug("decoding exception : ", e);
}
}
/**
* {@inheritDoc}
*/
+ @SuppressWarnings("unchecked")
@Override
public void messageWriting(IoSession session, WriteRequest message, WriteFilterChainController controller) {
LOGGER.debug("Processing a MESSAGE_WRITTING for session {}", session);
- final ProtocolEncoder<MESSAGE,ENCODED> encoder = session.getAttribute(ENCODER, null);
- ENCODED encoded = encoder.encode(session,(MESSAGE) message.getMessage());
+ final ProtocolEncoder<MESSAGE, ENCODED> encoder = session.getAttribute(ENCODER, null);
+ ENCODED encoded = encoder.encode((MESSAGE) message.getMessage());
message.setMessage(encoded);
-
+
controller.callWriteNextFilter(message);
}
@@ -219,9 +199,9 @@
public void sessionOpened(final IoSession session) {
// Initialize the encoder and decoder if we use a factory
if (factory != null) {
- final ProtocolEncoder<MESSAGE,ENCODED> encoder = factory.getEncoder(session);
+ final ProtocolEncoder<MESSAGE, ENCODED> encoder = factory.getEncoder(session);
session.setAttribute(ENCODER, encoder);
- final ProtocolDecoder<ENCODED,MESSAGE> decoder = factory.getDecoder(session);
+ final ProtocolDecoder<ENCODED, MESSAGE> decoder = factory.getDecoder(session);
session.setAttribute(DECODER, decoder);
}
}
@@ -258,9 +238,10 @@
* method.
*/
private void disposeDecoder(final IoSession session) {
- final ProtocolDecoder<ENCODED,MESSAGE> decoder = session.removeAttribute(DECODER);
+ @SuppressWarnings("unchecked")
+ final ProtocolDecoder<ENCODED, MESSAGE> decoder = session.removeAttribute(DECODER);
try {
- decoder.finishDecode(session);
+ decoder.finishDecode();
} catch (final Throwable t) {
LOGGER.warn("Failed to dispose: " + decoder.getClass().getName() + " (" + decoder + ')');
}
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java b/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java
deleted file mode 100644
index 435f9d1..0000000
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolDecoder.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- *
- */
-package org.apache.mina.filter.codec;
-
-import org.apache.mina.api.IoSession;
-
-/**
- * Decodes binary or protocol-specific data into higher-level message objects.
- *
- * @author <a href="http://mina.apache.org">Apache MINA Project</a>
- *
- */
-public interface ProtocolDecoder<INPUT,OUTPUT> {
-
- /**
- * Decode binary or protocol-specific content of type <code>INPUT</code> into higher-level protocol message objects, of type OUTPUT
- * @param session the session for this message
- * @param input the received message to decode
- * @return the decoded message or <code>null</code> if nothing was decoded
- */
- OUTPUT decode(IoSession session, INPUT input);
-
- /**
- * Finish decoding, for example if the decoder accumulated some unused input, it should discard it, or throw an Exception
- */
- void finishDecode(IoSession session);
-}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/mina/filter/codec/ProtocolCodecFilterTest.java b/core/src/test/java/org/apache/mina/filter/codec/ProtocolCodecFilterTest.java
index d4de8ea..f70415f 100644
--- a/core/src/test/java/org/apache/mina/filter/codec/ProtocolCodecFilterTest.java
+++ b/core/src/test/java/org/apache/mina/filter/codec/ProtocolCodecFilterTest.java
@@ -18,21 +18,22 @@
*/
package org.apache.mina.filter.codec;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
import org.apache.mina.api.IoSession;
+import org.apache.mina.codec.ProtocolDecoder;
+import org.apache.mina.codec.ProtocolEncoder;
import org.junit.Test;
/**
* Unit test for {@link ProtocolCodecFilter}
- *
+ *
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class ProtocolCodecFilterTest {
+ @SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void constructor_args() {
try {
@@ -45,24 +46,6 @@
}
try {
- new ProtocolCodecFilter(null, mock(ProtocolDecoder.class));
- fail();
- } catch (IllegalArgumentException e) {
- // happy
- } catch (Exception e2) {
- fail();
- }
-
- try {
- new ProtocolCodecFilter(mock(ProtocolEncoder.class), null);
- fail();
- } catch (IllegalArgumentException e) {
- // happy
- } catch (Exception e2) {
- fail();
- }
-
- try {
new ProtocolCodecFilter(null, ProtocolDecoder.class);
fail();
} catch (IllegalArgumentException e) {
@@ -81,6 +64,7 @@
}
}
+ @SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void codec_factory() {
ProtocolEncoder encoder = mock(ProtocolEncoder.class);
@@ -93,10 +77,6 @@
ProtocolCodecFilter codec = new ProtocolCodecFilter(factory);
assertEquals(encoder, codec.getEncoder(null));
assertEquals(decoder, codec.getDecoder(null));
-
- codec = new ProtocolCodecFilter(encoder, decoder);
- assertEquals(encoder, codec.getEncoder(null));
- assertEquals(decoder, codec.getDecoder(null));
}
}
\ No newline at end of file
diff --git a/examples/src/main/java/org/apache/mina/examples/http/HttpTest.java b/examples/src/main/java/org/apache/mina/examples/http/HttpTest.java
index edec192..df6c020 100644
--- a/examples/src/main/java/org/apache/mina/examples/http/HttpTest.java
+++ b/examples/src/main/java/org/apache/mina/examples/http/HttpTest.java
@@ -28,13 +28,15 @@
import org.apache.mina.api.AbstractIoFilter;
import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.logging.LoggingFilter;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.http.DateUtil;
-import org.apache.mina.http.HttpServerCodec;
+import org.apache.mina.http.HttpServerDecoder;
+import org.apache.mina.http.HttpServerEncoder;
import org.apache.mina.http.api.DefaultHttpResponse;
import org.apache.mina.http.api.HttpEndOfContent;
import org.apache.mina.http.api.HttpMethod;
+import org.apache.mina.http.api.HttpPdu;
import org.apache.mina.http.api.HttpRequest;
import org.apache.mina.http.api.HttpStatus;
import org.apache.mina.http.api.HttpVersion;
@@ -45,7 +47,8 @@
public static void main(String[] args) throws Exception {
NioTcpServer acceptor = new NioTcpServer();
- acceptor.setFilters(new LoggingFilter("INCOMING"), new HttpServerCodec(), new LoggingFilter("DECODED"),
+ acceptor.setFilters(/* new LoggingFilter("INCOMING"), */new ProtocolCodecFilter<HttpPdu, ByteBuffer>(
+ HttpServerEncoder.class, HttpServerDecoder.class), /* new LoggingFilter("DECODED"), */
new DummyHttpSever());
acceptor.getSessionConfig().setTcpNoDelay(true);
diff --git a/http/src/main/java/org/apache/mina/http/HttpRequestImpl.java b/http/src/main/java/org/apache/mina/http/HttpRequestImpl.java
index b114a2f..71f095d 100644
--- a/http/src/main/java/org/apache/mina/http/HttpRequestImpl.java
+++ b/http/src/main/java/org/apache/mina/http/HttpRequestImpl.java
@@ -19,11 +19,13 @@
*/
package org.apache.mina.http;
+import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.mina.http.api.HttpMethod;
+import org.apache.mina.http.api.HttpPduEncodingVisitor;
import org.apache.mina.http.api.HttpRequest;
import org.apache.mina.http.api.HttpVersion;
@@ -44,61 +46,99 @@
this.headers = Collections.unmodifiableMap(headers);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public HttpVersion getProtocolVersion() {
return version;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public String getContentType() {
return headers.get("content-type");
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean isKeepAlive() {
- // TODO Auto-generated method stub
+ // TODO check headers
return false;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public String getHeader(String name) {
return headers.get(name);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean containsHeader(String name) {
return headers.containsKey(name);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public Map<String, String> getHeaders() {
return headers;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean containsParameter(String name) {
// TODO Auto-generated method stub
return false;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
return null;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public Map<String, List<String>> getParameters() {
// TODO Auto-generated method stub
return null;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public HttpMethod getMethod() {
return method;
}
@Override
+ public ByteBuffer encode(HttpPduEncodingVisitor visitor) {
+ return visitor.visit(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public String toString() {
String result = "HTTP REQUEST METHOD: " + method + "\n";
result += "VERSION: " + version + "\n";
@@ -116,4 +156,4 @@
*/
return result;
}
-}
+}
\ No newline at end of file
diff --git a/http/src/main/java/org/apache/mina/http/HttpServerCodec.java b/http/src/main/java/org/apache/mina/http/HttpServerCodec.java
deleted file mode 100644
index 706659f..0000000
--- a/http/src/main/java/org/apache/mina/http/HttpServerCodec.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.
- *
- */
-package org.apache.mina.http;
-
-import static org.apache.mina.session.AttributeKey.createKey;
-
-import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.codec.ProtocolDecoder;
-import org.apache.mina.filter.codec.ProtocolEncoder;
-import org.apache.mina.session.AttributeKey;
-
-public class HttpServerCodec extends ProtocolCodecFilter {
-
- /** Key for decoder current state */
- private static final AttributeKey<DecoderState> DECODER_STATE_ATT = createKey(DecoderState.class,
- "internal_http.ds");
-
- /** Key for the partial HTTP requests head */
- private static final AttributeKey<String> PARTIAL_HEAD_ATT = createKey(String.class, "internal_http.ph");
-
- private static ProtocolEncoder encoder = new HttpServerEncoder();
-
- private static ProtocolDecoder decoder = new HttpServerDecoder();
-
- public HttpServerCodec() {
- super(encoder, decoder);
- }
-
- @Override
- public void sessionOpened(final IoSession session) {
- super.sessionOpened(session);
- session.setAttribute(DECODER_STATE_ATT, DecoderState.NEW);
- }
-
- @Override
- public void sessionClosed(final IoSession session) {
- super.sessionClosed(session);
- session.removeAttribute(DECODER_STATE_ATT);
- session.removeAttribute(PARTIAL_HEAD_ATT);
- }
-}
\ No newline at end of file
diff --git a/http/src/main/java/org/apache/mina/http/HttpServerDecoder.java b/http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
index 8ec3874..0c4cf0f 100644
--- a/http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
+++ b/http/src/main/java/org/apache/mina/http/HttpServerDecoder.java
@@ -19,36 +19,29 @@
*/
package org.apache.mina.http;
-import static org.apache.mina.session.AttributeKey.createKey;
-
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
-import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.codec.ProtocolDecoder;
-import org.apache.mina.filterchain.ReadFilterChainController;
+import org.apache.mina.codec.ProtocolDecoder;
+import org.apache.mina.codec.ProtocolDecoderException;
+import org.apache.mina.http.api.HttpContentChunk;
import org.apache.mina.http.api.HttpEndOfContent;
import org.apache.mina.http.api.HttpMethod;
+import org.apache.mina.http.api.HttpPdu;
import org.apache.mina.http.api.HttpVersion;
-import org.apache.mina.session.AttributeKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class HttpServerDecoder implements ProtocolDecoder {
- private static final Logger LOG = LoggerFactory.getLogger(HttpServerCodec.class);
-
- /** Key for decoder current state */
- private static final AttributeKey<DecoderState> DECODER_STATE_ATT = createKey(DecoderState.class,
- "internal_http.ds");
-
- /** Key for the partial HTTP requests head */
- private static final AttributeKey<ByteBuffer> PARTIAL_HEAD_ATT = createKey(ByteBuffer.class, "internal_http.ph");
-
- /** Key for the number of bytes remaining to read for completing the body */
- private static final AttributeKey<Integer> BODY_REMAINING_BYTES = createKey(Integer.class, "internal_http.brb");
+/**
+ * In charge of decoding received bytes into HTTP message.
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
+public class HttpServerDecoder implements ProtocolDecoder<ByteBuffer, HttpPdu> {
+ private static final Logger LOG = LoggerFactory.getLogger(HttpServerDecoder.class);
/** Regex to parse HttpRequest Request Line */
public static final Pattern REQUEST_LINE_PATTERN = Pattern.compile(" ");
@@ -74,17 +67,23 @@
/** Regex to split cookie header following RFC6265 Section 5.4 */
public static final Pattern COOKIE_SEPARATOR_PATTERN = Pattern.compile(";");
- @Override
- public Object decode(IoSession session, ByteBuffer msg, ReadFilterChainController controller) {
- DecoderState state = session.getAttribute(DECODER_STATE_ATT, null);
+ /** State of the decoder */
+ private DecoderState state = DecoderState.NEW;
+ /** The previously received buffer, not totally decoded */
+ private ByteBuffer partial;
+
+ /** Number of bytes remaining to read for completing the body */
+ private int remainingBytes;
+
+ @Override
+ public HttpPdu[] decode(ByteBuffer msg) throws ProtocolDecoderException {
+ LOG.debug("decode : {}", msg);
switch (state) {
case HEAD:
LOG.debug("decoding HEAD");
- // grab the stored a partial HEAD request
- ByteBuffer oldBuffer = session.getAttribute(PARTIAL_HEAD_ATT, null);
// concat the old buffer and the new incoming one
- msg = ByteBuffer.allocate(oldBuffer.remaining() + msg.remaining()).put(oldBuffer).put(msg);
+ msg = ByteBuffer.allocate(partial.remaining() + msg.remaining()).put(partial).put(msg);
msg.flip();
// now let's decode like it was a new message
@@ -94,36 +93,27 @@
if (rq == null) {
// we copy the incoming BB because it's going to be recycled by the inner IoProcessor for next reads
- ByteBuffer partial = ByteBuffer.allocate(msg.remaining());
+ partial = ByteBuffer.allocate(msg.remaining());
partial.put(msg);
partial.flip();
- // no request decoded, we accumulate
- session.setAttribute(PARTIAL_HEAD_ATT, partial);
- session.setAttribute(DECODER_STATE_ATT, DecoderState.HEAD);
} else {
- controller.callReadNextFilter(rq);
+ return new HttpPdu[] { rq };
}
-
return null;
-
case BODY:
LOG.debug("decoding BODY");
int chunkSize = msg.remaining();
// send the chunk of body
- controller.callReadNextFilter(msg);
+ HttpContentChunk chunk = new HttpContentChunk(msg);
// do we have reach end of body ?
- int remaining = session.getAttribute(BODY_REMAINING_BYTES, null);
- remaining -= chunkSize;
+ remainingBytes -= chunkSize;
- if (remaining <= 0) {
+ if (remainingBytes <= 0) {
LOG.debug("end of HTTP body");
- controller.callReadNextFilter(new HttpEndOfContent());
- session.setAttribute(DECODER_STATE_ATT, DecoderState.NEW);
- session.removeAttribute(BODY_REMAINING_BYTES);
- } else {
- session.setAttribute(BODY_REMAINING_BYTES, new Integer(remaining));
+ state = DecoderState.NEW;
+ remainingBytes = 0;
+ return new HttpPdu[] { chunk, new HttpEndOfContent() };
}
-
break;
default:
@@ -133,15 +123,6 @@
return null;
}
- @Override
- public Object finishDecode(IoSession session) throws Exception {
- return null;
- }
-
- @Override
- public void dispose(IoSession session) throws Exception {
- }
-
private HttpRequestImpl parseHttpRequestHead(ByteBuffer buffer) {
String raw = new String(buffer.array(), 0, buffer.limit(), Charset.forName("ISO-8859-1"));
String[] headersAndBody = RAW_VALUE_PATTERN.split(raw, -1);
@@ -173,4 +154,9 @@
return new HttpRequestImpl(version, method, requestedPath, generalHeaders);
}
+
+ @Override
+ public void finishDecode() {
+
+ }
}
diff --git a/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java b/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java
index caa631e..8101228 100644
--- a/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java
+++ b/http/src/main/java/org/apache/mina/http/HttpServerEncoder.java
@@ -19,59 +19,66 @@
*/
package org.apache.mina.http;
-
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Map;
-import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.codec.ProtocolEncoder;
-import org.apache.mina.filterchain.WriteFilterChainController;
+import org.apache.mina.codec.ProtocolEncoder;
+import org.apache.mina.http.api.HttpContentChunk;
import org.apache.mina.http.api.HttpEndOfContent;
+import org.apache.mina.http.api.HttpPdu;
+import org.apache.mina.http.api.HttpPduEncodingVisitor;
+import org.apache.mina.http.api.HttpRequest;
import org.apache.mina.http.api.HttpResponse;
-import org.apache.mina.session.WriteRequest;
+/**
+ * In charge of encoding HTTP message into bytes.
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
+public class HttpServerEncoder implements ProtocolEncoder<HttpPdu, ByteBuffer> {
-public class HttpServerEncoder implements ProtocolEncoder
-{
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public ByteBuffer encode(HttpPdu message) {
+ return message.encode(visitor);
+ }
- public Object encode( IoSession session, WriteRequest message, WriteFilterChainController controller )
- {
- if ( message.getOriginalMessage() instanceof HttpResponse )
- {
- HttpResponse msg = ( HttpResponse ) message;
- StringBuilder sb = new StringBuilder( msg.getStatus().line() );
+ private HttpPduEncodingVisitor visitor = new HttpPduEncodingVisitor() {
- for ( Map.Entry<String, String> header : msg.getHeaders().entrySet() )
- {
- sb.append( header.getKey() );
- sb.append( ": " );
- sb.append( header.getValue() );
- sb.append( "\r\n" );
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public ByteBuffer visit(HttpResponse msg) {
+ StringBuilder sb = new StringBuilder(msg.getStatus().line());
+
+ for (Map.Entry<String, String> header : msg.getHeaders().entrySet()) {
+ sb.append(header.getKey());
+ sb.append(": ");
+ sb.append(header.getValue());
+ sb.append("\r\n");
}
- sb.append( "\r\n" );
- byte[] bytes = sb.toString().getBytes( Charset.forName( "UTF-8" ) );
- message.setMessage( ByteBuffer.wrap( bytes ) );
- controller.callWriteNextFilter( message );
+ sb.append("\r\n");
+ byte[] bytes = sb.toString().getBytes(Charset.forName("UTF-8"));
+ return ByteBuffer.wrap(bytes);
}
- else if ( message.getOriginalMessage() instanceof ByteBuffer )
- {
- controller.callWriteNextFilter( message );
+
+ @Override
+ public ByteBuffer visit(HttpContentChunk msg) {
+ return msg.getContent();
}
- else if ( message.getOriginalMessage() instanceof HttpEndOfContent )
- {
- // end of HTTP content
- // keep alive ?
+
+ @Override
+ public ByteBuffer visit(HttpEndOfContent msg) {
return null;
}
- return null;
- }
-
-
- @Override
- public void dispose( IoSession session ) throws Exception
- {
- // TODO Auto-generated method stub
- }
+ @Override
+ public ByteBuffer visit(HttpRequest msg) {
+ throw new IllegalStateException("cannot encode that on server side");
+ }
+ };
}
diff --git a/http/src/main/java/org/apache/mina/http/api/DefaultHttpResponse.java b/http/src/main/java/org/apache/mina/http/api/DefaultHttpResponse.java
index d5c995b..403788b 100644
--- a/http/src/main/java/org/apache/mina/http/api/DefaultHttpResponse.java
+++ b/http/src/main/java/org/apache/mina/http/api/DefaultHttpResponse.java
@@ -19,8 +19,13 @@
*/
package org.apache.mina.http.api;
+import java.nio.ByteBuffer;
import java.util.Map;
+/**
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
public class DefaultHttpResponse implements HttpResponse {
private final HttpVersion version;
@@ -35,42 +40,74 @@
this.headers = headers;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public HttpVersion getProtocolVersion() {
return version;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public String getContentType() {
return headers.get("content-type");
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean isKeepAlive() {
// TODO check header and version for keep alive
return false;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public String getHeader(String name) {
return headers.get(name);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean containsHeader(String name) {
return headers.containsKey(name);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public Map<String, String> getHeaders() {
return headers;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public HttpStatus getStatus() {
return status;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public ByteBuffer encode(HttpPduEncodingVisitor visitor) {
+ return visitor.visit(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
@Override
public String toString() {
String result = "HTTP RESPONSE STATUS: " + status + "\n";
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpContentChunk.java b/http/src/main/java/org/apache/mina/http/api/HttpContentChunk.java
index 06761a6..c495bd2 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpContentChunk.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpContentChunk.java
@@ -20,9 +20,31 @@
package org.apache.mina.http.api;
import java.nio.ByteBuffer;
-import java.util.List;
-public interface HttpContentChunk {
+/**
+ * A chunk of an HTTP request or response. can be follwowed by another chunk or {@link HttpEndOfContent} marking the end
+ * of the content
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
+public class HttpContentChunk implements HttpPdu {
- List<ByteBuffer> getContent();
+ private ByteBuffer content;
+
+ public HttpContentChunk(ByteBuffer content) {
+ this.content = content;
+ }
+
+ /**
+ * The content of the chunk. A part of the HTTP message content.
+ */
+ public ByteBuffer getContent() {
+ return content;
+ }
+
+ @Override
+ public ByteBuffer encode(HttpPduEncodingVisitor visitor) {
+ return visitor.visit(this);
+ }
+
}
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpEndOfContent.java b/http/src/main/java/org/apache/mina/http/api/HttpEndOfContent.java
index 026cc39..6993f21 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpEndOfContent.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpEndOfContent.java
@@ -19,8 +19,25 @@
*/
package org.apache.mina.http.api;
-public class HttpEndOfContent {
+import java.nio.ByteBuffer;
+/**
+ *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
+public class HttpEndOfContent implements HttpPdu {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public ByteBuffer encode(HttpPduEncodingVisitor visitor) {
+ return visitor.visit(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
@Override
public String toString() {
return "HttpEndOfContent";
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpMessage.java b/http/src/main/java/org/apache/mina/http/api/HttpMessage.java
index 85801eb..5fc5854 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpMessage.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpMessage.java
@@ -25,10 +25,10 @@
/**
* An HTTP message, the ancestor of HTTP request & response.
*
- * @author jvermillar
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
*
*/
-public interface HttpMessage {
+public interface HttpMessage extends HttpPdu {
/**
* The HTTP version of the message
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpMethod.java b/http/src/main/java/org/apache/mina/http/api/HttpMethod.java
index 5c05d0b..9c8331b 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpMethod.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpMethod.java
@@ -21,8 +21,7 @@
/**
*
- * @author The Apache MINA Project (dev@mina.apache.org)
- *
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public enum HttpMethod {
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java b/http/src/main/java/org/apache/mina/http/api/HttpPdu.java
similarity index 62%
copy from core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
copy to http/src/main/java/org/apache/mina/http/api/HttpPdu.java
index 6bbc55e..d868a20 100644
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpPdu.java
@@ -6,34 +6,28 @@
* to you 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.
- *
+ * under the License.
+ *
*/
-package org.apache.mina.filter.codec;
+package org.apache.mina.http.api;
import java.nio.ByteBuffer;
-import org.apache.mina.api.IoSession;
-
/**
- * In charge of encoding a message of type MESSAGE into another form (could be a {@link ByteBuffer} or any other protocol level construction.
+ * Marker interface for decoded HTTP elements (P.D.U.: Protocol Data Units)
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
- *
*/
-public interface ProtocolEncoder<INPUT /* message type */, OUTPUT> {
+public interface HttpPdu {
- /**
- * Encodes higher-level message objects of type <code>INPUT</code> into binary or protocol-specific data of type <code>OUTPUT</code>.
- */
- OUTPUT encode(IoSession session, INPUT message);
+ public ByteBuffer encode(HttpPduEncodingVisitor visitor);
-}
\ No newline at end of file
+}
diff --git a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java b/http/src/main/java/org/apache/mina/http/api/HttpPduEncodingVisitor.java
similarity index 62%
copy from core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
copy to http/src/main/java/org/apache/mina/http/api/HttpPduEncodingVisitor.java
index 6bbc55e..206ae9b 100644
--- a/core/src/main/java/org/apache/mina/filter/codec/ProtocolEncoder.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpPduEncodingVisitor.java
@@ -6,34 +6,33 @@
* to you 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.
- *
+ * under the License.
+ *
*/
-package org.apache.mina.filter.codec;
+package org.apache.mina.http.api;
import java.nio.ByteBuffer;
-import org.apache.mina.api.IoSession;
-
/**
- * In charge of encoding a message of type MESSAGE into another form (could be a {@link ByteBuffer} or any other protocol level construction.
+ * Visitor in charge of encoding an HTTP message into bytes.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
- *
*/
-public interface ProtocolEncoder<INPUT /* message type */, OUTPUT> {
+public interface HttpPduEncodingVisitor {
- /**
- * Encodes higher-level message objects of type <code>INPUT</code> into binary or protocol-specific data of type <code>OUTPUT</code>.
- */
- OUTPUT encode(IoSession session, INPUT message);
+ public ByteBuffer visit(HttpRequest msg);
-}
\ No newline at end of file
+ public ByteBuffer visit(HttpResponse msg);
+
+ public ByteBuffer visit(HttpContentChunk msg);
+
+ public ByteBuffer visit(HttpEndOfContent msg);
+}
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpRequest.java b/http/src/main/java/org/apache/mina/http/api/HttpRequest.java
index 8f734ee..9e51d72 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpRequest.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpRequest.java
@@ -26,7 +26,7 @@
/**
* An HTTP request
*
- * @author jvermillar
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
*
*/
public interface HttpRequest extends HttpMessage {
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpVerb.java b/http/src/main/java/org/apache/mina/http/api/HttpVerb.java
index 0ff719c..5f96028 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpVerb.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpVerb.java
@@ -19,6 +19,9 @@
*/
package org.apache.mina.http.api;
+/**
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ */
public enum HttpVerb {
GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT
diff --git a/http/src/main/java/org/apache/mina/http/api/HttpVersion.java b/http/src/main/java/org/apache/mina/http/api/HttpVersion.java
index cb74472..475abfb 100644
--- a/http/src/main/java/org/apache/mina/http/api/HttpVersion.java
+++ b/http/src/main/java/org/apache/mina/http/api/HttpVersion.java
@@ -22,7 +22,7 @@
/**
* Type safe enumeration representing HTTP protocol version
*
- * @author The Apache MINA Project (dev@mina.apache.org)
+ * @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public enum HttpVersion {
/**
diff --git a/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java b/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java
index 1928f3a..4509867 100644
--- a/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java
+++ b/ldap/src/main/java/org/apache/mina/ldap/LdapCodec.java
@@ -41,9 +41,9 @@
import org.apache.directory.shared.ldap.model.message.SearchResultReference;
import org.apache.mina.api.IdleStatus;
import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.codec.ProtocolDecoder;
-import org.apache.mina.filter.codec.ProtocolEncoder;
+import org.apache.mina.codec.ProtocolCodecFilter;
+import org.apache.mina.codec.ProtocolDecoder;
+import org.apache.mina.codec.ProtocolEncoder;
import org.apache.mina.filterchain.WriteFilterChainController;
import org.apache.mina.session.AttributeKey;
import org.apache.mina.session.WriteRequest;
diff --git a/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolDecoder.java b/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolDecoder.java
index 55c2473..335c384 100644
--- a/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolDecoder.java
+++ b/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolDecoder.java
@@ -33,7 +33,7 @@
import org.apache.directory.shared.ldap.model.message.Message;
import org.apache.directory.shared.util.Strings;
import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.codec.ProtocolDecoder;
+import org.apache.mina.codec.ProtocolDecoder;
import org.apache.mina.filterchain.ReadFilterChainController;
import org.apache.mina.session.AttributeKey;
import org.slf4j.Logger;
diff --git a/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java b/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java
index 7cee474..2a2b01f 100644
--- a/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java
+++ b/ldap/src/main/java/org/apache/mina/ldap/LdapProtocolEncoder.java
@@ -25,7 +25,7 @@
import org.apache.directory.shared.ldap.codec.api.LdapEncoder;
import org.apache.directory.shared.ldap.model.message.Message;
import org.apache.mina.api.IoSession;
-import org.apache.mina.filter.codec.ProtocolEncoder;
+import org.apache.mina.codec.ProtocolEncoder;
import org.apache.mina.filterchain.WriteFilterChainController;
import org.apache.mina.session.WriteRequest;
diff --git a/pom.xml b/pom.xml
index 6aab59b..10bbfd2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -105,12 +105,13 @@
<modules>
- <module>core</module>
- <module>http</module>
- <module>ldap</module>
- <module>examples</module>
- <!-- Temporarilly commented. Should be run with a dedicatd benchmark profile -->
- <!-- module>benchmarks</module-->
+ <module>core</module>
+ <module>codec</module>
+ <module>http</module>
+ <module>ldap</module>
+ <module>examples</module>
+ <!-- Temporarilly commented. Should be run with a dedicatd benchmark profile -->
+ <!-- module>benchmarks</module-->
</modules>
<dependencyManagement>