Skip to content

Commit 246cf6e

Browse files
committed
Added installed lib priority comparator
This clearly defines the usage priority for installed libraries.
1 parent 8fa45a3 commit 246cf6e

File tree

3 files changed

+92
-23
lines changed

3 files changed

+92
-23
lines changed

arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndexer.java

+21-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import processing.app.packages.UserLibrary;
4444
import processing.app.packages.UserLibraryFolder;
4545
import processing.app.packages.UserLibraryFolder.Location;
46+
import processing.app.packages.UserLibraryPriorityComparator;
4647

4748
import java.io.File;
4849
import java.io.FileInputStream;
@@ -111,7 +112,25 @@ public List<UserLibraryFolder> getLibrariesFolders() {
111112
return librariesFolders;
112113
}
113114

115+
private UserLibraryPriorityComparator priorityComparator;
116+
117+
public void addToInstalledLibraries(UserLibrary lib) {
118+
UserLibrary toReplace = installedLibraries.getByName(lib.getName());
119+
if (toReplace == null) {
120+
installedLibraries.add(lib);
121+
return;
122+
}
123+
if (priorityComparator.compare(toReplace, lib) >= 0) {
124+
// The current lib has priority, do nothing
125+
return;
126+
}
127+
installedLibraries.remove(toReplace);
128+
installedLibraries.add(lib);
129+
}
130+
114131
public void rescanLibraries() {
132+
priorityComparator = new UserLibraryPriorityComparator(BaseNoGui.getTargetPlatform().getId());
133+
115134
// Clear all installed flags
116135
installedLibraries.clear();
117136

@@ -180,7 +199,7 @@ private void scanLibrary(UserLibraryFolder folderDesc) throws IOException {
180199
if (headers.length == 0) {
181200
throw new IOException(lib.getSrcFolder().getAbsolutePath());
182201
}
183-
installedLibraries.addOrReplace(lib);
202+
addToInstalledLibraries(lib);
184203
return;
185204
}
186205

@@ -190,7 +209,7 @@ private void scanLibrary(UserLibraryFolder folderDesc) throws IOException {
190209
if (headers.length == 0) {
191210
throw new IOException(lib.getSrcFolder().getAbsolutePath());
192211
}
193-
installedLibraries.addOrReplaceArchAware(lib);
212+
addToInstalledLibraries(lib);
194213

195214
Location loc = lib.getLocation();
196215
if (loc != Location.CORE && loc != Location.REFERENCED_CORE) {

arduino-core/src/processing/app/packages/LibraryList.java

-21
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,6 @@ public synchronized UserLibrary getByName(String name) {
5757
return null;
5858
}
5959

60-
public synchronized void addOrReplaceArchAware(UserLibrary lib) {
61-
addOrReplace(lib, true);
62-
}
63-
64-
public synchronized void addOrReplace(UserLibrary lib) {
65-
addOrReplace(lib, false);
66-
}
67-
68-
public synchronized void addOrReplace(UserLibrary lib, boolean archAware) {
69-
remove(lib, archAware);
70-
add(lib);
71-
}
72-
73-
public synchronized void remove(UserLibrary lib, boolean archAware) {
74-
UserLibrary l = getByName(lib.getName());
75-
if (l != null) {
76-
if (!archAware || lib.getArchitectures().contains("*") || lib.getArchitectures().containsAll(l.getArchitectures()))
77-
super.remove(l);
78-
}
79-
}
80-
8160
public synchronized void sort() {
8261
Collections.sort(this, (x, y) -> x.getName().compareToIgnoreCase(y.getName()));
8362
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* This file is part of Arduino.
3+
*
4+
* Copyright 2017 Arduino LLC (http://www.arduino.cc/)
5+
*
6+
* Arduino is free software; you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation; either version 2 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program; if not, write to the Free Software
18+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19+
*
20+
* As a special exception, you may use this file as part of a free software
21+
* library without restriction. Specifically, if other files instantiate
22+
* templates or use macros or inline functions from this file, or you compile
23+
* this file and link it with other files to produce an executable, this
24+
* file does not by itself cause the resulting executable to be covered by
25+
* the GNU General Public License. This exception does not however
26+
* invalidate any other reasons why the executable file might be covered by
27+
* the GNU General Public License.
28+
*/
29+
package processing.app.packages;
30+
31+
import java.util.Comparator;
32+
import java.util.HashMap;
33+
import java.util.Map;
34+
35+
import processing.app.packages.UserLibraryFolder.Location;
36+
37+
public class UserLibraryPriorityComparator implements Comparator<UserLibrary> {
38+
39+
private final static Map<Location, Integer> priorities = new HashMap<>();
40+
static {
41+
priorities.put(Location.SKETCHBOOK, 4);
42+
priorities.put(Location.CORE, 3);
43+
priorities.put(Location.REFERENCED_CORE, 2);
44+
priorities.put(Location.IDE_BUILTIN, 1);
45+
}
46+
47+
private String arch;
48+
49+
public UserLibraryPriorityComparator(String currentArch) {
50+
arch = currentArch;
51+
}
52+
53+
private boolean hasArchitecturePriority(UserLibrary x) {
54+
return x.getArchitectures().contains(arch);
55+
}
56+
57+
public int priority(UserLibrary l) {
58+
int priority = priorities.get(l.getLocation());
59+
if (hasArchitecturePriority(l))
60+
priority += 10;
61+
return priority;
62+
}
63+
64+
@Override
65+
public int compare(UserLibrary x, UserLibrary y) {
66+
if (!x.getName().equals(y.getName())) {
67+
throw new IllegalArgumentException("The compared libraries must have the same name");
68+
}
69+
return priority(x) - priority(y);
70+
}
71+
}

0 commit comments

Comments
 (0)