diff --git a/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java b/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java index 5a7c091683a..e4ba204db08 100644 --- a/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java +++ b/app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java @@ -205,6 +205,7 @@ public ContributedLibraryTableCellJPanel(JTable parentTable, Object value, } } + // TODO Make this a method of Theme private JTextPane makeNewDescription() { if (getComponentCount() > 0) { remove(0); diff --git a/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java b/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java index 4c94700197f..252499eafb8 100644 --- a/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java +++ b/app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java @@ -38,6 +38,7 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedList; +import java.util.List; import java.util.function.Predicate; import javax.swing.Box; @@ -50,6 +51,7 @@ import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.LibraryInstaller; import cc.arduino.contributions.libraries.LibraryTypeComparator; +import cc.arduino.contributions.libraries.ui.MultiLibraryInstallDialog.Result; import cc.arduino.contributions.ui.DropdownAllItem; import cc.arduino.contributions.ui.DropdownItem; import cc.arduino.contributions.ui.FilteredAbstractTableModel; @@ -84,7 +86,7 @@ protected void onInstall(ContributedLibrary selectedLibrary, ContributedLibrary if (selectedLibrary.isReadOnly()) { onRemovePressed(installedLibrary); } else { - onInstallPressed(selectedLibrary, installedLibrary); + onInstallPressed(selectedLibrary); } } @@ -219,12 +221,29 @@ protected void onUpdatePressed() { installerThread.start(); } - public void onInstallPressed(final ContributedLibrary lib, final ContributedLibrary replaced) { + public void onInstallPressed(final ContributedLibrary lib) { + List deps = BaseNoGui.librariesIndexer.getIndex().resolveDependeciesOf(lib); + boolean depsInstalled = deps.stream().allMatch(l -> l.isInstalled() || l.getName().equals(lib.getName())); + Result installDeps; + if (!depsInstalled) { + MultiLibraryInstallDialog dialog; + dialog = new MultiLibraryInstallDialog(this, lib, deps); + dialog.setVisible(true); + installDeps = dialog.getInstallDepsResult(); + if (installDeps == Result.CANCEL) + return; + } else { + installDeps = Result.NONE; + } clearErrorMessage(); installerThread = new Thread(() -> { try { setProgressVisible(true, tr("Installing...")); - installer.install(lib, replaced, this::setProgress); + if (installDeps == Result.ALL) { + installer.install(deps, this::setProgress); + } else { + installer.install(lib, this::setProgress); + } onIndexesUpdated(); // TODO: Do a better job in refreshing only the needed element //getContribModel().updateLibrary(lib); } catch (Exception e) { diff --git a/app/src/cc/arduino/contributions/libraries/ui/MultiLibraryInstallDialog.java b/app/src/cc/arduino/contributions/libraries/ui/MultiLibraryInstallDialog.java new file mode 100644 index 00000000000..24c03e37e9b --- /dev/null +++ b/app/src/cc/arduino/contributions/libraries/ui/MultiLibraryInstallDialog.java @@ -0,0 +1,177 @@ +/* + * This file is part of Arduino. + * + * Copyright 2017 Arduino LLC (http://www.arduino.cc/) + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + */ + +package cc.arduino.contributions.libraries.ui; + +import static processing.app.I18n.format; +import static processing.app.I18n.tr; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.WindowEvent; +import java.util.List; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextPane; +import javax.swing.WindowConstants; +import javax.swing.border.EmptyBorder; +import javax.swing.text.Document; +import javax.swing.text.html.HTMLDocument; +import javax.swing.text.html.StyleSheet; + +import cc.arduino.contributions.libraries.ContributedLibrary; +import cc.arduino.contributions.libraries.UnavailableContributedLibrary; +import processing.app.Base; +import processing.app.Theme; + +public class MultiLibraryInstallDialog extends JDialog { + + enum Result { + ALL, NONE, CANCEL + } + + Result result = Result.CANCEL; + + public MultiLibraryInstallDialog(Window parent, ContributedLibrary lib, + List dependencies) { + super(parent, format(tr("Dependencies for library {0}:{1}"), lib.getName(), + lib.getParsedVersion()), + ModalityType.APPLICATION_MODAL); + Container pane = getContentPane(); + pane.setLayout(new BorderLayout()); + + pane.add(Box.createHorizontalStrut(10), BorderLayout.WEST); + pane.add(Box.createHorizontalStrut(10), BorderLayout.EAST); + + { + JButton cancel = new JButton(tr("Cancel")); + cancel.addActionListener(ev -> { + result = Result.CANCEL; + setVisible(false); + }); + + JButton all = new JButton(tr("Install all")); + all.addActionListener(ev -> { + result = Result.ALL; + setVisible(false); + }); + + JButton none = new JButton(format(tr("Install '{0}' only"), lib.getName())); + none.addActionListener(ev -> { + result = Result.NONE; + setVisible(false); + }); + + Box buttonsBox = Box.createHorizontalBox(); + buttonsBox.add(all); + buttonsBox.add(Box.createHorizontalStrut(5)); + buttonsBox.add(none); + buttonsBox.add(Box.createHorizontalStrut(5)); + buttonsBox.add(cancel); + + JPanel buttonsPanel = new JPanel(); + buttonsPanel.setBorder(new EmptyBorder(7, 10, 7, 10)); + buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.Y_AXIS)); + buttonsPanel.add(buttonsBox); + + pane.add(buttonsPanel, BorderLayout.SOUTH); + } + + { + String libName = format("{0}:{1}", lib.getName(), + lib.getParsedVersion()); + String desc = format(tr("The library {0} needs some other library
dependencies currently not installed:"), + libName); + desc += "

