Merge remote-tracking branch 'arduino/master'

This commit is contained in:
Cristian Maglie 2015-11-24 16:45:33 +01:00
commit 8f2514f7c1
25 changed files with 108 additions and 142 deletions

View File

@ -29,14 +29,13 @@
package cc.arduino.contributions; package cc.arduino.contributions;
import cc.arduino.contributions.libraries.LibrariesIndexer;
import cc.arduino.contributions.libraries.LibraryInstaller; import cc.arduino.contributions.libraries.LibraryInstaller;
import cc.arduino.contributions.libraries.filters.UpdatableLibraryPredicate; import cc.arduino.contributions.libraries.filters.UpdatableLibraryPredicate;
import cc.arduino.contributions.packages.ContributionInstaller; import cc.arduino.contributions.packages.ContributionInstaller;
import cc.arduino.contributions.packages.ContributionsIndexer;
import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate; import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate;
import cc.arduino.view.NotificationPopup; import cc.arduino.view.NotificationPopup;
import processing.app.Base; import processing.app.Base;
import processing.app.BaseNoGui;
import processing.app.I18n; import processing.app.I18n;
import javax.swing.*; import javax.swing.*;
@ -49,21 +48,17 @@ public class ContributionsSelfCheck extends TimerTask {
private final Base base; private final Base base;
private final HyperlinkListener hyperlinkListener; private final HyperlinkListener hyperlinkListener;
private final ContributionsIndexer contributionsIndexer;
private final ContributionInstaller contributionInstaller; private final ContributionInstaller contributionInstaller;
private final LibrariesIndexer librariesIndexer;
private final LibraryInstaller libraryInstaller; private final LibraryInstaller libraryInstaller;
private final ProgressListener progressListener; private final ProgressListener progressListener;
private volatile boolean cancelled; private volatile boolean cancelled;
private volatile NotificationPopup notificationPopup; private volatile NotificationPopup notificationPopup;
public ContributionsSelfCheck(Base base, HyperlinkListener hyperlinkListener, ContributionsIndexer contributionsIndexer, ContributionInstaller contributionInstaller, LibrariesIndexer librariesIndexer, LibraryInstaller libraryInstaller) { public ContributionsSelfCheck(Base base, HyperlinkListener hyperlinkListener, ContributionInstaller contributionInstaller, LibraryInstaller libraryInstaller) {
this.base = base; this.base = base;
this.hyperlinkListener = hyperlinkListener; this.hyperlinkListener = hyperlinkListener;
this.contributionsIndexer = contributionsIndexer;
this.contributionInstaller = contributionInstaller; this.contributionInstaller = contributionInstaller;
this.librariesIndexer = librariesIndexer;
this.libraryInstaller = libraryInstaller; this.libraryInstaller = libraryInstaller;
this.progressListener = new NoopProgressListener(); this.progressListener = new NoopProgressListener();
this.cancelled = false; this.cancelled = false;
@ -74,12 +69,12 @@ public class ContributionsSelfCheck extends TimerTask {
updateContributionIndex(); updateContributionIndex();
updateLibrariesIndex(); updateLibrariesIndex();
long updatablePlatforms = contributionsIndexer.getPackages().stream() long updatablePlatforms = BaseNoGui.indexer.getPackages().stream()
.flatMap(pack -> pack.getPlatforms().stream()) .flatMap(pack -> pack.getPlatforms().stream())
.filter(new UpdatablePlatformPredicate(contributionsIndexer)).count(); .filter(new UpdatablePlatformPredicate()).count();
long updatableLibraries = librariesIndexer.getInstalledLibraries().stream() long updatableLibraries = BaseNoGui.librariesIndexer.getInstalledLibraries().stream()
.filter(new UpdatableLibraryPredicate(librariesIndexer)) .filter(new UpdatableLibraryPredicate())
.count(); .count();
if (updatableLibraries <= 0 && updatablePlatforms <= 0) { if (updatableLibraries <= 0 && updatablePlatforms <= 0) {

View File

@ -31,26 +31,21 @@ package cc.arduino.contributions.libraries.filters;
import cc.arduino.contributions.filters.InstalledPredicate; import cc.arduino.contributions.filters.InstalledPredicate;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.libraries.LibrariesIndex; import processing.app.BaseNoGui;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
public class InstalledLibraryPredicate implements Predicate<ContributedLibrary> { public class InstalledLibraryPredicate implements Predicate<ContributedLibrary> {
private final LibrariesIndex index;
public InstalledLibraryPredicate(LibrariesIndex index) {
this.index = index;
}
@Override @Override
public boolean test(ContributedLibrary input) { public boolean test(ContributedLibrary input) {
if (input.isInstalled()) { if (input.isInstalled()) {
return true; return true;
} }
List<ContributedLibrary> libraries = index.find(input.getName()); List<ContributedLibrary> libraries = BaseNoGui.librariesIndexer.getIndex().find(input.getName());
return libraries.stream() return libraries.stream()
.filter(new InstalledPredicate()) .filter(new InstalledPredicate())
.count() > 0; .count() > 0;

View File

@ -31,7 +31,7 @@ package cc.arduino.contributions.libraries.filters;
import cc.arduino.contributions.VersionComparator; import cc.arduino.contributions.VersionComparator;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.libraries.LibrariesIndexer; import processing.app.BaseNoGui;
import processing.app.packages.UserLibrary; import processing.app.packages.UserLibrary;
import java.util.List; import java.util.List;
@ -39,22 +39,20 @@ import java.util.function.Predicate;
public class UpdatableLibraryPredicate implements Predicate<ContributedLibrary> { public class UpdatableLibraryPredicate implements Predicate<ContributedLibrary> {
private final LibrariesIndexer indexer;
private final VersionComparator versionComparator; private final VersionComparator versionComparator;
public UpdatableLibraryPredicate(LibrariesIndexer indexer) { public UpdatableLibraryPredicate() {
this.indexer = indexer;
this.versionComparator = new VersionComparator(); this.versionComparator = new VersionComparator();
} }
@Override @Override
public boolean test(ContributedLibrary contributedLibrary) { public boolean test(ContributedLibrary contributedLibrary) {
String libraryName = contributedLibrary.getName(); String libraryName = contributedLibrary.getName();
UserLibrary installed = indexer.getInstalledLibraries().getByName(libraryName); UserLibrary installed = BaseNoGui.librariesIndexer.getInstalledLibraries().getByName(libraryName);
if (installed == null) { if (installed == null) {
return false; return false;
} }
List<ContributedLibrary> libraries = indexer.getIndex().find(libraryName); List<ContributedLibrary> libraries = BaseNoGui.librariesIndexer.getIndex().find(libraryName);
return libraries.stream() return libraries.stream()
.filter(library -> versionComparator.greaterThan(library.getParsedVersion(), installed.getParsedVersion())) .filter(library -> versionComparator.greaterThan(library.getParsedVersion(), installed.getParsedVersion()))
.count() > 0; .count() > 0;

View File

@ -30,7 +30,6 @@
package cc.arduino.contributions.libraries.ui; package cc.arduino.contributions.libraries.ui;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.libraries.LibrariesIndex;
import cc.arduino.contributions.libraries.filters.InstalledLibraryPredicate; import cc.arduino.contributions.libraries.filters.InstalledLibraryPredicate;
import cc.arduino.contributions.ui.DropdownItem; import cc.arduino.contributions.ui.DropdownItem;
@ -40,19 +39,13 @@ import static processing.app.I18n.tr;
public class DropdownInstalledLibraryItem implements DropdownItem<ContributedLibrary> { public class DropdownInstalledLibraryItem implements DropdownItem<ContributedLibrary> {
private final LibrariesIndex index;
public DropdownInstalledLibraryItem(LibrariesIndex index) {
this.index = index;
}
public String toString() { public String toString() {
return tr("Installed"); return tr("Installed");
} }
@Override @Override
public Predicate<ContributedLibrary> getFilterPredicate() { public Predicate<ContributedLibrary> getFilterPredicate() {
return new InstalledLibraryPredicate(index); return new InstalledLibraryPredicate();
} }
@Override @Override

View File

@ -30,7 +30,6 @@
package cc.arduino.contributions.libraries.ui; package cc.arduino.contributions.libraries.ui;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.libraries.LibrariesIndexer;
import cc.arduino.contributions.libraries.filters.UpdatableLibraryPredicate; import cc.arduino.contributions.libraries.filters.UpdatableLibraryPredicate;
import cc.arduino.contributions.ui.DropdownItem; import cc.arduino.contributions.ui.DropdownItem;
@ -40,15 +39,9 @@ import static processing.app.I18n.tr;
public class DropdownUpdatableLibrariesItem implements DropdownItem<ContributedLibrary> { public class DropdownUpdatableLibrariesItem implements DropdownItem<ContributedLibrary> {
private final LibrariesIndexer indexer;
public DropdownUpdatableLibrariesItem(LibrariesIndexer indexer) {
this.indexer = indexer;
}
@Override @Override
public Predicate<ContributedLibrary> getFilterPredicate() { public Predicate<ContributedLibrary> getFilterPredicate() {
return new UpdatableLibraryPredicate(indexer); return new UpdatableLibraryPredicate();
} }
@Override @Override

View File

@ -30,9 +30,9 @@
package cc.arduino.contributions.libraries.ui; package cc.arduino.contributions.libraries.ui;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.libraries.LibrariesIndexer;
import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributedPlatform;
import cc.arduino.contributions.ui.FilteredAbstractTableModel; import cc.arduino.contributions.ui.FilteredAbstractTableModel;
import processing.app.BaseNoGui;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -51,12 +51,6 @@ public class LibrariesIndexTableModel extends FilteredAbstractTableModel<Contrib
private final Class<?>[] columnTypes = {ContributedPlatform.class}; private final Class<?>[] columnTypes = {ContributedPlatform.class};
private LibrariesIndexer indexer;
public void setIndexer(LibrariesIndexer _index) {
indexer = _index;
}
Predicate<ContributedLibrary> selectedCategoryFilter = null; Predicate<ContributedLibrary> selectedCategoryFilter = null;
String selectedFilters[] = null; String selectedFilters[] = null;
@ -202,8 +196,8 @@ public class LibrariesIndexTableModel extends FilteredAbstractTableModel<Contrib
private void updateContributions() { private void updateContributions() {
contributions.clear(); contributions.clear();
indexer.getIndex().getLibraries().forEach(this::applyFilterToLibrary); BaseNoGui.librariesIndexer.getIndex().getLibraries().forEach(this::applyFilterToLibrary);
indexer.getInstalledLibraries().forEach(this::applyFilterToLibrary); BaseNoGui.librariesIndexer.getInstalledLibraries().forEach(this::applyFilterToLibrary);
Collections.sort(contributions, new ContributedLibraryReleasesComparator("Arduino")); Collections.sort(contributions, new ContributedLibraryReleasesComparator("Arduino"));
} }

View File

@ -31,7 +31,6 @@ package cc.arduino.contributions.libraries.ui;
import cc.arduino.contributions.DownloadableContribution; import cc.arduino.contributions.DownloadableContribution;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.libraries.LibrariesIndexer;
import cc.arduino.contributions.libraries.LibraryInstaller; import cc.arduino.contributions.libraries.LibraryInstaller;
import cc.arduino.contributions.libraries.LibraryTypeComparator; import cc.arduino.contributions.libraries.LibraryTypeComparator;
import cc.arduino.contributions.ui.*; import cc.arduino.contributions.ui.*;
@ -136,17 +135,12 @@ public class LibraryManagerUI extends InstallerJDialog<ContributedLibrary> {
categoryChooser.removeActionListener(categoryChooserActionListener); categoryChooser.removeActionListener(categoryChooserActionListener);
typeChooser.removeActionListener(typeChooserActionListener); typeChooser.removeActionListener(typeChooserActionListener);
// TODO: Remove setIndexer and make getContribModel
// return a FilteredAbstractTableModel
LibrariesIndexer indexer = BaseNoGui.librariesIndexer;
getContribModel().setIndexer(indexer);
categoryFilter = null; categoryFilter = null;
categoryChooser.removeAllItems(); categoryChooser.removeAllItems();
// Load categories // Load categories
categoryChooser.addItem(new DropdownAllItem()); categoryChooser.addItem(new DropdownAllItem());
Collection<String> categories = indexer.getIndex().getCategories(); Collection<String> categories = BaseNoGui.librariesIndexer.getIndex().getCategories();
for (String category : categories) { for (String category : categories) {
categoryChooser.addItem(new DropdownLibraryOfCategoryItem(category)); categoryChooser.addItem(new DropdownLibraryOfCategoryItem(category));
} }
@ -163,9 +157,9 @@ public class LibraryManagerUI extends InstallerJDialog<ContributedLibrary> {
typeFilter = null; typeFilter = null;
typeChooser.removeAllItems(); typeChooser.removeAllItems();
typeChooser.addItem(new DropdownAllItem()); typeChooser.addItem(new DropdownAllItem());
typeChooser.addItem(new DropdownUpdatableLibrariesItem(indexer)); typeChooser.addItem(new DropdownUpdatableLibrariesItem());
typeChooser.addItem(new DropdownInstalledLibraryItem(indexer.getIndex())); typeChooser.addItem(new DropdownInstalledLibraryItem());
java.util.List<String> types = new LinkedList<>(indexer.getIndex().getTypes()); java.util.List<String> types = new LinkedList<>(BaseNoGui.librariesIndexer.getIndex().getTypes());
Collections.sort(types, new LibraryTypeComparator()); Collections.sort(types, new LibraryTypeComparator());
for (String type : types) { for (String type : types) {
typeChooser.addItem(new DropdownLibraryOfTypeItem(type)); typeChooser.addItem(new DropdownLibraryOfTypeItem(type));

View File

@ -31,18 +31,16 @@ package cc.arduino.contributions.packages.filters;
import cc.arduino.contributions.VersionComparator; import cc.arduino.contributions.VersionComparator;
import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributedPlatform;
import cc.arduino.contributions.packages.ContributionsIndexer; import processing.app.BaseNoGui;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
public class UpdatablePlatformPredicate implements Predicate<ContributedPlatform> { public class UpdatablePlatformPredicate implements Predicate<ContributedPlatform> {
private final ContributionsIndexer indexer;
private final VersionComparator versionComparator; private final VersionComparator versionComparator;
public UpdatablePlatformPredicate(ContributionsIndexer indexer) { public UpdatablePlatformPredicate() {
this.indexer = indexer;
this.versionComparator = new VersionComparator(); this.versionComparator = new VersionComparator();
} }
@ -51,12 +49,12 @@ public class UpdatablePlatformPredicate implements Predicate<ContributedPlatform
String packageName = contributedPlatform.getParentPackage().getName(); String packageName = contributedPlatform.getParentPackage().getName();
String architecture = contributedPlatform.getArchitecture(); String architecture = contributedPlatform.getArchitecture();
ContributedPlatform installed = indexer.getInstalled(packageName, architecture); ContributedPlatform installed = BaseNoGui.indexer.getInstalled(packageName, architecture);
if (installed == null) { if (installed == null) {
return false; return false;
} }
List<ContributedPlatform> platforms = indexer.getIndex().findPlatforms(packageName, architecture); List<ContributedPlatform> platforms = BaseNoGui.indexer.getIndex().findPlatforms(packageName, architecture);
return platforms.stream() return platforms.stream()
.filter(platform -> versionComparator.greaterThan(platform.getParsedVersion(), installed.getParsedVersion())) .filter(platform -> versionComparator.greaterThan(platform.getParsedVersion(), installed.getParsedVersion()))
.count() > 0; .count() > 0;

View File

@ -34,8 +34,8 @@ import cc.arduino.contributions.filters.InstalledPredicate;
import cc.arduino.contributions.packages.ContributedBoard; import cc.arduino.contributions.packages.ContributedBoard;
import cc.arduino.contributions.packages.ContributedPackage; import cc.arduino.contributions.packages.ContributedPackage;
import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributedPlatform;
import cc.arduino.contributions.packages.ContributionsIndexer;
import cc.arduino.contributions.ui.FilteredAbstractTableModel; import cc.arduino.contributions.ui.FilteredAbstractTableModel;
import processing.app.BaseNoGui;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -115,16 +115,10 @@ public class ContributionIndexTableModel extends FilteredAbstractTableModel<Cont
private final Class<?>[] columnTypes = {ContributedPlatform.class}; private final Class<?>[] columnTypes = {ContributedPlatform.class};
private ContributionsIndexer indexer;
public void setIndexer(ContributionsIndexer indexer) {
this.indexer = indexer;
}
public void updateIndexFilter(String[] filters, Stream<Predicate<ContributedPlatform>> additionalFilters) { public void updateIndexFilter(String[] filters, Stream<Predicate<ContributedPlatform>> additionalFilters) {
contributions.clear(); contributions.clear();
Predicate<ContributedPlatform> filter = additionalFilters.reduce(Predicate::and).get(); Predicate<ContributedPlatform> filter = additionalFilters.reduce(Predicate::and).get();
for (ContributedPackage pack : indexer.getPackages()) { for (ContributedPackage pack : BaseNoGui.indexer.getPackages()) {
for (ContributedPlatform platform : pack.getPlatforms()) { for (ContributedPlatform platform : pack.getPlatforms()) {
String compoundTargetSearchText = platform.getName() + "\n" + platform.getBoards().stream().map(ContributedBoard::getName).collect(Collectors.joining(" ")); String compoundTargetSearchText = platform.getName() + "\n" + platform.getBoards().stream().map(ContributedBoard::getName).collect(Collectors.joining(" "));
if (!filter.test(platform)) { if (!filter.test(platform)) {

View File

@ -32,7 +32,6 @@ package cc.arduino.contributions.packages.ui;
import cc.arduino.contributions.DownloadableContribution; import cc.arduino.contributions.DownloadableContribution;
import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributedPlatform;
import cc.arduino.contributions.packages.ContributionInstaller; import cc.arduino.contributions.packages.ContributionInstaller;
import cc.arduino.contributions.packages.ContributionsIndexer;
import cc.arduino.contributions.ui.*; import cc.arduino.contributions.ui.*;
import cc.arduino.utils.Progress; import cc.arduino.utils.Progress;
import processing.app.BaseNoGui; import processing.app.BaseNoGui;
@ -94,9 +93,6 @@ public class ContributionManagerUI extends InstallerJDialog {
categoryChooser.removeActionListener(categoryChooserActionListener); categoryChooser.removeActionListener(categoryChooserActionListener);
ContributionsIndexer indexer = BaseNoGui.indexer;
getContribModel().setIndexer(indexer);
categoryFilter = null; categoryFilter = null;
categoryChooser.removeAllItems(); categoryChooser.removeAllItems();
@ -106,8 +102,8 @@ public class ContributionManagerUI extends InstallerJDialog {
// Enable categories combo only if there are two or more choices // Enable categories combo only if there are two or more choices
categoryChooser.addItem(new DropdownAllCoresItem()); categoryChooser.addItem(new DropdownAllCoresItem());
categoryChooser.addItem(new DropdownUpdatableCoresItem(indexer)); categoryChooser.addItem(new DropdownUpdatableCoresItem());
Collection<String> categories = indexer.getCategories(); Collection<String> categories = BaseNoGui.indexer.getCategories();
for (String s : categories) { for (String s : categories) {
categoryChooser.addItem(new DropdownCoreOfCategoryItem(s)); categoryChooser.addItem(new DropdownCoreOfCategoryItem(s));
} }

View File

@ -30,7 +30,6 @@
package cc.arduino.contributions.packages.ui; package cc.arduino.contributions.packages.ui;
import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributedPlatform;
import cc.arduino.contributions.packages.ContributionsIndexer;
import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate; import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate;
import cc.arduino.contributions.ui.DropdownItem; import cc.arduino.contributions.ui.DropdownItem;
@ -40,15 +39,9 @@ import static processing.app.I18n.tr;
public class DropdownUpdatableCoresItem implements DropdownItem<ContributedPlatform> { public class DropdownUpdatableCoresItem implements DropdownItem<ContributedPlatform> {
private final ContributionsIndexer indexer;
public DropdownUpdatableCoresItem(ContributionsIndexer indexer) {
this.indexer = indexer;
}
@Override @Override
public Predicate<ContributedPlatform> getFilterPredicate() { public Predicate<ContributedPlatform> getFilterPredicate() {
return new UpdatablePlatformPredicate(indexer); return new UpdatablePlatformPredicate();
} }
@Override @Override

View File

@ -301,8 +301,8 @@ public class Base {
this.pdeKeywords = new PdeKeywords(); this.pdeKeywords = new PdeKeywords();
this.pdeKeywords.reload(); this.pdeKeywords.reload();
contributionInstaller = new ContributionInstaller(BaseNoGui.indexer, BaseNoGui.getPlatform(), new GPGDetachedSignatureVerifier()); contributionInstaller = new ContributionInstaller(BaseNoGui.getPlatform(), new GPGDetachedSignatureVerifier());
libraryInstaller = new LibraryInstaller(BaseNoGui.librariesIndexer, BaseNoGui.getPlatform()); libraryInstaller = new LibraryInstaller(BaseNoGui.getPlatform());
parser.parseArgumentsPhase2(); parser.parseArgumentsPhase2();
@ -379,7 +379,7 @@ public class Base {
System.exit(0); System.exit(0);
} else if (parser.isInstallLibrary()) { } else if (parser.isInstallLibrary()) {
LibrariesIndexer indexer = new LibrariesIndexer(BaseNoGui.getSettingsFolder(), new ContributionsIndexer(BaseNoGui.getSettingsFolder(), BaseNoGui.getPlatform(), new GPGDetachedSignatureVerifier())); LibrariesIndexer indexer = new LibrariesIndexer(BaseNoGui.getSettingsFolder());
ProgressListener progressListener = new ConsoleProgressListener(); ProgressListener progressListener = new ConsoleProgressListener();
indexer.parseIndex(); indexer.parseIndex();
BaseNoGui.onBoardOrPortChange(); BaseNoGui.onBoardOrPortChange();
@ -462,7 +462,7 @@ public class Base {
if (PreferencesData.getBoolean("update.check")) { if (PreferencesData.getBoolean("update.check")) {
new UpdateCheck(this); new UpdateCheck(this);
contributionsSelfCheck = new ContributionsSelfCheck(this, new UpdatableBoardsLibsFakeURLsHandler(this), BaseNoGui.indexer, contributionInstaller, BaseNoGui.librariesIndexer, libraryInstaller); contributionsSelfCheck = new ContributionsSelfCheck(this, new UpdatableBoardsLibsFakeURLsHandler(this), contributionInstaller, libraryInstaller);
new Timer(false).schedule(contributionsSelfCheck, Constants.BOARDS_LIBS_UPDATABLE_CHECK_START_PERIOD); new Timer(false).schedule(contributionsSelfCheck, Constants.BOARDS_LIBS_UPDATABLE_CHECK_START_PERIOD);
} }

View File

@ -40,8 +40,8 @@ import java.nio.file.LinkOption;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import static processing.app.I18n.tr;
import static processing.app.I18n.format; import static processing.app.I18n.format;
import static processing.app.I18n.tr;
public class DownloadableContributionsDownloader { public class DownloadableContributionsDownloader {

View File

@ -33,7 +33,6 @@ import cc.arduino.Constants;
import cc.arduino.contributions.libraries.filters.LibraryInstalledInsideCore; import cc.arduino.contributions.libraries.filters.LibraryInstalledInsideCore;
import cc.arduino.contributions.libraries.filters.TypePredicate; import cc.arduino.contributions.libraries.filters.TypePredicate;
import cc.arduino.contributions.packages.ContributedPlatform; import cc.arduino.contributions.packages.ContributedPlatform;
import cc.arduino.contributions.packages.ContributionsIndexer;
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.mrbean.MrBeanModule; import com.fasterxml.jackson.module.mrbean.MrBeanModule;
@ -58,7 +57,6 @@ import static processing.app.I18n.tr;
public class LibrariesIndexer { public class LibrariesIndexer {
private final ContributionsIndexer contributionsIndexer;
private LibrariesIndex index; private LibrariesIndex index;
private final LibraryList installedLibraries = new LibraryList(); private final LibraryList installedLibraries = new LibraryList();
private final LibraryList installedLibrariesWithDuplicates = new LibraryList(); private final LibraryList installedLibrariesWithDuplicates = new LibraryList();
@ -69,8 +67,7 @@ public class LibrariesIndexer {
private final List<String> badLibNotified = new ArrayList<>(); private final List<String> badLibNotified = new ArrayList<>();
public LibrariesIndexer(File preferencesFolder, ContributionsIndexer contributionsIndexer) { public LibrariesIndexer(File preferencesFolder) {
this.contributionsIndexer = contributionsIndexer;
this.indexFile = new File(preferencesFolder, "library_index.json"); this.indexFile = new File(preferencesFolder, "library_index.json");
this.stagingFolder = new File(new File(preferencesFolder, "staging"), "libraries"); this.stagingFolder = new File(new File(preferencesFolder, "staging"), "libraries");
} }
@ -123,8 +120,8 @@ public class LibrariesIndexer {
scanInstalledLibraries(folder, folder.equals(sketchbookLibrariesFolder)); scanInstalledLibraries(folder, folder.equals(sketchbookLibrariesFolder));
} }
installedLibraries.stream().filter(new TypePredicate("Contributed")).filter(new LibraryInstalledInsideCore(contributionsIndexer)).forEach(userLibrary -> { installedLibraries.stream().filter(new TypePredicate("Contributed")).filter(new LibraryInstalledInsideCore()).forEach(userLibrary -> {
ContributedPlatform platform = contributionsIndexer.getPlatformByFolder(userLibrary.getInstalledFolder()); ContributedPlatform platform = BaseNoGui.indexer.getPlatformByFolder(userLibrary.getInstalledFolder());
userLibrary.setTypes(Collections.singletonList(platform.getCategory())); userLibrary.setTypes(Collections.singletonList(platform.getCategory()));
}); });
} }

View File

@ -35,6 +35,7 @@ import cc.arduino.contributions.GZippedJsonDownloader;
import cc.arduino.contributions.ProgressListener; import cc.arduino.contributions.ProgressListener;
import cc.arduino.utils.ArchiveExtractor; import cc.arduino.utils.ArchiveExtractor;
import cc.arduino.utils.MultiStepProgress; import cc.arduino.utils.MultiStepProgress;
import processing.app.BaseNoGui;
import processing.app.I18n; import processing.app.I18n;
import processing.app.Platform; import processing.app.Platform;
import processing.app.helpers.FileUtils; import processing.app.helpers.FileUtils;
@ -47,22 +48,18 @@ import static processing.app.I18n.tr;
public class LibraryInstaller { public class LibraryInstaller {
private final LibrariesIndexer indexer;
private final DownloadableContributionsDownloader downloader;
private final Platform platform; private final Platform platform;
public LibraryInstaller(LibrariesIndexer indexer, Platform platform) { public LibraryInstaller(Platform platform) {
this.indexer = indexer;
this.platform = platform; this.platform = platform;
File stagingFolder = indexer.getStagingFolder();
downloader = new DownloadableContributionsDownloader(stagingFolder);
} }
public synchronized void updateIndex(ProgressListener progressListener) throws Exception { public synchronized void updateIndex(ProgressListener progressListener) throws Exception {
final MultiStepProgress progress = new MultiStepProgress(2); final MultiStepProgress progress = new MultiStepProgress(2);
DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder());
// Step 1: Download index // Step 1: Download index
File outputFile = indexer.getIndexFile(); File outputFile = BaseNoGui.librariesIndexer.getIndexFile();
File tmpFile = new File(outputFile.getAbsolutePath() + ".tmp"); File tmpFile = new File(outputFile.getAbsolutePath() + ".tmp");
try { try {
GZippedJsonDownloader gZippedJsonDownloader = new GZippedJsonDownloader(downloader, new URL(Constants.LIBRARY_INDEX_URL), new URL(Constants.LIBRARY_INDEX_URL_GZ)); GZippedJsonDownloader gZippedJsonDownloader = new GZippedJsonDownloader(downloader, new URL(Constants.LIBRARY_INDEX_URL), new URL(Constants.LIBRARY_INDEX_URL_GZ));
@ -91,6 +88,8 @@ public class LibraryInstaller {
return; return;
} }
DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.librariesIndexer.getStagingFolder());
final MultiStepProgress progress = new MultiStepProgress(3); final MultiStepProgress progress = new MultiStepProgress(3);
// Step 1: Download library // Step 1: Download library
@ -108,7 +107,7 @@ public class LibraryInstaller {
// Step 2: Unpack library on the correct location // Step 2: Unpack library on the correct location
progress.setStatus(I18n.format(tr("Installing library: {0}"), lib.getName())); progress.setStatus(I18n.format(tr("Installing library: {0}"), lib.getName()));
progressListener.onProgress(progress); progressListener.onProgress(progress);
File libsFolder = indexer.getSketchbookLibrariesFolder(); File libsFolder = BaseNoGui.librariesIndexer.getSketchbookLibrariesFolder();
File tmpFolder = FileUtils.createTempFolder(libsFolder); File tmpFolder = FileUtils.createTempFolder(libsFolder);
try { try {
new ArchiveExtractor(platform).extract(lib.getDownloadedFile(), tmpFolder, 1); new ArchiveExtractor(platform).extract(lib.getDownloadedFile(), tmpFolder, 1);
@ -149,7 +148,7 @@ public class LibraryInstaller {
private void rescanLibraryIndex(MultiStepProgress progress, ProgressListener progressListener) { private void rescanLibraryIndex(MultiStepProgress progress, ProgressListener progressListener) {
progress.setStatus(tr("Updating list of installed libraries")); progress.setStatus(tr("Updating list of installed libraries"));
progressListener.onProgress(progress); progressListener.onProgress(progress);
indexer.rescanLibraries(); BaseNoGui.librariesIndexer.rescanLibraries();
progress.stepDone(); progress.stepDone();
} }
} }

View File

@ -30,21 +30,15 @@
package cc.arduino.contributions.libraries.filters; package cc.arduino.contributions.libraries.filters;
import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.ContributedLibrary;
import cc.arduino.contributions.packages.ContributionsIndexer; import processing.app.BaseNoGui;
import java.util.function.Predicate; import java.util.function.Predicate;
public class LibraryInstalledInsideCore implements Predicate<ContributedLibrary> { public class LibraryInstalledInsideCore implements Predicate<ContributedLibrary> {
private final ContributionsIndexer indexer;
public LibraryInstalledInsideCore(ContributionsIndexer indexer) {
this.indexer = indexer;
}
@Override @Override
public boolean test(ContributedLibrary contributedLibrary) { public boolean test(ContributedLibrary contributedLibrary) {
return indexer.isFolderInsidePlatform(contributedLibrary.getInstalledFolder()); return BaseNoGui.indexer.isFolderInsidePlatform(contributedLibrary.getInstalledFolder());
} }
} }

View File

@ -97,4 +97,17 @@ public abstract class ContributedPlatform extends DownloadableContribution {
public String toString() { public String toString() {
return getParsedVersion(); return getParsedVersion();
} }
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof ContributedPlatform)) {
return false;
}
ContributedPlatform obj1 = (ContributedPlatform) obj;
return getParentPackage().getName().equals(obj1.getParentPackage().getName()) && getArchitecture().equals(obj1.getArchitecture()) && getVersion().equals(obj1.getVersion()) && getName().equals(obj1.getName());
}
} }

View File

@ -37,10 +37,7 @@ import java.io.File;
public class ContributedTargetPlatform extends LegacyTargetPlatform { public class ContributedTargetPlatform extends LegacyTargetPlatform {
public ContributedTargetPlatform(String _name, File _folder, public ContributedTargetPlatform(String _name, File _folder, TargetPackage parent) throws TargetPlatformException {
TargetPackage parent,
ContributionsIndex index)
throws TargetPlatformException {
super(_name, _folder, parent); super(_name, _folder, parent);
} }
} }

View File

@ -68,4 +68,16 @@ public abstract class ContributedTool {
return res; return res;
} }
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof ContributedTool)) {
return false;
}
ContributedTool obj1 = (ContributedTool) obj;
return getName().equals(obj1.getName()) && getVersion().equals(obj1.getVersion());
}
} }

View File

@ -34,6 +34,7 @@ import cc.arduino.contributions.DownloadableContribution;
import cc.arduino.contributions.DownloadableContributionsDownloader; import cc.arduino.contributions.DownloadableContributionsDownloader;
import cc.arduino.contributions.ProgressListener; import cc.arduino.contributions.ProgressListener;
import cc.arduino.contributions.SignatureVerifier; import cc.arduino.contributions.SignatureVerifier;
import cc.arduino.contributions.filters.InstalledPredicate;
import cc.arduino.filters.FileExecutablePredicate; import cc.arduino.filters.FileExecutablePredicate;
import cc.arduino.utils.ArchiveExtractor; import cc.arduino.utils.ArchiveExtractor;
import cc.arduino.utils.MultiStepProgress; import cc.arduino.utils.MultiStepProgress;
@ -41,6 +42,7 @@ import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.Executor; import org.apache.commons.exec.Executor;
import org.apache.commons.exec.PumpStreamHandler; import org.apache.commons.exec.PumpStreamHandler;
import processing.app.BaseNoGui;
import processing.app.I18n; import processing.app.I18n;
import processing.app.Platform; import processing.app.Platform;
import processing.app.PreferencesData; import processing.app.PreferencesData;
@ -62,17 +64,12 @@ import static processing.app.I18n.tr;
public class ContributionInstaller { public class ContributionInstaller {
private final ContributionsIndexer indexer;
private final DownloadableContributionsDownloader downloader;
private final Platform platform; private final Platform platform;
private final SignatureVerifier signatureVerifier; private final SignatureVerifier signatureVerifier;
public ContributionInstaller(ContributionsIndexer contributionsIndexer, Platform platform, SignatureVerifier signatureVerifier) { public ContributionInstaller(Platform platform, SignatureVerifier signatureVerifier) {
this.platform = platform; this.platform = platform;
this.signatureVerifier = signatureVerifier; this.signatureVerifier = signatureVerifier;
File stagingFolder = contributionsIndexer.getStagingFolder();
indexer = contributionsIndexer;
downloader = new DownloadableContributionsDownloader(stagingFolder);
} }
public synchronized List<String> install(ContributedPlatform contributedPlatform, ProgressListener progressListener) throws Exception { public synchronized List<String> install(ContributedPlatform contributedPlatform, ProgressListener progressListener) throws Exception {
@ -95,6 +92,8 @@ public class ContributionInstaller {
} }
} }
DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.indexer.getStagingFolder());
// Calculate progress increases // Calculate progress increases
MultiStepProgress progress = new MultiStepProgress((tools.size() + 1) * 2); MultiStepProgress progress = new MultiStepProgress((tools.size() + 1) * 2);
@ -118,7 +117,7 @@ public class ContributionInstaller {
} }
ContributedPackage pack = contributedPlatform.getParentPackage(); ContributedPackage pack = contributedPlatform.getParentPackage();
File packageFolder = new File(indexer.getPackagesFolder(), pack.getName()); File packageFolder = new File(BaseNoGui.indexer.getPackagesFolder(), pack.getName());
// TODO: Extract to temporary folders and move to the final destination only // TODO: Extract to temporary folders and move to the final destination only
// once everything is successfully unpacked. If the operation fails remove // once everything is successfully unpacked. If the operation fails remove
@ -137,7 +136,7 @@ public class ContributionInstaller {
i++; i++;
ContributedTool tool = entry.getValue(); ContributedTool tool = entry.getValue();
DownloadableContribution toolContrib = tool.getDownloadableContribution(platform); DownloadableContribution toolContrib = tool.getDownloadableContribution(platform);
Path destFolder = Paths.get(indexer.getPackagesFolder().getAbsolutePath(), entry.getKey().getPackager(), "tools", tool.getName(), tool.getVersion()); Path destFolder = Paths.get(BaseNoGui.indexer.getPackagesFolder().getAbsolutePath(), entry.getKey().getPackager(), "tools", tool.getName(), tool.getVersion());
Files.createDirectories(destFolder); Files.createDirectories(destFolder);
assert toolContrib.getDownloadedFile() != null; assert toolContrib.getDownloadedFile() != null;
@ -237,6 +236,7 @@ public class ContributionInstaller {
} }
public synchronized List<String> remove(ContributedPlatform contributedPlatform) { public synchronized List<String> remove(ContributedPlatform contributedPlatform) {
BaseNoGui.indexer.getPackages().stream().flatMap(p -> p.getPlatforms().stream()).filter(new InstalledPredicate()).peek(pl -> System.out.println(pl.getName() + " " + pl.getVersion())).collect(Collectors.toList());
if (contributedPlatform == null || contributedPlatform.isReadOnly()) { if (contributedPlatform == null || contributedPlatform.isReadOnly()) {
return new LinkedList<>(); return new LinkedList<>();
} }
@ -247,13 +247,9 @@ public class ContributionInstaller {
errors.add(tr("Error running post install script")); errors.add(tr("Error running post install script"));
} }
FileUtils.recursiveDelete(contributedPlatform.getInstalledFolder());
contributedPlatform.setInstalled(false);
contributedPlatform.setInstalledFolder(null);
// Check if the tools are no longer needed // Check if the tools are no longer needed
for (ContributedTool tool : contributedPlatform.getResolvedTools()) { for (ContributedTool tool : contributedPlatform.getResolvedTools()) {
if (indexer.isContributedToolUsed(tool)) { if (BaseNoGui.indexer.isContributedToolUsed(contributedPlatform, tool)) {
continue; continue;
} }
@ -273,6 +269,10 @@ public class ContributionInstaller {
} }
} }
FileUtils.recursiveDelete(contributedPlatform.getInstalledFolder());
contributedPlatform.setInstalled(false);
contributedPlatform.setInstalledFolder(null);
return errors; return errors;
} }
@ -324,8 +324,9 @@ public class ContributionInstaller {
String statusText = tr("Downloading platforms index..."); String statusText = tr("Downloading platforms index...");
URL url = new URL(packageIndexUrl); URL url = new URL(packageIndexUrl);
String[] urlPathParts = url.getFile().split("/"); String[] urlPathParts = url.getFile().split("/");
File outputFile = indexer.getIndexFile(urlPathParts[urlPathParts.length - 1]); File outputFile = BaseNoGui.indexer.getIndexFile(urlPathParts[urlPathParts.length - 1]);
File tmpFile = new File(outputFile.getAbsolutePath() + ".tmp"); File tmpFile = new File(outputFile.getAbsolutePath() + ".tmp");
DownloadableContributionsDownloader downloader = new DownloadableContributionsDownloader(BaseNoGui.indexer.getStagingFolder());
downloader.download(url, tmpFile, progress, statusText, progressListener); downloader.download(url, tmpFile, progress, statusText, progressListener);
Files.deleteIfExists(outputFile.toPath()); Files.deleteIfExists(outputFile.toPath());
@ -335,7 +336,7 @@ public class ContributionInstaller {
} }
public synchronized void deleteUnknownFiles(List<String> downloadedPackageIndexFiles) throws IOException { public synchronized void deleteUnknownFiles(List<String> downloadedPackageIndexFiles) throws IOException {
File preferencesFolder = indexer.getIndexFile(".").getParentFile(); File preferencesFolder = BaseNoGui.indexer.getIndexFile(".").getParentFile();
File[] additionalPackageIndexFiles = preferencesFolder.listFiles(new PackageIndexFilenameFilter(Constants.DEFAULT_INDEX_FILE_NAME)); File[] additionalPackageIndexFiles = preferencesFolder.listFiles(new PackageIndexFilenameFilter(Constants.DEFAULT_INDEX_FILE_NAME));
if (additionalPackageIndexFiles == null) { if (additionalPackageIndexFiles == null) {
return; return;

View File

@ -310,7 +310,7 @@ public class ContributionsIndexer {
File folder = platform.getInstalledFolder(); File folder = platform.getInstalledFolder();
try { try {
TargetPlatform targetPlatform = new ContributedTargetPlatform(arch, folder, targetPackage, index); TargetPlatform targetPlatform = new ContributedTargetPlatform(arch, folder, targetPackage);
if (!targetPackage.hasPlatform(targetPlatform)) { if (!targetPackage.hasPlatform(targetPlatform)) {
targetPackage.addPlatform(targetPlatform); targetPackage.addPlatform(targetPlatform);
} }
@ -332,11 +332,15 @@ public class ContributionsIndexer {
return packages; return packages;
} }
public boolean isContributedToolUsed(ContributedTool tool) { public boolean isContributedToolUsed(ContributedPlatform platformToIgnore, ContributedTool tool) {
for (ContributedPackage pack : index.getPackages()) { for (ContributedPackage pack : index.getPackages()) {
for (ContributedPlatform platform : pack.getPlatforms()) { for (ContributedPlatform platform : pack.getPlatforms()) {
if (!platform.isInstalled()) if (platformToIgnore.equals(platform)) {
continue; continue;
}
if (!platform.isInstalled()) {
continue;
}
for (ContributedTool requiredTool : platform.getResolvedTools()) { for (ContributedTool requiredTool : platform.getResolvedTools()) {
if (requiredTool.equals(tool)) if (requiredTool.equals(tool))
return true; return true;

View File

@ -39,8 +39,12 @@ import com.jcraft.jsch.Session;
import processing.app.BaseNoGui; import processing.app.BaseNoGui;
import processing.app.I18n; import processing.app.I18n;
import processing.app.PreferencesData; import processing.app.PreferencesData;
import processing.app.debug.*; import processing.app.debug.RunnerException;
import processing.app.helpers.*; import processing.app.debug.TargetPlatform;
import processing.app.helpers.PreferencesMap;
import processing.app.helpers.PreferencesMapException;
import processing.app.helpers.StringReplacer;
import processing.app.helpers.StringUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;

View File

@ -34,9 +34,9 @@
package cc.arduino.packages.uploaders; package cc.arduino.packages.uploaders;
import cc.arduino.LoadVIDPIDSpecificPreferences;
import cc.arduino.packages.Uploader; import cc.arduino.packages.Uploader;
import processing.app.*; import processing.app.*;
import cc.arduino.LoadVIDPIDSpecificPreferences;
import processing.app.debug.RunnerException; import processing.app.debug.RunnerException;
import processing.app.debug.TargetPlatform; import processing.app.debug.TargetPlatform;
import processing.app.helpers.OSUtils; import processing.app.helpers.OSUtils;

View File

@ -608,7 +608,7 @@ public class BaseNoGui {
loadHardware(getSketchbookHardwareFolder()); loadHardware(getSketchbookHardwareFolder());
createToolPreferences(indexer.getInstalledTools(), true); createToolPreferences(indexer.getInstalledTools(), true);
librariesIndexer = new LibrariesIndexer(BaseNoGui.getSettingsFolder(), indexer); librariesIndexer = new LibrariesIndexer(BaseNoGui.getSettingsFolder());
File librariesIndexFile = librariesIndexer.getIndexFile(); File librariesIndexFile = librariesIndexer.getIndexFile();
copyStockLibraryIndexIfUpstreamIsMissing(librariesIndexFile); copyStockLibraryIndexIfUpstreamIsMissing(librariesIndexFile);
try { try {

View File

@ -7,6 +7,8 @@ ARDUINO 1.6.7
* Added support to file:// protocol for boards manager URLs * Added support to file:// protocol for boards manager URLs
* Portable sketchbook folder can now be any arbitrary location * Portable sketchbook folder can now be any arbitrary location
* Fixed a bug that caused Boards Manager to install the same tool twice or more, thus wasting disk space, if other cores where using tools delivered by arduino * Fixed a bug that caused Boards Manager to install the same tool twice or more, thus wasting disk space, if other cores where using tools delivered by arduino
* Fixed various Boards manager glitches, in particular when removing a board
* Windows: Arduino IDE icon is now in high definition, bye bye that blurry icon
[libraries] [libraries]
* SPI: Added SPI.transfer16(...) function to SAM core. * SPI: Added SPI.transfer16(...) function to SAM core.