package tech.powerjob.server.core.container;
import tech.powerjob.common.ContainerConstant;
import net.lingala.zip4j.ZipFile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import tech.powerjob.server.common.utils.OmsFileUtils;
import java.io.*;
import java.util.Objects;
/**
* oms-worker container 生成器
*
* @author tjq
* @since 2020/5/15
*/
public class ContainerTemplateGenerator {
private static final String ORIGIN_FILE_NAME = "oms-template-origin";
/**
* 生成 container 的模版文件
* @param group pom group标签
* @param artifact pom artifact标签
* @param name pom name标签
* @param packageName 包名
* @param javaVersion Java版本
* @return 压缩包
* @throws IOException 异常
*/
public static File generate(String group, String artifact, String name, String packageName, Integer javaVersion) throws IOException {
String workerDir = OmsFileUtils.genTemporaryWorkPath();
File originJar = new File(workerDir + "tmp.jar");
String tmpPath = workerDir + "/unzip/";
// CentOS 7 上 getResource 会报 FileNotFoundException,原因不详...
try (InputStream is = ContainerTemplateGenerator.class.getClassLoader().getResourceAsStream(ORIGIN_FILE_NAME + ".zip")) {
Objects.requireNonNull(is, "generate container template failed, can't find zip file in classpath.");
FileUtils.copyInputStreamToFile(is, originJar);
}
ZipFile zipFile = new ZipFile(originJar);
zipFile.extractAll(tmpPath);
String rootPath = tmpPath + ORIGIN_FILE_NAME;
// 1. 修改 pom.xml (按行读,读取期间更改,然后回写)
String pomPath = rootPath + "/pom.xml";
String line;
StringBuilder buffer = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(pomPath))) {
while ((line = br.readLine()) != null) {
if (line.contains("groupId")) {
buffer.append(" ").append(group).append("");
}else if (line.contains("artifactId")) {
buffer.append(" ").append(artifact).append("");
}else if (line.contains("name")) {
buffer.append(" ").append(name).append("");
}else if (line.contains("")) {
buffer.append(" ").append(javaVersion).append("");
}else if (line.contains("")) {
buffer.append(" ").append(javaVersion).append("");
} else {
buffer.append(line);
}
buffer.append(System.lineSeparator());
}
}
OmsFileUtils.string2File(buffer.toString(), new File(pomPath));
// 2. 新建目录
String packagePath = StringUtils.replace(packageName, ".", "/");
String absPath = rootPath + "/src/main/java/" + packagePath;
FileUtils.forceMkdir(new File(absPath));
// 3. 修改 Spring 配置文件
String resourcePath = rootPath + "/src/main/resources/";
String springXMLPath = resourcePath + ContainerConstant.SPRING_CONTEXT_FILE_NAME;
buffer.setLength(0);
try (BufferedReader br = new BufferedReader(new FileReader(springXMLPath))) {
while ((line = br.readLine()) != null) {
if (line.contains("");
}else {
buffer.append(line);
}
buffer.append(System.lineSeparator());
}
}
OmsFileUtils.string2File(buffer.toString(), new File(springXMLPath));
// 4. 写入 packageName,便于容器加载用户类
String propertiesPath = resourcePath + ContainerConstant.CONTAINER_PROPERTIES_FILE_NAME;
String properties = ContainerConstant.CONTAINER_PACKAGE_NAME_KEY + "=" + packageName;
OmsFileUtils.string2File(properties, new File(propertiesPath));
// 5. 再打包回去
String finPath = tmpPath + "template.zip";
ZipFile finZip = new ZipFile(finPath);
finZip.addFolder(new File(rootPath));
// 6. 删除源文件
FileUtils.forceDelete(originJar);
return finZip.getFile();
}
}