From 9d3d9707b67abd11052b3594c5f3dc9a7355fa7d Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 26 Oct 2011 14:51:51 +0400 Subject: [PATCH] refactored & javadoc added --- .../importProject/RootsDetectionStep.java | 2 +- .../JavaSourceRootDetectionUtil.java | 7 ++-- .../importSources/JavaSourceRootDetector.java | 8 ++++- .../ProjectStructureDetector.java | 32 ++++++++++++++++++- .../impl/JavaProjectStructureDetector.java | 15 +++++++++ .../JavaVfsSourceRootDetectionUtil.java | 2 +- .../groovy/GroovySourceRootDetector.java | 16 ++++++++++ 7 files changed, 75 insertions(+), 7 deletions(-) diff --git a/java/idea-ui/src/com/intellij/ide/util/importProject/RootsDetectionStep.java b/java/idea-ui/src/com/intellij/ide/util/importProject/RootsDetectionStep.java index c2fa41ad2dc2..1d6607a87cc3 100644 --- a/java/idea-ui/src/com/intellij/ide/util/importProject/RootsDetectionStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/importProject/RootsDetectionStep.java @@ -131,7 +131,7 @@ public class RootsDetectionStep extends AbstractStepWithProgress suggestRootForJavaFile(File javaFile, File topmostPossibleRoot) { + public static Pair suggestRootForJavaFile(File javaFile, File topmostPossibleRoot, NullableFunction packageNameFetcher) { if (!javaFile.isFile()) return null; final CharSequence chars; @@ -88,7 +89,7 @@ public class JavaSourceRootDetectionUtil { return null; } - String packageName = getPackageStatement(chars); + String packageName = packageNameFetcher.fun(chars); if (packageName != null) { File root = javaFile.getParentFile(); int index = packageName.length(); @@ -114,7 +115,7 @@ public class JavaSourceRootDetectionUtil { } @Nullable - public static String getPackageStatement(CharSequence text) { + public static String getPackageName(CharSequence text) { Lexer lexer = new JavaLexer(LanguageLevel.JDK_1_3); lexer.start(text); skipWhiteSpaceAndComments(lexer); diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/JavaSourceRootDetector.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/JavaSourceRootDetector.java index f1bf48be5f35..e557fc88ad6b 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/JavaSourceRootDetector.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/JavaSourceRootDetector.java @@ -17,6 +17,7 @@ package com.intellij.ide.util.projectWizard.importSources; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.NullableFunction; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -35,7 +36,7 @@ public abstract class JavaSourceRootDetector extends ProjectStructureDetector { if (child.isFile()) { String extension = FileUtil.getExtension(child.getName()); if (extension.equals(fileExtension)) { - Pair root = JavaSourceRootDetectionUtil.suggestRootForJavaFile(child, base); + Pair root = JavaSourceRootDetectionUtil.suggestRootForJavaFile(child, base, getPackageNameFetcher()); if (root != null) { result.add(new JavaModuleSourceRoot(root.getFirst(), root.getSecond(), getLanguageName())); return DirectoryProcessingResult.skipChildrenAndParentsUpTo(root.getFirst()); @@ -49,7 +50,12 @@ public abstract class JavaSourceRootDetector extends ProjectStructureDetector { return DirectoryProcessingResult.PROCESS_CHILDREN; } + @NotNull protected abstract String getLanguageName(); + @NotNull protected abstract String getFileExtension(); + + @NotNull + protected abstract NullableFunction getPackageNameFetcher(); } diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/ProjectStructureDetector.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/ProjectStructureDetector.java index b1f416d5fc78..636c791a6bef 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/ProjectStructureDetector.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/ProjectStructureDetector.java @@ -28,20 +28,50 @@ import java.util.Collections; import java.util.List; /** + * Override this class to provide automatic detection of modules and libraries for 'Create from existing sources' mode of + * the new project/module wizard. + * + *

+ * The implementation should be registered in your {@code plugin.xml}: + *

+ * <extensions defaultExtensionNs="com.intellij">
+ *   <projectStructureDetector implementation="qualified-class-name"/>
+ * </extensions>
+ * 
+ * * @author nik */ public abstract class ProjectStructureDetector { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.projectStructureDetector"); + /** + * This methods is called recursively for all directories under the selected root directory. + * @param dir current directory + * @param children its children + * @param base the root directory in which project files are detected. All detected roots must be located under this directory. + * @param result list of detected roots + * @return + *
  • {@link DirectoryProcessingResult#PROCESS_CHILDREN} if children of {@code dir} need to be processed by this detector
  • + *
  • {@link DirectoryProcessingResult#SKIP_CHILDREN} to skip all children of {@code dir} from processing
  • + *
  • {@link DirectoryProcessingResult#skipChildrenAndParentsUpTo}(parent) to skip all directories under {@code parent} from processing. + * {@code parent} must be an ancestor of {@code dir} or {@code dir} itself + *
  • + */ @NotNull public abstract DirectoryProcessingResult detectRoots(@NotNull File dir, @NotNull File[] children, @NotNull File base, @NotNull List result); + /** + * Return additional wizard steps which will be shown if some roots are detected by this detector + */ public List createWizardSteps(ProjectFromSourcesBuilder builder, ProjectDescriptor projectDescriptor, Icon stepIcon) { return Collections.emptyList(); } - public void setupProjectStructure(@NotNull Collection roots, + /** + * Setup modules and libraries for the selected roots + */ + public void setupProjectStructure(@NotNull Collection roots, @NotNull ProjectDescriptor projectDescriptor, @NotNull ProjectFromSourcesBuilder builder) { } diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/impl/JavaProjectStructureDetector.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/impl/JavaProjectStructureDetector.java index 062347fd9c30..bf26b2f2ee47 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/impl/JavaProjectStructureDetector.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/importSources/impl/JavaProjectStructureDetector.java @@ -23,8 +23,11 @@ import com.intellij.ide.util.importProject.ModulesDetectionStep; import com.intellij.ide.util.importProject.ProjectDescriptor; import com.intellij.ide.util.projectWizard.ModuleWizardStep; import com.intellij.ide.util.projectWizard.ProjectWizardStepFactory; +import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetectionUtil; import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetector; import com.intellij.ide.util.projectWizard.importSources.ProjectFromSourcesBuilder; +import com.intellij.util.NullableFunction; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.ArrayList; @@ -35,11 +38,13 @@ import java.util.List; */ public class JavaProjectStructureDetector extends JavaSourceRootDetector { + @NotNull @Override protected String getLanguageName() { return "Java"; } + @NotNull @Override protected String getFileExtension() { return JavaFileType.DEFAULT_EXTENSION; @@ -56,4 +61,14 @@ public class JavaProjectStructureDetector extends JavaSourceRootDetector { steps.add(ProjectWizardStepFactory.getInstance().createProjectJdkStep(builder.getContext())); return steps; } + + @NotNull + protected NullableFunction getPackageNameFetcher() { + return new NullableFunction() { + @Override + public String fun(CharSequence charSequence) { + return JavaSourceRootDetectionUtil.getPackageName(charSequence); + } + }; + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaVfsSourceRootDetectionUtil.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaVfsSourceRootDetectionUtil.java index 958d60400552..7200a8c023c6 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaVfsSourceRootDetectionUtil.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaVfsSourceRootDetectionUtil.java @@ -123,7 +123,7 @@ public class JavaVfsSourceRootDetectionUtil { CharSequence chars = LoadTextUtil.loadText(javaFile); - String packageName = JavaSourceRootDetectionUtil.getPackageStatement(chars); + String packageName = JavaSourceRootDetectionUtil.getPackageName(chars); if (packageName != null){ VirtualFile root = javaFile.getParent(); int index = packageName.length(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovySourceRootDetector.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovySourceRootDetector.java index ad0b83af3ebd..12d9045cce68 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovySourceRootDetector.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/GroovySourceRootDetector.java @@ -15,19 +15,35 @@ */ package org.jetbrains.plugins.groovy; +import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetectionUtil; import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetector; +import com.intellij.util.NullableFunction; +import org.jetbrains.annotations.NotNull; /** * @author nik */ public class GroovySourceRootDetector extends JavaSourceRootDetector { + @NotNull @Override protected String getLanguageName() { return "Groovy"; } + @NotNull @Override protected String getFileExtension() { return GroovyFileType.DEFAULT_EXTENSION; } + + @NotNull + protected NullableFunction getPackageNameFetcher() { + return new NullableFunction() { + @Override + public String fun(CharSequence charSequence) { + //todo[nik] implement groovy-specific package name parsing? + return JavaSourceRootDetectionUtil.getPackageName(charSequence); + } + }; + } }