com.edgytech.umongo.DocumentSerializer.java Source code

Java tutorial

Introduction

Here is the source code for com.edgytech.umongo.DocumentSerializer.java

Source

/**
 * Copyright (C) 2010 EdgyTech LLC.
 *
 * Licensed 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 com.edgytech.umongo;

import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.bson.BSON;

/**
 *
 * @author antoine
 */
public class DocumentSerializer {

    public enum Format {

        JSON, JSON_ARRAY, CSV, BSON
    }

    Format format;
    OutputStream os;
    boolean first = true;
    String fields;
    String[] filter;
    File file;
    String delimiter = ",";
    String header;

    public DocumentSerializer(Format format, String fields) {
        this.format = format;

        this.fields = fields;
        if (fields != null) {
            filter = fields.split(",");
            for (int i = 0; i < filter.length; ++i) {
                filter[i] = filter[i].trim();
            }
        }
    }

    public Format getFormat() {
        return format;
    }

    public String getFields() {
        return fields;
    }

    public void setOutputStream(OutputStream os) {
        this.os = os;
    }

    public OutputStream getOutputStream() {
        return os;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public File getFile() {
        return file;
    }

    private Object getFieldValueRecursive(DBObject obj, String field) {
        if (field.indexOf(".") < 0)
            return obj.get(field);

        String[] tokens = field.split("\\.");
        for (int i = 0; i < tokens.length - 1; ++i) {
            String f = tokens[i];
            if (!obj.containsField(f))
                return null;
            Object o = obj.get(f);
            if (!DBObject.class.isInstance(o))
                return null;
            obj = (DBObject) o;
        }
        return obj.get(tokens[tokens.length - 1]);
    }

    public void writeObject(DBObject obj) throws IOException {
        if (os == null) {
            os = new FileOutputStream(file);
        }

        if (first) {
            first = false;
            if (format == Format.CSV) {
                if (header != null && !header.isEmpty())
                    os.write(header.getBytes());
                else
                    os.write(fields.getBytes());
                os.write('\n');
            } else if (format == Format.JSON_ARRAY) {
                os.write('[');
            }
        } else {
            if (format == Format.JSON_ARRAY) {
                os.write(',');
            }
        }

        if (format == Format.CSV) {
            for (int i = 0; i < filter.length; ++i) {
                if (i != 0) {
                    os.write(delimiter.getBytes());
                }
                String field = filter[i];
                os.write(MongoUtils.getJSON(getFieldValueRecursive(obj, field)).getBytes());
            }
        } else if (format == Format.BSON) {
            os.write(BSON.encode(obj));
        } else {
            os.write(MongoUtils.getJSON(obj).getBytes());
        }

        if (format == Format.JSON || format == Format.CSV) {
            os.write('\n');
        }
    }

    public void close() throws IOException {
        if (first == false && format == Format.JSON_ARRAY) {
            os.write(']');
        }
        os.close();
    }

    void setDelimiter(String delimiter) {
        if (!delimiter.trim().isEmpty())
            this.delimiter = delimiter.substring(0, 1);
    }

    void setHeader(String header) {
        if (!header.trim().isEmpty())
            this.header = header;
    }

}