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