484aad25f966b0f28819b0bbc5576dd763409ecf
[idea/community.git] / plugins / ant / src / com / intellij / lang / ant / dom / AntDomElement.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.lang.ant.dom;
17
18 import com.intellij.lang.ant.AntSupport;
19 import com.intellij.lang.ant.config.AntConfigurationBase;
20 import com.intellij.openapi.util.Key;
21 import com.intellij.psi.PsiFile;
22 import com.intellij.psi.xml.XmlElement;
23 import com.intellij.psi.xml.XmlFile;
24 import com.intellij.psi.xml.XmlTag;
25 import com.intellij.util.xml.*;
26
27 import java.util.Collections;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.NoSuchElementException;
31
32 /**
33  * @author Eugene Zhuravlev
34  */
35 public abstract class AntDomElement implements DomElement {
36   public enum Role {
37     TASK, DATA_TYPE
38   }
39   public static final Key<Role> ROLE = Key.create("element_role");
40
41   @Attribute("id")
42   public abstract GenericAttributeValue<String> getId();
43
44   @Attribute("refid")
45   @Convert(value = AntDomRefIdConverter.class)
46   public abstract GenericAttributeValue<AntDomElement> getRefId();
47
48   public final AntDomProject getAntProject() {
49     return getParentOfType(AntDomProject.class, false);
50   }
51
52   public final AntDomProject getContextAntProject() {
53     final AntConfigurationBase antConfig = AntConfigurationBase.getInstance(getManager().getProject());
54     final XmlElement xmlElement = getXmlElement();
55     if (xmlElement == null) {
56       return getAntProject();
57     }
58     PsiFile containingFile = xmlElement.getContainingFile();
59     if (containingFile != null) {
60       containingFile = containingFile.getOriginalFile();
61     }
62     if (!(containingFile instanceof XmlFile)) {
63       return getAntProject();
64     }
65     final XmlFile contextFile = antConfig.getEffectiveContextFile(((XmlFile)containingFile));
66     if (contextFile == null) {
67       return getAntProject();
68     }
69     return AntSupport.getAntDomProject(contextFile);
70   }
71
72   /*
73   public final List<AntDomElement> getAntChildren() {
74     final List<DomElement> children = DomUtil.getDefinedChildren(this, true, false);
75     final int size = children.size();
76     if (size == 0) {
77       return Collections.emptyList();
78     }
79     final List<AntDomElement> antChildren = new ArrayList<AntDomElement>(size);
80     for (DomElement child : children) {
81       if (child instanceof AntDomElement) {
82         antChildren.add((AntDomElement)child);
83       }
84     }
85     return antChildren;
86   }
87   */
88
89   public final Iterator<AntDomElement> getAntChildrenIterator() {
90     final List<DomElement> children = DomUtil.getDefinedChildren(this, true, false);
91     if (children.size() == 0) {
92       return Collections.<AntDomElement>emptyList().iterator();
93     }
94     final Iterator<DomElement> it = children.iterator();
95     return new Iterator<AntDomElement>() {
96       private DomElement myUnprocessedElement;
97       @Override
98       public boolean hasNext() {
99         findNextAntElement();
100         return myUnprocessedElement != null;
101       }
102
103       @Override
104       public AntDomElement next() {
105         findNextAntElement();
106         if (myUnprocessedElement == null) {
107           throw new NoSuchElementException();
108         }
109         final AntDomElement antElement = (AntDomElement)myUnprocessedElement;
110         myUnprocessedElement = null;
111         return antElement;
112       }
113
114       private void findNextAntElement() {
115         if (myUnprocessedElement != null) {
116           return;
117         }
118         do {
119           if (!it.hasNext()) {
120             break;
121           }
122           myUnprocessedElement = it.next();
123         }
124         while (!(myUnprocessedElement instanceof AntDomElement));
125       }
126
127       @Override
128       public void remove() {
129         throw new UnsupportedOperationException("remove");
130       }
131     };
132   }
133
134   public final boolean isTask() {
135     return Role.TASK.equals(getChildDescription().getUserData(ROLE));
136   }
137
138   public final boolean isDataType() {
139     return Role.DATA_TYPE.equals(getChildDescription().getUserData(ROLE));
140   }
141
142   public String toString() {
143     final XmlTag tag = getXmlTag();
144     if (tag == null) {
145       return super.toString();
146     }
147     final String name = tag.getName();
148     if ("".equals(name)) {
149       return super.toString();
150     }
151     return name;
152   }
153
154 }