/** * Copyright (c) 2000-present Liferay, Inc. 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 com.liferay.knowledge.base.service.util; import com.liferay.knowledge.base.constants.KBArticleConstants; import com.liferay.knowledge.base.model.KBArticle; import com.liferay.knowledge.base.service.KBArticleLocalServiceUtil; import com.liferay.knowledge.base.service.KBArticleServiceUtil; import com.liferay.knowledge.base.util.comparator.KBArticleVersionComparator; import com.liferay.portal.kernel.bean.BeanPropertiesUtil; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.diff.DiffHtmlUtil; import com.liferay.portal.kernel.diff.DiffVersion; import com.liferay.portal.kernel.diff.DiffVersionsInfo; import com.liferay.portal.kernel.io.unsync.UnsyncStringReader; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.workflow.WorkflowConstants; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.htmlparser.jericho.Attribute; import net.htmlparser.jericho.Attributes; import net.htmlparser.jericho.Element; import net.htmlparser.jericho.OutputDocument; import net.htmlparser.jericho.Source; /** * @author Peter Shin * @author Brian Wing Shun Chan */ public class AdminUtil { public static String[] escapeSections(String[] sections) { if (ArrayUtil.isEmpty(sections)) { return new String[0]; } sections = ArrayUtil.clone(sections); for (int i = 0; i < sections.length; i++) { sections[i] = StringPool.UNDERLINE.concat(sections[i]).concat( StringPool.UNDERLINE); } return sections; } public static DiffVersionsInfo getDiffVersionsInfo( long groupId, long kbArticleResourcePrimKey, int sourceVersion, int targetVersion) { double previousVersion = 0; double nextVersion = 0; List<KBArticle> kbArticles = KBArticleServiceUtil.getKBArticleVersions( groupId, kbArticleResourcePrimKey, WorkflowConstants.STATUS_APPROVED, QueryUtil.ALL_POS, QueryUtil.ALL_POS, new KBArticleVersionComparator()); for (KBArticle curKBArticle : kbArticles) { if ((curKBArticle.getVersion() < sourceVersion) && (curKBArticle.getVersion() > previousVersion)) { previousVersion = curKBArticle.getVersion(); } if ((curKBArticle.getVersion() > targetVersion) && ((curKBArticle.getVersion() < nextVersion) || (nextVersion == 0))) { nextVersion = curKBArticle.getVersion(); } } List<DiffVersion> diffVersions = new ArrayList<>(); for (KBArticle curKBArticle : kbArticles) { DiffVersion diffVersion = new DiffVersion( curKBArticle.getUserId(), curKBArticle.getVersion(), curKBArticle.getModifiedDate()); diffVersions.add(diffVersion); } return new DiffVersionsInfo(diffVersions, nextVersion, previousVersion); } public static String getKBArticleDiff( long resourcePrimKey, int sourceVersion, int targetVersion, String param) throws Exception { if (sourceVersion < KBArticleConstants.DEFAULT_VERSION) { sourceVersion = KBArticleConstants.DEFAULT_VERSION; } if (sourceVersion == targetVersion) { KBArticle kbArticle = KBArticleLocalServiceUtil.getKBArticle( resourcePrimKey, targetVersion); return BeanPropertiesUtil.getString(kbArticle, param); } KBArticle sourceKBArticle = KBArticleLocalServiceUtil.getKBArticle( resourcePrimKey, sourceVersion); KBArticle targetKBArticle = KBArticleLocalServiceUtil.getKBArticle( resourcePrimKey, targetVersion); String sourceHtml = BeanPropertiesUtil.getString( sourceKBArticle, param); String targetHtml = BeanPropertiesUtil.getString( targetKBArticle, param); String diff = DiffHtmlUtil.diff( new UnsyncStringReader(sourceHtml), new UnsyncStringReader(targetHtml)); Source source = new Source(diff); OutputDocument outputDocument = new OutputDocument(source); for (Element element : source.getAllElements()) { StringBundler sb = new StringBundler(4); Attributes attributes = element.getAttributes(); if (attributes == null) { continue; } Attribute changeTypeAttribute = attributes.get("changeType"); if (changeTypeAttribute != null) { String changeTypeValue = changeTypeAttribute.getValue(); if (changeTypeValue.contains("diff-added-image")) { sb.append("border: 10px solid #CFC; "); } else if (changeTypeValue.contains("diff-changed-image")) { sb.append("border: 10px solid #C6C6FD; "); } else if (changeTypeValue.contains("diff-removed-image")) { sb.append("border: 10px solid #FDC6C6; "); } } Attribute classAttribute = attributes.get("class"); if (classAttribute != null) { String classValue = classAttribute.getValue(); if (classValue.contains("diff-html-added")) { sb.append("background-color: #CFC; "); } else if (classValue.contains("diff-html-changed")) { sb.append("background-color: #C6C6FD; "); } else if (classValue.contains("diff-html-removed")) { sb.append("background-color: #FDC6C6; "); sb.append("text-decoration: line-through; "); } } if (Validator.isNull(sb.toString())) { continue; } Attribute styleAttribute = attributes.get("style"); if (styleAttribute != null) { sb.append(GetterUtil.getString(styleAttribute.getValue())); } Map<String, String> map = outputDocument.replace(attributes, false); map.put("style", sb.toString()); } return outputDocument.toString(); } public static String[] unescapeSections(String sections) { String[] sectionsArray = StringUtil.split(sections); for (int i = 0; i < sectionsArray.length; i++) { String section = sectionsArray[i]; if (StringUtil.startsWith(section, StringPool.UNDERLINE) && StringUtil.endsWith(section, StringPool.UNDERLINE)) { sectionsArray[i] = section.substring(1, section.length() - 1); } } return sectionsArray; } }