/* * 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.hyperlink.detectors; import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.rf.ide.core.project.ImportPath; import org.rf.ide.core.project.ImportSearchPaths; import org.rf.ide.core.project.ImportSearchPaths.PathsProvider; import org.rf.ide.core.project.ResolvedImportPath; import org.rf.ide.core.project.ResolvedImportPath.MalformedPathImportException; import org.rf.ide.core.testdata.model.RobotExpressions; import org.robotframework.ide.eclipse.main.plugin.RedWorkspace; import org.robotframework.ide.eclipse.main.plugin.hyperlink.FileHyperlink; import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile; import com.google.common.base.Function; abstract class HyperlinksToFilesDetector { protected final List<IHyperlink> detectHyperlinks(final RobotSuiteFile suiteFile, final IRegion fromRegion, final String pathAsString, final boolean isLibraryImport) { final List<IHyperlink> hyperlinks = new ArrayList<>(); final String normalizedPath = RobotExpressions.unescapeSpaces(pathAsString); if (isLibraryImport && !isPath(normalizedPath)) { return hyperlinks; } final Optional<URI> absoluteUri = createAbsoluteUri(suiteFile, normalizedPath); if (!absoluteUri.isPresent()) { return hyperlinks; } final Optional<IHyperlink> hyperlink = createLink(suiteFile, fromRegion, absoluteUri.get()); if (hyperlink.isPresent()) { hyperlinks.add(hyperlink.get()); } return hyperlinks; } private Optional<URI> createAbsoluteUri(final RobotSuiteFile suiteFile, final String path) { final Map<String, String> variablesMapping = suiteFile.getProject() .getRobotProjectHolder() .getVariableMappings(); try { final Optional<ResolvedImportPath> resolvedPath = ResolvedImportPath.from(ImportPath.from(path), variablesMapping); if (!resolvedPath.isPresent()) { return Optional.empty(); } final PathsProvider pathsProvider = suiteFile.getProject().createPathsProvider(); final ImportSearchPaths searchPaths = new ImportSearchPaths(pathsProvider); return searchPaths.findAbsoluteUri(suiteFile.getFile().getLocationURI(), resolvedPath.get()); } catch (final MalformedPathImportException e) { return Optional.empty(); } } private Optional<IHyperlink> createLink(final RobotSuiteFile suiteFile, final IRegion fromRegion, final URI path) { final IWorkspaceRoot wsRoot = suiteFile.getFile().getWorkspace().getRoot(); final IResource resource = new RedWorkspace(wsRoot).forUri(path); return resource != null ? createHyperlink(fromRegion, resource) : Optional.<IHyperlink> empty(); } private Optional<IHyperlink> createHyperlink(final IRegion fromRegion, final IResource destination) { if (destination != null && destination.exists() && destination.getType() == IResource.FILE) { return Optional.<IHyperlink> of( new FileHyperlink(fromRegion, (IFile) destination, "Open File", performAfterOpening())); } return Optional.empty(); } protected abstract Function<IFile, Void> performAfterOpening(); private boolean isPath(final String pathAsString) { return pathAsString.endsWith("/") || pathAsString.endsWith(".py") || pathAsString.endsWith(".class") || pathAsString.endsWith(".java"); } }