blob: f1835d3ae44add0dc8908cfc471dae0534e66de2 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.start.graph;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
/**
* Basic Graph Node
* @param <T> the node type
*/
public abstract class Node<T>
{
/** The logical name of this Node */
private String logicalName;
/** The depth of the Node in the tree */
private int depth = 0;
/** The set of selections for how this node was selected */
private Set<Selection> selections = new LinkedHashSet<>();
/** Set of Nodes, by name, that this Node depends on */
private List<String> parentNames = new ArrayList<>();
/** Set of Nodes, by name, that this Node optionally depend on */
private List<String> optionalParentNames = new ArrayList<>();
/** The Edges to parent Nodes */
private Set<T> parentEdges = new LinkedHashSet<>();
/** The Edges to child Nodes */
private Set<T> childEdges = new LinkedHashSet<>();
public void addChildEdge(T child)
{
if (childEdges.contains(child))
{
// already present, skip
return;
}
this.childEdges.add(child);
}
public void addOptionalParentName(String name)
{
if (this.optionalParentNames.contains(name))
{
// skip, name already exists
return;
}
this.optionalParentNames.add(name);
}
public void addParentEdge(T parent)
{
if (parentEdges.contains(parent))
{
// already present, skip
return;
}
this.parentEdges.add(parent);
}
public void addParentName(String name)
{
if (this.parentNames.contains(name))
{
// skip, name already exists
return;
}
this.parentNames.add(name);
}
public void addSelection(Selection selection)
{
this.selections.add(selection);
}
public Set<T> getChildEdges()
{
return childEdges;
}
public int getDepth()
{
return depth;
}
@Deprecated
public String getLogicalName()
{
return logicalName;
}
public String getName()
{
return logicalName;
}
public List<String> getOptionalParentNames()
{
return optionalParentNames;
}
public Set<T> getParentEdges()
{
return parentEdges;
}
public List<String> getParentNames()
{
return parentNames;
}
public Set<Selection> getSelections()
{
return selections;
}
public Set<String> getSelectedCriteriaSet()
{
Set<String> criteriaSet = new HashSet<>();
for (Selection selection : selections)
{
criteriaSet.add(selection.getCriteria());
}
return criteriaSet;
}
public boolean isSelected()
{
return !selections.isEmpty();
}
public boolean matches(Predicate predicate)
{
return predicate.match(this);
}
public void setDepth(int depth)
{
this.depth = depth;
}
public void setName(String name)
{
this.logicalName = name;
}
public void setParentNames(List<String> parents)
{
this.parentNames.clear();
this.parentEdges.clear();
if (parents != null)
{
this.parentNames.addAll(parents);
}
}
public void setSelections(Set<Selection> selection)
{
this.selections = selection;
}
}