Java tutorial
/** * 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" }; }