/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.testdata.importer;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.rf.ide.core.project.ImportSearchPaths.PathsProvider;
import org.rf.ide.core.testdata.RobotParser;
import org.rf.ide.core.testdata.model.RobotFileOutput;
import org.rf.ide.core.testdata.model.RobotFileOutput.BuildMessage;
import org.rf.ide.core.testdata.model.RobotProjectHolder;
import org.rf.ide.core.testdata.model.table.SettingTable;
import org.rf.ide.core.testdata.model.table.setting.AImported;
import org.rf.ide.core.testdata.model.table.setting.AImported.Type;
import org.rf.ide.core.testdata.model.table.setting.ResourceImport;
public class ResourceImporter {
private final RobotParser parser;
private final AbsoluteUriFinder uriFinder;
public ResourceImporter(final RobotParser parser) {
this.parser = parser;
this.uriFinder = new AbsoluteUriFinder();
}
public List<ResourceImportReference> importResources(final PathsProvider pathsProvider,
final RobotProjectHolder robotProject, final RobotFileOutput robotFile) {
final SettingTable settingTable = robotFile.getFileModel().getSettingTable();
if (!settingTable.isPresent()) {
return new ArrayList<>();
}
final File importingFile = robotFile.getProcessedFile().getAbsoluteFile();
final Map<String, String> variableMappings = robotProject.getVariableMappings();
final List<ResourceImportReference> importedReferences = new ArrayList<>();
for (final AImported imported : settingTable.getImports()) {
try {
final Optional<ResourceImportReference> importRef = createImportReference(imported, importingFile,
pathsProvider, variableMappings);
if (importRef.isPresent()) {
importedReferences.add(importRef.get());
}
} catch (final UnableToImportException e) {
robotFile.addBuildMessage(e.buildMessage);
}
}
robotFile.addResourceReferences(importedReferences);
return importedReferences;
}
private Optional<ResourceImportReference> createImportReference(final AImported imported, final File importingFile,
final PathsProvider pathsProvider, final Map<String, String> variableMappings) {
if (imported.getType() == Type.RESOURCE) {
final String path = imported.getPathOrName().getRaw();
URI importUri = null;
try {
final Optional<URI> foundUri = uriFinder.find(pathsProvider, variableMappings, importingFile, path);
if (foundUri.isPresent()) {
importUri = foundUri.get();
} else {
throw new UnableToImportException(BuildMessage
.createErrorMessage("Couldn't import resource file " + path, "" + importingFile));
}
} catch (final Exception e) {
throw new UnableToImportException(BuildMessage.createErrorMessage(
"Problem with importing resource file " + importingFile + " with error stack: " + e,
"" + importingFile));
}
final File toImport = new File(importUri);
final List<RobotFileOutput> parsed = parser.parse(toImport);
if (parsed.isEmpty()) {
throw new UnableToImportException(
BuildMessage.createErrorMessage("Couldn't import resource file.", toImport.getAbsolutePath()));
} else {
return Optional.of(new ResourceImportReference((ResourceImport) imported, parsed.get(0)));
}
}
return Optional.empty();
}
public void importDebugResource(final RobotFileOutput robotFile, final File toImport) {
final List<RobotFileOutput> parsedFiles = parser.parse(toImport);
if (parsedFiles.isEmpty()) {
robotFile.addBuildMessage(
BuildMessage.createErrorMessage("Couldn't import resource file.", toImport.getAbsolutePath()));
} else {
final ResourceImportReference resourceReference = new ResourceImportReference(null, parsedFiles.get(0));
final int position = robotFile.findResourceReferencePositionToReplace(resourceReference);
if (position < 0) {
robotFile.addResourceReference(resourceReference);
}
}
}
private class UnableToImportException extends RuntimeException {
private static final long serialVersionUID = 1L;
private final BuildMessage buildMessage;
public UnableToImportException(final BuildMessage buildMessage) {
this.buildMessage = buildMessage;
}
}
}