1 package com
.intellij
.util
.xml
.model
.impl
;
3 import com
.intellij
.openapi
.project
.Project
;
4 import com
.intellij
.openapi
.roots
.ProjectRootManager
;
5 import com
.intellij
.openapi
.util
.UserDataHolder
;
6 import com
.intellij
.psi
.PsiElement
;
7 import com
.intellij
.psi
.PsiFile
;
8 import com
.intellij
.psi
.util
.PsiModificationTracker
;
9 import com
.intellij
.psi
.xml
.XmlFile
;
10 import com
.intellij
.util
.xml
.DomElement
;
11 import com
.intellij
.util
.xml
.DomFileElement
;
12 import com
.intellij
.util
.xml
.ModelMerger
;
13 import com
.intellij
.util
.xml
.model
.DomModel
;
14 import com
.intellij
.util
.xml
.model
.MultipleDomModelFactory
;
15 import com
.intellij
.util
.xml
.model
.SimpleModelFactory
;
16 import org
.jetbrains
.annotations
.NonNls
;
17 import org
.jetbrains
.annotations
.NotNull
;
18 import org
.jetbrains
.annotations
.Nullable
;
20 import java
.util
.ArrayList
;
21 import java
.util
.List
;
25 * User: Sergey.Vasiliev
27 public abstract class BaseDomModelFactory
<S
extends UserDataHolder
, T
extends DomElement
, M
extends DomModel
<T
>, C
extends PsiElement
>
28 extends DomModelFactoryHelper
<T
> implements SimpleModelFactory
<T
, M
>, MultipleDomModelFactory
<S
, T
, M
> {
30 private Project myProject
;
31 private SimpleModelFactory
<T
,M
> mySimpleDomModelFactory
;
32 private MultipleDomModelFactory
<S
, T
, M
> myMultipleDomModelFactory
;
34 protected BaseDomModelFactory(@NotNull Class
<T
> aClass
, @NotNull ModelMerger modelMerger
, final Project project
, @NonNls String name
) {
35 super(aClass
, modelMerger
);
39 mySimpleDomModelFactory
= createSimpleModelFactory(aClass
, modelMerger
, project
, name
);
41 myMultipleDomModelFactory
= createMultipleDomModelFactory(aClass
, modelMerger
, project
, name
);
44 protected abstract S
getModelScope(final XmlFile file
);
47 protected abstract List
<M
> computeAllModels(@NotNull S scope
);
49 protected abstract M
createCombinedModel(Set
<XmlFile
> configFiles
, DomFileElement
<T
> mergedModel
, M firstModel
, final S scope
);
52 public M
getModel(@NotNull C context
){
53 final PsiFile psiFile
= context
.getContainingFile();
54 if (psiFile
instanceof XmlFile
) {
55 return getModelByConfigFile((XmlFile
)psiFile
);
61 public List
<M
> getAllModels(@NotNull S scope
) {
62 return myMultipleDomModelFactory
.getAllModels(scope
);
66 public M
getModelByConfigFile(@Nullable XmlFile psiFile
) {
67 return mySimpleDomModelFactory
.getModelByConfigFile(psiFile
);
71 public Object
[] computeDependencies(@Nullable M model
, @Nullable S scope
) {
73 final ArrayList
<Object
> dependencies
= new ArrayList
<Object
>();
74 final Set
<XmlFile
> files
;
76 files
= model
.getConfigFiles();
77 dependencies
.addAll(files
);
80 dependencies
.add(PsiModificationTracker
.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
);
83 dependencies
.add(ProjectRootManager
.getInstance(getProject()));
85 return dependencies
.toArray(new Object
[dependencies
.size()]);
89 protected M
computeModel(@NotNull XmlFile psiFile
, @Nullable S scope
) {
93 final List
<M
> models
= getAllModels(scope
);
94 for (M model
: models
) {
95 final Set
<XmlFile
> configFiles
= model
.getConfigFiles();
96 if (configFiles
.contains(psiFile
)) {
104 public M
getCombinedModel(@Nullable S scope
) {
105 return myMultipleDomModelFactory
.getCombinedModel(scope
);
109 public Set
<XmlFile
> getAllConfigFiles(@NotNull S scope
) {
110 return myMultipleDomModelFactory
.getAllConfigFiles(scope
);
114 public DomFileElement
<T
> createMergedModelRoot(final Set
<XmlFile
> configFiles
) {
115 return mySimpleDomModelFactory
.createMergedModelRoot(configFiles
);
118 private CachedMultipleDomModelFactory
<S
, T
, M
, C
> createMultipleDomModelFactory(final Class
<T
> aClass
,
119 final ModelMerger modelMerger
,
120 final Project project
,
122 return new CachedMultipleDomModelFactory
<S
, T
, M
, C
>(aClass
, modelMerger
, project
, name
) {
123 public M
getModel(@NotNull final C context
) {
124 return BaseDomModelFactory
.this.getModel(context
);
127 protected List
<M
> computeAllModels(@NotNull final S scope
) {
128 return BaseDomModelFactory
.this.computeAllModels(scope
);
131 protected M
createCombinedModel(final Set
<XmlFile
> configFiles
,
132 final DomFileElement
<T
> mergedModel
,
135 return BaseDomModelFactory
.this.createCombinedModel(configFiles
, mergedModel
, firstModel
, scope
);
139 public Object
[] computeDependencies(@Nullable final M model
, @Nullable final S scope
) {
140 return BaseDomModelFactory
.this.computeDependencies(model
, scope
);
143 public S
getModelScope(@NotNull final XmlFile xmlFile
) {
144 return BaseDomModelFactory
.this.getModelScope(xmlFile
);
149 private CachedSimpleDomModelFactory
<T
, M
, S
> createSimpleModelFactory(final Class
<T
> aClass
,
150 final ModelMerger modelMerger
,
151 final Project project
,
153 return new CachedSimpleDomModelFactory
<T
, M
, S
>(aClass
, modelMerger
, project
, name
) {
155 protected M
computeModel(@NotNull final XmlFile psiFile
, @Nullable final S scope
) {
156 return BaseDomModelFactory
.this.computeModel(psiFile
, scope
);
160 public Object
[] computeDependencies(@Nullable final M model
, @Nullable final S scope
) {
161 return BaseDomModelFactory
.this.computeDependencies(model
, scope
);
164 public S
getModelScope(@NotNull XmlFile file
) {
165 return BaseDomModelFactory
.this.getModelScope(file
);
170 public Project
getProject() {