/* * Copyright 2009 Google Inc. * * 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.google.jstestdriver.idea.config; import com.google.common.base.Function; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.jstestdriver.idea.PluginResources; import com.google.jstestdriver.idea.execution.JstdConfigurationType; import com.google.jstestdriver.idea.execution.JstdRunConfiguration; import com.intellij.execution.RunManager; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLLanguage; import javax.swing.*; import java.io.File; import java.util.Arrays; public class JstdConfigFileType extends LanguageFileType implements FileTypeIdentifiableByVirtualFile { public static final JstdConfigFileType INSTANCE = new JstdConfigFileType(); private static final ImmutableSet<String> SUITABLE_FILE_NAMES_WITHOUT_EXTENSION; private static final ImmutableSet<String> EXTRA_FILE_EXTENSIONS; static { Function<String, String> lower = new Function<String, String>() { @Override public String apply(String s) { return s.toLowerCase(); } }; SUITABLE_FILE_NAMES_WITHOUT_EXTENSION = ImmutableSet.copyOf(Iterables.transform(Arrays.asList( "jsTestDriver", "js-test-driver", "js_test_driver", "jstd" ), lower)); EXTRA_FILE_EXTENSIONS = ImmutableSet.copyOf(Iterables.transform(Arrays.asList( "conf", "yml", "yaml" ), lower)); } /** * Creates a language file type for the specified language. */ protected JstdConfigFileType() { super(YAMLLanguage.INSTANCE); } @NotNull @Override public String getName() { return "JsTestDriver"; } @NotNull @Override public String getDescription() { return "JsTestDriver config file"; } @NotNull @Override public String getDefaultExtension() { return "jstd"; } @NotNull @Override public Icon getIcon() { return PluginResources.getJstdSmallIcon(); } @Override public boolean isMyFileType(VirtualFile file) { if (EXTRA_FILE_EXTENSIONS.contains(file.getExtension())) { if (isSuitableNameWithoutExtension(file)) { return true; } if (isReferencedByJstdRunConfiguration(file)) { return true; } } return false; } private static boolean isSuitableNameWithoutExtension(@NotNull VirtualFile file) { String nameWithoutExtension = StringUtil.toLowerCase(file.getNameWithoutExtension()); if (nameWithoutExtension == null) { return false; } for (String prefix : SUITABLE_FILE_NAMES_WITHOUT_EXTENSION) { if (nameWithoutExtension.startsWith(prefix)) { return true; } } return false; } private static boolean isReferencedByJstdRunConfiguration(VirtualFile file) { Project[] projects = ProjectManager.getInstance().getOpenProjects(); for (Project project : projects) { RunManager runManager = RunManager.getInstance(project); RunConfiguration[] runConfigurations = runManager.getConfigurations(JstdConfigurationType.getInstance()); for (RunConfiguration runConfiguration : runConfigurations) { if (runConfiguration instanceof JstdRunConfiguration) { JstdRunConfiguration jstdConfiguration = (JstdRunConfiguration)runConfiguration; File targetIOFile = new File(jstdConfiguration.getRunSettings().getConfigFile()); VirtualFile vf = LocalFileSystem.getInstance().findFileByIoFile(targetIOFile); if (vf == file) { return true; } } } } return false; } }