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}