diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java index 26b5ee0669640bffcaebd882e0b07e819b687149..6851eb2c11b595a5abc2a5312beb9bf406a2df61 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java @@ -9,14 +9,20 @@ import com.schbrain.common.util.JacksonUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.maven.cli.MavenCli; -import org.apache.maven.settings.*; +import org.apache.maven.settings.Mirror; +import org.apache.maven.settings.Server; +import org.apache.maven.settings.Settings; import org.apache.maven.settings.io.DefaultSettingsWriter; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.transport.CredentialsProvider; import org.eclipse.jgit.transport.URIish; -import org.gitlab4j.api.*; -import org.gitlab4j.api.models.*; +import org.gitlab4j.api.GitLabApi; +import org.gitlab4j.api.GitLabApiException; +import org.gitlab4j.api.ProtectedBranchesApi; +import org.gitlab4j.api.models.Group; +import org.gitlab4j.api.models.Project; +import org.gitlab4j.api.models.ProtectedBranch; import java.io.File; import java.io.IOException; @@ -53,12 +59,11 @@ public class MavenUtils { public static String generate(ArchetypeGenerateParam param) { log.info("Prepare to generate archetype project: {}", JacksonUtils.toJsonString(param, true)); - MavenCli mavenCli = new MavenCli(); String id = IdWorker.getIdStr(); File archetype = getArchetypeDirectory(id); String outputDirectory = archetype.getAbsolutePath(); String[] args = getArchetypeGenerateArgs(param, SETTINGS_FILE.getAbsolutePath(), outputDirectory); - mavenCli.doMain(args, null, System.out, System.err); + MavenCli.doMain(args, null); log.info("Generate archetype project at {}", outputDirectory); if (param.isInitGitRepo()) { Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId()); @@ -190,4 +195,4 @@ public class MavenUtils { } } -} \ No newline at end of file +} diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java index d0ad406a2e88a9815a5115297eb6149cf95f2303..f59ad1231e5d4fbf2ea60eecfbe1334e94257fa3 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java @@ -4,19 +4,16 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.system.SystemUtil; import com.schbrain.archetype.initializer.config.properties.ArchetypeProperties; import com.schbrain.archetype.initializer.maven.MavenUtils; -import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.common.exception.BaseException; import com.schbrain.common.util.EnvUtils; +import com.schbrain.framework.support.spring.OnceApplicationContextEventListener; import lombok.extern.slf4j.Slf4j; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.transport.TagOpt; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import java.io.File; @@ -28,39 +25,25 @@ import java.io.File; @Slf4j @Component @EnableConfigurationProperties(ArchetypeProperties.class) -public class ArchetypePreparer implements ApplicationRunner { +public class ArchetypePreparer extends OnceApplicationContextEventListener { - @Autowired - private Environment environment; @Autowired private ArchetypeProperties archetypeProperties; - @Autowired - private ThreadPoolTaskExecutor taskExecutor; @Override - public void run(ApplicationArguments args) { - taskExecutor.execute(() -> { - installArchetype(); - warmUpIfRequired(); - }); + protected void onEvent(ContextRefreshedEvent event) { + if (!EnvUtils.runningOnCloudPlatform(getApplicationContext().getEnvironment())) { + return; + } + installArchetype(); } - public void installArchetype() { + private void installArchetype() { File archetypeTemplateDirectory = createArchetypeDirectory(); checkoutArchetype(archetypeTemplateDirectory); MavenUtils.install(archetypeTemplateDirectory.getAbsolutePath()); } - private void warmUpIfRequired() { - if (!EnvUtils.runningOnCloudPlatform(environment)) { - return; - } - ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam(); - mockParam.setGroupId("com.schbrain"); - mockParam.setArtifactId("schbrain-init"); - MavenUtils.generate(mockParam); - } - private File createArchetypeDirectory() { String tempDir = SystemUtil.getUserInfo().getTempDir(); File archetypeTemplateDirectory = new File(tempDir, "archetype"); @@ -75,10 +58,10 @@ public class ArchetypePreparer implements ApplicationRunner { .setDirectory(archetypeTemplateDirectory) .setURI(archetypeProperties.getSourceUrl()) .call()) { - log.info("Success checkout archetype source from {}", archetypeProperties.getSourceUrl()); + log.info("Success checkout archetype source from {} to {}", archetypeProperties.getSourceUrl(), archetypeTemplateDirectory); } catch (GitAPIException e) { throw new BaseException("Failed to checkout archetype source from git repository", e); } } -} \ No newline at end of file +} diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java index 4e3c6aff722c6bc507799e1fb2bbebfff926ed6d..7711c8d5a106bdb489fab0134040136ea36f7a02 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java @@ -1,21 +1,30 @@ package com.schbrain.archetype.initializer.service; import cn.hutool.cache.impl.TimedCache; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ZipUtil; import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.response.PreviewFileTree; import com.schbrain.common.web.utils.ServletUtils; -import org.springframework.http.*; +import org.springframework.http.ContentDisposition; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Duration; -import java.util.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -48,9 +57,12 @@ public class ArchetypeService { } private PreviewFileTree buildFileTree(File root) { - File[] fileItems = root.listFiles(); - if (ArrayUtil.isEmpty(fileItems)) { - return new PreviewFileTree(root); + File[] fileItems = Optional.ofNullable(root.listFiles()).orElse(new File[0]); + if (fileItems.length == 0) { + File gitKeepFile = createGitKeepFile(root); + if (gitKeepFile != null) { + fileItems = new File[]{gitKeepFile}; + } } List children = Arrays.stream(fileItems) .map(fileItem -> { @@ -67,6 +79,16 @@ public class ArchetypeService { return new PreviewFileTree(root, children); } + private File createGitKeepFile(File root) { + try { + Path created = Files.createFile(Path.of(root.getPath(), ".gitkeep")); + Files.writeString(created, "This file is used to keep an empty folder when git uploads, If you put other files in the folder, delete this file please"); + return created.toFile(); + } catch (IOException ignore) { + return null; + } + } + private File getGeneratedFiles(String id) throws FileNotFoundException { File archetypeDirectory = MavenUtils.getArchetypeDirectory(id); if (!archetypeDirectory.exists()) { diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/GitlabService.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/GitlabService.java index 764f582321bb2c47f920a184e45e882d5f7f21ee..f1449151412427499052ac6b03ea46926d30d369 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/GitlabService.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/GitlabService.java @@ -1,6 +1,8 @@ package com.schbrain.archetype.initializer.service; -import cn.hutool.core.lang.tree.*; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; import com.schbrain.common.exception.BaseException; import lombok.extern.slf4j.Slf4j; import org.gitlab4j.api.GitLabApi; @@ -39,4 +41,4 @@ public class GitlabService { } } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 7cf538413fed303da1f0c063d3ff92e1f2d82900..49a8f840a966ebfc257f430fb430a0499a27ec27 100644 --- a/pom.xml +++ b/pom.xml @@ -6,9 +6,9 @@ 4.0.0 - com.schbrain.kp - kp-parent - 2.0.0-SNAPSHOT + com.schbrain.framework + schbrain-parent + 3.0.5-SNAPSHOT com.schbrain.archetype @@ -76,4 +76,4 @@ - \ No newline at end of file +