// Others are per class/field. Others have a user-defined name.
// The name that they are cached under relates to what they use.
// Generate the name for ValueGenerationManager to use the strategy for this field/class.
String generatorName = null;
String generatorNameKeyInManager = null;
ConfigurationElement elem =
nucleusContext.getPluginManager().getConfigurationElementForExtension(
"org.datanucleus.store_valuegenerator",
new String[]{"name", "unique"}, new String[] {strategyName, "true"});
if (elem != null)
{
// Unique value generator so set the key in ValueGenerationManager to the value generator name itself
generatorName = elem.getAttribute("name");
generatorNameKeyInManager = generatorName;
}
else
{
// Not a unique (datastore-independent) generator so try just for this datastore
elem = nucleusContext.getPluginManager().getConfigurationElementForExtension(
"org.datanucleus.store_valuegenerator",
new String[]{"name", "datastore"}, new String[] {strategyName, storeManagerKey});
if (elem != null)
{
// Set the generator name (for use by the ValueGenerationManager)
generatorName = elem.getAttribute("name");
}
}
if (generatorNameKeyInManager == null)
{
// Value generator is not unique so set based on class/field
if (absoluteFieldNumber >= 0)
{
// Require generation for a field so use field name for the generator symbolic name
generatorNameKeyInManager = mmd.getFullFieldName();
}
else
{
// Require generation for a datastore id field so use the base class name for generator symbolic name
generatorNameKeyInManager = cmd.getBaseAbstractClassMetaData().getFullClassName();
}
}
// Try to find the generator from the ValueGenerationManager if we already have it managed
ValueGenerator generator = null;
synchronized (this)
{
// This block is synchronised since we don't want to let any other thread through until
// the generator is created, in case it is the same as the next request
generator = getValueGenerationManager().getValueGenerator(generatorNameKeyInManager);
if (generator == null)
{
if (generatorName == null)
{
// No available value-generator for the specified strategy for this datastore
throw new NucleusUserException(LOCALISER.msg("038004", strategy));
}
// Set up the default properties available for all value generators
Properties props = getPropertiesForGenerator(cmd, absoluteFieldNumber, ec, sequenceMetaData,
tableGeneratorMetaData);
Class cls = null;
if (elem != null)
{
cls = nucleusContext.getPluginManager().loadClass(elem.getExtension().getPlugin().getSymbolicName(),
elem.getAttribute("class-name"));
}
if (cls == null)
{
throw new NucleusException("Cannot create Value Generator for strategy " + generatorName);
}