001/**
002 * Copyright 2005-2015 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.rice.krms.api.repository;
017
018import java.lang.reflect.InvocationTargetException;
019import java.util.ArrayList;
020import java.util.Collections;
021import java.util.HashSet;
022import java.util.List;
023import java.util.Set;
024
025import org.apache.commons.collections.CollectionUtils;
026import org.kuali.rice.core.api.exception.RiceRuntimeException;
027import org.kuali.rice.core.api.mo.ModelBuilder;
028import org.kuali.rice.core.api.mo.ModelObjectComplete;
029
030/**
031 * Utilities for implementing {@link ModelBuilder}s more easily.
032 * 
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 *
035 */
036public class BuilderUtils {
037        
038        private static final String COULDNT_INVOKE_BUILDER_CREATE = "couldn't invoke Builder.create()";
039
040
041        @SuppressWarnings("unchecked")
042        public static <B> List<B> convertFromBuilderList(List<? extends ModelBuilder> toConvert) {
043                if (CollectionUtils.isEmpty(toConvert)) {
044                        return Collections.emptyList();
045                } else {
046                        List<B> results = new ArrayList<B>(toConvert.size());
047                        for (ModelBuilder elem : toConvert) {
048                                results.add((B)elem.build());
049                        }
050                        return Collections.unmodifiableList(results);
051                }
052        } 
053        
054        @SuppressWarnings("unchecked")
055        public static <B> Set<B> convertFromBuilderSet(Set<? extends ModelBuilder> toConvert) {
056                if (CollectionUtils.isEmpty(toConvert)) {
057                        return Collections.emptySet();
058                } else {
059                        Set<B> results = new HashSet<B>(toConvert.size());
060                        for (ModelBuilder elem : toConvert) {
061                                results.add((B)elem.build());
062                        }
063                        return Collections.unmodifiableSet(results);
064                }
065        } 
066        
067        /**
068         * This method is useful for converting a List&lt;? extends BlahContract&gt; to a 
069         * List&lt;Blah.Builder&gt;.  You'll just need to implement Transformer to use it.
070         * 
071         * @param <A>
072         * @param <B>
073         * @param toConvert
074         * @param xform
075         * @return
076         */
077        public static <A,B> List<B> transform(List<? extends A> toConvert, Transformer<A,B> xform) {
078                if (CollectionUtils.isEmpty(toConvert)) {
079                        return new ArrayList<B>();
080                } else {
081                        List<B> results = new ArrayList<B>(toConvert.size());
082                        for (A elem : toConvert) {
083                                results.add(xform.transform(elem));
084                        }
085                        return results;
086                }
087        }
088        
089        public static <A,B> Set<B> transform(Set<? extends A> toConvert, Transformer<A,B> xform) {
090                if (CollectionUtils.isEmpty(toConvert)) {
091                        return new HashSet<B>();
092                } else {
093                        Set<B> results = new HashSet<B>(toConvert.size());
094                        for (A elem : toConvert) {
095                                results.add(xform.transform(elem));
096                        }
097                        return results;
098                }
099        }
100        
101        public interface Transformer<A,B> {
102                public B transform(A input);
103        }
104        
105}