| /* |
| * 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.project; |
| |
| import com.intellij.ide.util.projectWizard.ModuleWizardStep; |
| import com.intellij.ide.util.projectWizard.WizardContext; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.Key; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.io.IOException; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * Importers for different project types, e.g. ADT, Gradle. |
| */ |
| public abstract class ModuleImporter { |
| private static final Key<ModuleImporter[]> KEY_IMPORTERS = new Key<ModuleImporter[]>("com.android.tools.importers"); |
| private static final Key<ModuleImporter> KEY_CURRENT_IMPORTER = new Key<ModuleImporter>("com.android.tools.currentImporter"); |
| private static final ModuleImporter NONE = new ModuleImporter() { |
| @Override |
| public boolean isStepVisible(ModuleWizardStep step) { |
| return false; |
| } |
| |
| @Override |
| public List<? extends ModuleWizardStep> createWizardSteps() { |
| return Collections.emptyList(); |
| } |
| |
| @Override |
| public void importProjects(@Nullable Map<String, VirtualFile> projects) { |
| LOG.error("Unsupported import kind"); |
| } |
| |
| @Override |
| public boolean isValid() { |
| return false; |
| } |
| |
| @Override |
| public boolean canImport(VirtualFile importSource) { |
| return false; |
| } |
| |
| @Override |
| public Set<ModuleToImport> findModules(VirtualFile importSource) { |
| return Collections.emptySet(); |
| } |
| }; |
| private static Logger LOG = Logger.getInstance(ModuleImporter.class); |
| |
| /** |
| * Importers live in the wizard context. This method lazily creates importers if they are |
| * not already there. |
| */ |
| @NotNull |
| public static synchronized ModuleImporter[] getAllImporters(@NotNull WizardContext context) { |
| ModuleImporter[] importers = context.getUserData(KEY_IMPORTERS); |
| if (importers == null) { |
| importers = createImporters(context); |
| } |
| return importers; |
| } |
| |
| /** |
| * Create supported importers. |
| */ |
| // TODO: Consider creating an extension point |
| @NotNull |
| private static ModuleImporter[] createImporters(WizardContext context) { |
| ModuleImporter[] importers = {new AdtModuleImporter(context), new GradleModuleImporter(context)}; |
| context.putUserData(KEY_IMPORTERS, importers); |
| return importers; |
| } |
| |
| /** |
| * @return "headless" importers - that don't always need UI. |
| */ |
| public static ModuleImporter[] getAllImporters(Project destinationProject) { |
| return new ModuleImporter[] {new GradleModuleImporter(destinationProject)}; |
| } |
| |
| public static ModuleImporter getImporter(WizardContext context) { |
| ModuleImporter importer = context.getUserData(KEY_CURRENT_IMPORTER); |
| if (importer != null) { |
| return importer; |
| } |
| else { |
| return NONE; |
| } |
| } |
| |
| @NotNull |
| public static ModuleImporter importerForLocation(WizardContext context, VirtualFile importSource) { |
| for (ModuleImporter importer : getAllImporters(context)) { |
| if (importer.canImport(importSource)) { |
| return importer; |
| } |
| } |
| return NONE; |
| } |
| |
| public static void setImporter(WizardContext context, @Nullable ModuleImporter importer) { |
| context.putUserData(KEY_CURRENT_IMPORTER, importer); |
| } |
| |
| public abstract boolean isStepVisible(ModuleWizardStep step); |
| |
| public abstract List<? extends ModuleWizardStep> createWizardSteps(); |
| |
| public abstract void importProjects(@Nullable Map<String, VirtualFile> projects); |
| |
| public abstract boolean isValid(); |
| |
| public abstract boolean canImport(VirtualFile importSource); |
| |
| public abstract Set<ModuleToImport> findModules(VirtualFile importSource) throws IOException; |
| } |