jorgediazest.util.model.ModelFactory.java Source code

Java tutorial

Introduction

Here is the source code for jorgediazest.util.model.ModelFactory.java

Source

/**
 * Copyright (c) 2015-present Jorge Daz All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package jorgediazest.util.model;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import jorgediazest.util.data.DataComparator;
import jorgediazest.util.data.DataModelComparator;
import jorgediazest.util.reflection.ReflectionUtil;
import jorgediazest.util.service.Service;
import jorgediazest.util.service.ServiceUtil;

/**
 * @author Jorge Daz
 */
public class ModelFactory {

    public ModelFactory() {
        this(null, null);
    }

    public ModelFactory(Class<? extends Model> defaultModelClass) {
        this(defaultModelClass, null);
    }

    public ModelFactory(Class<? extends Model> defaultModelClass,
            Map<String, Class<? extends Model>> modelClassMap) {

        if (defaultModelClass == null) {
            this.defaultModelClass = DefaultModel.class;
        } else {
            this.defaultModelClass = defaultModelClass;
        }

        this.modelClassMap = modelClassMap;

        fillHandlerPortletIdMap();
    }

    public ModelFactory(Map<String, Class<? extends Model>> modelClassMap) {
        this(null, modelClassMap);
    }

    public DataComparatorFactory getDataComparatorFactory() {
        return dataComparatorFactory;
    }

    public List<ClassLoader> getModelFactoryClassLoaders() {
        if (modelFactoryClassLoaders == null) {
            modelFactoryClassLoaders = ModelUtil.getClassLoaders();
        }
        return modelFactoryClassLoaders;
    }

    public Map<String, Model> getModelMap(Collection<String> classNames) {
        Map<String, Model> modelMap = new LinkedHashMap<>();

        for (String classname : classNames) {
            if (Validator.isNull(classname) || !classname.contains(".model.")) {
                continue;
            }

            Model model = getModelObject(classname);

            if (model != null) {
                modelMap.put(model.getName(), model);
            }
        }

        return modelMap;
    }

    public Model getModelObject(Class<?> clazz) {
        return getModelObject(getModelFactoryClassLoaders(), clazz);
    }

    public final Model getModelObject(ClassLoader classLoader, Class<?> clazz) {
        return getModelObject(classLoader, clazz.getName());
    }

    public final Model getModelObject(ClassLoader classLoader, String className) {

        String classPackageName = StringPool.BLANK;
        String classSimpleName = className;

        int pos = className.lastIndexOf(".");

        if (pos > 0) {
            classPackageName = className.substring(0, pos);
            classSimpleName = className.substring(pos + 1, className.length());
        }

        return getModelObject(classLoader, classPackageName, classSimpleName);
    }

    public Model getModelObject(ClassLoader classLoader, String classPackageName, String classSimpleName) {

        Service service = ServiceUtil.getService(classLoader, classPackageName, classSimpleName);

        if (service == null) {
            return null;
        }

        return getModelObject(classPackageName, classSimpleName, service);
    }

    public final Model getModelObject(List<ClassLoader> classLoaders, Class<?> clazz) {

        return getModelObject(classLoaders, clazz.getName());
    }

    public Model getModelObject(List<ClassLoader> classLoaders, String className) {

        String classPackageName = StringPool.BLANK;
        String classSimpleName = className;

        int pos = className.lastIndexOf(".");

        if (pos > 0) {
            classPackageName = className.substring(0, pos);
            classSimpleName = className.substring(pos + 1, className.length());
        }

        try {
            Model model = this.getModelObjectFromOSGI(classPackageName, classSimpleName);

            if ((model != null) && (model.getAttributesName() != null)) {
                return model;
            }
        } catch (Exception e) {
            traceException(className, e);
        }

        try {
            Model model = this.getModelObjectFromPortal(classPackageName, classSimpleName);

            if ((model != null) && (model.getAttributesName() != null)) {
                return model;
            }
        } catch (Exception e) {
            traceException(className, e);
        }

        for (ClassLoader classLoader : classLoaders) {
            try {
                Model model = this.getModelObject(classLoader, classPackageName, classSimpleName);

                if ((model != null) && (model.getAttributesName() != null)) {
                    return model;
                }
            } catch (Exception e) {
                traceException(className, e);
            }
        }

        if (_log.isWarnEnabled()) {
            _log.warn("Model object " + className + " was not found");
        }

        return null;
    }

    public Model getModelObject(String className) {
        return getModelObject(getModelFactoryClassLoaders(), className);
    }

