Package com.kurento.kmf.repository.internal.repoimpl.mongo

Source Code of com.kurento.kmf.repository.internal.repoimpl.mongo.MongoRepository

/*
* (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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

import javax.annotation.PostConstruct;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;

import com.kurento.kmf.repository.DuplicateItemException;
import com.kurento.kmf.repository.RepositoryItem;
import com.kurento.kmf.repository.internal.http.RepositoryHttpManager;
import com.kurento.kmf.repository.internal.repoimpl.RepositoryWithHttp;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
import com.mongodb.util.JSON;

public class MongoRepository implements RepositoryWithHttp {

  private final Logger log = LoggerFactory.getLogger(MongoRepository.class);

  @Autowired
  private MongoTemplate mongoTemplate;

  private GridFS gridFS;

  @Autowired
  private RepositoryHttpManager httpManager;

  @PostConstruct
  private void postConstruct() {
    gridFS = new GridFS(mongoTemplate.getDb());
  }

  // TODO Define ways to let users access to low level mongo backend. I prefer
  // using Spring with @Autowired, but can be useful to let users access
  // mongo from repository.
  public GridFS getGridFS() {
    return gridFS;
  }

  @Override
  public RepositoryItem findRepositoryItemById(String id) {

    List<GridFSDBFile> dbFiles = gridFS.find(idQuery(id));

    if (dbFiles.size() > 0) {

      if (dbFiles.size() > 1) {
        log.warn("There are several files with the same "
            + "filename and should be only one");
      }

      return createRepositoryItem(dbFiles.get(0));
    }

    throw new NoSuchElementException("The repository item with id \"" + id
        + "\" does not exist");
  }

  private DBObject idQuery(String id) {
    return new BasicDBObject("_id", id);
  }

  private RepositoryItem createRepositoryItem(GridFSInputFile dbFile) {
    return new MongoRepositoryItem(this, dbFile);
  }

  private MongoRepositoryItem createRepositoryItem(GridFSDBFile dbFile) {

    MongoRepositoryItem item = new MongoRepositoryItem(this, dbFile);

    Map<String, String> metadata = new HashMap<>();
    DBObject object = dbFile.getMetaData();
    for (String key : object.keySet()) {
      metadata.put(key, object.get(key).toString());
    }
    item.setMetadata(metadata);
    return item;
  }

  @Override
  public RepositoryItem createRepositoryItem() {
    GridFSInputFile dbFile = gridFS.createFile();
    dbFile.setFilename(dbFile.getId().toString());
    return createRepositoryItem(dbFile);
  }

  @Override
  public RepositoryItem createRepositoryItem(String id) {

    // TODO The file is not written until outputstream is closed. There is a
    // potentially data race with this unique test
    if (!gridFS.find(idQuery(id)).isEmpty()) {
      throw new DuplicateItemException(id);
    }

    GridFSInputFile dbFile = gridFS.createFile(id);
    dbFile.setId(id);
    return createRepositoryItem(dbFile);
  }

  @Override
  public RepositoryHttpManager getRepositoryHttpManager() {
    return httpManager;
  }

  @Override
  public void remove(RepositoryItem item) {
    httpManager.disposeHttpRepoItemElemByItemId(item,
        "Repository Item removed");
    gridFS.remove(idQuery(item.getId()));
  }

  @Override
  public List<RepositoryItem> findRepositoryItemsByAttValue(
      String attributeName, String value) {

    String query = "{'metadata." + attributeName + "':'" + value + "'}";

    return findRepositoryItemsByQuery(query);
  }

  @Override
  public List<RepositoryItem> findRepositoryItemsByAttRegex(
      String attributeName, String regex) {

    String query = "{'metadata." + attributeName + "': { $regex : '"
        + regex + "'}}";

    return findRepositoryItemsByQuery(query);
  }

  private List<RepositoryItem> findRepositoryItemsByQuery(String query) {
    List<GridFSDBFile> files = gridFS.find((DBObject) JSON.parse(query));

    List<RepositoryItem> repositoryItems = new ArrayList<>();
    for (GridFSDBFile file : files) {
      repositoryItems.add(createRepositoryItem(file));
    }

    return repositoryItems;
  }

}
TOP

Related Classes of com.kurento.kmf.repository.internal.repoimpl.mongo.MongoRepository

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.