From 33781b393e76f13fdd5da195723f45723acca389 Mon Sep 17 00:00:00 2001 From: Sergey Vasiliev Date: Thu, 27 Mar 2008 13:36:14 +0300 Subject: [PATCH] refactored jsf model --- .../util/xml/ModuleContenRootSearchScope.java | 33 +++ .../intellij/util/xml/model/DomModelFactory.java | 228 --------------------- .../util/xml/model/MultipleDomModelFactory.java | 23 +++ .../util/xml/model/SimpleModelFactory.java | 21 ++ .../util/xml/model/impl/BaseDomModelFactory.java | 173 ++++++++++++++++ .../util/xml/model/impl/CachedDomModelFactory.java | 18 ++ .../model/impl/CachedMultipleDomModelFactory.java | 151 ++++++++++++++ .../model/impl/CachedSimpleDomModelFactory.java | 56 +++++ .../util/xml/model/impl/DomModelFactory.java | 74 +++++++ .../util/xml/model/impl/DomModelFactoryHelper.java | 41 ++++ .../util/xml/model/{ => impl}/DomModelImpl.java | 2 +- .../model/{ => impl}/SimpleDomModelFactory.java | 37 ++-- 12 files changed, 603 insertions(+), 254 deletions(-) create mode 100644 dom/openapi/src/com/intellij/util/xml/ModuleContenRootSearchScope.java delete mode 100644 dom/openapi/src/com/intellij/util/xml/model/DomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/MultipleDomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/SimpleModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/impl/BaseDomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/impl/CachedDomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/impl/CachedMultipleDomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/impl/CachedSimpleDomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactory.java create mode 100644 dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactoryHelper.java rename dom/openapi/src/com/intellij/util/xml/model/{ => impl}/DomModelImpl.java (97%) rename dom/openapi/src/com/intellij/util/xml/model/{ => impl}/SimpleDomModelFactory.java (66%) diff --git a/dom/openapi/src/com/intellij/util/xml/ModuleContenRootSearchScope.java b/dom/openapi/src/com/intellij/util/xml/ModuleContenRootSearchScope.java new file mode 100644 index 0000000000..63cc562ee9 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/ModuleContenRootSearchScope.java @@ -0,0 +1,33 @@ +package com.intellij.util.xml; + +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; + +public class ModuleContenRootSearchScope extends GlobalSearchScope { + private final ModuleRootManager myRootManager; + private final Module myModule; + + public ModuleContenRootSearchScope(final Module module) { + myRootManager = ModuleRootManager.getInstance(module); + myModule = module; + } + + public boolean contains(final VirtualFile file) { + return myRootManager.getFileIndex().isInContent(file); + } + + public int compare(final VirtualFile file1, final VirtualFile file2) { + return 0; + } + + public boolean isSearchInModuleContent(@NotNull final Module aModule) { + return aModule == myModule; + } + + public boolean isSearchInLibraries() { + return false; + } +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/DomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/DomModelFactory.java deleted file mode 100644 index 1e5aba508e..0000000000 --- a/dom/openapi/src/com/intellij/util/xml/model/DomModelFactory.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright 2000-2007 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.util.xml.model; - -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.util.CachedValueProvider; -import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.psi.xml.XmlFile; -import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.DomFileElement; -import com.intellij.util.xml.DomManager; -import com.intellij.util.xml.ModelMerger; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * @author Dmitry Avdeev - */ -public abstract class DomModelFactory, C extends PsiElement> extends SimpleDomModelFactory { - - private final DomModelCache myModelCache; - private final DomModelCache myCombinedModelCache; - private final DomModelCache, Module> myAllModelsCache; - - - protected DomModelFactory(@NotNull Class aClass, - @NotNull ModelMerger modelMerger, - final Project project, - @NonNls String name) { - super(aClass, modelMerger); - - myModelCache = new DomModelCache(project, name + " model") { - @NotNull - protected CachedValueProvider.Result computeValue(@NotNull XmlFile file) { - final PsiFile originalFile = file.getOriginalFile(); - if (originalFile != null) { - file = (XmlFile)originalFile; - } - - final Module module = ModuleUtil.findModuleForPsiElement(file); - final M model = computeModel(file, module); - return new CachedValueProvider.Result(model, computeDependencies(model, module)); - } - }; - - myCombinedModelCache = new DomModelCache(project, name + " combined model") { - @NotNull - protected CachedValueProvider.Result computeValue(@NotNull final Module module) { - final M combinedModel = computeCombinedModel(module); - return new CachedValueProvider.Result(combinedModel, computeDependencies(combinedModel, module)); - } - }; - - myAllModelsCache = new DomModelCache, Module>(project, name + " models list") { - @NotNull - protected CachedValueProvider.Result> computeValue(@NotNull final Module module) { - final List models = computeAllModels(module); - return new CachedValueProvider.Result>(models, computeDependencies(null, module)); - } - }; - } - - @NotNull - public Object[] computeDependencies(@Nullable M model, @Nullable Module module) { - - final ArrayList dependencies = new ArrayList(); - final Set files; - if (model != null) { - files = model.getConfigFiles(); - dependencies.addAll(files); - } else { - dependencies.add(PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); - } - if (module != null) { - dependencies.add(ProjectRootManager.getInstance(module.getProject())); - } - return dependencies.toArray(new Object[dependencies.size()]); - } - - @Nullable - public abstract M getModel(@NotNull C context); - - @NotNull - public List getAllModels(@NotNull Module module) { - - final List models = myAllModelsCache.getCachedValue(module); - if (models == null) { - return Collections.emptyList(); - } - else { - return models; - } - } - - @Nullable - protected abstract List computeAllModels(@NotNull Module module); - - @Nullable - public M getModelByConfigFile(@Nullable XmlFile psiFile) { - if (psiFile == null) { - return null; - } - return myModelCache.getCachedValue(psiFile); - } - - @Nullable - protected M computeModel(@NotNull XmlFile psiFile, @Nullable Module module) { - if (module == null) { - return null; - } - final List models = getAllModels(module); - for (M model: models) { - final Set configFiles = model.getConfigFiles(); - if (configFiles.contains(psiFile)) { - return model; - } - } - return null; - } - - @Nullable - public M getCombinedModel(@Nullable Module module) { - if (module == null) { - return null; - } - return myCombinedModelCache.getCachedValue(module); - } - - @Nullable - protected M computeCombinedModel(@NotNull Module module) { - final List models = getAllModels(module); - switch (models.size()) { - case 0: - return null; - case 1: - return models.get(0); - } - final Set configFiles = new LinkedHashSet(); - final LinkedHashSet> list = new LinkedHashSet>(models.size()); - for (M model: models) { - final Set files = model.getConfigFiles(); - for (XmlFile file: files) { - ContainerUtil.addIfNotNull(getDomRoot(file), list); - } - configFiles.addAll(files); - } - final DomFileElement mergedModel = getModelMerger().mergeModels(DomFileElement.class, list); - final M firstModel = models.get(0); - return createCombinedModel(configFiles, mergedModel, firstModel, module); - } - - /** - * Factory method to create combined model for given module. - * Used by {@link #computeCombinedModel(com.intellij.openapi.module.Module)}. - * - * @param configFiles file set including all files for all models returned by {@link #getAllModels(com.intellij.openapi.module.Module)}. - * @param mergedModel merged model for all models returned by {@link #getAllModels(com.intellij.openapi.module.Module)}. - * @param firstModel the first model returned by {@link #getAllModels(com.intellij.openapi.module.Module)}. - * @param module - * @return combined model. - */ - protected abstract M createCombinedModel(Set configFiles, DomFileElement mergedModel, M firstModel, final Module module); - - @NotNull - public Set getConfigFiles(@Nullable C context) { - if (context == null) { - return Collections.emptySet(); - } - final M model = getModel(context); - if (model == null) { - return Collections.emptySet(); - } - else { - return model.getConfigFiles(); - } - } - - @NotNull - public Set getAllConfigFiles(@NotNull Module module) { - final HashSet xmlFiles = new HashSet(); - for (M model: getAllModels(module)) { - xmlFiles.addAll(model.getConfigFiles()); - } - return xmlFiles; - } - - public List> getFileElements(M model) { - final ArrayList> list = new ArrayList>(model.getConfigFiles().size()); - for (XmlFile configFile: model.getConfigFiles()) { - final DomFileElement element = DomManager.getDomManager(configFile.getProject()).getFileElement(configFile, myClass); - if (element != null) { - list.add(element); - } - } - return list; - } - - public ModelMerger getModelMerger() { - return myModelMerger; - } - - public Class getClazz() { - return myClass; - } -} diff --git a/dom/openapi/src/com/intellij/util/xml/model/MultipleDomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/MultipleDomModelFactory.java new file mode 100644 index 0000000000..8b8d091ad6 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/MultipleDomModelFactory.java @@ -0,0 +1,23 @@ +package com.intellij.util.xml.model; + +import com.intellij.openapi.util.UserDataHolder; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.DomElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Set; + +/** + * User: Sergey.Vasiliev + */ +public interface MultipleDomModelFactory> { + @NotNull + List getAllModels(@NotNull Scope scope); + + Set getAllConfigFiles(@NotNull Scope scope); + + @Nullable + M getCombinedModel(@Nullable Scope scope); +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/SimpleModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/SimpleModelFactory.java new file mode 100644 index 0000000000..d893168759 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/SimpleModelFactory.java @@ -0,0 +1,21 @@ +package com.intellij.util.xml.model; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomElement; +import com.intellij.psi.xml.XmlFile; + +import java.util.Set; + +/** + * User: Sergey.Vasiliev + */ +public interface SimpleModelFactory> { + + @Nullable + M getModelByConfigFile(@Nullable XmlFile psiFile); + + @NotNull + DomFileElement createMergedModelRoot(Set configFiles); +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/impl/BaseDomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/impl/BaseDomModelFactory.java new file mode 100644 index 0000000000..3c51483872 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/BaseDomModelFactory.java @@ -0,0 +1,173 @@ +package com.intellij.util.xml.model.impl; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.UserDataHolder; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.ModelMerger; +import com.intellij.util.xml.model.DomModel; +import com.intellij.util.xml.model.MultipleDomModelFactory; +import com.intellij.util.xml.model.SimpleModelFactory; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * User: Sergey.Vasiliev + */ +public abstract class BaseDomModelFactory, C extends PsiElement> + extends DomModelFactoryHelper implements SimpleModelFactory, MultipleDomModelFactory { + + private Project myProject; + private SimpleModelFactory mySimpleDomModelFactory; + private MultipleDomModelFactory myMultipleDomModelFactory; + + protected BaseDomModelFactory(@NotNull Class aClass, @NotNull ModelMerger modelMerger, final Project project, @NonNls String name) { + super(aClass, modelMerger); + + myProject = project; + + mySimpleDomModelFactory = createSimpleModelFactory(aClass, modelMerger, project, name); + + myMultipleDomModelFactory = createMultipleDomModelFactory(aClass, modelMerger, project, name); + } + + protected abstract S getModelScope(final XmlFile file); + + @Nullable + protected abstract List computeAllModels(@NotNull S scope); + + protected abstract M createCombinedModel(Set configFiles, DomFileElement mergedModel, M firstModel, final S scope); + + @Nullable + public M getModel(@NotNull C context){ + final PsiFile psiFile = context.getContainingFile(); + if (psiFile instanceof XmlFile) { + return getModelByConfigFile((XmlFile)psiFile); + } + return null; + } + + @NotNull + public List getAllModels(@NotNull S scope) { + return myMultipleDomModelFactory.getAllModels(scope); + } + + @Nullable + public M getModelByConfigFile(@Nullable XmlFile psiFile) { + return mySimpleDomModelFactory.getModelByConfigFile(psiFile); + } + + @NotNull + public Object[] computeDependencies(@Nullable M model, @Nullable S scope) { + + final ArrayList dependencies = new ArrayList(); + final Set files; + if (model != null) { + files = model.getConfigFiles(); + dependencies.addAll(files); + } + else { + dependencies.add(PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); + } + if (scope != null) { + dependencies.add(ProjectRootManager.getInstance(getProject())); + } + return dependencies.toArray(new Object[dependencies.size()]); + } + + @Nullable + protected M computeModel(@NotNull XmlFile psiFile, @Nullable S scope) { + if (scope == null) { + return null; + } + final List models = getAllModels(scope); + for (M model : models) { + final Set configFiles = model.getConfigFiles(); + if (configFiles.contains(psiFile)) { + return model; + } + } + return null; + } + + @Nullable + public M getCombinedModel(@Nullable S scope) { + return myMultipleDomModelFactory.getCombinedModel(scope); + } + + @NotNull + public Set getAllConfigFiles(@NotNull S scope) { + return myMultipleDomModelFactory.getAllConfigFiles(scope); + } + + @NotNull + public DomFileElement createMergedModelRoot(final Set configFiles) { + return mySimpleDomModelFactory.createMergedModelRoot(configFiles); + } + + private CachedMultipleDomModelFactory createMultipleDomModelFactory(final Class aClass, + final ModelMerger modelMerger, + final Project project, + final String name) { + return new CachedMultipleDomModelFactory(aClass, modelMerger, project, name) { + public M getModel(@NotNull final C context) { + return BaseDomModelFactory.this.getModel(context); + } + + protected List computeAllModels(@NotNull final S scope) { + return BaseDomModelFactory.this.computeAllModels(scope); + } + + protected M createCombinedModel(final Set configFiles, + final DomFileElement mergedModel, + final M firstModel, + final S scope) { + return BaseDomModelFactory.this.createCombinedModel(configFiles, mergedModel, firstModel, scope); + } + + @NotNull + public Object[] computeDependencies(@Nullable final M model, @Nullable final S scope) { + return BaseDomModelFactory.this.computeDependencies(model, scope); + } + + public S getModelScope(@NotNull final XmlFile xmlFile) { + return BaseDomModelFactory.this.getModelScope(xmlFile); + } + }; + } + + private CachedSimpleDomModelFactory createSimpleModelFactory(final Class aClass, + final ModelMerger modelMerger, + final Project project, + final String name) { + return new CachedSimpleDomModelFactory(aClass, modelMerger, project, name) { + + protected M computeModel(@NotNull final XmlFile psiFile, @Nullable final S scope) { + return BaseDomModelFactory.this.computeModel(psiFile, scope); + } + + @NotNull + public Object[] computeDependencies(@Nullable final M model, @Nullable final S scope) { + return BaseDomModelFactory.this.computeDependencies(model, scope); + } + + public S getModelScope(@NotNull XmlFile file) { + return BaseDomModelFactory.this.getModelScope(file); + } + }; + } + + public Project getProject() { + return myProject; + } +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/impl/CachedDomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/impl/CachedDomModelFactory.java new file mode 100644 index 0000000000..caf15d3a99 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/CachedDomModelFactory.java @@ -0,0 +1,18 @@ +package com.intellij.util.xml.model.impl; + +import com.intellij.openapi.util.UserDataHolder; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.model.DomModel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: Sergey.Vasiliev + */ +public interface CachedDomModelFactory , Scope extends UserDataHolder> { + @NotNull + Object[] computeDependencies(@Nullable M model, @Nullable Scope scope); + + Scope getModelScope(@NotNull XmlFile xmlFile); +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/impl/CachedMultipleDomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/impl/CachedMultipleDomModelFactory.java new file mode 100644 index 0000000000..54692b5ede --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/CachedMultipleDomModelFactory.java @@ -0,0 +1,151 @@ +package com.intellij.util.xml.model.impl; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.UserDataHolder; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomManager; +import com.intellij.util.xml.ModelMerger; +import com.intellij.util.xml.model.DomModel; +import com.intellij.util.xml.model.DomModelCache; +import com.intellij.util.xml.model.MultipleDomModelFactory; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * User: Sergey.Vasiliev + */ +public abstract class CachedMultipleDomModelFactory, C extends PsiElement> + extends DomModelFactoryHelper + implements CachedDomModelFactory, MultipleDomModelFactory { + + private final DomModelCache myCombinedModelCache; + private final DomModelCache, Scope> myAllModelsCache; + + + protected CachedMultipleDomModelFactory(@NotNull Class aClass, + @NotNull ModelMerger modelMerger, + final Project project, + @NonNls String name) { + super(aClass,modelMerger); + + myCombinedModelCache = new DomModelCache(project, name + " combined model") { + @NotNull + protected CachedValueProvider.Result computeValue(@NotNull final Scope scope) { + final M combinedModel = computeCombinedModel(scope); + return new CachedValueProvider.Result(combinedModel, computeDependencies(combinedModel, scope)); + } + }; + + myAllModelsCache = new DomModelCache, Scope>(project, name + " models list") { + @NotNull + protected CachedValueProvider.Result> computeValue(@NotNull final Scope scope) { + final List models = computeAllModels(scope); + return new CachedValueProvider.Result>(models, computeDependencies(null, scope)); + } + }; + } + + @Nullable + public abstract M getModel(@NotNull C context); + + @NotNull + public List getAllModels(@NotNull Scope scope) { + + final List models = myAllModelsCache.getCachedValue(scope); + if (models == null) { + return Collections.emptyList(); + } + else { + return models; + } + } + + @Nullable + protected abstract List computeAllModels(@NotNull Scope scope); + + @Nullable + public M getCombinedModel(@Nullable Scope scope) { + if (scope == null) { + return null; + } + return myCombinedModelCache.getCachedValue(scope); + } + + @Nullable + protected M computeCombinedModel(@NotNull Scope scope) { + final List models = getAllModels(scope); + switch (models.size()) { + case 0: + return null; + case 1: + return models.get(0); + } + final Set configFiles = new LinkedHashSet(); + final LinkedHashSet> list = new LinkedHashSet>(models.size()); + for (M model: models) { + final Set files = model.getConfigFiles(); + for (XmlFile file: files) { + ContainerUtil.addIfNotNull(getDomRoot(file), list); + } + configFiles.addAll(files); + } + final DomFileElement mergedModel = getModelMerger().mergeModels(DomFileElement.class, list); + final M firstModel = models.get(0); + return createCombinedModel(configFiles, mergedModel, firstModel, scope); + } + + /** + * Factory method to create combined model for given module. + * Used by {@link #computeCombinedModel(com.intellij.openapi.module.Module)}. + * + * @param configFiles file set including all files for all models returned by {@link #getAllModels(com.intellij.openapi.module.Module)}. + * @param mergedModel merged model for all models returned by {@link #getAllModels(com.intellij.openapi.module.Module)}. + * @param firstModel the first model returned by {@link #getAllModels(com.intellij.openapi.module.Module)}. + * @param scope + * @return combined model. + */ + protected abstract M createCombinedModel(Set configFiles, DomFileElement mergedModel, M firstModel, final Scope scope); + + @NotNull + public Set getConfigFiles(@Nullable C context) { + if (context == null) { + return Collections.emptySet(); + } + final M model = getModel(context); + if (model == null) { + return Collections.emptySet(); + } + else { + return model.getConfigFiles(); + } + } + + @NotNull + public Set getAllConfigFiles(@NotNull Scope scope) { + final HashSet xmlFiles = new HashSet(); + for (M model: getAllModels(scope)) { + xmlFiles.addAll(model.getConfigFiles()); + } + return xmlFiles; + } + + public List> getFileElements(M model) { + final ArrayList> list = new ArrayList>(model.getConfigFiles().size()); + for (XmlFile configFile: model.getConfigFiles()) { + final DomFileElement element = DomManager.getDomManager(configFile.getProject()).getFileElement(configFile, myClass); + if (element != null) { + list.add(element); + } + } + return list; + } + + } diff --git a/dom/openapi/src/com/intellij/util/xml/model/impl/CachedSimpleDomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/impl/CachedSimpleDomModelFactory.java new file mode 100644 index 0000000000..2411ddac33 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/CachedSimpleDomModelFactory.java @@ -0,0 +1,56 @@ +package com.intellij.util.xml.model.impl; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.UserDataHolder; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.ModelMerger; +import com.intellij.util.xml.model.DomModel; +import com.intellij.util.xml.model.DomModelCache; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: Sergey.Vasiliev + */ +public abstract class CachedSimpleDomModelFactory, Scope extends UserDataHolder> extends + SimpleDomModelFactory + implements CachedDomModelFactory { + + private final DomModelCache myModelCache; + + protected CachedSimpleDomModelFactory(@NotNull Class aClass, + @NotNull ModelMerger modelMerger, + final Project project, + @NonNls String name) { + super(aClass, modelMerger); + + myModelCache = new DomModelCache(project, name + " model") { + @NotNull + protected CachedValueProvider.Result computeValue(@NotNull XmlFile file) { + final PsiFile originalFile = file.getOriginalFile(); + if (originalFile != null) { + file = (XmlFile)originalFile; + } + + final Scope scope = getModelScope(file); + final M model = computeModel(file, scope); + return new CachedValueProvider.Result(model, computeDependencies(model, scope)); + } + }; + } + + @Nullable + public M getModelByConfigFile(@Nullable XmlFile psiFile) { + if (psiFile == null) { + return null; + } + return myModelCache.getCachedValue(psiFile); + } + + @Nullable + protected abstract M computeModel(@NotNull XmlFile psiFile, @Nullable Scope scope); +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactory.java new file mode 100644 index 0000000000..aea98272ed --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactory.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2007 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.util.xml.model.impl; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomManager; +import com.intellij.util.xml.ModelMerger; +import com.intellij.util.xml.model.DomModel; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public abstract class DomModelFactory, C extends PsiElement> extends BaseDomModelFactory { + + protected DomModelFactory(@NotNull Class aClass, @NotNull ModelMerger modelMerger, final Project project, @NonNls String name) { + super(aClass, modelMerger, project, name); + } + + protected Module getModelScope(final XmlFile file) { + final Module module = ModuleUtil.findModuleForPsiElement(file); + + return module; + } + + @NotNull + public Set getConfigFiles(@Nullable C context) { + if (context == null) { + return Collections.emptySet(); + } + final M model = getModel(context); + if (model == null) { + return Collections.emptySet(); + } + else { + return model.getConfigFiles(); + } + } + + public List> getFileElements(M model) { + final ArrayList> list = new ArrayList>(model.getConfigFiles().size()); + for (XmlFile configFile : model.getConfigFiles()) { + final DomFileElement element = DomManager.getDomManager(configFile.getProject()).getFileElement(configFile, myClass); + if (element != null) { + list.add(element); + } + } + return list; + } +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactoryHelper.java b/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactoryHelper.java new file mode 100644 index 0000000000..25f9e6bc87 --- /dev/null +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelFactoryHelper.java @@ -0,0 +1,41 @@ +package com.intellij.util.xml.model.impl; + +import com.intellij.util.xml.ModelMerger; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomManager; +import com.intellij.util.xml.DomElement; +import com.intellij.psi.xml.XmlFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * User: Sergey.Vasiliev + */ +public class DomModelFactoryHelper { + protected final Class myClass; + protected final ModelMerger myModelMerger; + + public DomModelFactoryHelper(@NotNull Class aClass, @NotNull ModelMerger modelMerger) { + myClass = aClass; + myModelMerger = modelMerger; + } + + @Nullable + public T getDom(@NotNull XmlFile configFile) { + final DomFileElement element = getDomRoot(configFile); + return element == null ? null : element.getRootElement(); + } + + @Nullable + public DomFileElement getDomRoot(@NotNull XmlFile configFile) { + return DomManager.getDomManager(configFile.getProject()).getFileElement(configFile, myClass); + } + + public Class getDomModelClass() { + return myClass; + } + + public ModelMerger getModelMerger() { + return myModelMerger; + } +} diff --git a/dom/openapi/src/com/intellij/util/xml/model/DomModelImpl.java b/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelImpl.java similarity index 97% rename from dom/openapi/src/com/intellij/util/xml/model/DomModelImpl.java rename to dom/openapi/src/com/intellij/util/xml/model/impl/DomModelImpl.java index d8b3994846..497428601e 100644 --- a/dom/openapi/src/com/intellij/util/xml/model/DomModelImpl.java +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/DomModelImpl.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.intellij.util.xml.model; +package com.intellij.util.xml.model.impl; import com.intellij.psi.xml.XmlFile; import com.intellij.util.xml.DomElement; diff --git a/dom/openapi/src/com/intellij/util/xml/model/SimpleDomModelFactory.java b/dom/openapi/src/com/intellij/util/xml/model/impl/SimpleDomModelFactory.java similarity index 66% rename from dom/openapi/src/com/intellij/util/xml/model/SimpleDomModelFactory.java rename to dom/openapi/src/com/intellij/util/xml/model/impl/SimpleDomModelFactory.java index 03970f2efc..e61b9d698a 100644 --- a/dom/openapi/src/com/intellij/util/xml/model/SimpleDomModelFactory.java +++ b/dom/openapi/src/com/intellij/util/xml/model/impl/SimpleDomModelFactory.java @@ -14,42 +14,29 @@ * limitations under the License. */ -package com.intellij.util.xml.model; +package com.intellij.util.xml.model.impl; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.NotNull; import com.intellij.psi.xml.XmlFile; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomFileElement; -import com.intellij.util.xml.DomManager; import com.intellij.util.xml.ModelMerger; -import com.intellij.util.xml.DomElement; -import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.model.DomModel; +import com.intellij.util.xml.model.SimpleModelFactory; +import org.jetbrains.annotations.NotNull; -import java.util.Set; -import java.util.List; import java.util.ArrayList; +import java.util.List; +import java.util.Set; /** * @author Dmitry Avdeev */ -public class SimpleDomModelFactory { - protected final Class myClass; - protected final ModelMerger myModelMerger; +public abstract class SimpleDomModelFactory> extends DomModelFactoryHelper implements + SimpleModelFactory { public SimpleDomModelFactory(@NotNull Class aClass, @NotNull ModelMerger modelMerger) { - myClass = aClass; - myModelMerger = modelMerger; - } - - @Nullable - public T getDom(@NotNull XmlFile configFile) { - final DomFileElement element = getDomRoot(configFile); - return element == null ? null : element.getRootElement(); - } - - @Nullable - public DomFileElement getDomRoot(@NotNull XmlFile configFile) { - return DomManager.getDomManager(configFile.getProject()).getFileElement(configFile, myClass); + super(aClass, modelMerger); } @Deprecated @@ -64,6 +51,6 @@ public class SimpleDomModelFactory { for (XmlFile configFile : configFiles) { ContainerUtil.addIfNotNull(getDomRoot(configFile), configs); } - return myModelMerger.mergeModels(DomFileElement.class, configs); + return getModelMerger().mergeModels(DomFileElement.class, configs); } } -- 2.11.4.GIT