/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.graph;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.opengamma.util.ArgumentChecker;
/**
* Node decorator that composes other decorators.
*/
public final class CompositeNodeDecorator extends NodeDecorator {
/** Logger. */
private static final Logger s_logger = LoggerFactory.getLogger(CompositeNodeDecorator.class);
/**
* The underlying decorators.
*/
private final ImmutableList<NodeDecorator> _decorators;
//-------------------------------------------------------------------------
/**
* Composes a list of decorators.
*
* @param decorators the array of decorators, not null
* @return the composite decorators, not null
*/
public static NodeDecorator compose(NodeDecorator... decorators) {
ArgumentChecker.noNulls(decorators, "decorators");
switch (decorators.length) {
case 0:
return NodeDecorator.IDENTITY;
case 1:
return decorators[0];
default:
return new CompositeNodeDecorator(ImmutableList.copyOf(decorators));
}
}
/**
* Composes a list of decorators.
*
* @param decorators the list of decorators, not null
* @return the composite decorators, not null
*/
public static NodeDecorator compose(List<NodeDecorator> decorators) {
ArgumentChecker.noNulls(decorators, "decorators");
switch (decorators.size()) {
case 0:
return NodeDecorator.IDENTITY;
case 1:
return decorators.get(0);
default:
return new CompositeNodeDecorator(ImmutableList.copyOf(decorators));
}
}
//-------------------------------------------------------------------------
/**
* Creates an instance.
*
* @param decorators the decorators, not null
*/
private CompositeNodeDecorator(ImmutableList<NodeDecorator> decorators) {
_decorators = decorators.reverse();
}
//-------------------------------------------------------------------------
@Override
public FunctionModelNode decorateNode(FunctionModelNode node) {
FunctionModelNode wrappedNode = node;
for (NodeDecorator decorator : _decorators) {
wrappedNode = decorator.decorateNode(wrappedNode);
}
return wrappedNode;
}
}