    public Model getModelObject(String classPackageName, String classSimpleName, Service service) {

        String className = classPackageName + "." + classSimpleName;

        Class<? extends Model> modelClass = this.defaultModelClass;

        if ((this.modelClassMap != null) && this.modelClassMap.containsKey(className)) {

            modelClass = this.modelClassMap.get(className);
        }

        Model model = null;
        try {
            model = (Model) modelClass.newInstance();

            model.setModelFactory(this);

            model.init(classPackageName, classSimpleName, service, dataComparatorFactory);
        } catch (Exception e) {
            if (_log.isDebugEnabled()) {
                Class ec = e.getClass();

                _log.debug("getModelObject(" + className + ") EXCEPTION " + ec.getName() + ": " + e.getMessage());
            }

            throw new RuntimeException(e);
        }

        return model;
    }

    public Set<Portlet> getPortletSet(Object handler) {
        Object handlerAux = ReflectionUtil.unWrapProxy(handler);

        if (handlerAux == null) {
            return new HashSet<>();
        }

        Class handlerAuxClass = handlerAux.getClass();
        if (!handlerPortletMap.containsKey(handlerAuxClass.getName())) {
            return new HashSet<>();
        }

        return handlerPortletMap.get(handlerAuxClass.getName());
    }

    public void setDataComparatorFactory(DataComparatorFactory dataComparatorFactory) {

        this.dataComparatorFactory = dataComparatorFactory;
    }

    public interface DataComparatorFactory {

        public DataComparator getDataComparator(Model model);

    }

    protected void fillHandlerPortletIdMap() {
        for (Portlet portlet : PortletLocalServiceUtil.getPortlets()) {
            addHandlersToMap(portlet.getIndexerClasses(), portlet);
            addHandlersToMap(portlet.getStagedModelDataHandlerClasses(), portlet);
            addHandlersToMap(portlet.getTrashHandlerClasses(), portlet);
            addHandlersToMap(portlet.getWorkflowHandlerClasses(), portlet);
        }
    }

    protected final Model getModelObjectFromOSGI(String classPackageName, String classSimpleName) {

        Service service = ServiceUtil.getServiceFromOSGI(classPackageName, classSimpleName);

        if (service == null) {
            return null;
        }

        return getModelObject(classPackageName, classSimpleName, service);
    }

    protected final Model getModelObjectFromPortal(Class<?> clazz) {
        return getModelObjectFromPortal(clazz.getName());
    }

    protected final Model getModelObjectFromPortal(String className) {
        String classPackageName = StringPool.BLANK;
        String classSimpleName = className;

        int pos = className.lastIndexOf(".");

        if (pos > 0) {
            classPackageName = className.substring(0, pos);
            classSimpleName = className.substring(pos + 1, className.length());
        }

        return getModelObjectFromPortal(classPackageName, classSimpleName);
    }

    protected final Model getModelObjectFromPortal(String classPackageName, String classSimpleName) {

        Service service = ServiceUtil.getServiceFromPortal(classPackageName, classSimpleName);

        if (service == null) {
            return null;
        }

        return getModelObject(classPackageName, classSimpleName, service);
    }

    protected void traceException(String className, Exception e) {
        if (_log.isDebugEnabled()) {
            Class ec = e.getClass();

            _log.debug("Cannot get model object of " + className + " EXCEPTION: " + ec.getName() + ": "
                    + e.getMessage());
        }

        if (_log.isTraceEnabled()) {
            _log.trace(e, e);
        }
    }

    protected DataComparatorFactory dataComparatorFactory = new DataComparatorFactory() {

        protected DataComparator dataComparator = new DataModelComparator(
                new String[] { "createDate", "status", "version", "name", "title", "description", "size" });

        @Override
        public DataComparator getDataComparator(Model model) {
            return dataComparator;
        }

    };

    protected Class<? extends Model> defaultModelClass = null;
    protected Map<String, Set<Portlet>> handlerPortletMap = new HashMap<>();
    protected Map<String, Class<? extends Model>> modelClassMap = null;
    protected List<ClassLoader> modelFactoryClassLoaders = null;

    private void addHandlersToMap(List<String> handlerList, Portlet portlet) {
        for (String handler : handlerList) {
            if (!handlerPortletMap.containsKey(handler)) {
                handlerPortletMap.put(handler, new HashSet<Portlet>());
            }

            Set<Portlet> portletSet = handlerPortletMap.get(handler);

            if (!portletSet.contains(portlet)) {
                portletSet.add(portlet);

                if (_log.isDebugEnabled()) {
                    _log.debug("Adding: " + handler + " portlet " + portlet);
                }
            }
        }
    }

    private static Log _log = LogFactoryUtil.getLog(ModelFactory.class);

}