Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Java Registry Definition API

The Registry Definition API is a collection of interfaces for the definition of the constituents of a registry. This includes modules, extension points (services and configurations),
extensions (implementation, contributions, interceptors etc.) and their relationships.

The hivemind-framework library includes a default implementation of these interfaces.

The following example shows how two services (Calculator and Adder) are defined and wired:

Code Block
public class JavaDefinitionExample
{
    public static void main(String[] args)
    {
        JavaDefinitionExample example = new JavaDefinitionExample();
        Registry registry = example.constructRegistry();
        
        Calculator calculator = (Calculator) registry.getService(Calculator.class);
        double result = calculator.add(10, 20);
        System.out.println("Result: " + result);
    }
    
    private Registry constructRegistry()
    {
        RegistryDefinition registryDefinition = new RegistryDefinitionImpl();
        ModuleDefinition module = defineModule(registryDefinition);
        registryDefinition.addModule(module);
        
        RegistryBuilder builder = new RegistryBuilder(registryDefinition);
        Registry registry = builder.constructRegistry();
        return registry;
    }

    private ModuleDefinition defineModule(RegistryDefinition registryDefinition)
    {
        ModuleDefinitionImpl module = new ModuleDefinitionImpl("calculator", createLocation());
         
        // Define the calculator service
        ServicePointDefinitionImpl calculatorService = new ServicePointDefinitionImpl(module, 
                "Calculator", null, Visibility.PUBLIC, Calculator.class.getName());

        // Define inline implementation constructor, that wires the Adder service
        ImplementationConstructor calculatorConstructor = new AbstractServiceImplementationConstructor(createLocation())
        {
            public Object constructCoreServiceImplementation(ImplementationConstructionContext context)
            {
                CalculatorImpl result = new CalculatorImpl();
                result.setAdder((Adder) context.getService(Adder.class));
                return result;
            }
        };
        ImplementationDefinition calculatorImplementation = new ImplementationDefinitionImpl(module, null, 
                calculatorConstructor, ServiceModel.PRIMITIVE, true);
        calculatorService.addImplementation(calculatorImplementation);
        module.addServicePoint(calculatorService);
        
        // Define the adder service
        ServicePointDefinitionImpl adderService = new ServicePointDefinitionImpl(module, 
                "Adder", null, Visibility.PUBLIC, Adder.class.getName());

        ImplementationDefinition adderImplementation = new ImplementationDefinitionImpl(module, null, 
                new CreateClassServiceConstructor(createLocation(), AdderImpl.class.getName()), 
                ServiceModel.PRIMITIVE, true);
        adderService.addImplementation(adderImplementation);
        module.addServicePoint(adderService);
        
        return module;
    }
    
}

In comparison to the XML or annotation based definition this is quite verbose, but it is the most versatile technique.

A main concept of the definition API is the use of constructor callbacks. The service implementation CalculatorImpl
of the Calculator service is constructed by a call to an implementation of the ImplementationConstructor interface.
The use of callbacks allows to realize lazy instantiation and service models (POOLED, THREADED) which require the
construction of multiple service instances.

The core services of the hivemind-framework library are defined by this API too. Have a look at CoreServicesProvider to see more example code.