All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.source.formatter.check.JavaUpgradeModelPermissionsCheck Maven / Gradle / Ivy

There is a newer version: 1.0.1437
Show newest version
/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.source.formatter.check;

import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.source.formatter.check.util.SourceUtil;
import com.liferay.source.formatter.parser.JavaTerm;

import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Michael Cavalcanti
 */
public class JavaUpgradeModelPermissionsCheck extends BaseJavaTermCheck {

	@Override
	protected String doProcess(
			String fileName, String absolutePath, JavaTerm javaTerm,
			String fileContent)
		throws Exception {

		List importNames = javaTerm.getImportNames();

		String javaTermContent = javaTerm.getContent();

		if (!importNames.contains(
				"com.liferay.portal.kernel.service.ServiceContext")) {

			return javaTermContent;
		}

		if (javaTerm.isJavaClass()) {
			return _formatClass(javaTermContent, importNames);
		}

		return _formatMethod(javaTermContent, fileContent);
	}

	@Override
	protected String[] getCheckableJavaTermNames() {
		return new String[] {JAVA_CLASS, JAVA_METHOD};
	}

	private String _formatClass(String content, List importNames) {
		Matcher setGroupPermissionsMatcher =
			_setGroupPermissionsPattern.matcher(content);
		Matcher setGuestPermissionsMatcher =
			_setGuestPermissionsPattern.matcher(content);

		if (!(setGroupPermissionsMatcher.find() ||
			  setGuestPermissionsMatcher.find())) {

			return content;
		}

		if (!importNames.contains(
				"com.liferay.portal.kernel.service.permission." +
					"ModelPermissions")) {

			content = StringBundler.concat(
				"import com.liferay.portal.kernel.service.permission.",
				"ModelPermissions;\n\n", content);
		}

		if (!importNames.contains(
				"com.liferay.portal.kernel.model.role.RoleConstants")) {

			content = StringBundler.concat(
				"import com.liferay.portal.kernel.model.role.",
				"RoleConstants;\n\n", content);
		}

		return content;
	}

	private String _formatMethod(String content, String fileContent) {
		boolean hasSetGroupPermissions = false;

		Matcher setGroupPermissionsMatcher =
			_setGroupPermissionsPattern.matcher(content);

		if (setGroupPermissionsMatcher.find()) {
			hasSetGroupPermissions = _isServiceContextMethodCall(
				content, fileContent, setGroupPermissionsMatcher.group(1));
		}

		boolean hasSetGuestPermissions = false;

		Matcher setGuestPermissionsMatcher =
			_setGuestPermissionsPattern.matcher(content);

		if (setGuestPermissionsMatcher.find()) {
			hasSetGuestPermissions = _isServiceContextMethodCall(
				content, fileContent, setGuestPermissionsMatcher.group(1));
		}

		if (hasSetGroupPermissions || hasSetGuestPermissions) {
			content = _formatSetGroupAndGuestPermissions(
				hasSetGroupPermissions, hasSetGuestPermissions,
				setGroupPermissionsMatcher, setGuestPermissionsMatcher,
				content);
		}

		return content;
	}

	private String _formatSetGroupAndGuestPermissions(
		boolean hasSetGroupPermissions, boolean hasSetGuestPermissions,
		Matcher setGroupPermissionsMatcher, Matcher setGuestPermissionsMatcher,
		String javaTermContent) {

		String groupPermissions = "new String[0]";
		String guestPermissions = "new String[0]";
		String oldSub = null;
		String serviceContext = null;

		if (hasSetGroupPermissions) {
			groupPermissions = setGroupPermissionsMatcher.group(2);
			oldSub = setGroupPermissionsMatcher.group(0);
			serviceContext = setGroupPermissionsMatcher.group(1);

			if (hasSetGuestPermissions) {
				guestPermissions = setGuestPermissionsMatcher.group(2);
				javaTermContent = StringUtil.removeSubstring(
					javaTermContent, setGuestPermissionsMatcher.group(0));
			}
		}
		else {
			guestPermissions = setGuestPermissionsMatcher.group(2);
			oldSub = setGuestPermissionsMatcher.group(0);
			serviceContext = setGuestPermissionsMatcher.group(1);
		}

		return StringUtil.replace(
			javaTermContent, oldSub,
			_getModelPermissionsImplementation(
				groupPermissions, guestPermissions,
				SourceUtil.getIndent(oldSub), serviceContext));
	}

	private String _getModelPermissionsImplementation(
		String groupPermissions, String guestPermissions, String indent,
		String serviceContext) {

		StringBundler sb = new StringBundler(35);

		sb.append(StringPool.NEW_LINE);
		sb.append(indent);
		sb.append("ModelPermissions modelPermissions = ");
		sb.append(serviceContext);
		sb.append(".getModelPermissions();\n\n");
		sb.append(indent);
		sb.append("if (modelPermissions == null) {\n");
		sb.append(indent);
		sb.append("\tmodelPermissions = ModelPermissionsFactory.create(");
		sb.append(groupPermissions);
		sb.append(StringPool.COMMA_AND_SPACE);
		sb.append(guestPermissions);
		sb.append(");\n");
		sb.append(indent);
		sb.append("}\n");
		sb.append(indent);
		sb.append("else {");

		if (!groupPermissions.equals("new String[0]")) {
			sb.append(StringPool.NEW_LINE);
			sb.append(indent);
			sb.append("\tmodelPermissions.addRolePermissions(");
			sb.append("RoleConstants.PLACEHOLDER_DEFAULT_GROUP_ROLE, ");
			sb.append(groupPermissions);
			sb.append(");");
		}

		if (!guestPermissions.equals("new String[0]")) {
			sb.append(StringPool.NEW_LINE);
			sb.append(indent);
			sb.append("\tmodelPermissions.addRolePermissions(");
			sb.append("RoleConstants.GUEST, ");
			sb.append(guestPermissions);
			sb.append(");");
		}

		sb.append(StringPool.NEW_LINE);
		sb.append(indent);
		sb.append("}\n\n");
		sb.append(indent);
		sb.append(serviceContext);
		sb.append(".setModelPermissions(modelPermissions);");

		return sb.toString();
	}

	private boolean _isServiceContextMethodCall(
		String methodCall, String fileContent, String variableName) {

		return Objects.equals(
			getVariableTypeName(methodCall, fileContent, variableName),
			"ServiceContext");
	}

	private static final Pattern _setGroupPermissionsPattern = Pattern.compile(
		"\\t*(\\w+)\\.setGroupPermissions\\(\\s*(\\w+)\\s*\\);");
	private static final Pattern _setGuestPermissionsPattern = Pattern.compile(
		"\\t*(\\w+)\\.setGuestPermissions\\(\\s*(\\w+)\\s*\\);");

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy