001package com.credibledoc.substitution.doc;
002
003import com.credibledoc.combiner.application.identifier.ApplicationIdentifierService;
004import com.credibledoc.combiner.tactic.TacticService;
005import com.credibledoc.substitution.core.configuration.Configuration;
006import com.credibledoc.substitution.core.configuration.ConfigurationService;
007import com.credibledoc.substitution.core.resource.ResourceService;
008import com.credibledoc.substitution.core.template.TemplateService;
009import com.credibledoc.substitution.doc.module.substitution.SubstitutionApplicationIdentifier;
010import com.credibledoc.substitution.doc.module.substitution.SubstitutionTactic;
011import com.credibledoc.substitution.reporting.markdown.MarkdownService;
012import com.credibledoc.substitution.reporting.reportdocument.ReportDocumentType;
013import com.credibledoc.substitution.reporting.reportdocument.creator.ReportDocumentCreator;
014import com.credibledoc.substitution.reporting.reportdocument.creator.ReportDocumentCreatorService;
015import com.credibledoc.substitution.reporting.visualizer.VisualizerService;
016import lombok.NonNull;
017import lombok.RequiredArgsConstructor;
018import lombok.extern.slf4j.Slf4j;
019import org.springframework.context.annotation.AnnotationConfigApplicationContext;
020import org.springframework.context.annotation.ComponentScan;
021
022import javax.inject.Inject;
023import java.io.File;
024import java.util.Collections;
025import java.util.List;
026
027/**
028 * The main class for generation of documentation of the credibledoc-substitution tool.
029 *
030 * @author Kyrylo Semenko
031 */
032@ComponentScan(basePackages = "com.credibledoc.substitution.doc")
033@RequiredArgsConstructor(onConstructor = @__(@Inject))
034@Slf4j
035public class SubstitutionDocMain {
036
037    public static final String APPLICATION_SUBSTITUTION_DOC_LAUNCHED = "Application substitution-doc launched.";
038
039    public static final String SUBSTITUTION_DOC = "substitution-doc";
040
041    public static final String APPLICATION_SUBSTITUTION_DOC_FINISHED = "Application finished.";
042
043    @NonNull
044    private final List<ReportDocumentCreator> reportDocumentCreators;
045
046    @NonNull
047    private final SubstitutionTactic substitutionSpecificTactic;
048
049    @NonNull
050    private final SubstitutionApplicationIdentifier substitutionApplicationIdentifier;
051
052    /**
053     * The main method for generation of documentation of the credibledoc-substitution tool.
054     */
055    public static void main(String[] args) {
056        log.info(APPLICATION_SUBSTITUTION_DOC_LAUNCHED);
057        try (AnnotationConfigApplicationContext applicationContext
058                     = new AnnotationConfigApplicationContext(SubstitutionDocMain.class)) {
059            applicationContext.start();
060            log.info("Spring ApplicationContext created and started");
061            SubstitutionDocMain substitutionDocMain = applicationContext.getBean(SubstitutionDocMain.class);
062            substitutionDocMain.substitute();
063        }
064        log.info(APPLICATION_SUBSTITUTION_DOC_FINISHED);
065    }
066
067    private void substitute() {
068        TacticService.getInstance().getTactics().add(substitutionSpecificTactic);
069        ApplicationIdentifierService.getInstance().getApplicationIdentifiers().add(substitutionApplicationIdentifier);
070        ReportDocumentCreatorService reportDocumentCreatorService = ReportDocumentCreatorService.getInstance();
071        reportDocumentCreatorService.addReportDocumentCreators(reportDocumentCreators);
072        reportDocumentCreatorService.createReportDocuments();
073        copyResourcesToTargetDirectory();
074        VisualizerService.getInstance().createReports(Collections.singletonList(ReportDocumentType.DOCUMENT_PART_UML));
075        MarkdownService.getInstance().generateContentFromTemplates();
076    }
077
078    private void copyResourcesToTargetDirectory() {
079        Configuration configuration = ConfigurationService.getInstance().getConfiguration();
080        ResourceService resourceService = ResourceService.getInstance();
081        List<String> allResources = resourceService.getResources(null, configuration.getTemplatesResource());
082        TemplateService templateService = TemplateService.getInstance();
083        for (String resource : allResources) {
084            if (!resource.endsWith(MarkdownService.MARKDOWN_FILE_EXTENSION) && containsDotInName(resource)) {
085                String targetFilePath = resourceService.generatePlaceholderResourceRelativePath(resource);
086                String targetFileAbsolutePath = configuration.getTargetDirectory() + targetFilePath;
087                log.info("Resource will be copied to file. Resource: '{}'. TargetFileAbsolutePath: '{}'",
088                    resource, targetFileAbsolutePath);
089                File file = templateService.exportResource(resource, targetFileAbsolutePath);
090                log.info("Resource copied to file: '{}'", file.getAbsolutePath());
091            }
092        }
093    }
094
095    /**
096     * @param resource for example '/template/markdown/' is a directory, and '/template/markdown/README.md' is a file.
097     * @return 'False' if this resource is directory
098     */
099    private boolean containsDotInName(String resource) {
100        int index = resource.lastIndexOf('/');
101        if (index == -1) {
102            index = 0;
103        }
104        String fileName = resource.substring(index);
105        return fileName.contains(".");
106    }
107}