From 34de624112e35ec96e0b71d4d3d20b2420b922ef Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 19 Nov 2010 10:04:22 +0300 Subject: [PATCH] facet detectors migrated to FileContent based filters --- .../FacetAutodetectingManagerImpl.java | 6 +- .../FacetByPsiFileDetectorWrapper.java | 4 +- .../FacetByVirtualFileDetectorWrapper.java | 4 +- .../FacetDetectorForWizardRegistry.java | 6 +- .../FacetDetectorRegistryEx.java | 110 +++------------ .../autodetecting/FacetDetectorWrapper.java | 10 +- .../FacetOnTheFlyDetectorRegistry.java | 4 +- .../impl/autodetecting/FileContentFilter.java | 25 ---- .../autodetecting/FileContentPattern.java | 125 ++++++++++++++++++ .../impl/ui/FacetDetectionProcessor.java | 43 +++--- .../importProject/FacetDetectionStep.java | 9 +- 11 files changed, 182 insertions(+), 164 deletions(-) delete mode 100644 java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentFilter.java create mode 100644 java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentPattern.java diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetAutodetectingManagerImpl.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetAutodetectingManagerImpl.java index c7eb340c0255..96b0133e9594 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetAutodetectingManagerImpl.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetAutodetectingManagerImpl.java @@ -198,7 +198,7 @@ public class FacetAutodetectingManagerImpl extends FacetAutodetectingManager imp FileContent fileContent, final FacetDetectorWrapper detector, List> facets) { - if (!myDetectionInProgress && detector.getFileContentFilter().accept(fileContent)) { + if (!myDetectionInProgress && detector.getFileContentPattern().accepts(fileContent)) { try { myDetectionInProgress = true; FacetInfo2 facet = detector.detectFacet(virtualFile, myPsiManager); @@ -349,7 +349,7 @@ public class FacetAutodetectingManagerImpl extends FacetAutodetectingManager imp myType = type; } - public void register(@NotNull final FileType fileType, @NotNull final FileContentFilter fileContentFilter, + public void register(@NotNull final FileType fileType, @NotNull final FileContentPattern fileContentFilter, @NotNull final FacetDetector facetDetector, final UnderlyingFacetSelector selector) { myHasDetectors = true; @@ -359,7 +359,7 @@ public class FacetAutodetectingManagerImpl extends FacetAutodetectingManager imp facetDetector, selector)); } - public void register(@NotNull final FileType fileType, @NotNull final FileContentFilter fileContentFilter, + public void register(@NotNull final FileType fileType, @NotNull final FileContentPattern fileContentFilter, @NotNull final Condition psiFileFilter, @NotNull final FacetDetector facetDetector, final UnderlyingFacetSelector selector) { myHasDetectors = true; diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByPsiFileDetectorWrapper.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByPsiFileDetectorWrapper.java index 569111ad8127..30b1116171cd 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByPsiFileDetectorWrapper.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByPsiFileDetectorWrapper.java @@ -37,10 +37,10 @@ public class FacetByPsiFileDetectorWrapper myPsiFileFilter; public FacetByPsiFileDetectorWrapper(ProjectFacetInfoSet projectFacetSet, FacetType facetType, - final AutodetectionFilter autodetectionFilter, final FileContentFilter fileContentFilter, + final AutodetectionFilter autodetectionFilter, final FileContentPattern fileContentPattern, final FacetDetector facetDetector, Condition psiFileFilter, final UnderlyingFacetSelector selector) { - super(projectFacetSet, facetType, autodetectionFilter, fileContentFilter, facetDetector, selector); + super(projectFacetSet, facetType, autodetectionFilter, fileContentPattern, facetDetector, selector); myPsiFileFilter = psiFileFilter; } diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByVirtualFileDetectorWrapper.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByVirtualFileDetectorWrapper.java index b1ed6f59cc17..f7fd2f7b83ad 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByVirtualFileDetectorWrapper.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetByVirtualFileDetectorWrapper.java @@ -34,10 +34,10 @@ import org.jetbrains.annotations.Nullable; */ public class FacetByVirtualFileDetectorWrapper, U extends FacetConfiguration> extends FacetDetectorWrapper { public FacetByVirtualFileDetectorWrapper(ProjectFacetInfoSet projectFacetSet, FacetType facetType, - final AutodetectionFilter autodetectionFilter, final FileContentFilter fileContentFilter, + final AutodetectionFilter autodetectionFilter, final FileContentPattern fileContentPattern, final FacetDetector facetDetector, final UnderlyingFacetSelector selector) { - super(projectFacetSet, facetType, autodetectionFilter, fileContentFilter, facetDetector, selector); + super(projectFacetSet, facetType, autodetectionFilter, fileContentPattern, facetDetector, selector); } @Nullable diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorForWizardRegistry.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorForWizardRegistry.java index 099571d247ad..d7da474f795f 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorForWizardRegistry.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorForWizardRegistry.java @@ -21,17 +21,13 @@ import com.intellij.facet.autodetecting.FacetDetector; import com.intellij.facet.autodetecting.UnderlyingFacetSelector; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileFilter; import org.jetbrains.annotations.NotNull; /** * @author nik */ public interface FacetDetectorForWizardRegistry { - void register(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, - @NotNull final FacetDetector facetDetector); - - void register(final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, + void register(final FileType fileType, @NotNull final FileContentPattern fileContentPattern, final FacetDetector facetDetector, final UnderlyingFacetSelector underlyingFacetSelector); } diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorRegistryEx.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorRegistryEx.java index ac9ebccb8372..f60bc0958ec6 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorRegistryEx.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorRegistryEx.java @@ -16,34 +16,24 @@ package com.intellij.facet.impl.autodetecting; -import com.intellij.facet.Facet; import com.intellij.facet.FacetConfiguration; -import com.intellij.facet.FacetModel; import com.intellij.facet.FacetType; import com.intellij.facet.autodetecting.DetectedFacetPresentation; import com.intellij.facet.autodetecting.FacetDetector; import com.intellij.facet.autodetecting.FacetDetectorRegistry; import com.intellij.facet.autodetecting.UnderlyingFacetSelector; -import com.intellij.ide.caches.FileContent; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileFilter; -import com.intellij.patterns.*; +import com.intellij.patterns.ElementPattern; +import com.intellij.patterns.VirtualFilePattern; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.cache.impl.CacheUtil; -import com.intellij.util.text.CharSequenceReader; -import com.intellij.util.xml.NanoXmlUtil; -import com.intellij.util.xml.XmlFileHeader; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.util.Collection; - /** * @author nik */ @@ -62,67 +52,34 @@ public class FacetDetectorRegistryEx implements Fa } public void registerUniversalDetectorByRootTag(@NotNull final String rootTag, @NotNull final FacetDetector detector) { - registerUniversalDetector(StdFileTypes.XML, new VirtualFileFilter() { - @Override - public boolean accept(VirtualFile file) { - try { - return rootTag.equals(NanoXmlUtil.parseHeaderWithException(file).getRootTagLocalName()); - } - catch (IOException e) { - return false; - } - } - }, new FileContentFilter() { - @Override - public boolean accept(FileContent fileContent) { - try { - return rootTag.equals(parseHeaderWithException(fileContent).getRootTagLocalName()); - } - catch (IOException e) { - return false; - } - } - }, detector); - } - - @NotNull - private static XmlFileHeader parseHeaderWithException(FileContent fileContent) throws IOException { - final CharSequence contentText = CacheUtil.getContentText(fileContent); - //noinspection IOResourceOpenedButNotSafelyClosed - return NanoXmlUtil.parseHeaderWithException(new CharSequenceReader(contentText)); + registerUniversalDetector(StdFileTypes.XML, FileContentPattern.fileContent().xmlWithRootTag(rootTag), detector, null); } public void registerUniversalDetectorByFileNameAndRootTag(@NotNull @NonNls String fileName, @NotNull @NonNls String rootTag, @NotNull final FacetDetector detector, @Nullable UnderlyingFacetSelector underlyingFacetSelector) { - VirtualFilePattern fileNamePattern = PlatformPatterns.virtualFile().withName(StandardPatterns.string().equalTo(fileName)); - VirtualFilePattern wizardPattern = fileNamePattern.xmlWithRootTag(StandardPatterns.string().equalTo(rootTag)); - - if (underlyingFacetSelector != null) { - registerUniversalSubFacetDetector(StdFileTypes.XML, wizardPattern, detector, underlyingFacetSelector); - } - else { - registerUniversalDetector(StdFileTypes.XML, wizardPattern, detector); - } + registerUniversalDetector(StdFileTypes.XML, FileContentPattern.fileContent().withName(fileName).xmlWithRootTag(rootTag), detector, underlyingFacetSelector); } public void registerDetectorForWizard(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, @NotNull final FacetDetector facetDetector) { if (myForWizardDelegate != null) { - myForWizardDelegate.register(fileType, virtualFileFilter, facetDetector); + myForWizardDelegate.register(fileType, FileContentPattern.byFilter(virtualFileFilter), facetDetector, null); } } public void registerDetectorForWizard(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern, @NotNull final FacetDetector facetDetector) { - registerDetectorForWizard(fileType, new MyPatternFilter(virtualFilePattern), facetDetector); + if (myForWizardDelegate != null) { + myForWizardDelegate.register(fileType, FileContentPattern.byFilePattern(virtualFilePattern), facetDetector, null); + } } public void registerSubFacetDetectorForWizard(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern, @NotNull final FacetDetector facetDetector, @NotNull final UnderlyingFacetSelector underlyingFacetSelector) { if (myForWizardDelegate != null) { - myForWizardDelegate.register(fileType, new MyPatternFilter(virtualFilePattern), facetDetector, underlyingFacetSelector); + myForWizardDelegate.register(fileType, FileContentPattern.byFilePattern(virtualFilePattern), facetDetector, underlyingFacetSelector); } } @@ -133,7 +90,7 @@ public class FacetDetectorRegistryEx implements Fa @NotNull final FacetDetector facetDetector, @Nullable UnderlyingFacetSelector selector) { if (myOnTheFlyDelegate != null) { - myOnTheFlyDelegate.register(fileType, new MyFileContentFilter(virtualFileFilter), psiFileFilter, facetDetector, selector); + myOnTheFlyDelegate.register(fileType, FileContentPattern.byFilter(virtualFileFilter), psiFileFilter, facetDetector, selector); } } @@ -168,26 +125,25 @@ public class FacetDetectorRegistryEx implements Fa } public void registerUniversalDetector(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, @NotNull final FacetDetector facetDetector) { - registerUniversalDetector(fileType, virtualFileFilter, new MyFileContentFilter(virtualFileFilter), facetDetector); + registerUniversalDetector(fileType, FileContentPattern.byFilter(virtualFileFilter), facetDetector, null); } - private void registerUniversalDetector(@NotNull final FileType fileType, @NotNull VirtualFileFilter virtualFileFilter, @NotNull final FileContentFilter fileContentFilter, - @NotNull final FacetDetector facetDetector) { + public void registerUniversalDetector(@NotNull final FileType fileType, + @NotNull final FileContentPattern fileContentFilter, + @NotNull final FacetDetector facetDetector, + final UnderlyingFacetSelector underlyingFacetSelector) { if (myForWizardDelegate != null) { - myForWizardDelegate.register(fileType, virtualFileFilter, facetDetector); + myForWizardDelegate.register(fileType, fileContentFilter, facetDetector, underlyingFacetSelector); } if (myOnTheFlyDelegate != null) { - myOnTheFlyDelegate.register(fileType, fileContentFilter, facetDetector, null); + myOnTheFlyDelegate.register(fileType, fileContentFilter, facetDetector, underlyingFacetSelector); } } public void registerUniversalSubFacetDetector(@NotNull final FileType fileType, @NotNull final VirtualFilePattern virtualFilePattern, @NotNull final FacetDetector facetDetector, final UnderlyingFacetSelector underlyingFacetSelector) { - registerSubFacetDetectorForWizard(fileType, virtualFilePattern, facetDetector, underlyingFacetSelector); - if (myOnTheFlyDelegate != null) { - myOnTheFlyDelegate.register(fileType, new MyFileContentFilter(new MyPatternFilter(virtualFilePattern)), facetDetector, underlyingFacetSelector); - } + registerUniversalDetector(fileType, FileContentPattern.byFilePattern(virtualFilePattern), facetDetector, underlyingFacetSelector); } private static class MyPatternFilter implements VirtualFileFilter { @@ -202,23 +158,6 @@ public class FacetDetectorRegistryEx implements Fa } } - public static FacetDetector convertDetector(final FacetDetector detector) { - return new FacetDetector(detector.getId() + "-psi") { - public C detectFacet(final PsiFile source, final Collection existentFacetConfigurations) { - VirtualFile virtualFile = source.getVirtualFile(); - return virtualFile != null ? detector.detectFacet(virtualFile, existentFacetConfigurations) : null; - } - - public void beforeFacetAdded(@NotNull final Facet facet, final FacetModel facetModel, @NotNull final ModifiableRootModel modifiableRootModel) { - detector.beforeFacetAdded(facet, facetModel, modifiableRootModel); - } - - public void afterFacetAdded(@NotNull final Facet facet) { - detector.afterFacetAdded(facet); - } - }; - } - @NotNull public static DetectedFacetPresentation getDetectedFacetPresentation(@NotNull FacetType facetType) { FacetDetectorRegistryEx registry = new FacetDetectorRegistryEx(null, null); @@ -226,17 +165,4 @@ public class FacetDetectorRegistryEx implements Fa DetectedFacetPresentation presentation = registry.myPresentation; return presentation != null ? presentation : DefaultDetectedFacetPresentation.INSTANCE; } - - private static class MyFileContentFilter implements FileContentFilter { - private final VirtualFileFilter myVirtualFileFilter; - - public MyFileContentFilter(VirtualFileFilter virtualFileFilter) { - myVirtualFileFilter = virtualFileFilter; - } - - @Override - public boolean accept(FileContent fileContent) { - return myVirtualFileFilter.accept(fileContent.getVirtualFile()); - } - } } diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorWrapper.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorWrapper.java index b52ae2b67203..9e5df83b05b5 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorWrapper.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetDetectorWrapper.java @@ -40,25 +40,25 @@ import java.util.Map; public abstract class FacetDetectorWrapper, U extends FacetConfiguration> { private static final Logger LOG = Logger.getInstance("#com.intellij.facet.impl.autodetecting.FacetDetectorWrapper"); private final AutodetectionFilter myAutodetectionFilter; - private final FileContentFilter myFileContentFilter; + private final FileContentPattern myFileContentPattern; private final FacetDetector myFacetDetector; private final UnderlyingFacetSelector myUnderlyingFacetSelector; private final ProjectFacetInfoSet myDetectedFacetSet; private final FacetType myFacetType; - protected FacetDetectorWrapper(ProjectFacetInfoSet projectFacetSet, FacetType facetType, final AutodetectionFilter autodetectionFilter, final FileContentFilter fileContentFilter, + protected FacetDetectorWrapper(ProjectFacetInfoSet projectFacetSet, FacetType facetType, final AutodetectionFilter autodetectionFilter, final FileContentPattern fileContentPattern, final FacetDetector facetDetector, final UnderlyingFacetSelector selector) { myDetectedFacetSet = projectFacetSet; myFacetType = facetType; myAutodetectionFilter = autodetectionFilter; - myFileContentFilter = fileContentFilter; + myFileContentPattern = fileContentPattern; myFacetDetector = facetDetector; myUnderlyingFacetSelector = selector; } - public FileContentFilter getFileContentFilter() { - return myFileContentFilter; + public FileContentPattern getFileContentPattern() { + return myFileContentPattern; } public FacetType getFacetType() { diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetOnTheFlyDetectorRegistry.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetOnTheFlyDetectorRegistry.java index 05ce154c2644..19d37178709e 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetOnTheFlyDetectorRegistry.java +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FacetOnTheFlyDetectorRegistry.java @@ -30,11 +30,11 @@ import org.jetbrains.annotations.NotNull; */ public interface FacetOnTheFlyDetectorRegistry { - void register(@NotNull FileType fileType, @NotNull FileContentFilter virtualFileFilter, + void register(@NotNull FileType fileType, @NotNull FileContentPattern fileContentPattern, @NotNull FacetDetector detector, UnderlyingFacetSelector selector); - void register(@NotNull FileType fileType, @NotNull FileContentFilter virtualFileFilter, + void register(@NotNull FileType fileType, @NotNull FileContentPattern fileContentPattern, @NotNull Condition psiFileFilter, @NotNull FacetDetector detector, UnderlyingFacetSelector selector); } diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentFilter.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentFilter.java deleted file mode 100644 index 20f52516685e..000000000000 --- a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentFilter.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2000-2010 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.facet.impl.autodetecting; - -import com.intellij.ide.caches.FileContent; - -/** - * @author nik - */ -public interface FileContentFilter { - boolean accept(FileContent fileContent); -} diff --git a/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentPattern.java b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentPattern.java new file mode 100644 index 000000000000..25931e87c1e7 --- /dev/null +++ b/java/idea-ui/src/com/intellij/facet/impl/autodetecting/FileContentPattern.java @@ -0,0 +1,125 @@ +/* + * Copyright 2000-2010 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.facet.impl.autodetecting; + +import com.intellij.ide.caches.FileContent; +import com.intellij.openapi.vfs.VirtualFileFilter; +import com.intellij.patterns.*; +import com.intellij.psi.impl.cache.impl.CacheUtil; +import com.intellij.util.ProcessingContext; +import com.intellij.util.text.CharSequenceReader; +import com.intellij.util.xml.NanoXmlUtil; +import com.intellij.util.xml.XmlFileHeader; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +/** + * @author nik + */ +public class FileContentPattern extends ObjectPattern { + public FileContentPattern() { + super(FileContent.class); + } + + public static FileContentPattern fileContent() { + return new FileContentPattern(); + } + + public FileContentPattern withName(@NotNull final String name) { + return with(new PatternCondition("withName") { + @Override + public boolean accepts(@NotNull FileContent fileContent, ProcessingContext context) { + return name.equals(fileContent.getVirtualFile().getName()); + } + }); + } + + public FileContentPattern withName(final StringPattern namePattern) { + return with(new PatternCondition("withName") { + @Override + public boolean accepts(@NotNull FileContent fileContent, ProcessingContext context) { + return namePattern.accepts(fileContent.getVirtualFile().getName()); + } + }); + } + + public FileContentPattern inDirectory(final @NotNull String name) { + return with(new PatternCondition("inDirectory") { + @Override + public boolean accepts(@NotNull FileContent fileContent, ProcessingContext context) { + return name.equals(fileContent.getVirtualFile().getParent().getName()); + } + }); + } + + public FileContentPattern xmlWithRootTag(@NotNull final String rootTag) { + return with(new PatternCondition("withRootTag") { + @Override + public boolean accepts(@NotNull FileContent fileContent, ProcessingContext context) { + try { + return rootTag.equals(parseHeaderWithException(fileContent).getRootTagLocalName()); + } + catch (IOException e) { + return false; + } + } + }); + } + + public FileContentPattern xmlWithRootTagNamespace(final String namespace) { + return xmlWithRootTagNamespace(StandardPatterns.string().equalTo(namespace)); + } + + public FileContentPattern xmlWithRootTagNamespace(final ElementPattern namespacePattern) { + return with(new PatternCondition("xmlWithRootTagNamespace") { + public boolean accepts(@NotNull final FileContent fileContent, final ProcessingContext context) { + try { + String rootTagNamespace = parseHeaderWithException(fileContent).getRootTagNamespace(); + return rootTagNamespace != null && namespacePattern.getCondition().accepts(rootTagNamespace, context); + } + catch (IOException e) { + return false; + } + } + }); + } + + public static FileContentPattern byFilter(@NotNull final VirtualFileFilter filter) { + return fileContent().with(new PatternCondition("withFileFilter") { + @Override + public boolean accepts(@NotNull FileContent fileContent, ProcessingContext context) { + return filter.accept(fileContent.getVirtualFile()); + } + }); + } + + public static FileContentPattern byFilePattern(@NotNull final VirtualFilePattern pattern) { + return fileContent().with(new PatternCondition("withFilePattern") { + @Override + public boolean accepts(@NotNull FileContent fileContent, ProcessingContext context) { + return pattern.accepts(fileContent.getVirtualFile()); + } + }); + } + + @NotNull + private static XmlFileHeader parseHeaderWithException(FileContent fileContent) throws IOException { + final CharSequence contentText = CacheUtil.getContentText(fileContent); + //noinspection IOResourceOpenedButNotSafelyClosed + return NanoXmlUtil.parseHeaderWithException(new CharSequenceReader(contentText)); + } +} diff --git a/java/idea-ui/src/com/intellij/facet/impl/ui/FacetDetectionProcessor.java b/java/idea-ui/src/com/intellij/facet/impl/ui/FacetDetectionProcessor.java index b31f5783cf96..b54fefd8e352 100644 --- a/java/idea-ui/src/com/intellij/facet/impl/ui/FacetDetectionProcessor.java +++ b/java/idea-ui/src/com/intellij/facet/impl/ui/FacetDetectionProcessor.java @@ -21,15 +21,16 @@ import com.intellij.facet.autodetecting.FacetDetector; import com.intellij.facet.autodetecting.UnderlyingFacetSelector; import com.intellij.facet.impl.autodetecting.FacetDetectorForWizardRegistry; import com.intellij.facet.impl.autodetecting.FacetDetectorRegistryEx; +import com.intellij.facet.impl.autodetecting.FileContentPattern; +import com.intellij.ide.caches.FileContent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.util.MultiValuesMap; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileFilter; -import com.intellij.openapi.module.ModuleType; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -107,8 +108,9 @@ public class FacetDetectionProcessor { Collection detectors = detectorsMap.get(fileType); if (detectors == null) return; + final FileContent content = new FileContent(file); for (MyFacetDetectorWrapper detector : detectors) { - detector.detectFacet(file); + detector.detectFacet(content); } } @@ -127,16 +129,16 @@ public class FacetDetectionProcessor { private class MyFacetDetectorWrapper { private final FacetType myFacetType; private final FileType myFileType; - private final VirtualFileFilter myVirtualFileFilter; + private final FileContentPattern myFileContentPattern; private final FacetDetector myDetector; private final UnderlyingFacetSelector myUnderlyingFacetSelector; - public MyFacetDetectorWrapper(final FacetType facetType, final FileType fileType, final VirtualFileFilter virtualFileFilter, final FacetDetector detector, + public MyFacetDetectorWrapper(final FacetType facetType, final FileType fileType, final FileContentPattern fileContentFilter, final FacetDetector detector, final UnderlyingFacetSelector underlyingFacetSelector) { myUnderlyingFacetSelector = underlyingFacetSelector; myFacetType = facetType; myFileType = fileType; - myVirtualFileFilter = virtualFileFilter; + myFileContentPattern = fileContentFilter; myDetector = detector; } @@ -148,8 +150,9 @@ public class FacetDetectionProcessor { return myFacetType; } - public void detectFacet(VirtualFile file) { - if (!myVirtualFileFilter.accept(file)) return; + public void detectFacet(final FileContent fileContent) { + if (!myFileContentPattern.accepts(fileContent)) return; + final VirtualFile file = fileContent.getVirtualFile(); FacetInfo underlyingFacet = null; if (myUnderlyingFacetSelector != null) { @@ -222,11 +225,17 @@ public class FacetDetectionProcessor { myLevel=level; } - public void register(@NotNull final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, - @NotNull final FacetDetector facetDetector) { - LOG.assertTrue(myFacetType.getUnderlyingFacetType() == null, "This method must not be used for sub-facets"); - getDetectorsMap().put(fileType, new MyFacetDetectorWrapper(myFacetType, fileType, virtualFileFilter, - facetDetector, null)); + public void register(final FileType fileType, @NotNull final FileContentPattern fileContentPattern, final FacetDetector facetDetector, + final UnderlyingFacetSelector underlyingFacetSelector) { + if (myFacetType.getUnderlyingFacetType() != null) { + LOG.assertTrue(underlyingFacetSelector != null, "UnderlyingFacetSelector must be specified for " + myFacetType.getPresentableName() + " detector"); + } + else { + LOG.assertTrue(underlyingFacetSelector == null, "UnderlyingFacetSelector must not be specified for " + myFacetType.getPresentableName() + " detector"); + } + MyFacetDetectorWrapper detector = new MyFacetDetectorWrapper(myFacetType, fileType, fileContentPattern, + facetDetector, underlyingFacetSelector); + getDetectorsMap().put(fileType, detector); } private MultiValuesMap getDetectorsMap() { @@ -235,14 +244,6 @@ public class FacetDetectionProcessor { } return myDetectors.get(myLevel); } - - public void register(final FileType fileType, @NotNull final VirtualFileFilter virtualFileFilter, final FacetDetector facetDetector, - final UnderlyingFacetSelector underlyingFacetSelector) { - LOG.assertTrue(myFacetType.getUnderlyingFacetType() != null, "This method can be used only for sub-facets"); - MyFacetDetectorWrapper detector = new MyFacetDetectorWrapper(myFacetType, fileType, virtualFileFilter, - facetDetector, underlyingFacetSelector); - getDetectorsMap() .put(fileType, detector); - } } //todo[nik] use DetectedFacetInfo instead diff --git a/java/idea-ui/src/com/intellij/ide/util/importProject/FacetDetectionStep.java b/java/idea-ui/src/com/intellij/ide/util/importProject/FacetDetectionStep.java index fda17b31d9f1..1f88c3cd416c 100644 --- a/java/idea-ui/src/com/intellij/ide/util/importProject/FacetDetectionStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/importProject/FacetDetectionStep.java @@ -22,6 +22,7 @@ import com.intellij.facet.autodetecting.FacetDetector; import com.intellij.facet.autodetecting.UnderlyingFacetSelector; import com.intellij.facet.impl.autodetecting.FacetDetectorForWizardRegistry; import com.intellij.facet.impl.autodetecting.FacetDetectorRegistryEx; +import com.intellij.facet.impl.autodetecting.FileContentPattern; import com.intellij.facet.impl.autodetecting.facetsTree.DetectedFacetsTreeComponent; import com.intellij.facet.impl.ui.FacetDetectionProcessor; import com.intellij.ide.util.newProjectWizard.ProjectFromSourcesBuilder; @@ -36,7 +37,6 @@ import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Ref; -import com.intellij.openapi.vfs.VirtualFileFilter; import com.intellij.ui.ScrollPaneFactory; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -146,14 +146,9 @@ public abstract class FacetDetectionStep extends AbstractStepWithProgress hasDetector = Ref.create(false); //noinspection unchecked facetType.registerDetectors(new FacetDetectorRegistryEx(new FacetDetectorForWizardRegistry() { - public void register(@NotNull FileType fileType, - @NotNull VirtualFileFilter virtualFileFilter, - @NotNull FacetDetector facetDetector) { - hasDetector.set(true); - } public void register(FileType fileType, - @NotNull VirtualFileFilter virtualFileFilter, + @NotNull FileContentPattern fileContentPattern, FacetDetector facetDetector, UnderlyingFacetSelector underlyingFacetSelector) { hasDetector.set(true);