Skip to content

Commit db9b228

Browse files
authored
Merge pull request #11 from zhyhang/feature/dev-2.4.0
Feature/dev 2.4.0
2 parents 38573cf + 7eca0f2 commit db9b228

11 files changed

Lines changed: 130 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55

66
## [Unreleased]
77

8+
## [2.4.0]
9+
- Supports add directory entries option
10+
- Remember export options
11+
812
## [2.3.1]
913
- Compatible with coming version 2022
1014
- Build tool change to gradle

Handy Export Jar-2.3.1.zip

-41 KB
Binary file not shown.

Handy Export Jar-2.4.0.zip

44.3 KB
Binary file not shown.

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,12 @@ Plugin of Intellij IDEA for quickly export java project's class, resource, sourc
6868
- help docs
6969
- throw swing context event exception when trigger by first-keystroke (key-map)
7070
- button component mnemonic not working
71-
## Note
71+
## Build
72+
73+
```shell
74+
# win
75+
.\gradlew.bat clean build
76+
77+
# linux/macos
78+
.\gradlew clean build
79+
```

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
pluginGroup = org.yanhuang.plugins.intellij.exportjar
55
pluginName = Handy Export Jar
66
# SemVer format -> https://semver.org
7-
pluginVersion = 2.3.1
7+
pluginVersion = 2.4.0
88

99
# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
1010
# for insight into build numbers and IntelliJ Platform versions.

src/main/java/org/yanhuang/plugins/intellij/exportjar/ExportPacker.java

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.intellij.openapi.vfs.VirtualFile;
1212
import com.intellij.psi.*;
1313
import org.jetbrains.annotations.NotNull;
14+
import org.yanhuang.plugins.intellij.exportjar.HistoryData.ExportOptions;
1415
import org.yanhuang.plugins.intellij.exportjar.utils.CommonUtils;
1516
import org.yanhuang.plugins.intellij.exportjar.utils.Constants;
1617
import org.yanhuang.plugins.intellij.exportjar.utils.action.CopyTextToClipboardAction;
@@ -21,6 +22,7 @@
2122
import java.nio.file.Path;
2223
import java.nio.file.Paths;
2324
import java.util.*;
25+
import java.util.stream.Collectors;
2426

2527
import static org.yanhuang.plugins.intellij.exportjar.utils.MessagesUtils.*;
2628

