blob: 7b946e272768b00cbedef3669f1ec69e392858d0 [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;
}
}