mirror of
https://github.com/arduino/Arduino.git
synced 2024-11-28 09:24:14 +01:00
Add library from ZIP
This commit is contained in:
parent
0efc024f93
commit
e8ea12c629
@ -36,6 +36,7 @@ import processing.app.helpers.FileUtils;
|
||||
import processing.app.helpers.PreferencesMap;
|
||||
import processing.app.helpers.filefilters.OnlyDirs;
|
||||
import processing.app.helpers.filefilters.OnlyFilesWithExtension;
|
||||
import processing.app.tools.ZipDeflater;
|
||||
import processing.core.*;
|
||||
import static processing.app.I18n._;
|
||||
|
||||
@ -2594,4 +2595,25 @@ public class Base {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void handleAddZipLibrary(Editor editor) {
|
||||
String prompt = _("Select a zip file containing the library you'd like to add");
|
||||
FileDialog fd = new FileDialog(editor, prompt, FileDialog.LOAD);
|
||||
fd.setDirectory(System.getProperty("user.home"));
|
||||
fd.setVisible(true);
|
||||
|
||||
String directory = fd.getDirectory();
|
||||
String filename = fd.getFile();
|
||||
if (filename == null) return;
|
||||
|
||||
File sourceFile = new File(directory, filename);
|
||||
try {
|
||||
ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder());
|
||||
zipDeflater.deflate();
|
||||
editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu"));
|
||||
} catch (IOException e) {
|
||||
editor.statusError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -178,7 +178,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
// re-add the sub-menus that are shared by all windows
|
||||
fileMenu.insert(sketchbookMenu, 2);
|
||||
fileMenu.insert(examplesMenu, 3);
|
||||
sketchMenu.insert(importMenu, 4);
|
||||
//sketchMenu.insert(importMenu, 4);
|
||||
toolsMenu.insert(boardsMenu, numTools);
|
||||
toolsMenu.insert(cpuTypeMenu, numTools + 1);
|
||||
toolsMenu.insert(serialMenu, numTools + 2);
|
||||
@ -190,7 +190,7 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
// System.err.println("deactivate"); // not coming through
|
||||
fileMenu.remove(sketchbookMenu);
|
||||
fileMenu.remove(examplesMenu);
|
||||
sketchMenu.remove(importMenu);
|
||||
//sketchMenu.remove(importMenu);
|
||||
toolsMenu.remove(boardsMenu);
|
||||
toolsMenu.remove(cpuTypeMenu);
|
||||
toolsMenu.remove(serialMenu);
|
||||
@ -634,6 +634,16 @@ public class Editor extends JFrame implements RunnerListener {
|
||||
}
|
||||
sketchMenu.add(importMenu);
|
||||
|
||||
item = new JMenuItem(_("Add Library from ZIP"));
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
base.handleAddZipLibrary(Editor.this);
|
||||
base.onBoardOrPortChange();
|
||||
base.rebuildImportMenu(Editor.importMenu);
|
||||
}
|
||||
});
|
||||
sketchMenu.add(item);
|
||||
|
||||
item = newJMenuItem(_("Show Sketch Folder"), 'K');
|
||||
item.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
|
97
app/src/processing/app/tools/ZipDeflater.java
Normal file
97
app/src/processing/app/tools/ZipDeflater.java
Normal file
@ -0,0 +1,97 @@
|
||||
package processing.app.tools;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Random;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipException;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
public class ZipDeflater {
|
||||
|
||||
private final ZipFile zipFile;
|
||||
private final File destFolder;
|
||||
|
||||
public ZipDeflater(File file, File destFolder) throws ZipException, IOException {
|
||||
this.destFolder = destFolder;
|
||||
this.zipFile = new ZipFile(file);
|
||||
}
|
||||
|
||||
public void deflate() throws IOException {
|
||||
String folderName = tempFolderNameFromZip();
|
||||
|
||||
File folder = new File(destFolder, folderName);
|
||||
|
||||
if (!folder.mkdir()) {
|
||||
throw new IOException("Unable to create folder " + folderName);
|
||||
}
|
||||
|
||||
Enumeration<? extends ZipEntry> entries = zipFile.entries();
|
||||
while (entries.hasMoreElements()) {
|
||||
ZipEntry entry = entries.nextElement();
|
||||
ensureFoldersOfEntryExist(folder, entry);
|
||||
File entryFile = new File(folder, entry.getName());
|
||||
if (entry.isDirectory()) {
|
||||
entryFile.mkdir();
|
||||
} else {
|
||||
FileOutputStream fos = null;
|
||||
InputStream zipInputStream = null;
|
||||
try {
|
||||
fos = new FileOutputStream(entryFile);
|
||||
zipInputStream = zipFile.getInputStream(entry);
|
||||
byte[] buffer = new byte[1024 * 4];
|
||||
int len = -1;
|
||||
while ((len = zipInputStream.read(buffer)) != -1) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
} finally {
|
||||
if (fos != null) {
|
||||
fos.close();
|
||||
}
|
||||
if (zipInputStream != null) {
|
||||
zipInputStream.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Test.zip may or may not contain Test folder. We use zip name to create libraries folder. Therefore, a contained Test folder is useless and must be removed
|
||||
ensureOneLevelFolder(folder);
|
||||
}
|
||||
|
||||
private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) {
|
||||
String[] parts = entry.getName().split("/");
|
||||
File current = folder;
|
||||
for (int i = 0; i < parts.length - 1; i++) {
|
||||
current = new File(current, parts[i]);
|
||||
current.mkdir();
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureOneLevelFolder(File folder) {
|
||||
File[] files = folder.listFiles();
|
||||
if (files.length == 1 && files[0].isDirectory()) {
|
||||
File tempFile = new File(files[0].getPath() + new Random().nextInt(1000));
|
||||
files[0].renameTo(tempFile);
|
||||
for (File file : tempFile.listFiles()) {
|
||||
file.renameTo(new File(folder, file.getName()));
|
||||
}
|
||||
tempFile.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private String tempFolderNameFromZip() {
|
||||
String folderName = zipFile.getName();
|
||||
if (folderName.lastIndexOf(".") != -1) {
|
||||
folderName = folderName.substring(0, folderName.lastIndexOf("."));
|
||||
}
|
||||
if (folderName.lastIndexOf(File.separator) != -1) {
|
||||
folderName = folderName.substring(folderName.lastIndexOf(File.separator) + 1);
|
||||
}
|
||||
return folderName;
|
||||
}
|
||||
|
||||
}
|
BIN
app/test/Test.zip
Normal file
BIN
app/test/Test.zip
Normal file
Binary file not shown.
BIN
app/test/Test2.zip
Normal file
BIN
app/test/Test2.zip
Normal file
Binary file not shown.
81
app/test/processing/app/tools/ZipDeflaterTest.java
Normal file
81
app/test/processing/app/tools/ZipDeflaterTest.java
Normal file
@ -0,0 +1,81 @@
|
||||
package processing.app.tools;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.Random;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import processing.app.tools.ZipDeflater;
|
||||
|
||||
public class ZipDeflaterTest {
|
||||
|
||||
private File destFolder;
|
||||
|
||||
@Before
|
||||
public void makeTempFolder() {
|
||||
destFolder = new File(System.getProperty("java.io.tmpdir") + File.separator + "arduino_zip_test_" + new Random().nextInt(100000));
|
||||
destFolder.mkdir();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldDeflateZip() throws Exception {
|
||||
File file = new File(ZipDeflater.class.getResource("/Test2.zip").getFile());
|
||||
new ZipDeflater(file, destFolder).deflate();
|
||||
|
||||
String[] files = destFolder.list();
|
||||
assertEquals(1, files.length);
|
||||
assertEquals("Test2", files[0]);
|
||||
|
||||
file = destFolder.listFiles()[0];
|
||||
files = file.list();
|
||||
assertEquals(5, files.length);
|
||||
Arrays.sort(files);
|
||||
assertEquals("Test.cpp", files[0]);
|
||||
assertEquals("Test.h", files[1]);
|
||||
assertEquals("examples", files[2]);
|
||||
assertEquals("keywords.txt", files[3]);
|
||||
assertEquals("readme.txt", files[4]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldDeflateZipAndMoveContentsToParentFolder() throws Exception {
|
||||
File file = new File(ZipDeflater.class.getResource("/Test.zip").getFile());
|
||||
new ZipDeflater(file, destFolder).deflate();
|
||||
|
||||
String[] files = destFolder.list();
|
||||
assertEquals(1, files.length);
|
||||
assertEquals("Test", files[0]);
|
||||
|
||||
file = destFolder.listFiles()[0];
|
||||
files = file.list();
|
||||
assertEquals(5, files.length);
|
||||
Arrays.sort(files);
|
||||
assertEquals("Test.cpp", files[0]);
|
||||
assertEquals("Test.h", files[1]);
|
||||
assertEquals("examples", files[2]);
|
||||
assertEquals("keywords.txt", files[3]);
|
||||
assertEquals("readme.txt", files[4]);
|
||||
}
|
||||
|
||||
@After
|
||||
public void deleteTempFolder() {
|
||||
recursiveDelete(destFolder);
|
||||
}
|
||||
|
||||
private void recursiveDelete(File folder) {
|
||||
for (File file : folder.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
recursiveDelete(file);
|
||||
} else {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
folder.delete();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user