/**
   * Constructor.
   *
   * @param stackContext stack context which provides module access to external functionality
   * @param serviceInfo associated service info
   * @param serviceDirectory used for all IO interaction with service directory in stack definition
   * @param isCommonService flag to mark a service as a common service
   */
  public ServiceModule(
      StackContext stackContext,
      ServiceInfo serviceInfo,
      ServiceDirectory serviceDirectory,
      boolean isCommonService) {
    this.serviceInfo = serviceInfo;
    this.stackContext = stackContext;
    this.serviceDirectory = serviceDirectory;
    this.isCommonService = isCommonService;

    serviceInfo.setMetricsFile(serviceDirectory.getMetricsFile(serviceInfo.getName()));
    serviceInfo.setAlertsFile(serviceDirectory.getAlertsFile());
    serviceInfo.setKerberosDescriptorFile(serviceDirectory.getKerberosDescriptorFile());
    serviceInfo.setWidgetsDescriptorFile(
        serviceDirectory.getWidgetsDescriptorFile(serviceInfo.getName()));
    serviceInfo.setSchemaVersion(AmbariMetaInfo.SCHEMA_VERSION_2);
    serviceInfo.setServicePackageFolder(serviceDirectory.getPackageDir());

    populateComponentModules();
    populateConfigurationModules();
    populateThemeModules();

    validateServiceInfo();
  }