blob: e67e996c916671f5578da34b23fcb71b2395cb66 [file] [log] [blame]
/*
* 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.lang.ant.dom;
import com.intellij.lang.ant.AntSupport;
import com.intellij.lang.ant.config.AntConfigurationBase;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.xml.*;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
/**
* @author Eugene Zhuravlev
* Date: Apr 6, 2010
*/
@SuppressWarnings({"AbstractClassNeverImplemented"})
public abstract class AntDomElement implements DomElement {
public static enum Role {
TASK, DATA_TYPE
}
public static final Key<Role> ROLE = Key.create("element_role");
@Attribute("id")
public abstract GenericAttributeValue<String> getId();
@Attribute("refid")
@Convert(value = AntDomRefIdConverter.class)
public abstract GenericAttributeValue<AntDomElement> getRefId();
public final AntDomProject getAntProject() {
return getParentOfType(AntDomProject.class, false);
}
public final AntDomProject getContextAntProject() {
final AntConfigurationBase antConfig = AntConfigurationBase.getInstance(getManager().getProject());
final XmlElement xmlElement = getXmlElement();
if (xmlElement == null) {
return getAntProject();
}
PsiFile containingFile = xmlElement.getContainingFile();
if (containingFile != null) {
containingFile = containingFile.getOriginalFile();
}
if (!(containingFile instanceof XmlFile)) {
return getAntProject();
}
final XmlFile contextFile = antConfig.getEffectiveContextFile(((XmlFile)containingFile));
if (contextFile == null) {
return getAntProject();
}
return AntSupport.getAntDomProject(contextFile);
}
/*
public final List<AntDomElement> getAntChildren() {
final List<DomElement> children = DomUtil.getDefinedChildren(this, true, false);
final int size = children.size();
if (size == 0) {
return Collections.emptyList();
}
final List<AntDomElement> antChildren = new ArrayList<AntDomElement>(size);
for (DomElement child : children) {
if (child instanceof AntDomElement) {
antChildren.add((AntDomElement)child);
}
}
return antChildren;
}
*/
public final Iterator<AntDomElement> getAntChildrenIterator() {
final List<DomElement> children = DomUtil.getDefinedChildren(this, true, false);
if (children.size() == 0) {
return Collections.<AntDomElement>emptyList().iterator();
}
final Iterator<DomElement> it = children.iterator();
return new Iterator<AntDomElement>() {
private DomElement myUnprocessedElement;
public boolean hasNext() {
findNextAntElement();
return myUnprocessedElement != null;
}
public AntDomElement next() {
findNextAntElement();
if (myUnprocessedElement == null) {
throw new NoSuchElementException();
}
final AntDomElement antElement = (AntDomElement)myUnprocessedElement;
myUnprocessedElement = null;
return antElement;
}
private void findNextAntElement() {
if (myUnprocessedElement != null) {
return;
}
do {
if (!it.hasNext()) {
break;
}
myUnprocessedElement = it.next();
}
while (!(myUnprocessedElement instanceof AntDomElement));
}
public void remove() {
throw new UnsupportedOperationException("remove");
}
};
}
public final boolean isTask() {
return Role.TASK.equals(getChildDescription().getUserData(ROLE));
}
public final boolean isDataType() {
return Role.DATA_TYPE.equals(getChildDescription().getUserData(ROLE));
}
public String toString() {
final XmlTag tag = getXmlTag();
if (tag == null) {
return super.toString();
}
final String name = tag.getName();
if ("".equals(name)) {
return super.toString();
}
return name;
}
}