
com.liferay.object.service.impl.ObjectLayoutLocalServiceImpl Maven / Gradle / Ivy
The 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.object.service.impl;
import com.liferay.object.constants.ObjectLayoutBoxConstants;
import com.liferay.object.exception.DefaultObjectLayoutException;
import com.liferay.object.exception.ObjectDefinitionModifiableException;
import com.liferay.object.exception.ObjectLayoutBoxCategorizationTypeException;
import com.liferay.object.exception.ObjectLayoutColumnSizeException;
import com.liferay.object.model.ObjectDefinition;
import com.liferay.object.model.ObjectField;
import com.liferay.object.model.ObjectLayout;
import com.liferay.object.model.ObjectLayoutBox;
import com.liferay.object.model.ObjectLayoutColumn;
import com.liferay.object.model.ObjectLayoutRow;
import com.liferay.object.model.ObjectLayoutTab;
import com.liferay.object.service.ObjectFieldLocalService;
import com.liferay.object.service.ObjectLayoutTabLocalService;
import com.liferay.object.service.base.ObjectLayoutLocalServiceBaseImpl;
import com.liferay.object.service.persistence.ObjectDefinitionPersistence;
import com.liferay.object.service.persistence.ObjectFieldPersistence;
import com.liferay.object.service.persistence.ObjectLayoutBoxPersistence;
import com.liferay.object.service.persistence.ObjectLayoutColumnPersistence;
import com.liferay.object.service.persistence.ObjectLayoutRowPersistence;
import com.liferay.petra.function.transform.TransformUtil;
import com.liferay.portal.aop.AopService;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.SystemEventConstants;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.search.Indexable;
import com.liferay.portal.kernel.search.IndexableType;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.systemevent.SystemEvent;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Marco Leo
* @author Brian Wing Shun Chan
*/
@Component(
property = "model.class.name=com.liferay.object.model.ObjectLayout",
service = AopService.class
)
public class ObjectLayoutLocalServiceImpl
extends ObjectLayoutLocalServiceBaseImpl {
@Indexable(type = IndexableType.REINDEX)
@Override
public ObjectLayout addObjectLayout(
long userId, long objectDefinitionId, boolean defaultObjectLayout,
Map nameMap, List objectLayoutTabs)
throws PortalException {
ObjectDefinition objectDefinition =
_objectDefinitionPersistence.findByPrimaryKey(objectDefinitionId);
if (objectDefinition.isUnmodifiableSystemObject()) {
throw new ObjectDefinitionModifiableException.MustBeModifiable();
}
_validate(0, objectDefinitionId, defaultObjectLayout, objectLayoutTabs);
ObjectLayout objectLayout = objectLayoutPersistence.create(
counterLocalService.increment());
User user = _userLocalService.getUser(userId);
objectLayout.setCompanyId(user.getCompanyId());
objectLayout.setUserId(user.getUserId());
objectLayout.setUserName(user.getFullName());
objectLayout.setObjectDefinitionId(
objectDefinition.getObjectDefinitionId());
objectLayout.setDefaultObjectLayout(defaultObjectLayout);
objectLayout.setNameMap(nameMap);
objectLayout = objectLayoutPersistence.update(objectLayout);
objectLayout.setObjectLayoutTabs(
_addObjectLayoutTabs(
user, objectDefinitionId, objectLayout, objectLayoutTabs));
return objectLayout;
}
@Indexable(type = IndexableType.DELETE)
@Override
public ObjectLayout deleteObjectLayout(long objectLayoutId)
throws PortalException {
ObjectLayout objectLayout = objectLayoutPersistence.findByPrimaryKey(
objectLayoutId);
return deleteObjectLayout(objectLayout);
}
@Indexable(type = IndexableType.DELETE)
@Override
@SystemEvent(type = SystemEventConstants.TYPE_DELETE)
public ObjectLayout deleteObjectLayout(ObjectLayout objectLayout)
throws PortalException {
objectLayout = objectLayoutPersistence.remove(objectLayout);
_deleteObjectLayoutTabs(objectLayout.getObjectLayoutId());
return objectLayout;
}
@Override
public void deleteObjectLayouts(long objectDefinitionId)
throws PortalException {
for (ObjectLayout objectLayout :
objectLayoutPersistence.findByObjectDefinitionId(
objectDefinitionId)) {
objectLayoutLocalService.deleteObjectLayout(objectLayout);
}
}
@Override
public ObjectLayout fetchDefaultObjectLayout(long objectDefinitionId) {
ObjectLayout objectLayout =
objectLayoutPersistence.fetchByODI_DOL_First(
objectDefinitionId, true, null);
if (objectLayout == null) {
return null;
}
objectLayout.setObjectLayoutTabs(_getObjectLayoutTabs(objectLayout));
return objectLayout;
}
@Override
public ObjectLayout getDefaultObjectLayout(long objectDefinitionId)
throws PortalException {
ObjectLayout objectLayout = objectLayoutPersistence.findByODI_DOL_First(
objectDefinitionId, true, null);
objectLayout.setObjectLayoutTabs(_getObjectLayoutTabs(objectLayout));
return objectLayout;
}
@Override
public ObjectLayout getObjectLayout(long objectLayoutId)
throws PortalException {
ObjectLayout objectLayout = objectLayoutPersistence.findByPrimaryKey(
objectLayoutId);
objectLayout.setObjectLayoutTabs(_getObjectLayoutTabs(objectLayout));
return objectLayout;
}
@Override
public List getObjectLayouts(long objectDefinitionId) {
List objectLayouts =
objectLayoutPersistence.findByObjectDefinitionId(
objectDefinitionId);
for (ObjectLayout objectLayout : objectLayouts) {
objectLayout.setObjectLayoutTabs(
_getObjectLayoutTabs(objectLayout));
}
return objectLayouts;
}
@Override
public List getObjectLayouts(
long objectDefinitionId, int start, int end) {
return objectLayoutPersistence.findByObjectDefinitionId(
objectDefinitionId, start, end);
}
@Override
public int getObjectLayoutsCount(long objectDefinitionId) {
return objectLayoutPersistence.countByObjectDefinitionId(
objectDefinitionId);
}
@Override
public Map> getObjectLayoutsMap(long companyId) {
Map> objectLayoutsMap = new HashMap<>();
for (ObjectLayout objectLayout :
objectLayoutPersistence.findByC_DOL(companyId, true)) {
objectLayout.setObjectLayoutTabs(
_getObjectLayoutTabs(objectLayout));
List objectLayouts = objectLayoutsMap.computeIfAbsent(
objectLayout.getObjectDefinitionId(),
objectDefinitionId -> new ArrayList<>());
objectLayouts.add(objectLayout);
}
return objectLayoutsMap;
}
@Indexable(type = IndexableType.REINDEX)
@Override
public ObjectLayout updateObjectLayout(
long objectLayoutId, boolean defaultObjectLayout,
Map nameMap, List objectLayoutTabs)
throws PortalException {
ObjectLayout objectLayout = objectLayoutPersistence.findByPrimaryKey(
objectLayoutId);
_validate(
objectLayoutId, objectLayout.getObjectDefinitionId(),
defaultObjectLayout, objectLayoutTabs);
_deleteObjectLayoutTabs(objectLayoutId);
objectLayout.setDefaultObjectLayout(defaultObjectLayout);
objectLayout.setNameMap(nameMap);
objectLayout = objectLayoutPersistence.update(objectLayout);
User user = _userLocalService.getUser(objectLayout.getUserId());
objectLayout.setObjectLayoutTabs(
_addObjectLayoutTabs(
user, objectLayout.getObjectDefinitionId(), objectLayout,
objectLayoutTabs));
return objectLayout;
}
private ObjectLayoutBox _addObjectLayoutBox(
User user, long objectDefinitionId, long objectLayoutTabId,
ObjectLayoutBox objectLayoutBox)
throws PortalException {
ObjectLayoutBox newObjectLayoutBox = _objectLayoutBoxPersistence.create(
counterLocalService.increment());
newObjectLayoutBox.setCompanyId(user.getCompanyId());
newObjectLayoutBox.setUserId(user.getUserId());
newObjectLayoutBox.setUserName(user.getFullName());
newObjectLayoutBox.setObjectLayoutTabId(objectLayoutTabId);
newObjectLayoutBox.setCollapsable(objectLayoutBox.isCollapsable());
newObjectLayoutBox.setNameMap(objectLayoutBox.getNameMap());
newObjectLayoutBox.setPriority(objectLayoutBox.getPriority());
newObjectLayoutBox.setType(objectLayoutBox.getType());
newObjectLayoutBox.setObjectLayoutRows(
objectLayoutBox.getObjectLayoutRows());
newObjectLayoutBox = _objectLayoutBoxPersistence.update(
newObjectLayoutBox);
newObjectLayoutBox.setObjectLayoutRows(
_addObjectLayoutRows(
user, objectDefinitionId,
newObjectLayoutBox.getObjectLayoutBoxId(),
newObjectLayoutBox.getObjectLayoutRows()));
return newObjectLayoutBox;
}
private List _addObjectLayoutBoxes(
User user, long objectDefinitionId, long objectLayoutTabId,
List objectLayoutBoxes)
throws PortalException {
return TransformUtil.unsafeTransform(
objectLayoutBoxes,
objectLayoutBox -> _addObjectLayoutBox(
user, objectDefinitionId, objectLayoutTabId, objectLayoutBox));
}
private ObjectLayoutColumn _addObjectLayoutColumn(
User user, long objectDefinitionId, long objectFieldId,
long objectLayoutRowId, int priority, int size)
throws PortalException {
ObjectField objectField = _objectFieldPersistence.findByPrimaryKey(
objectFieldId);
if (objectField.getObjectDefinitionId() != objectDefinitionId) {
// TODO
throw new PortalException();
}
if ((size < 0) || (size > 12)) {
throw new ObjectLayoutColumnSizeException(
"Object layout column size must be more than 0 and less than " +
"12");
}
ObjectLayoutColumn objectLayoutColumn =
_objectLayoutColumnPersistence.create(
counterLocalService.increment());
objectLayoutColumn.setCompanyId(user.getCompanyId());
objectLayoutColumn.setUserId(user.getUserId());
objectLayoutColumn.setUserName(user.getFullName());
objectLayoutColumn.setObjectFieldId(objectField.getObjectFieldId());
objectLayoutColumn.setObjectLayoutRowId(objectLayoutRowId);
objectLayoutColumn.setPriority(priority);
objectLayoutColumn.setSize(size);
return _objectLayoutColumnPersistence.update(objectLayoutColumn);
}
private List _addObjectLayoutColumns(
User user, long objectDefinitionId, long objectLayoutRowId,
List objectLayoutColumns)
throws PortalException {
return TransformUtil.unsafeTransform(
objectLayoutColumns,
objectLayoutColumn -> _addObjectLayoutColumn(
user, objectDefinitionId, objectLayoutColumn.getObjectFieldId(),
objectLayoutRowId, objectLayoutColumn.getPriority(),
objectLayoutColumn.getSize()));
}
private ObjectLayoutRow _addObjectLayoutRow(
User user, long objectDefinitionId, long objectLayoutBoxId,
int priority, List objectLayoutColumns)
throws PortalException {
ObjectLayoutRow objectLayoutRow = _objectLayoutRowPersistence.create(
counterLocalService.increment());
objectLayoutRow.setCompanyId(user.getCompanyId());
objectLayoutRow.setUserId(user.getUserId());
objectLayoutRow.setUserName(user.getFullName());
objectLayoutRow.setObjectLayoutBoxId(objectLayoutBoxId);
objectLayoutRow.setPriority(priority);
objectLayoutRow = _objectLayoutRowPersistence.update(objectLayoutRow);
objectLayoutRow.setObjectLayoutColumns(
_addObjectLayoutColumns(
user, objectDefinitionId,
objectLayoutRow.getObjectLayoutRowId(), objectLayoutColumns));
return objectLayoutRow;
}
private List _addObjectLayoutRows(
User user, long objectDefinitionId, long objectLayoutBoxId,
List objectLayoutRows)
throws PortalException {
return TransformUtil.unsafeTransform(
objectLayoutRows,
objectLayoutRow -> _addObjectLayoutRow(
user, objectDefinitionId, objectLayoutBoxId,
objectLayoutRow.getPriority(),
objectLayoutRow.getObjectLayoutColumns()));
}
private ObjectLayoutTab _addObjectLayoutTab(
User user, long objectDefinitionId, long objectLayoutId,
long objectRelationshipId, Map nameMap,
int priority, List objectLayoutBoxes)
throws PortalException {
ObjectLayoutTab objectLayoutTab =
_objectLayoutTabLocalService.addObjectLayoutTab(
user.getUserId(), objectLayoutId, objectRelationshipId, nameMap,
priority);
objectLayoutTab.setObjectLayoutBoxes(
_addObjectLayoutBoxes(
user, objectDefinitionId,
objectLayoutTab.getObjectLayoutTabId(), objectLayoutBoxes));
return objectLayoutTab;
}
private List _addObjectLayoutTabs(
User user, long objectDefinitionId, ObjectLayout objectLayout,
List objectLayoutTabs)
throws PortalException {
objectLayoutTabs = TransformUtil.unsafeTransform(
objectLayoutTabs,
objectLayoutTab -> _addObjectLayoutTab(
user, objectDefinitionId, objectLayout.getObjectLayoutId(),
objectLayoutTab.getObjectRelationshipId(),
objectLayoutTab.getNameMap(), objectLayoutTab.getPriority(),
objectLayoutTab.getObjectLayoutBoxes()));
if (objectLayout.isDefaultObjectLayout()) {
_objectLayoutTabLocalService.
registerObjectLayoutTabScreenNavigationCategories(
_objectDefinitionPersistence.fetchByPrimaryKey(
objectDefinitionId),
objectLayoutTabs);
}
return objectLayoutTabs;
}
private void _deleteObjectLayoutBoxes(
List objectLayoutTabs) {
for (ObjectLayoutTab objectLayoutTab : objectLayoutTabs) {
List objectLayoutBoxes =
_objectLayoutBoxPersistence.findByObjectLayoutTabId(
objectLayoutTab.getObjectLayoutTabId());
_objectLayoutBoxPersistence.removeByObjectLayoutTabId(
objectLayoutTab.getObjectLayoutTabId());
_deleteObjectLayoutRows(objectLayoutBoxes);
}
}
private void _deleteObjectLayoutColumns(
List objectLayoutRows) {
for (ObjectLayoutRow objectLayoutRow : objectLayoutRows) {
_objectLayoutColumnPersistence.removeByObjectLayoutRowId(
objectLayoutRow.getObjectLayoutRowId());
}
}
private void _deleteObjectLayoutRows(
List objectLayoutBoxes) {
for (ObjectLayoutBox objectLayoutBox : objectLayoutBoxes) {
List objectLayoutRows =
_objectLayoutRowPersistence.findByObjectLayoutBoxId(
objectLayoutBox.getObjectLayoutBoxId());
_objectLayoutRowPersistence.removeByObjectLayoutBoxId(
objectLayoutBox.getObjectLayoutBoxId());
_deleteObjectLayoutColumns(objectLayoutRows);
}
}
private void _deleteObjectLayoutTabs(long objectLayoutId)
throws PortalException {
List objectLayoutTabs =
_objectLayoutTabLocalService.getObjectLayoutObjectLayoutTabs(
objectLayoutId);
_deleteObjectLayoutBoxes(objectLayoutTabs);
_objectLayoutTabLocalService.deleteObjectLayoutObjectLayoutTabs(
objectLayoutId);
}
private List _getObjectLayoutBoxes(
ObjectLayoutTab objectLayoutTab) {
List objectLayoutBoxes =
_objectLayoutBoxPersistence.findByObjectLayoutTabId(
objectLayoutTab.getObjectLayoutTabId());
for (ObjectLayoutBox objectLayoutBox : objectLayoutBoxes) {
objectLayoutBox.setObjectLayoutRows(
_getObjectLayoutRows(objectLayoutBox));
}
return objectLayoutBoxes;
}
private List _getObjectLayoutRows(
ObjectLayoutBox objectLayoutBox) {
List objectLayoutRows =
_objectLayoutRowPersistence.findByObjectLayoutBoxId(
objectLayoutBox.getObjectLayoutBoxId());
for (ObjectLayoutRow objectLayoutRow : objectLayoutRows) {
objectLayoutRow.setObjectLayoutColumns(
_objectLayoutColumnPersistence.findByObjectLayoutRowId(
objectLayoutRow.getObjectLayoutRowId()));
}
return objectLayoutRows;
}
private List _getObjectLayoutTabs(
ObjectLayout objectLayout) {
List objectLayoutTabs =
_objectLayoutTabLocalService.getObjectLayoutObjectLayoutTabs(
objectLayout.getObjectLayoutId());
for (ObjectLayoutTab objectLayoutTab : objectLayoutTabs) {
objectLayoutTab.setObjectLayoutBoxes(
_getObjectLayoutBoxes(objectLayoutTab));
}
return objectLayoutTabs;
}
private void _validate(
long objectLayoutId, long objectDefinitionId,
boolean defaultObjectLayout, List objectLayoutTabs)
throws PortalException {
if (defaultObjectLayout) {
Set objectFieldIds = new HashSet<>();
ObjectLayoutTab objectLayoutTab = objectLayoutTabs.get(0);
List objectLayoutBoxes =
objectLayoutTab.getObjectLayoutBoxes();
for (ObjectLayoutBox objectLayoutBox : objectLayoutBoxes) {
List objectLayoutRows =
objectLayoutBox.getObjectLayoutRows();
for (ObjectLayoutRow objectLayoutRow : objectLayoutRows) {
List objectLayoutColumns =
objectLayoutRow.getObjectLayoutColumns();
for (ObjectLayoutColumn objectLayoutColumn :
objectLayoutColumns) {
objectFieldIds.add(
objectLayoutColumn.getObjectFieldId());
}
}
}
List objectFields =
_objectFieldLocalService.getObjectFields(objectDefinitionId);
for (ObjectField objectField : objectFields) {
if (!objectField.isRequired()) {
continue;
}
if (!objectFieldIds.contains(objectField.getObjectFieldId())) {
throw new DefaultObjectLayoutException(
"All required object fields must be associated to " +
"the first tab of a default object layout");
}
}
ObjectLayout objectLayout =
objectLayoutPersistence.fetchByODI_DOL_First(
objectDefinitionId, true, null);
if ((objectLayout != null) &&
(objectLayout.getObjectLayoutId() != objectLayoutId)) {
throw new DefaultObjectLayoutException(
"There can only be one default object layout");
}
}
int countObjectLayoutBoxCategorizationType = 0;
ObjectDefinition objectDefinition =
_objectDefinitionPersistence.fetchByPrimaryKey(objectDefinitionId);
for (ObjectLayoutTab objectLayoutTab : objectLayoutTabs) {
List objectLayoutBoxes =
objectLayoutTab.getObjectLayoutBoxes();
for (ObjectLayoutBox objectLayoutBox : objectLayoutBoxes) {
if (Validator.isNull(objectLayoutBox.getType())) {
throw new ObjectLayoutBoxCategorizationTypeException(
"Object layout box must have a type");
}
if (!StringUtil.equals(
objectLayoutBox.getType(),
ObjectLayoutBoxConstants.TYPE_CATEGORIZATION)) {
continue;
}
if (!objectDefinition.isEnableCategorization()) {
throw new ObjectLayoutBoxCategorizationTypeException(
"Categorization layout box must be enabled to be used");
}
if (!objectDefinition.isDefaultStorageType()) {
throw new ObjectLayoutBoxCategorizationTypeException(
"Categorization layout box can only be used in " +
"object definitions with a default storage type");
}
countObjectLayoutBoxCategorizationType++;
if (countObjectLayoutBoxCategorizationType > 1) {
throw new ObjectLayoutBoxCategorizationTypeException(
"There can only be one categorization layout box per " +
"layout");
}
if (ListUtil.isNotEmpty(
objectLayoutBox.getObjectLayoutRows())) {
throw new ObjectLayoutBoxCategorizationTypeException(
"Categorization layout box must not have layout rows");
}
}
}
}
@Reference
private ObjectDefinitionPersistence _objectDefinitionPersistence;
@Reference
private ObjectFieldLocalService _objectFieldLocalService;
@Reference
private ObjectFieldPersistence _objectFieldPersistence;
@Reference
private ObjectLayoutBoxPersistence _objectLayoutBoxPersistence;
@Reference
private ObjectLayoutColumnPersistence _objectLayoutColumnPersistence;
@Reference
private ObjectLayoutRowPersistence _objectLayoutRowPersistence;
@Reference
private ObjectLayoutTabLocalService _objectLayoutTabLocalService;
@Reference
private UserLocalService _userLocalService;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy