Commit b63e2384 authored by liaozan's avatar liaozan 🏀

Polish

parent 7cfb6302
......@@ -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
}
......@@ -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<ContextRefreshedEvent> {
@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
}
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<PreviewFileTree> 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()) {
......
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
}
......@@ -6,9 +6,9 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.schbrain.kp</groupId>
<artifactId>kp-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<groupId>com.schbrain.framework</groupId>
<artifactId>schbrain-parent</artifactId>
<version>3.0.5-SNAPSHOT</version>
</parent>
<groupId>com.schbrain.archetype</groupId>
......@@ -76,4 +76,4 @@
</dependencies>
</dependencyManagement>
</project>
\ No newline at end of file
</project>
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