001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.model.adapter;
016    
017    import com.liferay.portal.model.adapter.builder.ModelAdapterBuilder;
018    import com.liferay.portal.model.adapter.builder.ModelAdapterBuilderLocator;
019    import com.liferay.registry.Registry;
020    import com.liferay.registry.RegistryUtil;
021    import com.liferay.registry.ServiceTracker;
022    
023    import java.util.ArrayList;
024    import java.util.List;
025    
026    /**
027     * @author Mate Thurzo
028     */
029    public class ModelAdapterUtil {
030    
031            public static <T, V> List<V> adapt(
032                    List<T> adapteeModels, Class<T> adapteeModelClass,
033                    Class<V> adaptedModelClass) {
034    
035                    List<V> adaptedModels = new ArrayList<>();
036    
037                    for (T adapteeModel : adapteeModels) {
038                            adaptedModels.add(
039                                    adapt(adapteeModel, adapteeModelClass, adaptedModelClass));
040                    }
041    
042                    return adaptedModels;
043            }
044    
045            public static <T, V> List<V> adapt(
046                    List<T> adapteeModels, Class<V> adaptedModelClass) {
047    
048                    List<V> adaptedModels = new ArrayList<>();
049    
050                    for (T adapteeModel : adapteeModels) {
051                            adaptedModels.add(adapt(adapteeModel, adaptedModelClass));
052                    }
053    
054                    return adaptedModels;
055            }
056    
057            public static <T, V> V adapt(
058                    T adapteeModel, Class<T> adapteeModelClass,
059                    Class<V> adaptedModelClass) {
060    
061                    return doAdapt(adapteeModel, adapteeModelClass, adaptedModelClass);
062            }
063    
064            public static <T, V> V adapt(T adapteeModel, Class<V> adaptedModelClass) {
065                    Class<T> adapteeModelClass = (Class<T>)adapteeModel.getClass();
066    
067                    return doAdapt(adapteeModel, adapteeModelClass, adaptedModelClass);
068            }
069    
070            protected static <T, V> V doAdapt(
071                    T adapteeModel, Class<T> adapteeModelClass,
072                    Class<V> adaptedModelClass) {
073    
074                    ModelAdapterBuilderLocator modelAdapterBuilderLocator =
075                            _modelAdapterBuilderLocatorServiceTracker.getService();
076    
077                    if (modelAdapterBuilderLocator == null) {
078                            return null;
079                    }
080    
081                    ModelAdapterBuilder<T, V> modelAdapterBuilder =
082                            modelAdapterBuilderLocator.locate(
083                                    adapteeModelClass, adaptedModelClass);
084    
085                    return modelAdapterBuilder.build(adapteeModel);
086            }
087    
088            private static final
089                    ServiceTracker<ModelAdapterBuilderLocator, ModelAdapterBuilderLocator>
090                            _modelAdapterBuilderLocatorServiceTracker;
091    
092            static {
093                    Registry registry = RegistryUtil.getRegistry();
094    
095                    _modelAdapterBuilderLocatorServiceTracker = registry.trackServices(
096                            ModelAdapterBuilderLocator.class);
097    
098                    _modelAdapterBuilderLocatorServiceTracker.open();
099            }
100    
101    }