001// Generated by delombok at Thu May 02 07:34:48 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 * @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    @NonNull
042    private final SubstitutionApplicationIdentifier substitutionApplicationIdentifier;
043
044    /**
045     * The main method for generation of documentation of the credibledoc-substitution tool.
046     * @param args not used
047     */
048    public static void main(String[] args) {
049        log.info(APPLICATION_SUBSTITUTION_DOC_LAUNCHED);
050        try (AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SubstitutionDocMain.class)) {
051            applicationContext.start();
052            log.info("Spring ApplicationContext created and started");
053            SubstitutionDocMain substitutionDocMain = applicationContext.getBean(SubstitutionDocMain.class);
054            substitutionDocMain.substitute();
055        }
056        log.info(APPLICATION_SUBSTITUTION_DOC_FINISHED);
057    }
058
059    private void substitute() {
060        TacticService.getInstance().getTactics().add(substitutionSpecificTactic);
061        ApplicationIdentifierService.getInstance().getApplicationIdentifiers().add(substitutionApplicationIdentifier);
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, @NonNull final SubstitutionApplicationIdentifier substitutionApplicationIdentifier) {
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        if (substitutionApplicationIdentifier == null) {
109            throw new java.lang.NullPointerException("substitutionApplicationIdentifier");
110        }
111        this.reportDocumentCreators = reportDocumentCreators;
112        this.substitutionSpecificTactic = substitutionSpecificTactic;
113        this.substitutionApplicationIdentifier = substitutionApplicationIdentifier;
114    }
115}