initializeMessageSource method

  1. @protected
  2. @mustCallSuper
Future<void> initializeMessageSource()

Initializes the MessageSource for this context.

This is invoked during setup to set up i18n message resolution. By default, it discovers non-abstract subclasses of MessageSource, wraps them in a DelegatingMessageSource, and registers the result in the pod factory.

Subclasses can override this method to provide a custom message source strategy.

This is part of Jetleaf – a framework which developers can use to build web applications.

Implementation

@protected
@mustCallSuper
Future<void> initializeMessageSource() async {
  final factory = getPodFactory();

  if (await factory.containsLocalPod(MESSAGE_SOURCE_POD_NAME)) {
    _messageSource = await factory.getPod(MESSAGE_SOURCE_POD_NAME);

    if (logger.getIsTraceEnabled()) {
      logger.trace("Using message source ${_messageSource!.runtimeType}");
    }
  } else {
    final mcl = Class<MessageSource>(null, PackageNames.CORE);
    final del = Class<DelegatingMessageSource>(null, PackageNames.CORE);
    final sources = <MessageSource>[];
    final classes = mcl.getSubClasses().where((cl) => cl.isInvokable());

    for (final cl in classes) {
      final defc = cl.getNoArgConstructor() ?? cl.getBestConstructor([]) ?? cl.getDefaultConstructor();
      if (defc != null) {
        final source = defc.newInstance();
        sources.add(source);
      } else {
        if (logger.getIsWarnEnabled()) {
          logger.warn("Message ${cl.getName()} does not have a no-arg constructor");
        }
      }
    }

    _messageSource = DelegatingMessageSource(sources);

    await factory.registerSingleton(
      MESSAGE_SOURCE_POD_NAME,
      del,
      object: ObjectHolder<MessageSource>(
        _messageSource!,
        packageName: PackageNames.CORE,
        qualifiedName: del.getQualifiedName(),
      ),
    );

    if (logger.getIsTraceEnabled()) {
      logger.trace("No message source found, using default message source ${_messageSource!.runtimeType}");
    }
  }

  return Future.value();
}