jorgediazest.missingrefchecker.portlet.MissingReferencesCheckerPortlet.java Source code

Java tutorial

Introduction

Here is the source code for jorgediazest.missingrefchecker.portlet.MissingReferencesCheckerPortlet.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.missingrefchecker.portlet;

import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.model.Repository;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.UserPersonalSite;
import com.liferay.portal.kernel.service.ClassNameLocalServiceUtil;
import com.liferay.portal.kernel.util.JavaConstants;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.ResourceURL;

import jorgediazest.missingrefchecker.output.MissingRefCheckerOutput;
import jorgediazest.missingrefchecker.ref.MissingRefInfo;
import jorgediazest.missingrefchecker.ref.Reference;
import jorgediazest.missingrefchecker.ref.ReferenceUtil;

import jorgediazest.util.data.DataComparator;
import jorgediazest.util.data.DataComparatorMap;
import jorgediazest.util.model.Model;
import jorgediazest.util.model.ModelFactory;
import jorgediazest.util.model.ModelUtil;
import jorgediazest.util.modelquery.ModelQuery;
import jorgediazest.util.modelquery.ModelQueryFactory;
import jorgediazest.util.modelquery.ModelQueryFactory.DataComparatorFactory;
import jorgediazest.util.output.OutputUtils;

/**
 * Portlet implementation class MissingReferencesCheckerPortlet
 *
 * @author Jorge Daz
 */
public class MissingReferencesCheckerPortlet extends MVCPortlet {

    public static Map<Reference, Reference> calculateAttributeReferences(ModelQueryFactory queryFactory,
            List<Model> modelList, boolean ignoreEmptyModels) {

        Map<Reference, Reference> references = new TreeMap<Reference, Reference>();

        List<Reference> fileReferences;
        try {
            fileReferences = ReferenceUtil.getDefaultReferences(queryFactory, modelList, ignoreEmptyModels);
        } catch (IOException e) {
            _log.error("Error reading references.txt configuration: " + e.getMessage(), e);
            throw new RuntimeException(e);
        }

        for (Reference reference : fileReferences) {
            references.put(reference, reference);
        }

        return references;
    }

    public static List<MissingRefInfo> execute(ModelQueryFactory queryFactory, List<Model> modelList,
            boolean ignoreNullValues) {

        Map<Reference, Reference> references = calculateAttributeReferences(queryFactory, modelList, true);

        List<MissingRefInfo> listMissingRefInfo = new ArrayList<MissingRefInfo>();

        for (Reference reference : references.values()) {
            try {
                if (_log.isDebugEnabled()) {
                    _log.debug("Processing: " + reference);
                }

                Collection<String> missingReferences = reference.getMissingReferences(queryFactory,
                        ignoreNullValues);

                if ((missingReferences == null) || missingReferences.size() > 0) {
                    listMissingRefInfo.add(new MissingRefInfo(reference, missingReferences));
                }
            } catch (Throwable t) {
                _log.error("EXCEPTION: " + t.getClass() + " - " + t.getMessage(), t);
                listMissingRefInfo.add(new MissingRefInfo(reference, t));
            }
        }

        return listMissingRefInfo;
    }

    public static ModelQueryFactory getModelQueryFactory() throws Exception {
        ModelFactory modelFactory = new ModelFactory() {
            public Model getModelObject(String className) {
                if (UserPersonalSite.class.getName().equals(className)) {
                    className = User.class.getName();
                }

                return super.getModelObject(className);
            }
        };
        ModelQueryFactory queryFactory = new ModelQueryFactory(modelFactory);

        DataComparatorFactory dataComparatorFactory = new DataComparatorFactory() {

            protected DataComparator defaultComparator = new DataComparatorMap();

            @Override
            public DataComparator getDataComparator(ModelQuery query) {
                return defaultComparator;
            }

        };

        queryFactory.setDataComparatorFactory(dataComparatorFactory);
        return queryFactory;
    }

