blob: 106cb60160282e0e391ff5ca167a0bf8f1d91f0a [file] [log] [blame]
/*
* Copyright 2000-2012 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 com.intellij.openapi.roots.impl;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
import java.util.*;
/**
* @author nik
*/
public abstract class RootModelBase implements ModuleRootModel {
@Override
@NotNull
public VirtualFile[] getContentRoots() {
final ArrayList<VirtualFile> result = new ArrayList<VirtualFile>();
for (ContentEntry contentEntry : getContent()) {
final VirtualFile file = contentEntry.getFile();
if (file != null) {
result.add(file);
}
}
return VfsUtilCore.toVirtualFileArray(result);
}
@Override
@NotNull
public String[] getContentRootUrls() {
if (getContent().isEmpty()) return ArrayUtil.EMPTY_STRING_ARRAY;
final ArrayList<String> result = new ArrayList<String>(getContent().size());
for (ContentEntry contentEntry : getContent()) {
result.add(contentEntry.getUrl());
}
return ArrayUtil.toStringArray(result);
}
@Override
@NotNull
public String[] getExcludeRootUrls() {
final List<String> result = new SmartList<String>();
for (ContentEntry contentEntry : getContent()) {
result.addAll(contentEntry.getExcludeFolderUrls());
}
return ArrayUtil.toStringArray(result);
}
@Override
@NotNull
public VirtualFile[] getExcludeRoots() {
final List<VirtualFile> result = new SmartList<VirtualFile>();
for (ContentEntry contentEntry : getContent()) {
Collections.addAll(result, contentEntry.getExcludeFolderFiles());
}
return VfsUtilCore.toVirtualFileArray(result);
}
@Override
@NotNull
public String[] getSourceRootUrls() {
return getSourceRootUrls(true);
}
@Override
@NotNull
public String[] getSourceRootUrls(boolean includingTests) {
List<String> result = new SmartList<String>();
for (ContentEntry contentEntry : getContent()) {
final SourceFolder[] sourceFolders = contentEntry.getSourceFolders();
for (SourceFolder sourceFolder : sourceFolders) {
if (includingTests || !sourceFolder.isTestSource()) {
result.add(sourceFolder.getUrl());
}
}
}
return ArrayUtil.toStringArray(result);
}
@Override
@NotNull
public VirtualFile[] getSourceRoots() {
return getSourceRoots(true);
}
@Override
@NotNull
public VirtualFile[] getSourceRoots(final boolean includingTests) {
List<VirtualFile> result = new SmartList<VirtualFile>();
for (ContentEntry contentEntry : getContent()) {
final SourceFolder[] sourceFolders = contentEntry.getSourceFolders();
for (SourceFolder sourceFolder : sourceFolders) {
final VirtualFile file = sourceFolder.getFile();
if (file != null && (includingTests || !sourceFolder.isTestSource())) {
result.add(file);
}
}
}
return VfsUtilCore.toVirtualFileArray(result);
}
@NotNull
@Override
public List<VirtualFile> getSourceRoots(@NotNull JpsModuleSourceRootType<?> rootType) {
return getSourceRoots(Collections.singleton(rootType));
}
@NotNull
@Override
public List<VirtualFile> getSourceRoots(@NotNull Set<? extends JpsModuleSourceRootType<?>> rootTypes) {
List<VirtualFile> result = new SmartList<VirtualFile>();
for (ContentEntry contentEntry : getContent()) {
final List<SourceFolder> sourceFolders = contentEntry.getSourceFolders(rootTypes);
for (SourceFolder sourceFolder : sourceFolders) {
final VirtualFile file = sourceFolder.getFile();
if (file != null) {
result.add(file);
}
}
}
return result;
}
@NotNull
@Override
public ContentEntry[] getContentEntries() {
final Collection<ContentEntry> content = getContent();
return content.toArray(new ContentEntry[content.size()]);
}
protected abstract Collection<ContentEntry> getContent();
@Override
public Sdk getSdk() {
for (OrderEntry orderEntry : getOrderEntries()) {
if (orderEntry instanceof JdkOrderEntry) {
return ((JdkOrderEntry)orderEntry).getJdk();
}
}
return null;
}
@Override
public boolean isSdkInherited() {
for (OrderEntry orderEntry : getOrderEntries()) {
if (orderEntry instanceof InheritedJdkOrderEntry) {
return true;
}
}
return false;
}
@NotNull
@Override
public OrderEnumerator orderEntries() {
return new ModuleOrderEnumerator(this, null);
}
@Override
public <R> R processOrder(RootPolicy<R> policy, R initialValue) {
R result = initialValue;
for (OrderEntry orderEntry : getOrderEntries()) {
result = orderEntry.accept(policy, result);
}
return result;
}
@Override
@NotNull
public String[] getDependencyModuleNames() {
List<String> result = orderEntries().withoutSdk().withoutLibraries().withoutModuleSourceEntries()
.process(new CollectDependentModules(), new ArrayList<String>());
return ArrayUtil.toStringArray(result);
}
@Override
@NotNull
public Module[] getModuleDependencies() {
return getModuleDependencies(true);
}
@Override
@NotNull
public Module[] getModuleDependencies(boolean includeTests) {
final List<Module> result = new ArrayList<Module>();
for (OrderEntry entry : getOrderEntries()) {
if (entry instanceof ModuleOrderEntry) {
ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry;
final DependencyScope scope = moduleOrderEntry.getScope();
if (!includeTests && !scope.isForProductionCompile() && !scope.isForProductionRuntime()) {
continue;
}
final Module module1 = moduleOrderEntry.getModule();
if (module1 != null) {
result.add(module1);
}
}
}
return result.isEmpty() ? Module.EMPTY_ARRAY : ContainerUtil.toArray(result, new Module[result.size()]);
}
private static class CollectDependentModules extends RootPolicy<List<String>> {
@NotNull
@Override
public List<String> visitModuleOrderEntry(@NotNull ModuleOrderEntry moduleOrderEntry, @NotNull List<String> arrayList) {
arrayList.add(moduleOrderEntry.getModuleName());
return arrayList;
}
}
}