Java tutorial
/* * (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()); } }