Package ch.agent.crnickl.mongodb

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

/*
*   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.HashSet;
import java.util.Set;
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.AttributeDefinition;
import ch.agent.crnickl.api.DBObjectType;
import ch.agent.crnickl.api.Database;
import ch.agent.crnickl.api.Property;
import ch.agent.crnickl.api.SeriesDefinition;
import ch.agent.crnickl.api.Surrogate;
import ch.agent.crnickl.api.UpdatableSchema;
import ch.agent.crnickl.impl.AttributeDefinitionImpl;
import ch.agent.crnickl.impl.SeriesDefinitionImpl;
import ch.agent.crnickl.impl.UpdatableSchemaImpl;
import ch.agent.crnickl.mongodb.T2DBMMsg.J;

import com.mongodb.BasicDBList;
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 schemas.
* @author Jean-Paul Vetterli
*/
public class ReadMethodsForSchema extends MongoDatabaseMethods {

  public ReadMethodsForSchema() {
  }
 
  /**
   * Find a schema corresponding to a surrogate.
   *
   * @param surrogate a surrogate
   * @return a schema or null
   * @throws T2DBException
   */
  public UpdatableSchema getSchema(Surrogate surrogate) throws T2DBException {
    return getSchema(surrogate, null);
  }
 
  /**
   * Find a collection of schema surrogates with labels matching a pattern.
   *
   * @param db a database
   * @param pattern a simple pattern where "*" stands for zero or more characters
   * @return a collection of schema surrogates
   * @throws T2DBException
   */
  public Collection<Surrogate> getSchemaSurrogateList(Database db, String pattern) throws T2DBException {
    try {
      Collection<Surrogate> result = new ArrayList<Surrogate>();
      DBCollection coll = getMongoDB(db).getSchemas();
      DBObject query = null;
      if (pattern != null && pattern.length() > 0) {
        String regexp = extractRegexp(pattern);
        if (regexp == null) {
          regexp = pattern.replace("*", ".*");
          if (regexp.equals(pattern))
            regexp = null;
        }
        query = mongoObject(MongoDatabase.FLD_SCHEMA_NAME,
            regexp == null ? pattern : Pattern.compile(regexp));
      }
      DBCursor cursor = coll.find(query);
      try {
        while (cursor.hasNext()) {
          ObjectId id = (ObjectId) cursor.next().get(MongoDatabase.FLD_ID);
          Surrogate s = makeSurrogate(db, DBObjectType.SCHEMA, new MongoDBObjectId(id));
          result.add(s);
        }
      } finally {
        cursor.close();
      }
      return result;
    } catch (Exception e) {
      throw T2DBMsg.exception(e, E.E30105, pattern);
    }
  }   
 
  private UpdatableSchema getSchema(Surrogate s, Set<ObjectId> cycleDetector) throws T2DBException {
    try {
      DBObject obj = getObject(s, false);
      return obj == null ? null : unpack(s.getDatabase(), (BasicDBObject) obj, cycleDetector);
    } catch (Exception e) {
      throw T2DBMsg.exception(e, E.E30104, s.toString());
    }
  }
 
  private UpdatableSchema unpack(Database db, BasicDBObject obj, Set<ObjectId> cycleDetector) throws T2DBException {
    if (cycleDetector == null)
      cycleDetector = new HashSet<ObjectId>();
    try {
      ObjectId id = obj.getObjectId(MongoDatabase.FLD_ID);
      Surrogate s = makeSurrogate(db, DBObjectType.SCHEMA, new MongoDBObjectId(id));
      boolean cycleDetected = !cycleDetector.add(id);
      String name = obj.getString(MongoDatabase.FLD_SCHEMA_NAME);
      UpdatableSchema base = null;
      ObjectId baseId = obj.getObjectId(MongoDatabase.FLD_SCHEMA_BASE);
      if (baseId != null && !cycleDetected) {
        Surrogate baseSurr = makeSurrogate(db, DBObjectType.SCHEMA, new MongoDBObjectId(baseId));
        base = getSchema(baseSurr, cycleDetector);
      }
      Collection<AttributeDefinition<?>> attribs = attributeDefinitions(s, 0, db, (BasicDBList)obj.get(MongoDatabase.FLD_SCHEMA_ATTRIBS));
      Collection<SeriesDefinition> series = seriesDefinitions(s, db, (BasicDBList)obj.get(MongoDatabase.FLD_SCHEMA_SERIES));
      return new UpdatableSchemaImpl(name,  base,  attribs,  series,  s);
    } catch (ClassCastException e) {
      throw T2DBMMsg.exception(e, J.J81010, obj.toString());
    }
  }
 
