blob: 72c3ddbe346a7414aec8a25036d14229488b4799 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.gradle.tooling.v1_9.builder;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.plugins.ide.idea.IdeaPlugin;
import org.gradle.plugins.ide.idea.model.IdeaModel;
import org.gradle.plugins.ide.internal.IdeDependenciesExtractor;
import org.gradle.tooling.model.idea.IdeaDependency;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.gradle.model.GradleDependencyScope;
import org.jetbrains.plugins.gradle.model.ProjectDependenciesModel;
import org.jetbrains.plugins.gradle.tooling.ModelBuilderService;
import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions;
import org.jetbrains.plugins.gradle.tooling.internal.*;
import org.jetbrains.plugins.gradle.tooling.v1_9.internal.InternalDependencyVersionId;
import org.jetbrains.plugins.gradle.tooling.v1_9.internal.ModelDependenciesBuilderImplHelper;
import java.util.*;
/**
* @author Vladislav.Soroka
* @since 11/5/13
*/
@TargetVersions("1.8 <=> 1.10")
public class ModelDependenciesBuilderImpl implements ModelBuilderService {
@Override
public boolean canBuild(String modelName) {
return ProjectDependenciesModel.class.getName().equals(modelName);
}
@Nullable
@Override
public Object buildAll(final String modelName, final Project project) {
final List<IdeaDependency> dependencies = new ArrayList<IdeaDependency>();
final Map<InternalDependencyVersionId, Scopes> scopesMap = new LinkedHashMap<InternalDependencyVersionId, Scopes>();
final IdeDependenciesExtractor dependenciesExtractor = new IdeDependenciesExtractor();
boolean offline = false;
boolean downloadJavadoc = false;
boolean downloadSources = true;
final IdeaPlugin ideaPlugin = project.getPlugins().getPlugin(IdeaPlugin.class);
Map<String, Map<String, Collection<Configuration>>> userScopes = Collections.emptyMap();
if (ideaPlugin != null) {
IdeaModel ideaModel = ideaPlugin.getModel();
if (ideaModel != null && ideaModel.getModule() != null) {
offline = ideaModel.getModule().isOffline();
downloadJavadoc = ideaModel.getModule().isDownloadJavadoc();
downloadSources = ideaModel.getModule().isDownloadSources();
userScopes = ideaModel.getModule().getScopes();
}
}
for (final Configuration configuration : project.getConfigurations()) {
Collection<Configuration> plusConfigurations = new ArrayList<Configuration>();
plusConfigurations.add(configuration);
final List<IdeDependenciesExtractor.IdeProjectDependency> ideProjectDependencies =
dependenciesExtractor.extractProjectDependencies(plusConfigurations, new ArrayList<Configuration>());
for (IdeDependenciesExtractor.IdeProjectDependency ideProjectDependency : ideProjectDependencies) {
ModelDependenciesBuilderImplHelper.merge(scopesMap, ideProjectDependency, userScopes);
}
if (!offline) {
final Collection<IdeDependenciesExtractor.IdeRepoFileDependency> ideRepoFileDependencies =
dependenciesExtractor.extractRepoFileDependencies(
project.getConfigurations(), plusConfigurations, new ArrayList<Configuration>(), downloadSources, downloadJavadoc);
for (IdeDependenciesExtractor.IdeRepoFileDependency repoFileDependency : ideRepoFileDependencies) {
ModelDependenciesBuilderImplHelper.merge(scopesMap, repoFileDependency, userScopes);
}
}
final List<IdeDependenciesExtractor.IdeLocalFileDependency> ideLocalFileDependencies =
dependenciesExtractor.extractLocalFileDependencies(plusConfigurations, new ArrayList<Configuration>());
for (IdeDependenciesExtractor.IdeLocalFileDependency fileDependency : ideLocalFileDependencies) {
ModelDependenciesBuilderImplHelper.merge(scopesMap, fileDependency, userScopes);
}
}
for (Map.Entry<InternalDependencyVersionId, Scopes> entry : scopesMap.entrySet()) {
InternalDependencyVersionId versionId = entry.getKey();
for (GradleDependencyScope scope : entry.getValue().getScopes()) {
if (versionId.getIdeDependency() instanceof IdeDependenciesExtractor.IdeRepoFileDependency) {
IdeDependenciesExtractor.IdeRepoFileDependency repoFileDependency =
(IdeDependenciesExtractor.IdeRepoFileDependency)versionId.getIdeDependency();
IdeaSingleEntryLibraryDependencyImpl libraryDependency = new IdeaSingleEntryLibraryDependencyImpl(
new IdeaDependencyScopeImpl(scope),
versionId.getName(),
versionId.getGroup(),
versionId.getVersion(),
versionId.getClassifier()
);
libraryDependency.setFile(repoFileDependency.getFile());
libraryDependency.setSource(repoFileDependency.getSourceFile());
libraryDependency.setJavadoc(repoFileDependency.getJavadocFile());
dependencies.add(libraryDependency);
}
else if (versionId.getIdeDependency() instanceof IdeDependenciesExtractor.IdeProjectDependency) {
IdeDependenciesExtractor.IdeProjectDependency projectDependency =
(IdeDependenciesExtractor.IdeProjectDependency)versionId.getIdeDependency();
String ideaModuleName = ModelDependenciesBuilderImplHelper.findDeDuplicatedModuleName(projectDependency.getProject());
if (ideaModuleName == null) {
ideaModuleName = versionId.getName();
}
IdeaModuleDependencyImpl moduleDependency = new IdeaModuleDependencyImpl(
new IdeaDependencyScopeImpl(scope),
ideaModuleName,
versionId.getGroup(),
versionId.getVersion(),
versionId.getClassifier()
);
moduleDependency.setIdeaModule(new StubIdeaModule(ideaModuleName));
dependencies.add(moduleDependency);
}
else if (versionId.getIdeDependency() instanceof IdeDependenciesExtractor.IdeLocalFileDependency) {
IdeDependenciesExtractor.IdeLocalFileDependency fileDependency =
(IdeDependenciesExtractor.IdeLocalFileDependency)versionId.getIdeDependency();
IdeaSingleEntryLibraryDependencyImpl libraryDependency = new IdeaSingleEntryLibraryDependencyImpl(
new IdeaDependencyScopeImpl(scope),
versionId.getName(),
versionId.getGroup(),
versionId.getVersion(),
versionId.getClassifier()
);
libraryDependency.setFile(fileDependency.getFile());
ModelDependenciesBuilderImplHelper.attachGradleSdkSources(libraryDependency, fileDependency);
dependencies.add(libraryDependency);
}
}
}
return new ProjectDependenciesModelImpl(project.getPath(), dependencies);
}
}