/*
 * Copyright 2009 Red Hat, Inc.
 *
 * Red Hat 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.jboss.netty.handler.codec.serialization;

import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferInputStream;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder;

/**
 * A decoder which deserializes the received {@link ChannelBuffer}s into Java
 * objects.
 * <p>
 * Please note that the serialized form this decoder expects is not
 * compatible with the standard {@link ObjectOutputStream}.  Please use
 * {@link ObjectEncoder} or {@link ObjectEncoderOutputStream} to ensure the
 * interoperability with this decoder.
 *
 * @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
 * @author <a href="http://gleamynode.net/">Trustin Lee</a>
 *
 * @version $Rev$, $Date$
 *
 * @apiviz.landmark
 * @apiviz.has org.jboss.netty.handler.codec.serialization.ObjectDecoderInputStream - - - compatible with
 */
public class ObjectDecoder extends LengthFieldBasedFrameDecoder {

    private final ClassResolver classResolver;

    /**
     * Creates a new decoder whose maximum object size is {@code 1048576}
     * bytes.  If the size of the received object is greater than
     * {@code 1048576} bytes, a {@link StreamCorruptedException} will be
     * raised.
     */
    public ObjectDecoder() {
        this(1048576);
    }

    /**
     * Creates a new decoder with the specified maximum object size.
     *
     * @param maxObjectSize  the maximum byte length of the serialized object.
     *                       if the length of the received object is greater
     *                       than this value, {@link StreamCorruptedException}
     *                       will be raised.
     */
    public ObjectDecoder(int maxObjectSize) {
        this(maxObjectSize, ClassResolvers.weakCachingResolver(null));
    }

    /**
     * Creates a new decoder with the specified maximum object size.
     *
     * @param maxObjectSize  the maximum byte length of the serialized object.
     *                       if the length of the received object is greater
     *                       than this value, {@link StreamCorruptedException}
     *                       will be raised.
     * @param classResolver    the {@link ClassResolver} which will load the class
     *                       of the serialized object
     */
    public ObjectDecoder(int maxObjectSize, ClassResolver classResolver) {
        super(maxObjectSize, 0, 4, 0, 4);
        this.classResolver = classResolver;
    }

    @Override
    protected Object decode(
            ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {

        ChannelBuffer frame = (ChannelBuffer) super.decode(ctx, channel, buffer);
        if (frame == null) {
            return null;
        }

        return new CompactObjectInputStream(
                new ChannelBufferInputStream(frame), classResolver).readObject();
    }

    @Override
    protected ChannelBuffer extractFrame(ChannelBuffer buffer, int index, int length) {
        return buffer.slice(index, length);
    }
}

@@ -2030,68 +2030,590 @@
    *
-/%0A    public ObjectDecoder() %7B%0A        this(1048576);%0A    %7D%0A
+ %0A     * @deprecated use %7B@link #ObjectDecoder(ClassResolver)%7D%0A     */%0A    @Deprecated%0A    public ObjectDecoder() %7B%0A        this(1048576);%0A    %7D%0A%0A%0A    /**%0A     * Creates a new decoder whose maximum object size is %7B@code 1048576%7D%0A     * bytes.  If the size of the received object is greater than%0A     * %7B@code 1048576%7D bytes, a %7B@link StreamCorruptedException%7D will be%0A     * raised.%0A     * %0A     * @param classResolver  the %7B@link ClassResolver%7D to use for this decoder%0A     */%0A    public ObjectDecoder(ClassResolver classResolver) %7B%0A        this(1048576, classResolver);%0A    %7D%0A    
 %0A   
@@ -2975,25 +2975,117 @@
 ised.%0A     *
-/
+ @deprecated           use %7B@link #ObjectDecoder(int, ClassResolver)%7D%0A     */%0A    @Deprecated
 %0A    public 
@@ -3866,32 +3866,815 @@
 esolver;%0A    %7D%0A%0A
+%0A    /**%0A     * Create a new decoder with the specified maximum object size and the %7B@link ClassLoader%7D wrapped in %7B@link ClassResolvers#weakCachingResolver(ClassLoader)%7D%0A     * %0A     * %0A     * @param maxObjectSize  the maximum byte length of the serialized object.%0A     *                       if the length of the received object is greater%0A     *                       than this value, %7B@link StreamCorruptedException%7D%0A     *                       will be raised.%0A     * @param classLoader    the the classloader to use%0A     * @deprecated           use %7B@link #ObjectDecoder(int, ClassResolver)%7D%0A     */%0A    @Deprecated%0A    public ObjectDecoder(int maxObjectSize, ClassLoader classLoader) %7B%0A        this(maxObjectSize, ClassResolvers.weakCachingResolver(classLoader));%0A    %7D%0A    %0A
     @Override%0A  

Add constructors to make it possible to backport it to 3.2 without breaking the api