Package ch.agent.crnickl.mongodb

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

/*
*   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 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.Property;
import ch.agent.crnickl.api.Surrogate;
import ch.agent.crnickl.impl.Permission;
import ch.agent.crnickl.impl.SchemaUpdatePolicy;

import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.WriteConcern;

/**
* A stateless object with methods providing write access to properties.
* <p>
* A property in MongoDB is stored as:
* <blockquote><pre><code>
* { _id : OID,
*   name : STRING,
*   type : OID,
*   indexed : BOOLEAN
* }
* </code></pre></blockquote>
* The <em>type</em> field identifies the value type.
* <p>
* @author Jean-Paul Vetterli
*/
public class WriteMethodsForProperty extends ReadMethodsForProperty {

  public WriteMethodsForProperty() {
  }
 
  /**
   * Create a new property and return its key.
   * If creation fails throw an exception.
   *
   * @param prop a property
   * @throws T2DBException
   */
  public <T>void createProperty(Property<T> prop) throws T2DBException {
    Surrogate surrogate = null;
    Throwable cause = null;
    try {
      check(Permission.CREATE, prop);
      BasicDBObject dob = pack(prop);
      getMongoDB(prop).getProperties().insert(dob);
      ObjectId ox = getObjectId(dob)
      surrogate = makeSurrogate(prop, new MongoDBObjectId(ox));
    } catch (Exception e) {
      cause = e;
    } finally {
    }
    if (surrogate == null || cause != null)
      throw T2DBMsg.exception(cause, E.E20114, prop.getName());
    prop.getSurrogate().upgrade(surrogate);
  }

  /**
   * Delete the property.
   * If deleting fails throw an exception.
   *
   * @param prop a property
   * @param policy a schema updating policy
   * @throws T2DBException
   */
  public <T>void deleteProperty(Property<T> prop, SchemaUpdatePolicy policy) throws T2DBException {
    boolean done = false;
    Throwable cause = null;
    Surrogate s = prop.getSurrogate();
    MongoDatabase database = (MongoDatabase) s.getDatabase();
    try {
      check(Permission.MODIFY, prop);
      // dangerous update! see comment in MongoDatabase.sleep
      policy.willDelete(prop);
      Property<T> original = database.getReadMethodsForProperty().getProperty(s);
      DBCollection coll = getMongoDB(s).getProperties();
      coll.remove(asQuery(s.getId()), WriteConcern.SAFE);
      database.sleep();
      try {
        policy.willDelete(original);
      } catch (T2DBException e) {
        createProperty(original);
        throw e;
      }
      done = true;
    } catch (Exception e) {
      cause = e;
    } finally {
    }
    if (!done || cause != null)
      throw T2DBMsg.exception(cause, E.E20115, prop.getName());
  }
 
  /**
   * Update the name of the property.
   * If updating fails throw an exception.
   *
   * @param prop a property
   * @param policy a schema updating policy
   * @throws T2DBException
   */
  public void updateProperty(Property<?> prop, SchemaUpdatePolicy policy) throws T2DBException {
    boolean done = false;
    Throwable cause = null;
    Surrogate s = prop.getSurrogate();
    try {
      check(Permission.MODIFY, prop);
      DBCollection coll = getMongoDB(s).getProperties();
      coll.update(asQuery(s.getId()), operation(Operator.SET, MongoDatabase.FLD_PROP_NAME, prop.getName()));
      done = true;
    } catch (Exception e) {
      cause = e;
    } finally {
    }
    if (!done || cause != null)
      throw T2DBMsg.exception(cause, E.E20116, prop.getName());
  }
 
  /**
   * Packs a property into a BSON object.
   *
   * @param prop a Property
   * @return a BasicDBObject
   */
  private <T>BasicDBObject pack(Property<T> prop) {
    com.mongodb.BasicDBObject bo = new BasicDBObject();
    if (!prop.getSurrogate().inConstruction())
      bo.put(MongoDatabase.FLD_ID, getId(prop));
    bo.put(MongoDatabase.FLD_PROP_NAME, prop.getName());
    bo.put(MongoDatabase.FLD_PROP_VT, getId(prop.getValueType()));
    bo.put(MongoDatabase.FLD_PROP_INDEXED, prop.isIndexed());
    return bo;
  }
 
}
TOP

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

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.