/*******************************************************************************
* Copyright (c) 2015 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package io.sloeber.core.managers;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import io.sloeber.core.Activator;
import io.sloeber.core.common.Common;
import io.sloeber.core.common.ConfigurationPreferences;
import io.sloeber.core.common.Const;
public class ArduinoPlatform {
private String name;
private String architecture;
private String version;
private String category;
private String url;
private String archiveFileName;
private String checksum;
private String size;
private List<Board> boards;
private List<ToolDependency> toolsDependencies;
private Package pkg;
private HierarchicalProperties boardsFile;
private Properties platformProperties;
void setOwner(Package pkg) {
this.pkg = pkg;
for (Board board : this.boards) {
board.setOwners(this);
}
if (this.toolsDependencies != null) {
for (ToolDependency toolDep : this.toolsDependencies) {
toolDep.setOwner(this);
}
}
}
public Package getPackage() {
return this.pkg;
}
public String getName() {
return this.name;
}
public String getArchitecture() {
return this.architecture;
}
public String getVersion() {
return this.version;
}
public String getCategory() {
return this.category;
}
public String getUrl() {
return this.url;
}
public String getArchiveFileName() {
return this.archiveFileName;
}
public String getChecksum() {
return this.checksum;
}
public String getSize() {
return this.size;
}
public List<Board> getBoards() {
if (isInstalled() && this.boardsFile == null) {
Properties boardProps = new Properties();
try (Reader reader = new FileReader(getBoardsFile())) {
boardProps.load(reader);
} catch (IOException e) {
Common.log(new Status(IStatus.ERROR, Activator.getId(), Messages.Platform_loading_boards, e));
return this.boards;
}
this.boardsFile = new HierarchicalProperties(boardProps);
// Replace the boards with a real ones
this.boards = new ArrayList<>();
for (Map.Entry<String, HierarchicalProperties> entry : this.boardsFile.getChildren().entrySet()) {
if (entry.getValue().getChild("name") != null) { //$NON-NLS-1$
// assume things with names are boards
this.boards.add(new Board(entry.getKey(), entry.getValue()).setOwners(this));
}
}
}
return this.boards;
}
public Board getBoard(String boardName) {
for (Board board : getBoards()) {
if (boardName.equals(board.getName())) {
return board;
}
}
return null;
}
public List<ToolDependency> getToolsDependencies() {
return this.toolsDependencies;
}
public Tool getTool(String toolName) {
for (ToolDependency toolDep : this.toolsDependencies) {
if (toolDep.getName().equals(toolName)) {
return toolDep.getTool();
}
}
return null;
}
public Properties getPlatformProperties() throws CoreException {
if (this.platformProperties == null) {
this.platformProperties = new Properties();
try (BufferedReader reader = new BufferedReader(new FileReader(getPlatformFile()))) {
// There are regex's here and need to preserve the \'s
StringBuilder builder = new StringBuilder();
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
builder.append(line.replace("\\", "\\\\")); //$NON-NLS-1$ //$NON-NLS-2$
builder.append('\n');
}
try (Reader reader1 = new StringReader(builder.toString())) {
this.platformProperties.load(reader1);
}
} catch (IOException e) {
throw new CoreException(
new Status(IStatus.ERROR, Activator.getId(), Messages.Platform_loading_platform, e));
}
}
return this.platformProperties;
}
public boolean isInstalled() {
return getBoardsFile().exists();
}
public File getBoardsFile() {
return getInstallPath().resolve(Const.BOARDS_FILE_NAME).toFile();
}
public File getPlatformFile() {
return getInstallPath().resolve(Const.PLATFORM_FILE_NAME).toFile();
}
public Path getInstallPath() {
String stPath = ConfigurationPreferences.getInstallationPath().append(Const.PACKAGES_FOLDER_NAME)
.append(this.pkg.getName()).append(Const.ARDUINO_HARDWARE_FOLDER_NAME).append(this.architecture)
.append(this.version).toString();
return Paths.get(stPath);
}
public List<Path> getIncludePath() {
Path installPath = getInstallPath();
return Arrays.asList(installPath.resolve("cores/{build.core}"), //$NON-NLS-1$
installPath.resolve(Const.VARIANTS_FOLDER_NAME + "/{build.variant}")); //$NON-NLS-1$
}
public IStatus remove(IProgressMonitor monitor) {
// Check if we're installed
if (!isInstalled()) {
return Status.OK_STATUS;
}
try {
FileUtils.deleteDirectory(getInstallPath().toFile());
} catch (IOException e) {
return new Status(IStatus.ERROR, Activator.getId(), "Failed to remove folder" + getInstallPath().toString(), //$NON-NLS-1$
e);
}
return Status.OK_STATUS;
}
public IStatus install(IProgressMonitor monitor) {
// Check if we're installed already
if (isInstalled()) {
return Status.OK_STATUS;
}
// Download platform archive
return Manager.downloadAndInstall(this, false, monitor);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((this.name == null) ? 0 : this.name.hashCode());
result = prime * result + ((this.pkg == null) ? 0 : this.pkg.hashCode());
result = prime * result + ((this.version == null) ? 0 : this.version.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ArduinoPlatform other = (ArduinoPlatform) obj;
if (this.name == null) {
if (other.name != null)
return false;
} else if (!this.name.equals(other.name))
return false;
if (this.pkg == null) {
if (other.pkg != null)
return false;
} else if (!this.pkg.equals(other.pkg))
return false;
if (this.version == null) {
if (other.version != null)
return false;
} else if (!this.version.equals(other.version))
return false;
return true;
}
public List<String> getBoardNames() {
List<String> ret = new ArrayList<>();
for (Board curBoar : this.boards) {
ret.add(curBoar.getName());
}
return ret;
}
}