feat: modify mutiple file entry and fix some problem

fix #I5AB9R #I5AAND

Signed-off-by: lengege <liulongc@digitalchina.com>
This commit is contained in:
lengege 2022-06-08 19:01:56 +08:00
parent 72c1b2a61b
commit 37ed36ed9f
9 changed files with 143 additions and 31 deletions

2
.gitignore vendored
View File

@ -24,3 +24,5 @@
/src/generator/resources/cmds/mac/napi_generator-macos
/src/generator/resources/cmds/win/napi_generator-win.exe
/src/generator/.idea/
/src/package-lock.json
/src/package.json

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

View File

@ -1,7 +1,7 @@
# IDEA插件开发环境配置
基础环境要求:
JDK 11 IDEA Community 213及以上
JDK 11 IDEA Community 2021.3.3
1.下载IDEA Community 与 JDK11 配置好环境
点击 https://www.jetbrains.com/idea/download/ 下载Community版本并完成安装。
@ -15,10 +15,12 @@ JDK 11 IDEA Community 213及以上
项目打开完成点击File>Project Structure
![](../../figures/IntelliJ_env_proj_structure.png)
4.配置Modules.
Project Settings > Modules 新建Modules,再new Modules界面选择IntelliJ Platform Plugin。点击上方“-”删除原有的Modules点击上方侧“+”选择 New Modules。
Project Settings > Modules 新建Modules.点击上方“-”删除原有的Modules“+”选择 New Modules。
![](../../figures/IntelliJ_env_Proj_Module.png)
5.配置Module SDK.
在New Modules对话框中选择IntelliJ Platform Plugin。若为首次环境配置请在Module SDK 下拉框中点击 Add IntelliJ Platform Plugin SDK 选择IDEA Community安装目录点击OK,在Select Internal Java Platform 选择 JAVA SDK 11213版本只支持 11)
![](../../figures/IntelliJ_env_Proj_Module_New.png)
@ -26,3 +28,15 @@ Project Settings > Modules 新建Modules,再new Modules界面选择IntelliJ Plat
6.配置Root Content.
在上图界面点击Next选择Content root:为napi_generator/src/generator文件夹module name会自动变为generator,若出现提示已存在是否覆盖的提示,请点“是”完成配置。
![](../../figures/IntelliJ_env_module_root.png)
7.配置完成Modules后若在SDKs中无相应JDK和Plugin SDK,请点击+号分别添加 Add Java JDK和Add Intellij PlantForm Plugin SDK,Java JDK为java11的安装目录Plugin SDK为 IDEA Community 2021.3.3的安装目录。
![](../../figures/IntelliJ_env_config_SDKs.png)
8.若完成步骤7配置点击OK完成配置。Rebuild项目若IDEA依然不能点击右上角的运行。请重新配置一次Modules。
9.项目运行成功后会另起一个IDEA应用程序。插件运行在IDEA中只需要新建一个Grandle Project,添加相应的TS文件到项目文件夹里面就可以右击文件选择Generate napi Frame出现插件主界面进行相应操作。
10.在Deveco stdio中安装插件。
请在IDEA Community中依次点击Build>Prepare Plugin Module " " for development"生成jar包(jar一般生成在generator目录下)。打开DevEco Studio 工具点击File>settings>plugin。点击右方齿轮选择install plugin from disk选择jar包点击确定完成。重新IDE完成安装
![](../../figures/IntelliJ_env_deveco_install.png)

View File

