1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.mina.filter.codec.serialization;
21
22 import java.io.Serializable;
23
24 import org.apache.mina.common.BufferDataException;
25 import org.apache.mina.common.ByteBuffer;
26 import org.apache.mina.common.IoSession;
27 import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
28 import org.apache.mina.filter.codec.ProtocolDecoder;
29 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
30
31 /**
32 * A {@link ProtocolDecoder} which deserializes {@link Serializable} Java
33 * objects using {@link ByteBuffer#getObject(ClassLoader)}.
34 *
35 * @author The Apache Directory Project (mina-dev@directory.apache.org)
36 * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (Fri, 13 Jul 2007) $
37 */
38 public class ObjectSerializationDecoder extends CumulativeProtocolDecoder {
39 private final ClassLoader classLoader;
40
41 private int maxObjectSize = 1048576; // 1MB
42
43 /**
44 * Creates a new instance with the {@link ClassLoader} of
45 * the current thread.
46 */
47 public ObjectSerializationDecoder() {
48 this(Thread.currentThread().getContextClassLoader());
49 }
50
51 /**
52 * Creates a new instance with the specified {@link ClassLoader}.
53 */
54 public ObjectSerializationDecoder(ClassLoader classLoader) {
55 if (classLoader == null) {
56 throw new NullPointerException("classLoader");
57 }
58 this.classLoader = classLoader;
59 }
60
61 /**
62 * Returns the allowed maximum size of the object to be decoded.
63 * If the size of the object to be decoded exceeds this value, this
64 * decoder will throw a {@link BufferDataException}. The default
65 * value is <tt>1048576</tt> (1MB).
66 */
67 public int getMaxObjectSize() {
68 return maxObjectSize;
69 }
70
71 /**
72 * Sets the allowed maximum size of the object to be decoded.
73 * If the size of the object to be decoded exceeds this value, this
74 * decoder will throw a {@link BufferDataException}. The default
75 * value is <tt>1048576</tt> (1MB).
76 */
77 public void setMaxObjectSize(int maxObjectSize) {
78 if (maxObjectSize <= 0) {
79 throw new IllegalArgumentException("maxObjectSize: "
80 + maxObjectSize);
81 }
82
83 this.maxObjectSize = maxObjectSize;
84 }
85
86 protected boolean doDecode(IoSession session, ByteBuffer in,
87 ProtocolDecoderOutput out) throws Exception {
88 if (!in.prefixedDataAvailable(4, maxObjectSize)) {
89 return false;
90 }
91
92 out.write(in.getObject(classLoader));
93 return true;
94 }
95 }