  private Collection<AttributeDefinition<?>> attributeDefinitions(Surrogate schemaSurrogate, int seriesNr, Database db, BasicDBList list) throws T2DBException {
    Collection<AttributeDefinition<?>> result = new ArrayList<AttributeDefinition<?>>(list.size());
    for (int i = 0; i < list.size(); i++) {
      result.add(attributeDefinition(schemaSurrogate, seriesNr, db, (BasicDBObject)list.get(i)));
    }
    return result;
  }
 
  @SuppressWarnings({ "rawtypes", "unchecked" })
  private AttributeDefinition<?> attributeDefinition(Surrogate schemaSurrogate, int seriesNr, Database db, BasicDBObject bo) throws T2DBException {
    int number = bo.getInt(MongoDatabase.FLD_ATTRIBDEF_NUM);
    boolean era = bo.getBoolean(MongoDatabase.FLD_ATTRIBDEF_ERASING);
    AttributeDefinitionImpl<?> def = null;
    if (era) {
      def = new AttributeDefinitionImpl(seriesNr, number, null, null);
      def.edit();
      def.setErasing(true);
    } else {
      ObjectId propId =  bo.getObjectId(MongoDatabase.FLD_ATTRIBDEF_PROP);
      Surrogate propSurr = makeSurrogate(db, DBObjectType.PROPERTY, new MongoDBObjectId(propId));
      Property<?> prop = ((MongoDatabase) db).getReadMethodsForProperty().getProperty(propSurr);
      String val =  bo.getString(MongoDatabase.FLD_ATTRIBDEF_VAL);
      checkIntegrity(prop, propSurr, schemaSurrogate);
      def = new AttributeDefinitionImpl(seriesNr, number, prop, prop.getValueType().scan(val));
    }
    return def;
  }
 
  private Collection<SeriesDefinition> seriesDefinitions(Surrogate schemaSurrogate, Database db, BasicDBList list) throws T2DBException {
    Collection<SeriesDefinition> result = new ArrayList<SeriesDefinition>(list.size());
    for (int i = 0; i < list.size(); i++) {
      result.add(seriesDefinition(schemaSurrogate, db, (BasicDBObject)list.get(i)));
    }
    return result;
  }
 
  private SeriesDefinition seriesDefinition(Surrogate schemaSurrogate, Database db, BasicDBObject bo) throws T2DBException {
    int number = bo.getInt(MongoDatabase.FLD_SERIESDEF_NUM);
    boolean era = bo.getBoolean(MongoDatabase.FLD_SERIESDEF_ERASING);
    SeriesDefinitionImpl def = null;
    if (era) {
      def = new SeriesDefinitionImpl(number, null, null);
      def.edit();
      def.setErasing(true);
    } else {
      String desc =  bo.getString(MongoDatabase.FLD_SERIESDEF_DESC);
      BasicDBList list = (BasicDBList)bo.get(MongoDatabase.FLD_SERIESDEF_ATTRIBS);
      Collection<AttributeDefinition<?>> attribs = attributeDefinitions(schemaSurrogate, number, db, list);
      def = new SeriesDefinitionImpl(number, desc, attribs);
    }
    return def;
  }

}
TOP

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

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.