Commit b63e2384 authored by liaozan's avatar liaozan 🏀

Polish

parent 7cfb6302
...@@ -9,14 +9,20 @@ import com.schbrain.common.util.JacksonUtils; ...@@ -9,14 +9,20 @@ import com.schbrain.common.util.JacksonUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.maven.cli.MavenCli; 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.apache.maven.settings.io.DefaultSettingsWriter;
import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.transport.CredentialsProvider; import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.URIish; import org.eclipse.jgit.transport.URIish;
import org.gitlab4j.api.*; import org.gitlab4j.api.GitLabApi;
import org.gitlab4j.api.models.*; 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.File;
import java.io.IOException; import java.io.IOException;
...@@ -53,12 +59,11 @@ public class MavenUtils { ...@@ -53,12 +59,11 @@ public class MavenUtils {
public static String generate(ArchetypeGenerateParam param) { public static String generate(ArchetypeGenerateParam param) {
log.info("Prepare to generate archetype project: {}", JacksonUtils.toJsonString(param, true)); log.info("Prepare to generate archetype project: {}", JacksonUtils.toJsonString(param, true));
MavenCli mavenCli = new MavenCli();
String id = IdWorker.getIdStr(); String id = IdWorker.getIdStr();
File archetype = getArchetypeDirectory(id); File archetype = getArchetypeDirectory(id);
String outputDirectory = archetype.getAbsolutePath(); String outputDirectory = archetype.getAbsolutePath();
String[] args = getArchetypeGenerateArgs(param, SETTINGS_FILE.getAbsolutePath(), outputDirectory); 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); log.info("Generate archetype project at {}", outputDirectory);
if (param.isInitGitRepo()) { if (param.isInitGitRepo()) {
Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId()); Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId());
...@@ -190,4 +195,4 @@ public class MavenUtils { ...@@ -190,4 +195,4 @@ public class MavenUtils {
} }
} }
} }
\ No newline at end of file
...@@ -4,19 +4,16 @@ import cn.hutool.core.io.FileUtil; ...@@ -4,19 +4,16 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.system.SystemUtil; import cn.hutool.system.SystemUtil;
import com.schbrain.archetype.initializer.config.properties.ArchetypeProperties; import com.schbrain.archetype.initializer.config.properties.ArchetypeProperties;
import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.common.exception.BaseException; import com.schbrain.common.exception.BaseException;
import com.schbrain.common.util.EnvUtils; import com.schbrain.common.util.EnvUtils;
import com.schbrain.framework.support.spring.OnceApplicationContextEventListener;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.transport.TagOpt; import org.eclipse.jgit.transport.TagOpt;
import org.springframework.beans.factory.annotation.Autowired; 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.boot.context.properties.EnableConfigurationProperties;
import org.springframework.core.env.Environment; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.File; import java.io.File;
...@@ -28,39 +25,25 @@ import java.io.File; ...@@ -28,39 +25,25 @@ import java.io.File;
@Slf4j @Slf4j
@Component @Component
@EnableConfigurationProperties(ArchetypeProperties.class) @EnableConfigurationProperties(ArchetypeProperties.class)
public class ArchetypePreparer implements ApplicationRunner { public class ArchetypePreparer extends OnceApplicationContextEventListener<ContextRefreshedEvent> {
@Autowired
private Environment environment;
@Autowired @Autowired
private ArchetypeProperties archetypeProperties; private ArchetypeProperties archetypeProperties;
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
@Override @Override
public void run(ApplicationArguments args) { protected void onEvent(ContextRefreshedEvent event) {
taskExecutor.execute(() -> { if (!EnvUtils.runningOnCloudPlatform(getApplicationContext().getEnvironment())) {
installArchetype(); return;
warmUpIfRequired(); }
}); installArchetype();
} }
public void installArchetype() { private void installArchetype() {
File archetypeTemplateDirectory = createArchetypeDirectory(); File archetypeTemplateDirectory = createArchetypeDirectory();
checkoutArchetype(archetypeTemplateDirectory); checkoutArchetype(archetypeTemplateDirectory);
MavenUtils.install(archetypeTemplateDirectory.getAbsolutePath()); 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() { private File createArchetypeDirectory() {
String tempDir = SystemUtil.getUserInfo().getTempDir(); String tempDir = SystemUtil.getUserInfo().getTempDir();
File archetypeTemplateDirectory = new File(tempDir, "archetype"); File archetypeTemplateDirectory = new File(tempDir, "archetype");
...@@ -75,10 +58,10 @@ public class ArchetypePreparer implements ApplicationRunner { ...@@ -75,10 +58,10 @@ public class ArchetypePreparer implements ApplicationRunner {
.setDirectory(archetypeTemplateDirectory) .setDirectory(archetypeTemplateDirectory)
.setURI(archetypeProperties.getSourceUrl()) .setURI(archetypeProperties.getSourceUrl())
.call()) { .call()) {
log.info("Success checkout archetype source from {}", archetypeProperties.getSourceUrl()); log.info("Success checkout archetype source from {} to {}", archetypeProperties.getSourceUrl(), archetypeTemplateDirectory);
} catch (GitAPIException e) { } catch (GitAPIException e) {
throw new BaseException("Failed to checkout archetype source from git repository", e); throw new BaseException("Failed to checkout archetype source from git repository", e);
} }
} }
} }
\ No newline at end of file
package com.schbrain.archetype.initializer.service; package com.schbrain.archetype.initializer.service;
import cn.hutool.cache.impl.TimedCache; import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.maven.MavenUtils;
import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam;
import com.schbrain.archetype.initializer.response.PreviewFileTree; import com.schbrain.archetype.initializer.response.PreviewFileTree;
import com.schbrain.common.web.utils.ServletUtils; 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.stereotype.Service;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse; 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.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; import java.util.stream.Collectors;
/** /**
...@@ -48,9 +57,12 @@ public class ArchetypeService { ...@@ -48,9 +57,12 @@ public class ArchetypeService {
} }
private PreviewFileTree buildFileTree(File root) { private PreviewFileTree buildFileTree(File root) {
File[] fileItems = root.listFiles(); File[] fileItems = Optional.ofNullable(root.listFiles()).orElse(new File[0]);
if (ArrayUtil.isEmpty(fileItems)) { if (fileItems.length == 0) {
return new PreviewFileTree(root); File gitKeepFile = createGitKeepFile(root);
if (gitKeepFile != null) {
fileItems = new File[]{gitKeepFile};
}
} }
List<PreviewFileTree> children = Arrays.stream(fileItems) List<PreviewFileTree> children = Arrays.stream(fileItems)
.map(fileItem -> { .map(fileItem -> {
...@@ -67,6 +79,16 @@ public class ArchetypeService { ...@@ -67,6 +79,16 @@ public class ArchetypeService {
return new PreviewFileTree(root, children); 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 { private File getGeneratedFiles(String id) throws FileNotFoundException {
File archetypeDirectory = MavenUtils.getArchetypeDirectory(id); File archetypeDirectory = MavenUtils.getArchetypeDirectory(id);
if (!archetypeDirectory.exists()) { if (!archetypeDirectory.exists()) {
......
package com.schbrain.archetype.initializer.service; 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 com.schbrain.common.exception.BaseException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.gitlab4j.api.GitLabApi; import org.gitlab4j.api.GitLabApi;
...@@ -39,4 +41,4 @@ public class GitlabService { ...@@ -39,4 +41,4 @@ public class GitlabService {
} }
} }
} }
\ No newline at end of file
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>com.schbrain.kp</groupId> <groupId>com.schbrain.framework</groupId>
<artifactId>kp-parent</artifactId> <artifactId>schbrain-parent</artifactId>
<version>2.0.0-SNAPSHOT</version> <version>3.0.5-SNAPSHOT</version>
</parent> </parent>
<groupId>com.schbrain.archetype</groupId> <groupId>com.schbrain.archetype</groupId>
...@@ -76,4 +76,4 @@ ...@@ -76,4 +76,4 @@
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </project>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment