blob: c03ff02737fd486cee2c7d5026a4d8b88cf89337 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 com.android.tools.idea.gradle.customizer.java;
import com.android.tools.idea.gradle.IdeaJavaProject;
import com.android.tools.idea.gradle.customizer.AbstractContentRootModuleCustomizer;
import com.android.tools.idea.gradle.model.java.JavaModuleContentRoot;
import com.google.common.collect.Lists;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.io.File;
import java.util.Collection;
import java.util.List;
import static com.android.tools.idea.gradle.util.FilePaths.findParentContentEntry;
import static com.android.tools.idea.gradle.util.FilePaths.pathToIdeaUrl;
import static com.android.tools.idea.gradle.util.Projects.isGradleProjectModule;
import static com.intellij.openapi.util.io.FileUtil.filesEqual;
import static org.jetbrains.jps.model.java.JavaResourceRootType.RESOURCE;
import static org.jetbrains.jps.model.java.JavaResourceRootType.TEST_RESOURCE;
import static org.jetbrains.jps.model.java.JavaSourceRootType.SOURCE;
import static org.jetbrains.jps.model.java.JavaSourceRootType.TEST_SOURCE;
public class ContentRootModuleCustomizer extends AbstractContentRootModuleCustomizer<IdeaJavaProject> {
@Override
@NotNull
protected Collection<ContentEntry> findOrCreateContentEntries(@NotNull ModifiableRootModel model, @NotNull IdeaJavaProject javaProject) {
List<ContentEntry> allEntries = Lists.newArrayList();
for (JavaModuleContentRoot contentRoot : javaProject.getContentRoots()) {
File rootDirPath = contentRoot.getRootDirPath();
ContentEntry contentEntry = model.addContentEntry(pathToIdeaUrl(rootDirPath));
allEntries.add(contentEntry);
}
return allEntries;
}
@Override
protected void setUpContentEntries(@NotNull ModifiableRootModel ideaModuleModel,
@NotNull Collection<ContentEntry> contentEntries,
@NotNull IdeaJavaProject javaProject,
@NotNull List<RootSourceFolder> orphans) {
boolean isTopLevelJavaModule = isGradleProjectModule(ideaModuleModel.getModule());
File buildFolderPath = javaProject.getBuildFolderPath();
boolean buildFolderUnexcluded = buildFolderPath == null;
for (JavaModuleContentRoot contentRoot : javaProject.getContentRoots()) {
if (contentRoot == null) {
continue;
}
addSourceFolders(contentEntries, contentRoot.getSourceDirPaths(), SOURCE, orphans, false);
addSourceFolders(contentEntries, contentRoot.getGenSourceDirPaths(), SOURCE, orphans, true);
addSourceFolders(contentEntries, contentRoot.getResourceDirPaths(), RESOURCE, orphans, false);
addSourceFolders(contentEntries, contentRoot.getTestDirPaths(), TEST_SOURCE, orphans, false);
addSourceFolders(contentEntries, contentRoot.getGenTestDirPaths(), TEST_SOURCE, orphans, true);
addSourceFolders(contentEntries, contentRoot.getTestResourceDirPaths(), TEST_RESOURCE, orphans, false);
for (File excluded : contentRoot.getExcludeDirPaths()) {
ContentEntry contentEntry = findParentContentEntry(excluded, contentEntries);
if (contentEntry != null) {
if (isTopLevelJavaModule && !buildFolderUnexcluded) {
// We need to "undo" the implicit exclusion of "build" folder for top-level module.
if (filesEqual(excluded, buildFolderPath)) {
buildFolderUnexcluded = true;
continue;
}
}
addExcludedFolder(contentEntry, excluded);
}
}
}
}
private void addSourceFolders(@NotNull Collection<ContentEntry> contentEntries,
@NotNull Collection<File> sourceDirPaths,
@NotNull JpsModuleSourceRootType type,
@NotNull List<RootSourceFolder> orphans,
boolean generated) {
for (File path : sourceDirPaths) {
addSourceFolder(contentEntries, path, type, generated, orphans);
}
}
}