001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package de.kumpe.hadooptimizer.hadoop;
020    
021    import java.io.IOException;
022    import java.io.InputStream;
023    import java.io.ObjectInputStream;
024    import java.io.ObjectOutputStream;
025    import java.io.ObjectStreamClass;
026    import java.io.OutputStream;
027    import java.io.Serializable;
028    
029    import org.apache.hadoop.conf.Configured;
030    import org.apache.hadoop.io.serializer.Deserializer;
031    import org.apache.hadoop.io.serializer.Serialization;
032    import org.apache.hadoop.io.serializer.Serializer;
033    
034    /**
035     * THIS IS JUST A TEMPORARY SOLUTION OF BUG IN THE ORIGINAL JavaSerialization
036     * IMPLEMENTATION WHERE THE WRONG CLASSLOADER IS USED. SHOULD BE REMOVED IF THE
037     * BUT IS REMOVED IN A NEW RELEASE.
038     * <p>
039     * THE FILE IS A COPY OF THE ORIGINAL JavaSerialization IMPLEMENTATION WITH THE
040     * DIFFRENCE THAT IS USES THE CLASSLOADER OF THE CONFIGURATION TO RESOLVE
041     * SERIALIZED CLASSES.
042     * <p>
043     * An experimental {@link Serialization} for Java {@link Serializable} classes.
044     * <p>
045     * <b>This class is not part of HadoOptimizer and will be removed as soon as
046     * possible.</b>
047     * 
048     * @see org.apache.hadoop.io.serializer.JavaSerialization
049     */
050    @Deprecated
051    public class JavaSerialization extends Configured implements
052                    Serialization<Serializable> {
053    
054            static class JavaSerializationDeserializer<T extends Serializable>
055                            implements Deserializer<T> {
056                    private final ClassLoader classLoader;
057                    private ObjectInputStream ois;
058    
059                    public JavaSerializationDeserializer(final ClassLoader classLoader) {
060                            this.classLoader = classLoader;
061                    }
062    
063                    @Override
064                    public void open(final InputStream in) throws IOException {
065                            ois = new ObjectInputStream(in) {
066                                    @Override
067                                    protected void readStreamHeader() {
068                                            // no header
069                                    }
070    
071                                    @Override
072                                    protected Class<?> resolveClass(final ObjectStreamClass desc)
073                                                    throws IOException, ClassNotFoundException {
074                                            return Class.forName(desc.getName(), false, classLoader);
075                                    };
076                            };
077                    }
078    
079                    @Override
080                    @SuppressWarnings("unchecked")
081                    public T deserialize(final T object) throws IOException {
082                            try {
083                                    // ignore passed-in object
084                                    return (T) ois.readObject();
085                            } catch (final ClassNotFoundException e) {
086                                    throw new IOException(e.toString());
087                            }
088                    }
089    
090                    @Override
091                    public void close() throws IOException {
092                            ois.close();
093                    }
094    
095            }
096    
097            static class JavaSerializationSerializer implements
098                            Serializer<Serializable> {
099    
100                    private ObjectOutputStream oos;
101    
102                    @Override
103                    public void open(final OutputStream out) throws IOException {
104                            oos = new ObjectOutputStream(out) {
105                                    @Override
106                                    protected void writeStreamHeader() {
107                                            // no header
108                                    }
109                            };
110                    }
111    
112                    @Override
113                    public void serialize(final Serializable object) throws IOException {
114                            oos.reset(); // clear (class) back-references
115                            oos.writeObject(object);
116                    }
117    
118                    @Override
119                    public void close() throws IOException {
120                            oos.close();
121                    }
122    
123            }
124    
125            @Override
126            public boolean accept(final Class<?> c) {
127                    return Serializable.class.isAssignableFrom(c);
128            }
129    
130            @Override
131            public Deserializer<Serializable> getDeserializer(
132                            final Class<Serializable> c) {
133                    return new JavaSerializationDeserializer<Serializable>(getConf()
134                                    .getClassLoader());
135            }
136    
137            @Override
138            public Serializer<Serializable> getSerializer(final Class<Serializable> c) {
139                    return new JavaSerializationSerializer();
140            }
141    
142    }