package org.jboss.windup.config.tags;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import org.apache.commons.collections4.set.UnmodifiableSet;
/**
* Represents a tag. Determined by it's lowercased name.
* The structure is not a tree - a tag may have multiple parents.
*
* @author Ondrej Zizka
*/
public final class Tag
{
private final String name;
/**
* Keeps the "contains" relation.
*/
private final Set<Tag> containedTags = new HashSet<>();
private final Set<Tag> parentTags = new HashSet<>();
private boolean isRoot = false;
private boolean isPseudo = false;
private String color = null;
private String title = null;
Tag(String name)
{
if( name == null )
throw new IllegalArgumentException("Tag name must not be null.");
this.name = name.toLowerCase();
}
public String getName()
{
return name;
}
public Set<Tag> getContainedTags()
{
return UnmodifiableSet.unmodifiableSet(containedTags);
}
public Set<Tag> getParentTags()
{
return UnmodifiableSet.unmodifiableSet(parentTags);
}
/**
* Loops are not checked here.
*/
public void addContainedTag(Tag tag)
{
this.containedTags.add(tag);
tag.parentTags.add(this);
}
/**
* Loops are not checked here.
*/
public void addContainingTag(Tag tag)
{
this.parentTags.add(tag);
tag.containedTags.add(this);
}
@Override
public int hashCode()
{
return this.name.hashCode();
}
@Override
public boolean equals(Object obj)
{
if( obj == null )
return false;
if( getClass() != obj.getClass() )
return false;
final Tag other = (Tag) obj;
if( !Objects.equals(this.name, other.name) )
return false;
return true;
}
public boolean isRoot()
{
return this.isRoot;
}
public void setIsRoot(boolean isRoot)
{
this.isRoot = isRoot;
}
public boolean isPseudo()
{
return isPseudo;
}
public void setPseudo(boolean isPseudo)
{
this.isPseudo = isPseudo;
}
public String getColor()
{
return color;
}
public void setColor(String color)
{
this.color = color;
}
public String getTitleOrName()
{
return title != null ? title : name;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
}