"; + for (ContributedLibrary l : dependencies) { + if (l.getName().equals(lib.getName())) + continue; + if (l.isInstalled()) + continue; + if (l instanceof UnavailableContributedLibrary) + continue; + desc += format("- {0}
", l.getName()); + } + desc += "
"; + desc += tr("Would you like to install also all the missing dependencies?"); + + JTextPane textArea = makeNewDescription(); + textArea.setContentType("text/html"); + textArea.setText(desc); + + JPanel libsList = new JPanel(); + libsList.setLayout(new BoxLayout(libsList, BoxLayout.Y_AXIS)); + libsList.add(textArea); + libsList.setBorder(new EmptyBorder(7, 7, 7, 7)); + pane.add(libsList, BorderLayout.NORTH); + } + + pack(); + setResizable(false); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + + WindowEvent closing = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); + Base.registerWindowCloseKeys(getRootPane(), e -> dispatchEvent(closing)); + } + + // TODO Make this a method of Theme + private JTextPane makeNewDescription() { + JTextPane description = new JTextPane(); + description.setInheritsPopupMenu(true); + Insets margin = description.getMargin(); + margin.bottom = 0; + description.setMargin(margin); + description.setContentType("text/html"); + Document doc = description.getDocument(); + if (doc instanceof HTMLDocument) { + HTMLDocument html = (HTMLDocument) doc; + StyleSheet s = html.getStyleSheet(); + s.addRule("body { margin: 0; padding: 0;" + + "font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;" + + "color: black;" + "font-size: " + 15 * Theme.getScale() / 100 + + "; }"); + } + description.setOpaque(false); + description.setBorder(new EmptyBorder(4, 7, 7, 7)); + description.setHighlighter(null); + description.setEditable(false); + add(description, 0); + return description; + } + + public Result getInstallDepsResult() { + return result; + } +} diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index f983ffe8f68..440744ede02 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -352,7 +352,7 @@ public Base(String[] args) throws Exception { if (selected.isReadOnly()) { libraryInstaller.remove(installed, progressListener); } else { - libraryInstaller.install(selected, installed, progressListener); + libraryInstaller.install(selected, progressListener); } } diff --git a/arduino-core/src/cc/arduino/contributions/VersionHelper.java b/arduino-core/src/cc/arduino/contributions/VersionHelper.java index 0f108aed5a7..2fb4296a52e 100644 --- a/arduino-core/src/cc/arduino/contributions/VersionHelper.java +++ b/arduino-core/src/cc/arduino/contributions/VersionHelper.java @@ -64,4 +64,7 @@ public static Version valueOf(String ver) { } } + public static int compare(String a, String b) { + return valueOf(a).compareTo(valueOf(b)); + } } diff --git a/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibrary.java b/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibrary.java index cb0d34c916b..eb5986d0e63 100644 --- a/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibrary.java +++ b/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibrary.java @@ -29,13 +29,14 @@ package cc.arduino.contributions.libraries; -import cc.arduino.contributions.DownloadableContribution; -import processing.app.I18n; +import static processing.app.I18n.tr; import java.util.Comparator; import java.util.List; -import static processing.app.I18n.tr; +import cc.arduino.contributions.DownloadableContribution; +import cc.arduino.contributions.VersionHelper; +import processing.app.I18n; public abstract class ContributedLibrary extends DownloadableContribution { @@ -61,7 +62,7 @@ public abstract class ContributedLibrary extends DownloadableContribution { public abstract List getTypes(); - public abstract List getRequires(); + public abstract List getRequires(); public static final Comparator CASE_INSENSITIVE_ORDER = (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()); @@ -117,7 +118,7 @@ public String info() { res += "\n"; res += " requires :\n"; if (getRequires() != null) - for (ContributedLibraryReference r : getRequires()) { + for (ContributedLibraryDependency r : getRequires()) { res += " " + r; } res += "\n"; @@ -137,7 +138,7 @@ public boolean equals(Object obj) { String thisVersion = getParsedVersion(); String otherVersion = other.getParsedVersion(); - boolean versionEquals = (thisVersion != null && otherVersion != null + boolean versionEquals = (thisVersion != null && thisVersion.equals(otherVersion)); // Important: for legacy libs, versions are null. Two legacy libs must @@ -147,9 +148,18 @@ public boolean equals(Object obj) { String thisName = getName(); String otherName = other.getName(); - - boolean nameEquals = thisName == null || otherName == null || thisName.equals(otherName); + boolean nameEquals = thisName != null && thisName.equals(otherName); return versionEquals && nameEquals; } + + public boolean isBefore(ContributedLibrary other) { + return VersionHelper.compare(getVersion(), other.getVersion()) < 0; + } + + @Override + public int hashCode() { + String hashingData = "CONTRIBUTEDLIB" + getName() + getVersion(); + return hashingData.hashCode(); + } } diff --git a/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibraryReference.java b/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibraryDependency.java similarity index 87% rename from arduino-core/src/cc/arduino/contributions/libraries/ContributedLibraryReference.java rename to arduino-core/src/cc/arduino/contributions/libraries/ContributedLibraryDependency.java index f4edd57327f..2683d5eb046 100644 --- a/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibraryReference.java +++ b/arduino-core/src/cc/arduino/contributions/libraries/ContributedLibraryDependency.java @@ -29,16 +29,14 @@ package cc.arduino.contributions.libraries; -public abstract class ContributedLibraryReference { +public abstract class ContributedLibraryDependency { public abstract String getName(); - public abstract String getMaintainer(); - - public abstract String getVersion(); + public abstract String getVersionRequired(); @Override public String toString() { - return getName() + " " + getVersion() + " (" + getMaintainer() + ")"; + return getName() + " " + getVersionRequired(); } } diff --git a/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java b/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java index a78b6b63733..7f37f095f0a 100644 --- a/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java +++ b/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java @@ -29,13 +29,19 @@ package cc.arduino.contributions.libraries; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + import cc.arduino.contributions.DownloadableContributionBuiltInAtTheBottomComparator; import cc.arduino.contributions.filters.InstalledPredicate; import cc.arduino.contributions.libraries.filters.LibraryWithNamePredicate; -import java.util.*; -import java.util.stream.Collectors; - public abstract class LibrariesIndex { public abstract List getLibraries(); @@ -101,4 +107,81 @@ public ContributedLibrary getInstalled(String name) { return installedReleases.get(0); } + + public List resolveDependeciesOf(ContributedLibrary library) { + List solution = new ArrayList<>(); + solution.add(library); + if (resolveDependeciesOf(solution, library)) { + return solution; + } else { + return null; + } + } + + public boolean resolveDependeciesOf(List solution, + ContributedLibrary library) { + List requirements = library.getRequires(); + if (requirements == null) { + // No deps for this library, great! + return true; + } + + for (ContributedLibraryDependency dep : requirements) { + + // If the current solution already contains this dependency, skip over + boolean alreadyInSolution = false; + for (ContributedLibrary c : solution) { + if (c.getName().equals(dep.getName())) + alreadyInSolution = true; + } + if (alreadyInSolution) + continue; + + // Generate possible matching dependencies + List possibleDeps = findMatchingDependencies(dep); + + // If there are no dependencies available add as "missing" lib + if (possibleDeps.isEmpty()) { + solution.add(new UnavailableContributedLibrary(dep)); + continue; + } + + // Pick the installed version if available + ContributedLibrary selected; + Optional installed = possibleDeps.stream() + .filter(l -> l.isInstalled()).findAny(); + if (installed.isPresent()) { + selected = installed.get(); + } else { + // otherwise pick the latest version + selected = possibleDeps.stream().reduce((a, b) -> b.isBefore(a) ? a : b).get(); + } + + // Add dependency to the solution and process recursively + solution.add(selected); + if (!resolveDependeciesOf(solution, selected)) { + return false; + } + } + return true; + } + + private List findMatchingDependencies(ContributedLibraryDependency dep) { + List available = find(dep.getName()); + if (dep.getVersionRequired() == null || dep.getVersionRequired().isEmpty()) + return available; + + // XXX: The following part is actually never reached. The use of version + // constraints requires a much complex backtracking algorithm, the following + // is just a draft placeholder. + +// List match = available.stream() +// // TODO: add more complex version comparators (> >= < <= ~ 1.0.* 1.*...) +// .filter(candidate -> candidate.getParsedVersion() +// .equals(dep.getVersionRequired())) +// .collect(Collectors.toList()); +// return match; + + return available; + } } diff --git a/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndexer.java b/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndexer.java index a09eb2a468f..140f927fd9f 100644 --- a/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndexer.java +++ b/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndexer.java @@ -68,7 +68,7 @@ public class LibrariesIndexer { private final List badLibNotified = new ArrayList<>(); public LibrariesIndexer(File preferencesFolder) { - indexFile = new File(preferencesFolder, "library_index.json"); + indexFile = new File(preferencesFolder, "library_index_test.json"); stagingFolder = new File(new File(preferencesFolder, "staging"), "libraries"); } @@ -99,6 +99,11 @@ private void parseIndex(File file) throws IOException { } finally { IOUtils.closeQuietly(indexIn); } + +// ContributedLibrary lib = index.find("ArduinoCloud","1.0.0"); +// System.out.println(lib.info()); +// System.out.println(index.resolveDependeciesOf(lib)); +// System.exit(0); } public void setLibrariesFolders(List _librariesFolders) { diff --git a/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java b/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java index 12ac6519ae4..8bb15a6ae75 100644 --- a/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java +++ b/arduino-core/src/cc/arduino/contributions/libraries/LibraryInstaller.java @@ -43,6 +43,8 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import static processing.app.I18n.tr; @@ -55,6 +57,7 @@ public LibraryInstaller(Platform platform) { } public synchronized void updateIndex(ProgressListener progressListener) throws Exception { + if (true) return; final MultiStepProgress progress = new MultiStepProgress(2); DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder()); @@ -82,15 +85,44 @@ public synchronized void updateIndex(ProgressListener progressListener) throws E rescanLibraryIndex(progress, progressListener); } - public synchronized void install(ContributedLibrary lib, ContributedLibrary replacedLib, ProgressListener progressListener) throws Exception { + public void install(ContributedLibrary lib, ProgressListener progressListener) throws Exception { + ArrayList libs = new ArrayList<>(); + libs.add(lib); + install(libs, progressListener); + } + + public synchronized void install(List libs, ProgressListener progressListener) throws Exception { + MultiStepProgress progress = new MultiStepProgress(3 * libs.size() + 1); + + for (ContributedLibrary lib : libs) { + // Do install library (3 steps) + performInstall(lib, progressListener, progress); + } + + // Rescan index (1 step) + rescanLibraryIndex(progress, progressListener); + } + + private void performInstall(ContributedLibrary lib, ProgressListener progressListener, MultiStepProgress progress) throws Exception { if (lib.isInstalled()) { System.out.println(I18n.format(tr("Library is already installed: {0} version {1}"), lib.getName(), lib.getParsedVersion())); return; } - DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder()); + File libsFolder = BaseNoGui.librariesIndexer.getSketchbookLibrariesFolder(); + File destFolder = new File(libsFolder, lib.getName().replaceAll(" ", "_")); - final MultiStepProgress progress = new MultiStepProgress(3); + // Check if we are replacing an already installed lib + ContributedLibrary replacedLib = null; + LibrariesIndex index = BaseNoGui.librariesIndexer.getIndex(); + for (ContributedLibrary l : index.find(lib.getName())) { + if (l.isInstalled() && l.getInstalledFolder().equals(destFolder)) { + replacedLib = l; + break; + } + } + + DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder()); // Step 1: Download library try { @@ -99,6 +131,7 @@ public synchronized void install(ContributedLibrary lib, ContributedLibrary repl // Download interrupted... just exit return; } + progress.stepDone(); // TODO: Extract to temporary folders and move to the final destination only // once everything is successfully unpacked. If the operation fails remove @@ -107,7 +140,6 @@ public synchronized void install(ContributedLibrary lib, ContributedLibrary repl // Step 2: Unpack library on the correct location progress.setStatus(I18n.format(tr("Installing library: {0}"), lib.getName())); progressListener.onProgress(progress); - File libsFolder = BaseNoGui.librariesIndexer.getSketchbookLibrariesFolder(); File tmpFolder = FileUtils.createTempFolder(libsFolder); try { new ArchiveExtractor(platform).extract(lib.getDownloadedFile(), tmpFolder, 1); @@ -120,12 +152,8 @@ public synchronized void install(ContributedLibrary lib, ContributedLibrary repl // Step 3: Remove replaced library and move installed one to the correct location // TODO: Fix progress bar... remove(replacedLib, progressListener); - File destFolder = new File(libsFolder, lib.getName().replaceAll(" ", "_")); tmpFolder.renameTo(destFolder); progress.stepDone(); - - // Step 4: Rescan index - rescanLibraryIndex(progress, progressListener); } public synchronized void remove(ContributedLibrary lib, ProgressListener progressListener) throws IOException { diff --git a/arduino-core/src/cc/arduino/contributions/libraries/UnavailableContributedLibrary.java b/arduino-core/src/cc/arduino/contributions/libraries/UnavailableContributedLibrary.java new file mode 100644 index 00000000000..2da1114af16 --- /dev/null +++ b/arduino-core/src/cc/arduino/contributions/libraries/UnavailableContributedLibrary.java @@ -0,0 +1,137 @@ +/* + * This file is part of Arduino. + * + * Copyright 2017 Arduino LLC (http://www.arduino.cc/) + * + * Arduino is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * As a special exception, you may use this file as part of a free software + * library without restriction. Specifically, if other files instantiate + * templates or use macros or inline functions from this file, or you compile + * this file and link it with other files to produce an executable, this + * file does not by itself cause the resulting executable to be covered by + * the GNU General Public License. This exception does not however + * invalidate any other reasons why the executable file might be covered by + * the GNU General Public License. + */ + +package cc.arduino.contributions.libraries; + +import java.util.ArrayList; +import java.util.List; + +public class UnavailableContributedLibrary extends ContributedLibrary { + + private String name; + private String version; + + public UnavailableContributedLibrary(ContributedLibraryDependency dependency) { + this(dependency.getName(), dependency.getVersionRequired()); + } + + public UnavailableContributedLibrary(String _name, String _version) { + name = _name; + version = _version; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getMaintainer() { + return "Unknown"; + } + + @Override + public String getAuthor() { + return "Unknown"; + } + + @Override + public String getWebsite() { + return "Unknown"; + } + + @Override + public String getCategory() { + return "Uncategorized"; + } + + @Override + public void setCategory(String category) { + } + + @Override + public String getLicense() { + return "Unknown"; + } + + @Override + public String getParagraph() { + return ""; + } + + @Override + public String getSentence() { + return ""; + } + + @Override + public List getArchitectures() { + return new ArrayList<>(); + } + + @Override + public List getTypes() { + return new ArrayList<>(); + } + + @Override + public List getRequires() { + return new ArrayList<>(); + } + + @Override + public String getUrl() { + return ""; + } + + @Override + public String getVersion() { + return version; + } + + @Override + public String getChecksum() { + return ""; + } + + @Override + public long getSize() { + return 0; + } + + @Override + public String getArchiveFileName() { + return ""; + } + + @Override + public String toString() { + return "!" + super.toString(); + } +} diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index fd372596c5b..b8f719cdae7 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -487,6 +487,7 @@ static public void initPackages() throws Exception { try { librariesIndexer.parseIndex(); } catch (JsonProcessingException e) { + e.printStackTrace(); File librariesIndexFile = librariesIndexer.getIndexFile(); FileUtils.deleteIfExists(librariesIndexFile); } diff --git a/arduino-core/src/processing/app/packages/LibraryList.java b/arduino-core/src/processing/app/packages/LibraryList.java index b83e5265ef2..4f7db2868a4 100644 --- a/arduino-core/src/processing/app/packages/LibraryList.java +++ b/arduino-core/src/processing/app/packages/LibraryList.java @@ -30,8 +30,15 @@ import java.io.File; import java.util.Collections; +import java.util.EnumSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; import processing.app.helpers.FileUtils; @@ -97,5 +104,36 @@ public synchronized boolean hasLibrary(UserLibrary lib) { if (l == lib) return true; return false; } -} + public static Collector collector() { + return new Collector() { + @Override + public Supplier supplier() { + return () -> new LibraryList(); + } + + @Override + public BiConsumer accumulator() { + return (libs, lib) -> libs.add(lib); + } + + @Override + public BinaryOperator combiner() { + return (we, they) -> { + we.addAll(they); + return we; + }; + } + + @Override + public Function finisher() { + return (libs) -> libs; + } + + @Override + public Set characteristics() { + return EnumSet.noneOf(Characteristics.class); + } + }; + } +} diff --git a/arduino-core/src/processing/app/packages/UserLibrary.java b/arduino-core/src/processing/app/packages/UserLibrary.java index 69ba15a3c34..4ce9a700a72 100644 --- a/arduino-core/src/processing/app/packages/UserLibrary.java +++ b/arduino-core/src/processing/app/packages/UserLibrary.java @@ -30,7 +30,7 @@ import cc.arduino.Constants; import cc.arduino.contributions.libraries.ContributedLibrary; -import cc.arduino.contributions.libraries.ContributedLibraryReference; +import cc.arduino.contributions.libraries.ContributedLibraryDependency; import processing.app.helpers.PreferencesMap; import java.io.File; @@ -244,7 +244,7 @@ public String getArchiveFileName() { } @Override - public List getRequires() { + public List getRequires() { return null; }