diff options
Diffstat (limited to 'toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java')
-rw-r--r-- | toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java | 130 |
1 files changed, 85 insertions, 45 deletions
diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java index 1d18767598a..3aba4a82eda 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java @@ -7,17 +7,25 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.board; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; +import org.eclipse.cdt.arduino.core.internal.Activator; import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences; +import org.eclipse.core.runtime.CoreException; public class ArduinoPackage { + // JSON fields private String name; private String maintainer; private String websiteURL; @@ -25,22 +33,9 @@ public class ArduinoPackage { private ArduinoHelp help; private List<ArduinoPlatform> platforms; private List<ArduinoTool> tools; + // end JSON fields - private transient ArduinoManager manager; - - void setOwner(ArduinoManager manager) { - this.manager = manager; - for (ArduinoPlatform platform : platforms) { - platform.setOwner(this); - } - for (ArduinoTool tool : tools) { - tool.setOwner(this); - } - } - - ArduinoManager getManager() { - return manager; - } + private Map<String, ArduinoPlatform> installedPlatforms; public String getName() { return name; @@ -66,51 +61,96 @@ public class ArduinoPackage { return Collections.unmodifiableCollection(platforms); } + void init() { + for (ArduinoPlatform platform : platforms) { + platform.init(this); + } + for (ArduinoTool tool : tools) { + tool.init(this); + } + } + + public ArduinoPlatform getPlatform(String architecture, String version) { + if (platforms != null) { + for (ArduinoPlatform plat : platforms) { + if (plat.getArchitecture().equals(architecture) && plat.getVersion().equals(version)) { + return plat; + } + } + } + return null; + } + public Path getInstallPath() { return ArduinoPreferences.getArduinoHome().resolve("packages").resolve(getName()); //$NON-NLS-1$ } - /** - * Only the latest versions of the platforms. - * - * @return latest platforms - */ - public Map<String, ArduinoPlatform> getAvailablePlatforms() { - Map<String, ArduinoPlatform> platformMap = new HashMap<>(); - for (ArduinoPlatform platform : platforms) { - ArduinoPlatform p = platformMap.get(platform.getName()); - if (p == null || ArduinoManager.compareVersions(platform.getVersion(), p.getVersion()) > 0) { - platformMap.put(platform.getName(), platform); + private void initInstalledPlatforms() throws CoreException { + if (installedPlatforms == null) { + installedPlatforms = new HashMap<>(); + + if (Files.isDirectory(getInstallPath())) { + Path platformTxt = Paths.get("platform.txt"); //$NON-NLS-1$ + try { + Files.find(getInstallPath().resolve("hardware"), 2, //$NON-NLS-1$ + (path, attrs) -> path.getFileName().equals(platformTxt)) + .forEach(path -> { + try (FileReader reader = new FileReader(path.toFile())) { + Properties platformProperties = new Properties(); + platformProperties.load(reader); + String arch = path.getName(path.getNameCount() - 2).toString(); + String version = platformProperties.getProperty("version"); //$NON-NLS-1$ + + ArduinoPlatform platform = getPlatform(arch, version); + if (platform != null) { + platform.setPlatformProperties(platformProperties); + installedPlatforms.put(arch, platform); + } // TODO manually add it if was removed from index + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } catch (IOException e) { + throw Activator.coreException(e); + } } } - return platformMap; } - public Map<String, ArduinoPlatform> getInstalledPlatforms() { - Map<String, ArduinoPlatform> platformMap = new HashMap<>(); - for (ArduinoPlatform platform : platforms) { - if (platform.isInstalled()) { - platformMap.put(platform.getName(), platform); - } + public Collection<ArduinoPlatform> getInstalledPlatforms() throws CoreException { + initInstalledPlatforms(); + return installedPlatforms.values(); + } + + public ArduinoPlatform getInstalledPlatform(String architecture) throws CoreException { + if (architecture == null) { + return null; + } else { + initInstalledPlatforms(); + return installedPlatforms.get(architecture); } - return platformMap; } - public ArduinoPlatform getPlatform(String name) { - ArduinoPlatform foundPlatform = null; + void platformInstalled(ArduinoPlatform platform) { + installedPlatforms.put(platform.getArchitecture(), platform); + } + + void platformUninstalled(ArduinoPlatform platform) { + installedPlatforms.remove(platform.getArchitecture()); + } + + public Collection<ArduinoPlatform> getAvailablePlatforms() throws CoreException { + initInstalledPlatforms(); + Map<String, ArduinoPlatform> platformMap = new HashMap<>(); for (ArduinoPlatform platform : platforms) { - if (platform.getName().equals(name)) { - if (foundPlatform == null) { - foundPlatform = platform; - } else { - if (platform.isInstalled() - && ArduinoManager.compareVersions(platform.getVersion(), foundPlatform.getVersion()) > 0) { - foundPlatform = platform; - } + if (!installedPlatforms.containsKey(platform.getArchitecture())) { + ArduinoPlatform p = platformMap.get(platform.getName()); + if (p == null || ArduinoManager.compareVersions(platform.getVersion(), p.getVersion()) > 0) { + platformMap.put(platform.getName(), platform); } } } - return foundPlatform; + return platformMap.values(); } public List<ArduinoTool> getTools() { |