/**
* 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;
}
}