// Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.service.project.metadata;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.Key;
import com.intellij.openapi.externalSystem.model.project.ProjectData;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.twitter.intellij.pants.service.project.PantsResolver;
import com.twitter.intellij.pants.settings.PantsSettings;
import com.twitter.intellij.pants.util.PantsConstants;
import com.twitter.intellij.pants.util.PantsUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.google.gson.Gson;
import java.util.Collection;
import java.util.Collections;
public class PantsMetadataService implements ProjectDataService<TargetMetadata, Module> {
private static final Gson gson = new Gson();
@NotNull
@Override
public Key<TargetMetadata> getTargetDataKey() {
return TargetMetadata.KEY;
}
@Override
public void importData(
@NotNull final Collection<DataNode<TargetMetadata>> toImport,
@Nullable ProjectData projectData,
@NotNull Project project,
@NotNull IdeModifiableModelsProvider modelsProvider
) {
// for existing projects. for new projects PantsSettings.defaultSettings will provide the version.
PantsSettings.getInstance(project).setResolverVersion(PantsResolver.VERSION);
for (DataNode<TargetMetadata> node : toImport) {
final TargetMetadata metadata = node.getData();
final Module module = modelsProvider.findIdeModule(metadata.getModuleName());
if (module != null) {
module.setOption(PantsConstants.PANTS_LIBRARY_EXCLUDES_KEY, PantsUtil.dehydrateTargetAddresses(metadata.getLibraryExcludes()));
module.setOption(PantsConstants.PANTS_TARGET_ADDRESSES_KEY, PantsUtil.dehydrateTargetAddresses(metadata.getTargetAddresses()));
module.setOption(PantsConstants.PANTS_TARGET_ADDRESS_INFOS_KEY, gson.toJson(metadata.getTargetAddressInfoSet()));
}
}
}
@NotNull
@Override
public Computable<Collection<Module>> computeOrphanData(
@NotNull Collection<DataNode<TargetMetadata>> toImport,
@NotNull ProjectData projectData,
@NotNull Project project,
@NotNull IdeModifiableModelsProvider modelsProvider
) {
return new Computable<Collection<Module>>() {
@Override
public Collection<Module> compute() {
return Collections.emptyList();
}
};
}
@Override
public void removeData(
@NotNull Computable<Collection<Module>> toRemove,
@NotNull Collection<DataNode<TargetMetadata>> toIgnore,
@NotNull ProjectData projectData,
@NotNull Project project,
@NotNull IdeModifiableModelsProvider modelsProvider
) {
for (Module module : toRemove.compute()) {
module.clearOption(PantsConstants.PANTS_TARGET_ADDRESSES_KEY);
}
}
}