@ -18,12 +18,15 @@ import com.intellij.notification.NotificationType;
import com.intellij.openapi.project.Project;
import com.sk.utils.FileUtil;
import com.sk.utils.GenNotification;
import org.apache.http.util.TextUtils;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.prefs.Preferences;
/**
@ -49,42 +52,86 @@ public class BrowseAction implements ActionListener {
this.interField = interField;
this.genField = geField;
this.scriptField = scriptField;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (actionEvent.getSource().equals(button)) {
Preferences preferences = Preferences.userRoot();
JFileChooser fcDlg = new JFileChooser();
// 获取上次打开文件的路径
String pathRecord = preferences.get("interPathRecord", "");
if (!pathRecord.equals("")) {
fcDlg = new JFileChooser(pathRecord);
}
fcDlg.setDialogTitle("请选择接口文件...");
fcDlg.setFileSelectionMode(JFileChooser.FILES_ONLY);
fcDlg.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文件(*.ts)", "ts");
fcDlg.setMultiSelectionEnabled(true);
fcDlg.setFileFilter(filter);
int returnVal = fcDlg.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
String filepath = fcDlg.getSelectedFile().getPath();
String filename = fcDlg.getSelectedFile().getName();
String upPath = fcDlg.getSelectedFile().getParent();
File[] files = fcDlg.getSelectedFiles();
if (!FileUtil.patternFileName(filename)) {
GenNotification.notifyMessage(project,
"当前文件名不符合转换规则!",
"提示",
NotificationType.WARNING);
String interFile = setSelectFile(files);
if (TextUtils.isBlank(interFile)) {
return;
}
String upPath = fcDlg.getSelectedFile().getParent();
preferences.put("interPathRecord", filepath);
interField.setText(filepath);
// 设置默认打开路径
preferences.put("interPathRecord", upPath);
interField.setText(interFile.substring(0, interFile.length() - 1));
genField.setText(upPath);
scriptField.setText(upPath);
}
}
}
private String setSelectFile(File[] files) {
String interFile = "";
boolean existFile = false;
boolean existDir = false;
for (File file : files) {
if (file.isDirectory()) {
if (!existDir) {
existDir = true;
interFile += file.getPath() + ",";
} else {
GenNotification.notifyMessage(project,
"目前只支持单个文件夹转换",
"选择不符合要求",
NotificationType.WARNING);
interField.setText("");
return "";
}
} else {
if (!FileUtil.patternFileName(file.getName())) {
GenNotification.notifyMessage(project,
file.getPath(),
file.getName() + "文件名不符合",
NotificationType.WARNING);
return "";
}
existFile = true;
interFile += file.getPath() + ",";
}
}
if (existDir && existFile) {
GenNotification.notifyMessage(project,
"不能同时转换文件和文件夹",
"选择不符合要求",
NotificationType.WARNING);
interField.setText("");
return "";
}
return interFile;
}
}

View File

@ -84,7 +84,6 @@ public class GenerateDialog extends DialogWrapper {
@Nullable
@Override
protected ValidationInfo doValidate() {
return genDiag.validationInfo();
}
@ -128,6 +127,7 @@ public class GenerateDialog extends DialogWrapper {
if (validationInfo != null) {
LOG.info(validationInfo.message);
} else {
if (genDiag.runFun()) {
close(CANCEL_EXIT_CODE);
}

View File

@ -26,6 +26,7 @@
<component id="b2411" class="javax.swing.JTextField" binding="interPath">
<constraints/>
<properties>
<editable value="false"/>
<margin top="2" left="6" bottom="2" right="6"/>
<maximumSize width="500" height="30"/>
<minimumSize width="300" height="30"/>
@ -56,6 +57,7 @@
<component id="c4c1b" class="javax.swing.JTextField" binding="genPath">
<constraints/>
<properties>
<editable value="false"/>
<maximumSize width="500" height="30"/>
<minimumSize width="300" height="30"/>
<preferredSize width="400" height="30"/>
@ -88,6 +90,7 @@
<component id="7194f" class="javax.swing.JTextField" binding="scriptPath">
<constraints/>
<properties>
<editable value="false"/>
<maximumSize width="500" height="30"/>
<minimumSize width="300" height="30"/>
<preferredSize width="400" height="30"/>

View File

@ -24,6 +24,8 @@ import com.sk.action.ScriptAction;
import com.sk.utils.FileUtil;
import com.sk.utils.GenNotification;
import org.apache.http.util.TextUtils;
import org.jetbrains.annotations.Nullable;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPanel;
@ -76,8 +78,10 @@ public class GenerateDialogPane extends JDialog {
private String fileName;
private Project project;
/**
* 构造函数
*
* @param project projectid
* @param interFilePath 接口文件路径
* @param genDir 生成框架文件路径
@ -101,7 +105,8 @@ public class GenerateDialogPane extends JDialog {
contentPane.registerKeyboardAction(actionEvent -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
selectInter.addActionListener(new BrowseAction(project, selectInter, interPath, genPath, scriptPath));
BrowseAction browseAction = new BrowseAction(project, selectInter, interPath, genPath, scriptPath);
selectInter.addActionListener(browseAction);
selectGenPath.addActionListener(new GenAction(selectGenPath, genPath));
selectScriptPath.addActionListener(new ScriptAction(selectScriptPath, scriptPath));
}
@ -127,6 +132,7 @@ public class GenerateDialogPane extends JDialog {
*
* @return ValidationInfo 返回不符要求的信息
*/
@Nullable
public ValidationInfo validationInfo() {
String fileInter = interPath.getText();
String scriptDir = scriptPath.getText();
@ -135,7 +141,7 @@ public class GenerateDialogPane extends JDialog {
|| TextUtils.isEmpty(scriptDir)
|| TextUtils.isEmpty(filegypDir);
ValidationInfo validationInfo = new ValidationInfo(null);
ValidationInfo validationInfo = null;
if (isEmptyFile) {
String warnMsg = "接口文件、框架、编译脚本路径不能为空";
warningMessage("Please input interface,gen and gyp file directory", warnMsg);
@ -199,8 +205,6 @@ public class GenerateDialogPane extends JDialog {
String sysName = System.getProperties().getProperty("os.name").toUpperCase();
String tmpDirFile = System.getProperty("java.io.tmpdir");
String execFn;
if (sysName.indexOf("WIN") >= 0) {
execFn = "cmds/win/napi_generator-win.exe";
tmpDirFile += "napi_generator-win.exe";
@ -211,13 +215,11 @@ public class GenerateDialogPane extends JDialog {
execFn = "cmds/mac/napi_generator-macos";
tmpDirFile += "napi_generator-macos";
}
;
File file = new File(tmpDirFile);
if (!file.exists()) {
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(execFn)) {
if (inputStream == null) {
return "";
throw new IOException("exec File InputStream is Null");
}
byte[] bs = inputStream.readAllBytes();
writeTmpFile(tmpDirFile, bs);
@ -231,7 +233,44 @@ public class GenerateDialogPane extends JDialog {
return "";
}
}
return file + " " + "-f" + " " + destPath + " " + "-o" + " " + parentPath;
String command = file.toString();
String inArgs = genInArgs(destPath);
command += inArgs + " -o " + parentPath;
return command;
}
/**
* 生成 -f -d 输入参数
*
* @param destPath 源文件路径
* @return 生成后的值-f -d的值
*/
private String genInArgs(String destPath) {
String[] interArr = destPath.split(",");
String tsParam = " -f ";
String dirParam = " -d ";
String inputCommand = "";
if (interArr.length > 0) {
for (String interStr : interArr) {
File interFile = new File(interStr);
if (interFile.isDirectory()) {
dirParam += interStr + " ";
} else {
tsParam += interStr + ",";
}
}
if (!TextUtils.isEmpty(tsParam.replaceAll("-f", ""))
&& !TextUtils.isBlank(tsParam.replaceAll("-f", ""))) {
inputCommand += tsParam.substring(0, tsParam.length() - 1);
}
if (!TextUtils.isEmpty(dirParam.replace("-d", ""))
&& !TextUtils.isBlank(dirParam.replace("-d", ""))) {
inputCommand += dirParam.substring(0, dirParam.length() - 1);
}
}
return inputCommand;
}
private boolean callExtProcess(String command) throws IOException, InterruptedException {

View File

@ -18,6 +18,7 @@ import com.intellij.notification.NotificationType;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.util.TextUtils;
import java.io.BufferedReader;
import java.io.File;
@ -155,13 +156,19 @@ public class FileUtil {
if (baseDir.isDirectory()) {
File[] childFile = baseDir.listFiles();
for (File file : childFile) {
if (file.getName().equals("build.gradle")) {
if (file.getName().equals("build.gradle") || file.getName().equals("build-profile.json5")) {
gradlePath = file.getPath();
}
}
}
Properties properties = new Properties();
if (TextUtils.isBlank(gradlePath)) {
GenNotification.notifyMessage(project, "项目结构中没有grandle配置文件。",
"当前项目结构不支持",
NotificationType.WARNING);
return false;
}
try {
properties.load(new FileInputStream(gradlePath));
} catch (IOException e) {