/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved. * */ package com.sleepycat.persist; import com.sleepycat.db.DatabaseException; import com.sleepycat.db.Environment; // for javadoc import com.sleepycat.persist.evolve.IncompatibleClassException; import com.sleepycat.persist.evolve.Mutations; import com.sleepycat.persist.model.AnnotationModel; import com.sleepycat.persist.model.EntityModel; import com.sleepycat.persist.raw.RawStore; // for javadoc /** * Configuration properties used with an {@link EntityStore} or {@link * RawStore}. * * <p>{@code StoreConfig} objects are thread-safe. Multiple threads may safely * call the methods of a shared {@code StoreConfig} object.</p> * * <p>See the {@link <a href="package-summary.html#example">package * summary example</a>} for an example of using a {@code StoreConfig}.</p> * * @author Mark Hayes */ public class StoreConfig implements Cloneable { /** * The default store configuration containing properties as if the * configuration were constructed and not modified. */ public static final StoreConfig DEFAULT = new StoreConfig(); private boolean allowCreate; private boolean exclusiveCreate; private boolean transactional; private boolean readOnly; private boolean secondaryBulkLoad; private EntityModel model; private Mutations mutations; private DatabaseNamer databaseNamer = DatabaseNamer.DEFAULT; /** * Creates an entity store configuration object with default properties. */ public StoreConfig() { } /** * Returns a shallow copy of the configuration. * * @deprecated As of JE 4.0.13, replaced by {@link * StoreConfig#clone()}.</p> */ public StoreConfig cloneConfig() { try { return (StoreConfig) super.clone(); } catch (CloneNotSupportedException cannotHappen) { return null; } } /** * Returns a shallow copy of the configuration. */ @Override public StoreConfig clone() { try { return (StoreConfig) super.clone(); } catch (CloneNotSupportedException cannotHappen) { return null; } } /** * Specifies whether creation of a new store is allowed. By default this * property is false. * * <p>If this property is false and the internal store metadata database * does not exist, {@link DatabaseException} will be thrown when the store * is opened.</p> */ public StoreConfig setAllowCreate(boolean allowCreate) { setAllowCreateVoid(allowCreate); return this; } /** * The void return setter for use by Bean editors. */ public void setAllowCreateVoid(boolean allowCreate) { this.allowCreate = allowCreate; } /** * Returns whether creation of a new store is allowed. */ public boolean getAllowCreate() { return allowCreate; } /** * Specifies whether opening an existing store is prohibited. By default * this property is false. * * <p>If this property is true and the internal store metadata database * already exists, {@link DatabaseException} will be thrown when the store * is opened.</p> */ public StoreConfig setExclusiveCreate(boolean exclusiveCreate) { setExclusiveCreateVoid(exclusiveCreate); return this; } /** * The void return setter for use by Bean editors. */ public void setExclusiveCreateVoid(boolean exclusiveCreate) { this.exclusiveCreate = exclusiveCreate; } /** * Returns whether opening an existing store is prohibited. */ public boolean getExclusiveCreate() { return exclusiveCreate; } /** * Sets the transactional configuration property. By default this property * is false. * * <p>This property is true to open all store indices for transactional * access. True may not be specified if the environment is not also * transactional.</p> */ public StoreConfig setTransactional(boolean transactional) { setTransactionalVoid(transactional); return this; } /** * The void return setter for use by Bean editors. */ public void setTransactionalVoid(boolean transactional) { this.transactional = transactional; } /** * Returns the transactional configuration property. */ public boolean getTransactional() { return transactional; } /** * Sets the read-only configuration property. By default this property is * false. * * <p>This property is true to open all store indices for read-only access, * or false to open them for read-write access. False may not be specified * if the environment is read-only.</p> */ public StoreConfig setReadOnly(boolean readOnly) { setReadOnlyVoid(readOnly); return this; } /** * The void return setter for use by Bean editors. */ public void setReadOnlyVoid(boolean readOnly) { this.readOnly = readOnly; } /** * Returns the read-only configuration property. */ public boolean getReadOnly() { return readOnly; } /** * Sets the bulk-load-secondaries configuration property. By default this * property is false. * * <p>This property is true to cause the initial creation of secondary * indices to be performed as a bulk load. If this property is true and * {@link EntityStore#getSecondaryIndex EntityStore.getSecondaryIndex} has * never been called for a secondary index, that secondary index will not * be created or written as records are written to the primary index. In * addition, if that secondary index defines a foreign key constraint, the * constraint will not be enforced.</p> * * <p>The secondary index will be populated later when the {@code * getSecondaryIndex} method is called for the first time for that index, * or when the store is closed and re-opened with this property set to * false and the primary index is obtained. In either case, the secondary * index is populated by reading through the entire primary index and * adding records to the secondary index as needed. While populating the * secondary, foreign key constraints will be enforced and an exception is * thrown if a constraint is violated.</p> * * <p>When loading a primary index along with secondary indexes from a * large input data set, configuring a bulk load of the secondary indexes * is sometimes more performant than updating the secondary indexes each * time the primary index is updated. The absence of foreign key * constraints during the load also provides more flexibility.</p> */ public StoreConfig setSecondaryBulkLoad(boolean secondaryBulkLoad) { setSecondaryBulkLoadVoid(secondaryBulkLoad); return this; } /** * The void return setter for use by Bean editors. */ public void setSecondaryBulkLoadVoid(boolean secondaryBulkLoad) { this.secondaryBulkLoad = secondaryBulkLoad; } /** * Returns the bulk-load-secondaries configuration property. */ public boolean getSecondaryBulkLoad() { return secondaryBulkLoad; } /** * Sets the entity model that defines entity classes and index keys. * * <p>If null is specified or this method is not called, an {@link * AnnotationModel} instance is used by default.</p> */ public StoreConfig setModel(EntityModel model) { setModelVoid(model); return this; } /** * The void return setter for use by Bean editors. */ public void setModelVoid(EntityModel model) { this.model = model; } /** * Returns the entity model that defines entity classes and index keys. */ public EntityModel getModel() { return model; } /** * Configures mutations for performing lazy evolution of stored instances. * Existing mutations for this store are not cleared, so the mutations * required are only those changes that have been made since the store was * last opened. Some new mutations may override existing specifications, * and some may be supplemental. * * <p>If null is specified and the store already exists, the previously * specified mutations are used. The mutations are stored persistently in * serialized form.</p> * * <p>Mutations must be available to handle all changes to classes that are * incompatible with the class definitions known to this store. See {@link * Mutations} and {@link com.sleepycat.persist.evolve Class Evolution} for * more information.</p> * * <p>If an incompatible class change has been made and mutations are not * available for handling the change, {@link IncompatibleClassException} * will be thrown when creating an {@link EntityStore}.</p> */ public StoreConfig setMutations(Mutations mutations) { setMutationsVoid(mutations); return this; } /** * The void return setter for use by Bean editors. */ public void setMutationsVoid(Mutations mutations) { this.mutations = mutations; } /** * Returns the configured mutations for performing lazy evolution of stored * instances. */ public Mutations getMutations() { return mutations; } /** * Specifies the object reponsible for naming of files and databases. * * By default this property is {@link DatabaseNamer#DEFAULT}. * * @throws NullPointerException if a null parameter value is passed. */ public StoreConfig setDatabaseNamer(DatabaseNamer databaseNamer) { setDatabaseNamerVoid(databaseNamer); return this; } /** * The void return setter for use by Bean editors. */ public void setDatabaseNamerVoid(DatabaseNamer databaseNamer) { if (databaseNamer == null) { throw new NullPointerException(); } this.databaseNamer = databaseNamer; } /** * Returns the object reponsible for naming of files and databases. */ public DatabaseNamer getDatabaseNamer() { return databaseNamer; } }