Package ch.agent.crnickl.mongodb

Source Code of ch.agent.crnickl.mongodb.ReadMethodsForProperty

/*
*   Copyright 2012-2013 Hauser Olsson GmbH
*
* 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 ch.agent.crnickl.mongodb;

import java.util.ArrayList;
import java.util.Collection;
import java.util.regex.Pattern;

import org.bson.types.ObjectId;

import ch.agent.crnickl.T2DBException;
import ch.agent.crnickl.T2DBMsg;
import ch.agent.crnickl.T2DBMsg.E;
import ch.agent.crnickl.api.DBObjectType;
import ch.agent.crnickl.api.Database;
import ch.agent.crnickl.api.Property;
import ch.agent.crnickl.api.Surrogate;
import ch.agent.crnickl.api.ValueType;
import ch.agent.crnickl.impl.PropertyImpl;
import ch.agent.crnickl.mongodb.T2DBMMsg.J;

import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;

/**
* A stateless object with methods providing read access to properties.
* @author Jean-Paul Vetterli
*/
public class ReadMethodsForProperty extends MongoDatabaseMethods {

  public ReadMethodsForProperty() {
  }

  /**
   * Find a property by its name in a database.
   *
   * @param database a database
   * @param name a string
   * @return a property or null
   * @throws T2DBException
   */
  public <T>Property<T> getProperty(Database database, String name) throws T2DBException {
    try {
      DBCollection coll = getMongoDB(database).getProperties();
      DBObject obj = coll.findOne(mongoObject(MongoDatabase.FLD_PROP_NAME, name));
      if (obj != null)
        return unpack(database, (BasicDBObject) obj);
      else
        return null;
    } catch (Exception e) {
      throw T2DBMsg.exception(e, E.E20104, name);
    }
  }
 
  /**
   * Find a collection of properties with names matching a pattern.
   * If the pattern is enclosed in slashes it is taken as a standard
   * regexp pattern; the slashes will be removed. If it is not enclosed
   * in slashes, it is taken as a minimal pattern and all occurrences of
   * "*" will be replaced with ".*" (zero or more arbitrary characters).
   *
   * @param database a database
   * @param pattern a simple pattern or a regexp pattern
   * @return a collection of properties, possibly empty, never null
   * @throws T2DBException
   */
  public Collection<Property<?>> getProperties(Database database, String pattern) throws T2DBException {
    try {
      DBCollection coll = getMongoDB(database).getProperties();
      DBObject query = null;
      if (pattern != null && pattern.length() > 0) {
        String regexp = extractRegexp(pattern);
        if (regexp == null)
          pattern = pattern.replace("*", ".*");
        else
          pattern = regexp;
        query = mongoObject(MongoDatabase.FLD_PROP_NAME, Pattern.compile(pattern));
      }
      DBCursor cursor = coll.find(query);
      Collection<Property<?>> result = new ArrayList<Property<?>>();
      try {
        while (cursor.hasNext()) {
          result.add(unpack(database, (BasicDBObject) cursor.next()));
        }
      } finally {
        cursor.close();
      }
      return result;
    } catch (Exception e) {
      throw T2DBMsg.exception(e, E.E20106, pattern);
    }
  }
 
  /**
   * Find a property corresponding to a surrogate.
   *
   * @param s a surrogate
   * @return a property or null
   * @throws T2DBException
   */
  public <T>Property<T> getProperty(Surrogate s) throws T2DBException {
    try {
      DBObject obj = getObject(s, false);
      if (obj != null)
        return unpack(s.getDatabase(), (BasicDBObject) obj);
      else
        return null;
    } catch (Exception e) {
      throw T2DBMsg.exception(e, E.E20105, s.toString());
    }
  }
 
  private <T>Property<T> unpack(Database db, BasicDBObject obj) throws T2DBException {
    try {
      ObjectId id = obj.getObjectId(MongoDatabase.FLD_ID);
      String name = obj.getString(MongoDatabase.FLD_PROP_NAME);
      ObjectId vtId = obj.getObjectId(MongoDatabase.FLD_PROP_VT);
      Boolean indexed = obj.getBoolean(MongoDatabase.FLD_PROP_INDEXED);
      Surrogate vts = makeSurrogate(db, DBObjectType.VALUE_TYPE, new MongoDBObjectId(vtId));
      ValueType<T> vt = db.getValueType(vts);
      Surrogate s = makeSurrogate(db, DBObjectType.PROPERTY, new MongoDBObjectId(id));
      checkIntegrity(vt, vts, s);
      return new PropertyImpl<T>(name, vt, indexed, s);
    } catch (ClassCastException e) {
      throw T2DBMMsg.exception(e, J.J81010, obj.toString());
    }
  }

 
}
TOP

Related Classes of ch.agent.crnickl.mongodb.ReadMethodsForProperty

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.