blob: 42b6a23045aa94061c78c9df589b879be58acddf [file] [log] [blame]
// Copyright 2010 Google Inc.
//
// 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 com.google.gwtorm.nosql.generic;
import com.google.gwtorm.nosql.NoSqlDatabase;
import com.google.gwtorm.nosql.NoSqlSchema;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.Schema;
import java.util.concurrent.TimeUnit;
/**
* Base class for generic NoSQL typed databases.
*
* <p>The generic types provide basic NoSQL implementation assuming a handful of primitive
* operations are available inside of the implementation's extension of {@link GenericSchema}. All
* relations are stored within the same key space, using the relation name as a prefix for the row's
* primary or secondary key.
*
* <p>Applications should use the database class to create instances of their Schema extension
* interface, and thus open and connect to the data store.
*
* <p>Creating a new database instance is expensive, due to the type analysis and code generation
* performed to implement the Schema and Access interfaces. Applications should create and cache
* their database instance for the life of the application.
*
* <p>Database instances are thread-safe, but returned Schema instances are not.
*
* <p>This class must be further extended by the NoSQL implementation to configure the connectivity
* with the data store and supply the correct subclass of {@link NoSqlSchema} that knows how to
* interact with the data store.
*
* @param <T> type of the application's Schema.
* @param <S> type of the implementation's base for Schema implementations.
* @param <A> type of the implementation's base for Access implementations.
*/
@SuppressWarnings("rawtypes")
public abstract class GenericDatabase<
T extends Schema, S extends GenericSchema, A extends GenericAccess>
extends NoSqlDatabase<T, S, A> {
private static final long DEFAULT_FOSSIL_AGE = TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
/**
* Initialize a new database and generate the implementation.
*
* @param schemaBaseType class that the generated Schema implementation should extend in order to
* provide data store connectivity.
* @param accessBaseType class that the generated Access implementations should extend in order to
* provide single-relation access for each schema instance.
* @param appSchema the application schema interface that must be implemented and constructed on
* demand.
* @throws OrmException the schema cannot be created because of an annotation error in the
* interface definitions.
*/
protected GenericDatabase(
final Class<S> schemaBaseType, final Class<A> accessBaseType, final Class<T> appSchema)
throws OrmException {
super(schemaBaseType, accessBaseType, appSchema);
}
/**
* Default number of milliseconds a transaction can appear to be open.
*
* <p>Secondary index rows that don't match their primary data object and that are older than this
* age are removed from the system during a scan.
*
* @return milliseconds before considering a fossil index record is garbage and should be pruned.
* By default, 5 minutes.
*/
public long getMaxFossilAge() {
return DEFAULT_FOSSIL_AGE;
}
}