@@ -31,17 +33,13 @@ public class ExportPacker implements CompileStatusNotification {
3133
private final Project project;
3234
private final VirtualFile[] selectedFiles;
3335
private final Path exportJarFullPath;
34-
private final boolean exportJava;
35-
private final boolean exportClass;
36-
private final boolean exportTests;
36+
private final Set<ExportOptions> exportOptionSet;
3737

38-
public ExportPacker(Project project, VirtualFile[] selectedFiles, Path exportJarFullPath, boolean exportJava, boolean exportClass, boolean exportTests) {
38+
public ExportPacker(Project project, VirtualFile[] selectedFiles, Path exportJarFullPath, ExportOptions[] exportOptions) {
3939
this.project = project;
4040
this.selectedFiles = selectedFiles;
4141
this.exportJarFullPath = exportJarFullPath;
42-
this.exportClass = exportClass;
43-
this.exportJava = exportJava;
44-
this.exportTests = exportTests;
42+
this.exportOptionSet = Arrays.stream(exportOptions).collect(Collectors.toSet());
4543
}
4644

4745
private void pack() {
@@ -64,13 +62,36 @@ private void pack() {
6462
filePathVfMap.put(filePaths.get(i), vf);
6563
}
6664
}
65+
if (exportOptionSet.contains(ExportOptions.add_directory)) {
66+
addDirectoryEntries(filePaths, jarEntryNames);
67+
}
6768
CommonUtils.createNewJar(project, exportJarFullPath, filePaths, jarEntryNames, filePathVfMap);
6869
}
6970

71+
private void addDirectoryEntries(List<Path> filePaths, List<String> entryNames) {
72+
final var added = new HashSet<String>();
73+
final int size = entryNames.size();
74+
for (int i = 0; i < size; i++) {
75+
addDirectoryEntry(filePaths, entryNames, entryNames.get(i), added);
76+
}
77+
}
78+
79+
private void addDirectoryEntry(List<Path> filePaths, List<String> entryNames, String entryName, HashSet<String> added) {
80+
int spIndex = entryName.indexOf("/");
81+
while (spIndex > 0) {
82+
final String dir = entryName.substring(0, spIndex + 1);
83+
if (added.add(dir)) {
84+
filePaths.add(null);
85+
entryNames.add(dir);
86+
}
87+
spIndex = entryName.indexOf("/", spIndex + 1);
88+
}
89+
}
90+
7091
private void collectExportVirtualFile(List<Path> filePaths, List<String> jarEntryNames, VirtualFile virtualFile) {
7192
final boolean inTestSourceContent =
7293
ProjectRootManager.getInstance(project).getFileIndex().isInTestSourceContent(virtualFile);
73-
if (inTestSourceContent && !exportTests) { // not export test source and resource files
94+
if (inTestSourceContent && !exportOptionSet.contains(ExportOptions.export_test)) { // not export test source and resource files
7495
return;
7596
}
7697
// find package name
@@ -80,11 +101,11 @@ private void collectExportVirtualFile(List<Path> filePaths, List<String> jarEntr
80101
String packagePath = psiPackage == null ? "" : psiPackage.getQualifiedName().replaceAll("\\.", "/");
81102
String fileName = virtualFile.getName();
82103
if (CompilerManager.getInstance(project).isCompilableFileType(virtualFile.getFileType())) {
83-
if (exportJava) {
104+
if (exportOptionSet.contains(ExportOptions.export_java)) {
84105
collectExportFile(filePaths, jarEntryNames, packagePath, Paths.get(virtualFile.getPath()));
85106
}
86107
// only export java classes
87-
if (psiPackage != null && exportClass && fileName.endsWith(".java")) {
108+
if (psiPackage != null && exportOptionSet.contains(ExportOptions.export_class) && fileName.endsWith(".java")) {
88109
PsiClass[] psiClasses = psiPackage.getClasses();
89110
if (psiClasses.length == 0) {
90111
warn(project, "not found class info of java file " + virtualFile.getPath());

src/main/java/org/yanhuang/plugins/intellij/exportjar/HistoryData.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
*/
1313
public class HistoryData {
1414

15-
private static final int maxHistory = 100;
15+
private static final int maxHistory = 2022;
1616

1717
private SavedJarInfo[] savedJarInfo;
1818

19+
private ExportOptions[] lastExportOptions;
20+
1921
public SavedJarInfo[] getSavedJarInfo() {
2022
return savedJarInfo;
2123
}
@@ -24,6 +26,14 @@ public void setSavedJarInfo(SavedJarInfo[] savedJarInfo) {
2426
this.savedJarInfo = savedJarInfo;
2527
}
2628

29+
public ExportOptions[] getLastExportOptions() {
30+
return lastExportOptions;
31+
}
32+
33+
public void setLastExportOptions(ExportOptions[] lastExportOptions) {
34+
this.lastExportOptions = lastExportOptions;
35+
}
36+
2737
public void addSavedJarInfo(SavedJarInfo savedJarInfo) {
2838
if (savedJarInfo == null) {
2939
return;
@@ -88,4 +98,8 @@ public int compareTo(@NotNull SavedJarInfo that) {
8898
return Long.compare(this.getCreation(), that.getCreation());
8999
}
90100
}
101+
102+
public enum ExportOptions {
103+
export_java,export_class,export_test,add_directory
104+
}
91105
}

src/main/java/org/yanhuang/plugins/intellij/exportjar/ui/SettingDialog.form

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
44
<margin top="10" left="10" bottom="10" right="10"/>
55
<constraints>
6-
<xy x="48" y="54" width="592" height="285"/>
6+
<xy x="48" y="54" width="674" height="285"/>
77
</constraints>
88
<properties/>
99
<border type="none"/>
@@ -54,7 +54,7 @@
5454
</component>
5555
</children>
5656
</grid>
57-
<grid id="e0128" layout-manager="GridLayoutManager" row-count="1" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
57+
<grid id="e0128" binding="optionsPanel" layout-manager="GridLayoutManager" row-count="1" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
5858
<margin top="0" left="0" bottom="0" right="0"/>
5959
<constraints>
6060
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -68,6 +68,7 @@
6868
</constraints>
6969
<properties>
7070
<enabled value="true"/>
71+
<name value="export_java"/>
7172
<selected value="true"/>
7273
<text value="Export &amp;java file"/>
7374
</properties>
@@ -77,6 +78,7 @@
7778
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
7879
</constraints>
7980
<properties>
81+
<name value="export_class"/>
8082
<selected value="true"/>
8183
<text value="Export &amp;class file"/>
8284
</properties>
@@ -86,9 +88,20 @@
8688
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
8789
</constraints>
8890
<properties>
91+
<name value="export_test"/>
8992
<text value="Export &amp;test file"/>
9093
</properties>
9194
</component>
95+
<component id="18a82" class="javax.swing.JCheckBox" binding="exportAddDirectoryCheckBox">
96+
<constraints>
97+
<grid row="0" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
98+
</constraints>
99+
<properties>
100+
<name value="add_directory"/>
101+
<selected value="false"/>
102+
<text value="Add directory entries"/>
103+
</properties>
104+
</component>
92105
</children>
93106
</grid>
94107
<vspacer id="543c1">

src/main/java/org/yanhuang/plugins/intellij/exportjar/ui/SettingDialog.java

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.jetbrains.annotations.Nullable;
2323
import org.yanhuang.plugins.intellij.exportjar.ExportPacker;
2424
import org.yanhuang.plugins.intellij.exportjar.HistoryData;
25+
import org.yanhuang.plugins.intellij.exportjar.HistoryData.ExportOptions;
26+
import org.yanhuang.plugins.intellij.exportjar.HistoryData.SavedJarInfo;
2527
import org.yanhuang.plugins.intellij.exportjar.utils.CommonUtils;
2628
import org.yanhuang.plugins.intellij.exportjar.utils.Constants;
2729
import org.yanhuang.plugins.intellij.exportjar.utils.MessagesUtils;
@@ -39,6 +41,7 @@
3941
import java.nio.file.Paths;
4042
import java.util.List;
4143
import java.util.*;
44+
import java.util.stream.Collectors;
4245

4346
import static com.intellij.openapi.ui.Messages.getWarningIcon;
4447
import static com.intellij.openapi.ui.Messages.showErrorDialog;
@@ -47,6 +50,7 @@
4750

4851
/**
4952
* export jar settings dialog (link to SettingDialog.form)
53+
* <li><b>In UIDesigner: export options JCheckBox's name is same as HistoryData.ExportOptions</b></li>
5054
*/
5155
public class SettingDialog extends JDialog {
5256
private final Project project;
@@ -58,12 +62,14 @@ public class SettingDialog extends JDialog {
5862
private JCheckBox exportJavaFileCheckBox;
5963
private JCheckBox exportClassFileCheckBox;
6064
private JCheckBox exportTestFileCheckBox;
65+
private JCheckBox exportAddDirectoryCheckBox;
6166
private JComboBox<String> outPutJarFileComboBox;
6267
private JButton selectJarFileButton;
6368
private JPanel settingPanel;
6469
private JPanel fileListPanel;
6570
private JButton debugButton;
6671
private JPanel actionPanel;
72+
private JPanel optionsPanel;
6773
private HistoryData historyData;
6874
private FileListDialog fileListDialog;
6975
private BorderLayoutPanel fileListLabel;
@@ -91,6 +97,7 @@ public void windowClosing(WindowEvent e) {
9197

9298
readSaveHistory();
9399
initComboBox();
100+
initOptionCheckBox();
94101
createFileListTree();
95102

96103
// uiDebug();
@@ -109,15 +116,34 @@ private void initComboBox() {
109116
String[] historyFiles;
110117
if (historyData != null) {
111118
historyFiles =
112-
Arrays.stream(Optional.ofNullable(historyData.getSavedJarInfo()).orElse(new HistoryData.SavedJarInfo[0]))
113-
.map(HistoryData.SavedJarInfo::getPath).toArray(String[]::new);
119+
Arrays.stream(Optional.ofNullable(historyData.getSavedJarInfo()).orElse(new SavedJarInfo[0]))
120+
.map(SavedJarInfo::getPath).toArray(String[]::new);
114121
} else {
115122
historyFiles = new String[0];
116123
}
117124
ComboBoxModel<String> model = new DefaultComboBoxModel<>(historyFiles);
118125
outPutJarFileComboBox.setModel(model);
119126
}
120127

128+
private void initOptionCheckBox(){
129+
final Component[] components = optionsPanel.getComponents();
130+
final Set<String> optionSet = Optional.ofNullable(historyData.getLastExportOptions()).stream().flatMap(Arrays::stream)
131+
.map(ExportOptions::name)
132+
.map(String::toLowerCase)
133+
.collect(Collectors.toSet());
134+
if (optionSet.size() == 0) {
135+
return;
136+
}
137+
//set select state according to last saved
138+
for (Component c : components) {
139+
if (c instanceof JCheckBox && optionSet.contains(c.getName().toLowerCase())) {
140+
((JCheckBox) c).setSelected(true);
141+
} else if (c instanceof JCheckBox) {
142+
((JCheckBox) c).setSelected(false);
143+
}
144+
}
145+
}
146+
121147
private void createFileListTree() {
122148
//remove old component
123149
if (this.fileListLabel != null) {
@@ -174,7 +200,8 @@ private void writeSaveHistory(Path exportJarName) {
174200
if (historyData == null) {
175201
this.historyData = new HistoryData();
176202
}
177-
HistoryData.SavedJarInfo savedJar = new HistoryData.SavedJarInfo();
203+
this.historyData.setLastExportOptions(pickExportOptions());
204+
SavedJarInfo savedJar = new SavedJarInfo();
178205
savedJar.setCreation(System.currentTimeMillis());
179206
savedJar.setPath(exportJarName.toString());
180207
historyData.addSavedJarInfo(savedJar);
@@ -189,6 +216,22 @@ private void writeSaveHistory(Path exportJarName) {
189216
}
190217
}
191218

219+
private ExportOptions[] pickExportOptions(){
220+
final Component[] components = optionsPanel.getComponents();
221+
return Arrays.stream(components).filter(c -> c instanceof JCheckBox)
222+
.filter(c->((JCheckBox) c).isSelected())
223+
.map(Component::getName)
224+
.map(String::toLowerCase)
225+
.filter(n -> {
226+
try {
227+
ExportOptions.valueOf(n);
228+
return true;
229+
} catch (Exception e) {
230+
return false;
231+
}
232+
}).map(ExportOptions::valueOf).toArray(ExportOptions[]::new);
233+
}
234+
192235
private void onSelectJarFileButton(ActionEvent event) {
193236
FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor();
194237
Consumer<VirtualFile> chooserConsumer = new FileChooserConsumerImplForComboBox(this.outPutJarFileComboBox);
@@ -260,9 +303,7 @@ public void doExport(VirtualFile[] exportFiles) {
260303
}
261304
this.dispose();
262305
writeSaveHistory(exportJarFullPath);
263-
final CompileStatusNotification packager = new ExportPacker(project, exportFiles, exportJarFullPath,
264-
exportJavaFileCheckBox.isSelected(), exportClassFileCheckBox.isSelected(),
265-
exportTestFileCheckBox.isSelected());
306+
final CompileStatusNotification packager = new ExportPacker(project, exportFiles, exportJarFullPath, pickExportOptions());
266307
app.invokeAndWait(() -> CompilerManager.getInstance(project).make(project, null == modules ? new Module[0] : modules, packager));
267308
}
268309
} else {

src/main/java/org/yanhuang/plugins/intellij/exportjar/utils/CommonUtils.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,17 @@ public static void createNewJar(Project project, Path jarFileFullPath, List<Path
8686
String entryName = entryNames.get(i);
8787
JarEntry je = new JarEntry(entryName);
8888
Path filePath = filePaths.get(i);
89-
// using origin entry(file) last modified time
90-
je.setLastModifiedTime(Files.getLastModifiedTime(filePath));
9189
jos.putNextEntry(je);
92-
if (!Files.isDirectory(filePath)) {
90+
if (filePath != null && Files.isRegularFile(filePath)) {
91+
// using origin entry(file) last modified time
92+
je.setLastModifiedTime(Files.getLastModifiedTime(filePath));
9393
jos.write(Files.readAllBytes(filePath));
9494
}
9595
jos.closeEntry();
9696
VirtualFile vf = filePathVfMap.get(filePath);
97-
MessagesUtils.infoAndMore(project, "packed " + filePath + " to jar", vf);
97+
if (vf != null) {
98+
MessagesUtils.infoAndMore(project, "packed " + filePath + " to jar", vf);
99+
}
98100
}
99101
} catch (Exception e) {
100102
throw new RuntimeException(e);

0 commit comments

Comments
 (0)