/**
* Copyright (C) 2010 Michael Mosmann <michael@mosmann.de>
*
* 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 de.flapdoodle.mongoom.datastore;
import java.util.logging.Logger;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import de.flapdoodle.mongoom.annotations.CappedAt;
import de.flapdoodle.mongoom.annotations.Entity;
import de.flapdoodle.mongoom.datastore.collections.ICollection;
import de.flapdoodle.mongoom.datastore.collections.ICollectionCap;
import de.flapdoodle.mongoom.exceptions.ObjectMapperException;
import de.flapdoodle.mongoom.logging.LogConfig;
public final class Caps {
static final Logger _logger=LogConfig.getLogger(Caps.class);
private Caps() {
}
@Deprecated
public static void ensureCaps(DB db, Class<?> entity) {
Entity annotation = entity.getAnnotation(Entity.class);
String collName = annotation.value();
CappedAt cap = annotation.cap();
if (cap!=null) {
ensureCaps(db, collName, ICollectionCap.Annotated.with(cap));
}
}
public static void ensureCaps(DB db, ICollection collection) {
ensureCaps(db, collection.name(),collection.cap());
}
public static void ensureCaps(DB db, String collectionName, ICollectionCap capCollection) {
if (capCollection != null) {
long count = capCollection.count();
long size = capCollection.size();
if (size==0) throw new ObjectMapperException("Size == 0");
if ((size<Long.MAX_VALUE) && (count<Long.MAX_VALUE)) {
try {
db.requestStart();
BasicDBObjectBuilder dbCapOpts = BasicDBObjectBuilder.start("capped", true);
dbCapOpts.add("size", size);
if (count > 0)
dbCapOpts.add("max", count);
DBCollection dbColl = db.getCollection(collectionName);
if (db.getCollectionNames().contains(collectionName)) {
DBObject dbResult = db.command(BasicDBObjectBuilder.start("collstats", collectionName).get());
if (dbResult.containsField("capped")) {
// TODO: check the cap options.
_logger.warning("DBCollection already exists is cap'd already; doing nothing. " + dbResult);
} else {
_logger.warning("DBCollection already exists with same name(" + collectionName
+ ") and is not cap'd; not creating cap'd version!");
}
} else {
db.createCollection(collectionName, dbCapOpts.get());
_logger.info("Created cap'd DBCollection (" + collectionName + ") with opts " + capCollection);
}
} finally {
Errors.checkError(db, Operation.Insert);
db.requestDone();
}
}
}
}
}