All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.agent.crnickl.mongodb.ReadMethodsForSchema Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
/*
 *   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 getSchemaSurrogateList(Database db, String pattern) throws T2DBException {
		try {
			Collection result = new ArrayList();
			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 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 cycleDetector) throws T2DBException {
		if (cycleDetector == null)
			cycleDetector = new HashSet();
		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> attribs = attributeDefinitions(s, 0, db, (BasicDBList)obj.get(MongoDatabase.FLD_SCHEMA_ATTRIBS));
			Collection 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> attributeDefinitions(Surrogate schemaSurrogate, int seriesNr, Database db, BasicDBList list) throws T2DBException {
		Collection> result = new ArrayList>(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 seriesDefinitions(Surrogate schemaSurrogate, Database db, BasicDBList list) throws T2DBException {
		Collection result = new ArrayList(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> attribs = attributeDefinitions(schemaSurrogate, number, db, list);
			def = new SeriesDefinitionImpl(number, desc, attribs);
		}
		return def;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy