001/**
002 * Copyright 2010-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.common.util.tree;
017
018import static org.kuali.common.util.base.Precondition.checkNotNull;
019
020import com.google.common.base.Function;
021
022public final class NodeStringFunction<T> implements Function<Node<T>, String> {
023
024        public NodeStringFunction(Function<T, String> function) {
025                checkNotNull(function, "function");
026                this.function = function;
027        }
028
029        /**
030         * Convert the element contained in each node to a string by calling it's toString() method
031         */
032        public static <T> NodeStringFunction<T> create() {
033                return create(new ToStringFunction<T>());
034        }
035
036        /**
037         * Convert the element contained in each node to a string by invoking {@code function} on it
038         */
039        public static <T> NodeStringFunction<T> create(Function<T, String> function) {
040                return new NodeStringFunction<T>(function);
041        }
042
043        private final Function<T, String> function;
044
045        @Override
046        public String apply(Node<T> node) {
047                checkNotNull(node, "node");
048                checkNotNull(node.getElement(), "node.element");
049                return function.apply(node.getElement());
050        }
051
052        private static class ToStringFunction<T> implements Function<T, String> {
053
054                @Override
055                public String apply(T element) {
056                        checkNotNull(element, "element");
057                        return element.toString();
058                }
059        }
060
061}