/* * Copyright (c) 2017 the original author or authors. * 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 org.eclipse.buildship.core.configuration.internal; import java.io.File; import com.google.common.base.Preconditions; import com.gradleware.tooling.toolingclient.GradleDistribution; import org.eclipse.core.resources.IProject; import org.eclipse.buildship.core.CorePlugin; import org.eclipse.buildship.core.GradlePluginsRuntimeException; import org.eclipse.buildship.core.util.gradle.GradleDistributionSerializer; /** * Provides capability to read and save configuration properties on a target project. * * @author Donat Csikos */ final class BuildConfigurationPersistence { private static final String PREF_NODE = CorePlugin.PLUGIN_ID; private static final String PREF_KEY_CONNECTION_PROJECT_DIR = "connection.project.dir"; private static final String PREF_KEY_CONNECTION_GRADLE_DISTRIBUTION = "connection.gradle.distribution"; private static final String PREF_KEY_OVERRIDE_WORKSPACE_SETTINGS = "override.workspace.settings"; private static final String PREF_KEY_BUILD_SCANS_ENABLED = "build.scans.enabled"; private static final String PREF_KEY_OFFLINE_MODE = "offline.mode"; public BuildConfigurationProperties readBuildConfiguratonProperties(IProject project) { Preconditions.checkNotNull(project); PreferenceStore preferences = PreferenceStore.forProjectScope(project, PREF_NODE); return readPreferences(preferences, project.getLocation().toFile()); } public BuildConfigurationProperties readBuildConfiguratonProperties(File projectDir) { Preconditions.checkNotNull(projectDir); PreferenceStore preferences = PreferenceStore.forPreferenceFile(getProjectPrefsFile(projectDir, PREF_NODE)); return readPreferences(preferences, projectDir); } public void saveBuildConfiguration(IProject project, BuildConfigurationProperties properties) { Preconditions.checkNotNull(project); Preconditions.checkNotNull(properties); PreferenceStore preferences = PreferenceStore.forProjectScope(project, PREF_NODE); savePreferences(properties, preferences); } public void saveBuildConfiguration(File projectDir, BuildConfigurationProperties properties) { Preconditions.checkNotNull(projectDir); Preconditions.checkNotNull(properties); PreferenceStore preferences = PreferenceStore.forPreferenceFile(getProjectPrefsFile(projectDir, PREF_NODE)); savePreferences(properties, preferences); } public String readPathToRoot(IProject project) { Preconditions.checkNotNull(project); PreferenceStore preferences = PreferenceStore.forProjectScope(project, PREF_NODE); String result = preferences.readString(PREF_KEY_CONNECTION_PROJECT_DIR, null); if (result == null) { throw new GradlePluginsRuntimeException("Can't read root project location for project " + project.getName()); } return result; } public String readPathToRoot(File projectDir) { Preconditions.checkNotNull(projectDir); PreferenceStore preferences = PreferenceStore.forPreferenceFile(getProjectPrefsFile(projectDir, PREF_NODE)); String result = preferences.readString(PREF_KEY_CONNECTION_PROJECT_DIR, null); if (result == null) { throw new GradlePluginsRuntimeException("Can't read root project location for project located at " + projectDir.getAbsolutePath()); } return result; } public void savePathToRoot(IProject project, String pathToRoot) { Preconditions.checkNotNull(project); Preconditions.checkNotNull(pathToRoot); PreferenceStore preferences = PreferenceStore.forProjectScope(project, PREF_NODE); saveRootDirPreference(pathToRoot, preferences); } public void savePathToRoot(File projectDir, String pathToRoot) { Preconditions.checkNotNull(projectDir); Preconditions.checkNotNull(pathToRoot); PreferenceStore preferences = PreferenceStore.forPreferenceFile(getProjectPrefsFile(projectDir, PREF_NODE)); saveRootDirPreference(pathToRoot, preferences); } public void deletePathToRoot(IProject project) { Preconditions.checkNotNull(project); PreferenceStore preferences = PreferenceStore.forProjectScope(project, PREF_NODE); deleteRootDirPreference(preferences); } public void deletePathToRoot(File projectDir) { Preconditions.checkNotNull(projectDir); PreferenceStore preferences = PreferenceStore.forPreferenceFile(getProjectPrefsFile(projectDir, PREF_NODE)); deleteRootDirPreference(preferences); } private static BuildConfigurationProperties readPreferences(PreferenceStore preferences, File rootDir) { String distribution = preferences.readString(PREF_KEY_CONNECTION_GRADLE_DISTRIBUTION, null); if (distribution == null) { throw new GradlePluginsRuntimeException("Invalid build configuration for project located at " + rootDir.getAbsolutePath()); } boolean overrideWorkspaceSettings = preferences.readBoolean(PREF_KEY_OVERRIDE_WORKSPACE_SETTINGS, false); boolean buildScansEnabled = preferences.readBoolean(PREF_KEY_BUILD_SCANS_ENABLED, false); boolean offlineMode = preferences.readBoolean(PREF_KEY_OFFLINE_MODE, false); GradleDistribution gradleDistribution = GradleDistributionSerializer.INSTANCE.deserializeFromString(distribution); return new BuildConfigurationProperties(rootDir, gradleDistribution, overrideWorkspaceSettings, buildScansEnabled, offlineMode); } private static void savePreferences(BuildConfigurationProperties properties, PreferenceStore preferences) { String gradleDistribution = GradleDistributionSerializer.INSTANCE.serializeToString(properties.getGradleDistribution()); preferences.write(PREF_KEY_CONNECTION_GRADLE_DISTRIBUTION, gradleDistribution); if (properties.isOverrideWorkspaceSettings()) { preferences.writeBoolean(PREF_KEY_OVERRIDE_WORKSPACE_SETTINGS, properties.isOverrideWorkspaceSettings()); preferences.writeBoolean(PREF_KEY_BUILD_SCANS_ENABLED, properties.isBuildScansEnabled()); preferences.writeBoolean(PREF_KEY_OFFLINE_MODE, properties.isOfflineMode()); } else { preferences.delete(PREF_KEY_OVERRIDE_WORKSPACE_SETTINGS); preferences.delete(PREF_KEY_BUILD_SCANS_ENABLED); preferences.delete(PREF_KEY_OFFLINE_MODE); } preferences.flush(); } private static File getProjectPrefsFile(File projectDir, String node) { return new File(projectDir, ".settings/" + node + ".prefs"); } private void saveRootDirPreference(String pathToRoot, PreferenceStore preferences) { preferences.write(PREF_KEY_CONNECTION_PROJECT_DIR, pathToRoot); preferences.flush(); } private void deleteRootDirPreference(PreferenceStore preferences) { preferences.delete(PREF_KEY_CONNECTION_PROJECT_DIR); preferences.flush(); } }