Package org.geoserver.importer.bdb

Source Code of org.geoserver.importer.bdb.XStreamInfoSerialBinding

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer.bdb;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.io.output.TeeOutputStream;
import org.geoserver.config.util.XStreamPersister;

import com.google.common.base.Throwables;
import com.google.common.io.ByteStreams;
import com.ning.compress.lzf.LZFInputStream;
import com.ning.compress.lzf.LZFOutputStream;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.SerialBase;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.util.FastOutputStream;

/**
* @param <T>
*/
public class XStreamInfoSerialBinding<T> extends SerialBase implements EntryBinding<T> {

    private final XStreamPersister xstreamPersister;
    private boolean compress = true;

    private static final boolean DEBUG = "true".equals(System
            .getProperty("org.opengeo.importer.xstream.debug"));

    private final Class<T> target;

    public XStreamInfoSerialBinding(final XStreamPersister xstreamPersister, final Class<T> target) {
        this.xstreamPersister = xstreamPersister;
        this.target = target;

        setSerialBufferSize(512);
    }

    public void setCompress(boolean compress) {
        this.compress = compress;
    }

    public T entryToObject(DatabaseEntry entry) {

        byte[] data = entry.getData();
        InputStream in = new ByteArrayInputStream(data, entry.getOffset(), entry.getSize());

        try {
            if (compress) {
                in = new LZFInputStream(in);
            }
        } catch (Exception e) {
            throw Throwables.propagate(e);
        }
        T info;

        try {
            if (DEBUG) {
                ByteArrayOutputStream tmp = new ByteArrayOutputStream();
                ByteStreams.copy(in, tmp);
                System.err.println("Read: " + tmp.toString());
                System.err.flush();
                in = new ByteArrayInputStream(tmp.toByteArray());
            }
            info = xstreamPersister.load(in, target);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return info;
    }

    public void objectToEntry(final T info, DatabaseEntry entry) {

        FastOutputStream serialOutput = super.getSerialOutput(info);
        OutputStream out = serialOutput;
        if (compress) {
            out = new LZFOutputStream(serialOutput);
        }
        if (DEBUG) {
            out = new TeeOutputStream(out, System.out);
        }
        try {
            xstreamPersister.save(info, out);
            out.flush();
            out.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        final byte[] bytes = serialOutput.getBufferBytes();
        final int offset = 0;
        final int length = serialOutput.getBufferLength();
        entry.setData(bytes, offset, length);
    }

}
TOP

Related Classes of org.geoserver.importer.bdb.XStreamInfoSerialBinding

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.