blob: 5584a65511550d367dc57cfb1295e83663023770 [file] [log] [blame]
/*
* Copyright 2000-2011 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.framework.detection.impl;
import com.intellij.facet.FacetType;
import com.intellij.framework.FrameworkType;
import com.intellij.framework.detection.DetectedFrameworkDescription;
import com.intellij.framework.detection.FacetBasedFrameworkDetector;
import com.intellij.framework.detection.FrameworkDetector;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.roots.ModifiableModelsProvider;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author nik
*/
public class FrameworkDetectionUtil {
private FrameworkDetectionUtil() {
}
@Nullable
public static FrameworkType findFrameworkTypeForFacetDetector(@NotNull FacetType<?, ?> facetType) {
for (FrameworkDetector detector : FrameworkDetector.EP_NAME.getExtensions()) {
if (detector instanceof FacetBasedFrameworkDetector<?, ?> &&
((FacetBasedFrameworkDetector)detector).getFacetType().equals(facetType)) {
return detector.getFrameworkType();
}
}
return null;
}
public static List<? extends DetectedFrameworkDescription> removeDisabled(List<DetectedFrameworkDescription> descriptions) {
return removeDisabled(descriptions, Collections.<DetectedFrameworkDescription>emptyList());
}
public static List<DetectedFrameworkDescription> getDisabledDescriptions(@NotNull List<? extends DetectedFrameworkDescription> currentDescriptions,
@NotNull List<? extends DetectedFrameworkDescription> otherDescriptions) {
return doGetDisabledDescriptions(currentDescriptions, ContainerUtil.concat(currentDescriptions, otherDescriptions));
}
private static List<DetectedFrameworkDescription> doGetDisabledDescriptions(@NotNull List<? extends DetectedFrameworkDescription> currentDescriptions,
@NotNull List<? extends DetectedFrameworkDescription> allDescriptions) {
List<DetectedFrameworkDescription> disabled = new ArrayList<DetectedFrameworkDescription>();
for (DetectedFrameworkDescription description : currentDescriptions) {
if (!description.canSetupFramework(allDescriptions)) {
disabled.add(description);
}
}
if (!disabled.isEmpty()) {
List<DetectedFrameworkDescription> remaining = new ArrayList<DetectedFrameworkDescription>(currentDescriptions);
remaining.removeAll(disabled);
disabled.addAll(doGetDisabledDescriptions(remaining, allDescriptions));
}
return disabled;
}
public static List<? extends DetectedFrameworkDescription> removeDisabled(@NotNull List<? extends DetectedFrameworkDescription> currentDescriptions,
@NotNull List<? extends DetectedFrameworkDescription> otherDescriptions) {
final List<DetectedFrameworkDescription> disabled = getDisabledDescriptions(currentDescriptions, otherDescriptions);
if (disabled.isEmpty()) return currentDescriptions;
final List<DetectedFrameworkDescription> descriptions = new ArrayList<DetectedFrameworkDescription>(currentDescriptions);
descriptions.removeAll(disabled);
return descriptions;
}
public static void setupFrameworks(List<? extends DetectedFrameworkDescription> descriptions,
final ModifiableModelsProvider modelsProvider, final ModulesProvider modulesProvider) {
AccessToken token = WriteAction.start();
try {
List<DetectedFrameworkDescription> sortedDescriptions = new ArrayList<DetectedFrameworkDescription>();
//todo[nik] perform real sorting
for (DetectedFrameworkDescription description : descriptions) {
if (description.getDetector().getUnderlyingFrameworkType() == null) {
sortedDescriptions.add(description);
}
}
for (DetectedFrameworkDescription description : descriptions) {
if (description.getDetector().getUnderlyingFrameworkType() != null) {
sortedDescriptions.add(description);
}
}
for (DetectedFrameworkDescription description : sortedDescriptions) {
description.setupFramework(modelsProvider, modulesProvider);
}
}
finally {
token.finish();
}
}
}