    @SuppressWarnings("unchecked")
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        PortletConfig portletConfig = (PortletConfig) renderRequest
                .getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);

        List<String> outputList = null;

        List<MissingRefInfo> listMissingRefInfo = (List<MissingRefInfo>) renderRequest
                .getAttribute("missingReferencesList");

        if (listMissingRefInfo != null) {
            outputList = MissingRefCheckerOutput.generateCSVOutputCheckReferences(portletConfig,
                    renderRequest.getLocale(), listMissingRefInfo);
        }

        Map<Reference, Reference> references = (Map<Reference, Reference>) renderRequest
                .getAttribute("referencesMap");

        if (references != null) {
            outputList = MissingRefCheckerOutput.generateCSVOutputMappingList(portletConfig,
                    renderRequest.getLocale(), references);
        }

        String outputScript = OutputUtils.listStringToString(outputList);

        FileEntry exportCsvFileEntry = null;

        try {
            InputStream inputStream = null;

            if (Validator.isNotNull(outputScript)) {
                inputStream = new ByteArrayInputStream(outputScript.getBytes(StringPool.UTF8));
            }

            String portletId = portletConfig.getPortletName();

            Repository repository = OutputUtils.getPortletRepository(portletId);

            OutputUtils.cleanupPortletFileEntries(repository, 8 * 60);

            long userId = PortalUtil.getUserId(renderRequest);

            String fileName = "missing-references_output_" + userId + "_" + System.currentTimeMillis() + ".csv";

            exportCsvFileEntry = OutputUtils.addPortletFileEntry(repository, inputStream, userId, fileName,
                    "text/plain");

            if (exportCsvFileEntry != null) {
                ResourceURL exportCsvResourceURL = renderResponse.createResourceURL();
                exportCsvResourceURL.setResourceID(exportCsvFileEntry.getTitle());
                renderRequest.setAttribute("exportCsvResourceURL", exportCsvResourceURL.toString());
            }
        } catch (Exception e) {
            _log.error(e, e);
        }

        super.doView(renderRequest, renderResponse);
    }

    public void executeCheckReferences(ActionRequest request, ActionResponse response) throws Exception {

        PortalUtil.copyRequestParameters(request, response);

        boolean ignoreNullValues = ParamUtil.getBoolean(request, "ignoreNullValues");

        List<String> classNames = ModelUtil
                .getClassNameValues(ClassNameLocalServiceUtil.getClassNames(QueryUtil.ALL_POS, QueryUtil.ALL_POS));
        long startTime = System.currentTimeMillis();

        ModelQueryFactory queryFactory = getModelQueryFactory();

        List<Model> modelList = getModelList(queryFactory, classNames);

        List<MissingRefInfo> listMissingRefInfo = execute(queryFactory, modelList, ignoreNullValues);

        long endTime = System.currentTimeMillis();

        request.setAttribute("missingReferencesList", listMissingRefInfo);

        response.setRenderParameter("processTime", "" + (endTime - startTime));
    }

    public void executeMappingList(ActionRequest request, ActionResponse response) throws Exception {

        PortalUtil.copyRequestParameters(request, response);

        List<String> classNames = ModelUtil
                .getClassNameValues(ClassNameLocalServiceUtil.getClassNames(QueryUtil.ALL_POS, QueryUtil.ALL_POS));
        long startTime = System.currentTimeMillis();

        ModelQueryFactory queryFactory = getModelQueryFactory();

        List<Model> modelList = getModelList(queryFactory, classNames);

        Map<Reference, Reference> references = calculateAttributeReferences(queryFactory, modelList, false);

        long endTime = System.currentTimeMillis();

        request.setAttribute("referencesMap", references);

        response.setRenderParameter("processTime", "" + (endTime - startTime));
    }

    public List<Model> getModelList(ModelQueryFactory queryFactory, List<String> classNames) {

        List<Model> modelList = new ArrayList<Model>();

        for (String className : classNames) {
            if (ignoreClassName(className)) {
                continue;
            }

            ModelQuery query = queryFactory.getModelQueryObject(className);

            if (query != null) {
                modelList.add(query.getModel());
            }
        }

        return modelList;
    }

    public boolean ignoreClassName(String className) {
        if (Validator.isNull(className)) {
            return true;
        }

        for (String ignoreClassName : ignoreClassNames) {
            if (ignoreClassName.equals(className)) {
                return true;
            }
        }

        return false;
    }

    public void serveResource(ResourceRequest request, ResourceResponse response)
            throws IOException, PortletException {

        PortletConfig portletConfig = (PortletConfig) request.getAttribute(JavaConstants.JAVAX_PORTLET_CONFIG);

        String resourceId = request.getResourceID();
        String portletId = portletConfig.getPortletName();

        OutputUtils.servePortletFileEntry(portletId, resourceId, response);
    }

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

    private static String[] ignoreClassNames = new String[] {
            "com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry",
            "com.liferay.portal.kernel.repository.model.FileEntry",
            "com.liferay.portal.kernel.repository.model.Folder", "com.liferay.portal.model.UserPersonalSite",
            "com.liferay.portal.model.SystemEvent" };

}