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