Create new module

Our application needs module entry point which will initialize all needed services. Our module will depends on ServerAppAdminModuleEntryPoint - administration module and will inherit all its dependencies. We need to register here menu, add business servicess mapping, and register database sequences for JPA entities.

public class EmpCoreModuleEntryPointImpl extends AbstractModuleEntryPoint
                implements EmpCoreModuleEntryPoint {
        private static LoggerMethodTracer logger = LoggerMethodTracer
                        .getLogger(EmpCoreModuleEntryPointImpl.class);

        @Override
        protected Module createModule() {
                return EmpCoreModule.getInstance();
        }

        @SuppressWarnings("unchecked")
        @Override
        public <T extends ModuleEntryPoint> Class<T> getImplClassForModule(
                        Class<T> moduleIface) {
                if (ServerAppAdminModuleEntryPoint.class.equals(moduleIface)) {
                        return (Class<T>) ServerAppAdminModuleEntryPointImpl.class;
                }
                return null;
        }

        @Override
        public void entryPoint(AppEntryPoint appEntryPoint, Module module) {
                MethodTimer method = logger.methodEntry(Level.INFO);
                registerMenu(appEntryPoint, module);
                registerSequences(appEntryPoint,module);
                registerBusinesServices(appEntryPoint, module);
                logger.methodExit(method);
        }

        private void registerMenu(AppEntryPoint appEntryPoint, Module module) {
                MenuBarBuilder menuBarBuilder = PicoHelper.getMandatoryComponent(module.getContainer(), MenuBarBuilder.class);
                menuBarBuilder.registerMenuBuilder(new EmployeesMenuDefinitionBuilder());
                menuBarBuilder.registerMenuBuilder(new DepartmentsMenuDefinitionBuilder());
                menuBarBuilder.registerMenuBuilder(new ProjectsMenuDefinitionBuilder());
        }
        
        private void registerBusinesServices(AppEntryPoint appEntryPoint,Module module) {
                BusinessServiceCreator bsc = PicoHelper.getMandatoryComponent(module.getContainer(),BusinessServiceCreator.class);
                bsc.registerMapping(DepartmentService.class,new BSImplMapping(DepartmentServiceImpl.class));
                bsc.registerMapping(TaskService.class,new BSImplMapping(TaskServiceImpl.class));
                bsc.registerMapping(ProjectService.class,new BSImplMapping(ProjectServiceImpl.class));
                bsc.registerMapping(EmployeeService.class,new BSImplMapping(EmployeeServiceImpl.class));
        }
        
        private void registerSequences(AppEntryPoint appEntryPoint, Module module) {
                JPAWrapper jpaWrapper = PicoHelper.getMandatoryComponent(module.getContainer(), JPAWrapper.class);
                DatabaseInfoRegistry dbInfoRegistry = PicoHelper.getMandatoryComponent(module.getContainer(), DatabaseInfoRegistry.class);
                IdGeneratorRegistry registry = module.getContainer().getComponent(IdGeneratorRegistry.class);
                if(registry == null){
                        registry = new IdGeneratorRegistryByEntity();
                        ServerPersistenceModule.getInstance().getContainer().addComponent(IdGeneratorRegistry.class,registry);
                        IdHelper.setRegistry(registry);
                }
                DataSource ds = jpaWrapper.getDataSource(VPDAUnitsRefs.VPDA);
                DatabaseInfo dbInfo = dbInfoRegistry.getDatabaseInfo(jpaWrapper.getDBProduct(VPDAUnitsRefs.VPDA));
                String dummyTable = VPDADBSchema.Tables.dummyTable.getQualifiedName(dbInfo);
                String seqName = null; 
                seqName = EMPDBSchema.Sequences.depSeq.getQualifiedName(dbInfo);
                registry.registerIdGenerator(Department.class,new SequenceIdGenerator(ds,dbInfo,seqName,dummyTable));
                seqName = EMPDBSchema.Sequences.empSeq.getQualifiedName(dbInfo);
                registry.registerIdGenerator(Employee.class,new SequenceIdGenerator(ds,dbInfo,seqName,dummyTable));
                seqName = EMPDBSchema.Sequences.taskSeq.getQualifiedName(dbInfo);
                registry.registerIdGenerator(Task.class,new SequenceIdGenerator(ds,dbInfo,seqName,dummyTable));
                seqName = EMPDBSchema.Sequences.projSeq.getQualifiedName(dbInfo);
                registry.registerIdGenerator(Project.class,new SequenceIdGenerator(ds,dbInfo,seqName,dummyTable));
        }



        @Override
        public List<Class<? extends ModuleEntryPoint>> getRequiredModuleEntryPointsClasses(
                        AppEntryPoint appEntryPoint) {
                List<Class<? extends ModuleEntryPoint>> result = new ArrayList<Class<? extends ModuleEntryPoint>>(
                                2);
                result.add(ServerAppAdminModuleEntryPoint.class);
                return result;
        }

}