blob: c76186893b16110be8bea1ae42d99889a84ecfec [file] [log] [blame]
package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.jst.jsf.common.internal.policy.IdentifierOrderedIteratorPolicy;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
/**
* @author cbateman
*
* @param <TLDELEMENT>
*/
public class CompositeTagResolvingStrategy<TLDELEMENT> extends
AbstractTagResolvingStrategy<TLDELEMENT, String>
{
private static final String ID = "org.eclipse.jst.jsf.designtime.CompositeTagResolvingStrategy";
private final Map<String, ITagResolvingStrategy<TLDELEMENT, String>> _strategies;
private IdentifierOrderedIteratorPolicy<String> _policy;
/**
*
*/
public CompositeTagResolvingStrategy()
{
_strategies = new HashMap<String, ITagResolvingStrategy<TLDELEMENT, String>>();
}
@Override
public ITagElement resolve(final TLDELEMENT element)
{
// by default just go in the order added
Iterator<String> strategyIterator = _strategies.keySet().iterator();
if (_policy != null)
{
strategyIterator = _policy.getIterator(_strategies.keySet());
}
while (strategyIterator.hasNext())
{
final String key = strategyIterator.next();
final ITagResolvingStrategy<TLDELEMENT, String> strategy =
_strategies.get(key);
final ITagElement tagElement = strategy.resolve(element);
if (tagElement != strategy.getNotFoundIndicator())
{
return tagElement;
}
}
return getNotFoundIndicator();
}
/**
* Set the optional ordering policy. If set to non-null, then it will be
* used to decide order in which the strategies are executed.
*
* @param policy
*/
public void setOrderingPolicy(final IdentifierOrderedIteratorPolicy<String> policy)
{
_policy = policy;
}
/**
* Adds the strategy to the composite using the getId to judge uniqueness
* @param strategy
*/
public void addStrategy(final ITagResolvingStrategy<TLDELEMENT, String> strategy)
{
_strategies.put(strategy.getId(), strategy);
}
/**
* Remove the strategy corresponding to id.
*
* @param id
* @return the item removed or null
*/
public ITagResolvingStrategy<TLDELEMENT, String> removeStrategy(final String id)
{
return _strategies.remove(id);
}
@Override
public String getId()
{
return ID;
}
}