com.kurento.kmf.repository.internal.repoimpl.mongo.MongoRepositoryItem.java Source code

Java tutorial

Introduction

Here is the source code for com.kurento.kmf.repository.internal.repoimpl.mongo.MongoRepositoryItem.java

Source

/*
 * (C) Copyright 2013 Kurento (http://kurento.org/)
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser General Public License
 * (LGPL) version 2.1 which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-2.1.html
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 */

package com.kurento.kmf.repository.internal.repoimpl.mongo;

import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map.Entry;

import com.kurento.kmf.repository.RepositoryItemAttributes;
import com.kurento.kmf.repository.internal.repoimpl.AbstractRepositoryItem;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSFile;
import com.mongodb.gridfs.GridFSInputFile;
import com.mongodb.util.JSON;

public class MongoRepositoryItem extends AbstractRepositoryItem {

    private GridFSFile dbFile;
    private OutputStream storingOutputStream;

    private MongoRepositoryItem(MongoRepository repository, GridFSFile dbFile, State state) {

        super(dbFile.getId().toString(), state, loadAttributes(dbFile), repository);

        this.dbFile = dbFile;
        this.setMetadata(new HashMap<String, String>());
    }

    private static RepositoryItemAttributes loadAttributes(GridFSFile file) {

        RepositoryItemAttributes attributes = new RepositoryItemAttributes();

        attributes.setContentLength(file.getLength());
        attributes.setLastModified(file.getUploadDate().getTime());
        attributes.setMimeType(file.getContentType());

        return attributes;
    }

    public MongoRepositoryItem(MongoRepository repository, GridFSDBFile dbFile) {
        this(repository, dbFile, State.STORED);
    }

    public MongoRepositoryItem(MongoRepository repository, GridFSInputFile dbFile) {
        this(repository, dbFile, State.NEW);
    }

    @Override
    public InputStream createInputStreamToRead() {
        checkState(State.STORED);
        return ((GridFSDBFile) dbFile).getInputStream();
    }

    @Override
    public OutputStream createOutputStreamToWrite() {
        checkState(State.NEW);

        storingOutputStream = new FilterOutputStream(((GridFSInputFile) dbFile).getOutputStream()) {

            @Override
            public void close() throws IOException {
                putMetadataInGridFS();
                super.close();
                refreshAttributesOnClose();
            }

            // TODO Optimise this to use the GridFS metadata
            private void putMetadataInGridFS() {
                DBObject metadataDBO = new BasicDBObject();
                for (Entry<String, String> entry : metadata.entrySet()) {
                    metadataDBO.put(entry.getKey(), entry.getValue());
                }
                dbFile.setMetaData(metadataDBO);
            }
        };

        return storingOutputStream;
    }

    protected void refreshAttributesOnClose() {
        DBObject query = (DBObject) JSON.parse("{ _id : '" + getId() + "' }");
        dbFile = ((MongoRepository) repository).getGridFS().findOne(query);
        state = State.STORED;
        attributes.setContentLength(dbFile.getLength());
    }

}