// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md). // Licensed under the Apache License, Version 2.0 (see LICENSE). package com.twitter.intellij.pants.settings; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.components.StorageScheme; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.xmlb.annotations.AbstractCollection; import com.twitter.intellij.pants.service.project.PantsResolver; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Objects; import java.util.Set; @State( name = "PantsSettings", storages = { @Storage(file = StoragePathMacros.PROJECT_FILE), @Storage(file = StoragePathMacros.PROJECT_CONFIG_DIR + "/pants.xml", scheme = StorageScheme.DIRECTORY_BASED) } ) public class PantsSettings extends AbstractExternalSystemSettings<PantsSettings, PantsProjectSettings, PantsSettingsListener> implements PersistentStateComponent<PantsSettings.MyState> { protected boolean myUseIdeaProjectJdk = false; protected boolean myUsePantsMakeBeforeRun = true; protected int myResolverVersion = 0; public PantsSettings(@NotNull Project project) { super(PantsSettingsListener.TOPIC, project); } @NotNull public static PantsSettings defaultSettings() { final PantsSettings pantsSettings = new PantsSettings(ProjectManager.getInstance().getDefaultProject()); pantsSettings.setResolverVersion(PantsResolver.VERSION); return pantsSettings; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } PantsSettings other = (PantsSettings) obj; return Objects.equals(myUseIdeaProjectJdk, other.myUseIdeaProjectJdk) && Objects.equals(myUsePantsMakeBeforeRun, other.myUsePantsMakeBeforeRun) && Objects.equals(myResolverVersion, other.myResolverVersion); } public static PantsSettings copy(PantsSettings pantsSettings) { PantsSettings settings = defaultSettings(); settings.copyFrom(pantsSettings); return settings; } public static PantsSettings getSystemLevelSettings() { return getInstance(ProjectManager.getInstance().getDefaultProject()); } public void setUseIdeaProjectJdk(boolean useIdeaProjectJdk) { myUseIdeaProjectJdk = useIdeaProjectJdk; } public boolean isUseIdeaProjectJdk() { return myUseIdeaProjectJdk; } public boolean isEnableIncrementalImport() { return getLinkedProjectsSettings().stream().anyMatch(PantsProjectSettings::isEnableIncrementalImport); } public void setEnableIncrementalImport(boolean enableIncrementalImport) { getLinkedProjectsSettings().forEach(s -> s.setEnableIncrementalImport(enableIncrementalImport)); } public int getResolverVersion() { return myResolverVersion; } public void setResolverVersion(int resolverVersion) { myResolverVersion = resolverVersion; } @NotNull public static PantsSettings getInstance(@NotNull Project project) { return ServiceManager.getService(project, PantsSettings.class); } @Override public void subscribe(@NotNull ExternalSystemSettingsListener<PantsProjectSettings> listener) { } @Override protected void copyExtraSettingsFrom(@NotNull PantsSettings settings) { setResolverVersion(settings.getResolverVersion()); setUseIdeaProjectJdk(settings.isUseIdeaProjectJdk()); } @Override protected void checkSettings(@NotNull PantsProjectSettings old, @NotNull PantsProjectSettings current) { } @SuppressWarnings("unchecked") @Nullable @Override public MyState getState() { final MyState state = new MyState(); state.setResolverVersion(getResolverVersion()); state.setUseIdeaProjectJdk(isUseIdeaProjectJdk()); fillState(state); return state; } @Override public void loadState(MyState state) { super.loadState(state); setResolverVersion(state.getResolverVersion()); setUseIdeaProjectJdk(state.isUseIdeaProjectJdk()); } public static class MyState implements State<PantsProjectSettings> { Set<PantsProjectSettings> myLinkedExternalProjectsSettings = ContainerUtilRt.newTreeSet(); boolean myUseIdeaProjectJdk = false; int myResolverVersion = 0; @AbstractCollection(surroundWithTag = false, elementTypes = {PantsProjectSettings.class}) public Set<PantsProjectSettings> getLinkedExternalProjectsSettings() { return myLinkedExternalProjectsSettings; } public void setUseIdeaProjectJdk(boolean useIdeaProjectJdk) { myUseIdeaProjectJdk = useIdeaProjectJdk; } public boolean isUseIdeaProjectJdk() { return myUseIdeaProjectJdk; } public void setLinkedExternalProjectsSettings(Set<PantsProjectSettings> settings) { myLinkedExternalProjectsSettings = settings; } public int getResolverVersion() { return myResolverVersion; } public void setResolverVersion(int resolverVersion) { myResolverVersion = resolverVersion; } } }