#include "utilityGradle.h" #include "DialogView.h" #include "JavaEnvironment.h" #include "JavaEnvironmentFactory.h" #include "SourceGroupSettingsWithClasspath.h" #include "ApplicationSettings.h" #include "logging.h" #include "MessageStatus.h" #include "TextAccess.h" #include "ResourcePaths.h" #include "ScopedFunctor.h" #include "utilityString.h" #include "Application.h" namespace utility { std::vector getRequiredJarNames() { return { L"gradle-tooling-api-4.2.jar", L"java-indexer.jar", L"org.eclipse.core.commands-3.9.200.jar", L"org.eclipse.core.contenttype-3.7.200.jar", L"org.eclipse.core.expressions-3.6.200.jar", L"org.eclipse.core.filesystem-1.7.200.jar", L"org.eclipse.core.jobs-3.10.200.jar", L"org.eclipse.core.resources-3.13.200.jar", L"org.eclipse.core.runtime-3.15.100.jar", L"org.eclipse.equinox.app-1.4.0.jar", L"org.eclipse.equinox.common-3.10.200.jar", L"org.eclipse.equinox.preferences-3.7.200.jar", L"org.eclipse.equinox.registry-3.8.200.jar", L"org.eclipse.jdt.core-3.13.102.jar", L"org.eclipse.osgi-3.13.200.jar", L"org.eclipse.text-3.8.0.jar", L"slf4j-api-1.7.10.jar", L"slf4j-simple-1.7.10.jar" }; } std::string prepareJavaEnvironment() { std::string errorString; if (!JavaEnvironmentFactory::getInstance()) { #ifdef _WIN32 const std::string separator = ";"; #else const std::string separator = ":"; #endif std::string classPath = ""; { const std::vector jarNames = getRequiredJarNames(); for (size_t i = 0; i < jarNames.size(); i++) { if (i != 0) { classPath += separator; } classPath += ResourcePaths::getJavaPath().concatenate(L"lib/" + jarNames[i]).str(); } } JavaEnvironmentFactory::createInstance( classPath, errorString ); } return errorString; } bool prepareJavaEnvironmentAndDisplayOccurringErrors() { const std::wstring errorString = utility::decodeFromUtf8(utility::prepareJavaEnvironment()); if (!errorString.empty()) { LOG_ERROR(errorString); MessageStatus(errorString, true, false).dispatch(); } if (!JavaEnvironmentFactory::getInstance()) { std::wstring dialogMessage = L"Sourcetrail was unable to locate Java on this machine.\n" "Please make sure to provide the correct Java Path in the preferences."; if (!errorString.empty()) { dialogMessage += L"\n\nError: " + errorString; } MessageStatus(dialogMessage, true, false).dispatch(); Application::getInstance()->handleDialog(dialogMessage); return false; } return true; } std::set fetchRootDirectories(const std::set& sourceFilePaths) { std::shared_ptr dialogView = Application::getInstance()->getDialogView(DialogView::UseCase::PROJECT_SETUP); dialogView->showUnknownProgressDialog(L"Preparing Project", L"Gathering Root\nDirectories"); ScopedFunctor dialogHider([&dialogView]() { dialogView->hideUnknownProgressDialog(); }); std::set rootDirectories; std::shared_ptr javaEnvironment = JavaEnvironmentFactory::getInstance()->createEnvironment(); for (const FilePath& filePath : sourceFilePaths) { std::shared_ptr textAccess = TextAccess::createFromFile(filePath); std::string packageName = ""; javaEnvironment->callStaticStringMethod("com/sourcetrail/JavaIndexer", "getPackageName", packageName, textAccess->getText()); if (packageName.empty()) { continue; } FilePath rootPath = filePath.getParentDirectory(); bool success = true; const std::vector packageNameParts = utility::splitToVector(packageName, "."); for (std::vector::const_reverse_iterator it = packageNameParts.rbegin(); it != packageNameParts.rend(); it++) { if (rootPath.fileName() != utility::decodeFromUtf8(*it)) { success = false; break; } rootPath = rootPath.getParentDirectory(); } if (success) { rootDirectories.insert(rootPath); } } return rootDirectories; } std::vector getClassPath(const std::vector& classpathItems, bool useJreSystemLibrary, const std::set& sourceFilePaths) { std::vector classPath; for (const FilePath& classpath : classpathItems) { if (classpath.exists()) { LOG_INFO(L"Adding path to classpath: " + classpath.wstr()); classPath.push_back(classpath); } } if (useJreSystemLibrary) { for (const FilePath& systemLibraryPath : ApplicationSettings::getInstance()->getJreSystemLibraryPathsExpanded()) { LOG_INFO(L"Adding JRE system library path to classpath: " + systemLibraryPath.wstr()); classPath.push_back(systemLibraryPath); } } for (const FilePath& rootDirectory : utility::fetchRootDirectories(sourceFilePaths)) { if (rootDirectory.exists()) { LOG_INFO(L"Adding root directory to classpath: " + rootDirectory.wstr()); classPath.push_back(rootDirectory); } } return classPath; } }