/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.assist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import org.eclipse.core.resources.IFile;
import org.rf.ide.core.executor.RedSystemProperties;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSetting.SettingsGroup;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import com.google.common.base.Supplier;
public abstract class RedFileLocationProposals {
private final RobotSuiteFile suiteFile;
private final Supplier<List<IFile>> filesSupplier;
private final ProposalMatcher matcher;
protected RedFileLocationProposals(final RobotSuiteFile suiteFile, final Supplier<List<IFile>> filesSupplier,
final ProposalMatcher matcher) {
this.suiteFile = suiteFile;
this.filesSupplier = filesSupplier;
this.matcher = matcher;
}
public static RedFileLocationProposals create(final SettingsGroup importType, final RobotSuiteFile suiteFile) {
return create(importType, suiteFile, ProposalMatchers.pathsMatcher());
}
public static RedFileLocationProposals create(final SettingsGroup importType, final RobotSuiteFile suiteFile,
final ProposalMatcher matcher) {
switch (importType) {
case RESOURCES:
return new RedResourceFileLocationsProposals(suiteFile, matcher);
case VARIABLES:
return new RedPythonFileLocationsProposals(suiteFile, matcher);
default:
throw new IllegalStateException("Unknown value: " + importType);
}
}
public List<? extends AssistProposal> getFilesLocationsProposals(final String userContent) {
final String projectFolderName = suiteFile.getProject().getProject().getFullPath().segment(0);
return getFilesLocationsProposals(userContent, ImportedFiles.createComparator(projectFolderName));
}
public List<? extends AssistProposal> getFilesLocationsProposals(final String userContent,
final Comparator<IFile> comparator) {
final List<RedFileLocationProposal> proposals = new ArrayList<>();
final List<IFile> files = filesSupplier.get();
Collections.sort(files, comparator);
for (final IFile varFile : files) {
final IFile fromFile = suiteFile.getFile();
final String content;
if (RedSystemProperties.isWindowsPlatform()
&& !fromFile.getLocation().getDevice().equals(varFile.getLocation().getDevice())) {
content = varFile.getLocation().toString();
} else {
content = createCurrentFileRelativePath(fromFile, varFile);
}
final Optional<ProposalMatch> match = matcher.matches(userContent, content);
if (match.isPresent()) {
proposals.add(AssistProposals.createFileLocationProposal(content, varFile, match.get()));
}
}
return proposals;
}
private static String createCurrentFileRelativePath(final IFile from, final IFile to) {
return to.getLocation().makeRelativeTo(from.getLocation()).removeFirstSegments(1).toString();
}
private static class RedPythonFileLocationsProposals extends RedFileLocationProposals {
private RedPythonFileLocationsProposals(final RobotSuiteFile suiteFile, final ProposalMatcher matcher) {
super(suiteFile, new Supplier<List<IFile>>() {
@Override
public List<IFile> get() {
return ImportedFiles.getPythonFiles();
}
}, matcher);
}
}
private static class RedResourceFileLocationsProposals extends RedFileLocationProposals {
private RedResourceFileLocationsProposals(final RobotSuiteFile suiteFile, final ProposalMatcher matcher) {
super(suiteFile, new Supplier<List<IFile>>() {
@Override
public List<IFile> get() {
return ImportedFiles.getResourceFiles(suiteFile.getFile());
}
}, matcher);
}
}
}