/*
* 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 org.napile.idea.thermit.dom;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import org.napile.idea.thermit.ThermitSupport;
import org.napile.idea.thermit.config.ThermitConfigurationBase;
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.Attribute;
import com.intellij.util.xml.Convert;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomUtil;
import com.intellij.util.xml.GenericAttributeValue;
/**
* @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 ThermitConfigurationBase antConfig = ThermitConfigurationBase.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 ThermitSupport.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;
}
}