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

com.liferay.dynamic.data.mapping.service.impl.DDMStructureLocalServiceImpl Maven / Gradle / Ivy

/**
 * 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.dynamic.data.mapping.service.impl;

import com.liferay.dynamic.data.mapping.background.task.DDMStructureIndexerBackgroundTaskExecutor;
import com.liferay.dynamic.data.mapping.exception.InvalidStructureVersionException;
import com.liferay.dynamic.data.mapping.exception.NoSuchStructureException;
import com.liferay.dynamic.data.mapping.exception.RequiredStructureException;
import com.liferay.dynamic.data.mapping.exception.StructureDefinitionException;
import com.liferay.dynamic.data.mapping.exception.StructureDuplicateElementException;
import com.liferay.dynamic.data.mapping.exception.StructureDuplicateStructureKeyException;
import com.liferay.dynamic.data.mapping.exception.StructureNameException;
import com.liferay.dynamic.data.mapping.io.DDMFormJSONDeserializer;
import com.liferay.dynamic.data.mapping.io.DDMFormJSONSerializer;
import com.liferay.dynamic.data.mapping.io.DDMFormXSDDeserializer;
import com.liferay.dynamic.data.mapping.model.DDMDataProviderInstanceLink;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormField;
import com.liferay.dynamic.data.mapping.model.DDMFormLayout;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMStructureConstants;
import com.liferay.dynamic.data.mapping.model.DDMStructureVersion;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.model.DDMTemplateConstants;
import com.liferay.dynamic.data.mapping.service.base.DDMStructureLocalServiceBaseImpl;
import com.liferay.dynamic.data.mapping.service.permission.DDMStructurePermission;
import com.liferay.dynamic.data.mapping.storage.StorageType;
import com.liferay.dynamic.data.mapping.util.DDM;
import com.liferay.dynamic.data.mapping.util.DDMXML;
import com.liferay.dynamic.data.mapping.util.impl.DDMFormTemplateSynchonizer;
import com.liferay.dynamic.data.mapping.validator.DDMFormValidationException;
import com.liferay.dynamic.data.mapping.validator.DDMFormValidator;
import com.liferay.portal.kernel.backgroundtask.BackgroundTaskManager;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.LocaleException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.SystemEventConstants;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.search.DDMStructureIndexer;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.security.auth.CompanyThreadLocal;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.permission.ModelPermissions;
import com.liferay.portal.kernel.systemevent.SystemEvent;
import com.liferay.portal.kernel.transaction.TransactionCommitCallbackUtil;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.GroupThreadLocal;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.SetUtil;
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 com.liferay.portal.spring.extender.service.ServiceReference;

import java.io.Serializable;

import java.util.Collections;
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 java.util.concurrent.Callable;

/**
 * Provides the local service for accessing, adding, deleting, and updating
 * dynamic data mapping (DDM) structures.
 *
 * 

* DDM structures (structures) are used in Liferay to store structured content * like document types, dynamic data definitions, or web contents. *

* *

* Structures support inheritance via parent structures. They also support * multi-language names and descriptions. *

* *

* Structures can be related to many models in Liferay, such as those for web * contents, dynamic data lists, and documents. This relationship can be * established via the model's class name ID. *

* * @author Brian Wing Shun Chan * @author Bruno Basto * @author Marcellus Tavares * @author Juan Fernández */ public class DDMStructureLocalServiceImpl extends DDMStructureLocalServiceBaseImpl { @Override public DDMStructure addStructure( long userId, long groupId, long parentStructureId, long classNameId, String structureKey, Map nameMap, Map descriptionMap, DDMForm ddmForm, DDMFormLayout ddmFormLayout, String storageType, int type, ServiceContext serviceContext) throws PortalException { // Structure User user = userPersistence.findByPrimaryKey(userId); if (Validator.isNull(structureKey)) { structureKey = String.valueOf(counterLocalService.increment()); } else { structureKey = StringUtil.toUpperCase(structureKey.trim()); } validate( groupId, parentStructureId, classNameId, structureKey, nameMap, ddmForm); long structureId = counterLocalService.increment(); DDMStructure structure = ddmStructurePersistence.create(structureId); structure.setUuid(serviceContext.getUuid()); structure.setGroupId(groupId); structure.setCompanyId(user.getCompanyId()); structure.setUserId(user.getUserId()); structure.setUserName(user.getFullName()); structure.setVersionUserId(user.getUserId()); structure.setVersionUserName(user.getFullName()); structure.setParentStructureId(parentStructureId); structure.setClassNameId(classNameId); structure.setStructureKey(structureKey); structure.setVersion(DDMStructureConstants.VERSION_DEFAULT); structure.setNameMap(nameMap); structure.setDescriptionMap(descriptionMap); structure.setDefinition(ddmFormJSONSerializer.serialize(ddmForm)); structure.setStorageType(storageType); structure.setType(type); ddmStructurePersistence.update(structure); // Resources if (serviceContext.isAddGroupPermissions() || serviceContext.isAddGuestPermissions()) { addStructureResources( structure, serviceContext.isAddGroupPermissions(), serviceContext.isAddGuestPermissions()); } else { addStructureResources( structure, serviceContext.getModelPermissions()); } // Structure version DDMStructureVersion structureVersion = addStructureVersion( user, structure, DDMStructureConstants.VERSION_DEFAULT, serviceContext); // Structure layout ddmStructureLayoutLocalService.addStructureLayout( userId, groupId, structureVersion.getStructureVersionId(), ddmFormLayout, serviceContext); // Data provider instance links addDataProviderInstanceLinks(structureId, ddmForm); return structure; } /** * Adds a structure referencing its parent structure. * * @param userId the primary key of the structure's creator/owner * @param groupId the primary key of the group * @param parentStructureId the primary key of the parent structure * (optionally {@link * DDMStructureConstants#DEFAULT_PARENT_STRUCTURE_ID}) * @param classNameId the primary key of the class name for the * structure's related model * @param structureKey the unique string identifying the structure * (optionally null) * @param nameMap the structure's locales and localized names * @param descriptionMap the structure's locales and localized * descriptions * @param definition the structure's XML schema definition * @param storageType the structure's storage type. It can be "xml" or * "expando". For more information, see {@link StorageType}. * @param type the structure's type. For more information, see {@link * DDMStructureConstants}. * @param serviceContext the service context to be applied. Can set the * UUID, creation date, modification date, guest permissions, * and group permissions for the structure. * @return the structure * @deprecated As of 7.0.0, replaced by {@link #addStructure(long, long, * long, long, String, Map, Map, DDMForm, DDMFormLayout, String, * int, ServiceContext)} */ @Deprecated @Override public DDMStructure addStructure( long userId, long groupId, long parentStructureId, long classNameId, String structureKey, Map nameMap, Map descriptionMap, String definition, String storageType, int type, ServiceContext serviceContext) throws PortalException { ddmXML.validateXML(definition); DDMForm ddmForm = ddmFormXSDDeserializer.deserialize(definition); DDMFormLayout ddmFormLayout = ddm.getDefaultDDMFormLayout(ddmForm); return addStructure( userId, groupId, parentStructureId, classNameId, structureKey, nameMap, descriptionMap, ddmForm, ddmFormLayout, storageType, type, serviceContext); } @Override public DDMStructure addStructure( long userId, long groupId, long classNameId, Map nameMap, Map descriptionMap, DDMForm ddmForm, DDMFormLayout ddmFormLayout, String storageType, ServiceContext serviceContext) throws PortalException { return addStructure( userId, groupId, DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID, classNameId, null, nameMap, descriptionMap, ddmForm, ddmFormLayout, storageType, DDMStructureConstants.TYPE_DEFAULT, serviceContext); } /** * Adds a structure referencing a default parent structure, using the portal * property dynamic.data.lists.storage.type storage type and * default structure type. * * @param userId the primary key of the structure's creator/owner * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the * structure's related model * @param nameMap the structure's locales and localized names * @param descriptionMap the structure's locales and localized * descriptions * @param definition the structure's XML schema definition * @param serviceContext the service context to be applied. Can set the * UUID, creation date, modification date, guest permissions, * and group permissions for the structure. * @return the structure * @deprecated As of 7.0.0, replaced by {@link #addStructure(long, long, * long, Map, Map, DDMForm, DDMFormLayout, ServiceContext)} */ @Deprecated @Override public DDMStructure addStructure( long userId, long groupId, long classNameId, Map nameMap, Map descriptionMap, String definition, ServiceContext serviceContext) throws PortalException { return addStructure( userId, groupId, DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID, classNameId, null, nameMap, descriptionMap, definition, StorageType.JSON.toString(), DDMStructureConstants.TYPE_DEFAULT, serviceContext); } @Override public DDMStructure addStructure( long userId, long groupId, String parentStructureKey, long classNameId, String structureKey, Map nameMap, Map descriptionMap, DDMForm ddmForm, DDMFormLayout ddmFormLayout, String storageType, int type, ServiceContext serviceContext) throws PortalException { DDMStructure parentStructure = fetchStructure( groupId, classNameId, parentStructureKey); long parentStructureId = DDMStructureConstants.DEFAULT_PARENT_STRUCTURE_ID; if (parentStructure != null) { parentStructureId = parentStructure.getStructureId(); } return addStructure( userId, groupId, parentStructureId, classNameId, structureKey, nameMap, descriptionMap, ddmForm, ddmFormLayout, storageType, type, serviceContext); } /** * Adds a structure referencing a default parent structure if the parent * structure is not found. * * @param userId the primary key of the structure's creator/owner * @param groupId the primary key of the group * @param parentStructureKey the unique string identifying the parent * structure (optionally null) * @param classNameId the primary key of the class name for the * structure's related model * @param structureKey the unique string identifying the structure * (optionally null) * @param nameMap the structure's locales and localized names * @param descriptionMap the structure's locales and localized * descriptions * @param definition the structure's XML schema definition * @param storageType the structure's storage type. It can be "xml" or * "expando". For more information, see {@link StorageType}. * @param type the structure's type. For more information, see {@link * DDMStructureConstants}. * @param serviceContext the service context to be applied. Can set the * UUID, creation date, modification date, guest permissions and * group permissions for the structure. * @return the structure * @deprecated As of 7.0.0, replaced by {@link #addStructure(long, long, * String, long, String, Map, Map, DDMForm, DDMFormLayout, * String, int, ServiceContext)} */ @Deprecated @Override public DDMStructure addStructure( long userId, long groupId, String parentStructureKey, long classNameId, String structureKey, Map nameMap, Map descriptionMap, String definition, String storageType, int type, ServiceContext serviceContext) throws PortalException { ddmXML.validateXML(definition); DDMForm ddmForm = ddmFormXSDDeserializer.deserialize(definition); DDMFormLayout ddmFormLayout = ddm.getDefaultDDMFormLayout(ddmForm); return addStructure( userId, groupId, parentStructureKey, classNameId, structureKey, nameMap, descriptionMap, ddmForm, ddmFormLayout, storageType, type, serviceContext); } /** * Adds the resources to the structure. * * @param structure the structure to add resources to * @param addGroupPermissions whether to add group permissions * @param addGuestPermissions whether to add guest permissions */ @Override public void addStructureResources( DDMStructure structure, boolean addGroupPermissions, boolean addGuestPermissions) throws PortalException { String resourceName = DDMStructurePermission.getStructureModelResourceName( structure.getClassNameId()); resourceLocalService.addResources( structure.getCompanyId(), structure.getGroupId(), structure.getUserId(), resourceName, structure.getStructureId(), false, addGroupPermissions, addGuestPermissions); } /** * Adds the model resources with the permissions to the structure. * * @param structure the structure to add resources to * @param modelPermissions the model permissions to be added */ @Override public void addStructureResources( DDMStructure structure, ModelPermissions modelPermissions) throws PortalException { String resourceName = DDMStructurePermission.getStructureModelResourceName( structure.getClassNameId()); resourceLocalService.addModelResources( structure.getCompanyId(), structure.getGroupId(), structure.getUserId(), resourceName, structure.getStructureId(), modelPermissions); } /** * Copies a structure, creating a new structure with all the values * extracted from the original one. The new structure supports a new name * and description. * * @param userId the primary key of the structure's creator/owner * @param structureId the primary key of the structure to be copied * @param nameMap the new structure's locales and localized names * @param descriptionMap the new structure's locales and localized * descriptions * @param serviceContext the service context to be applied. Can set the * UUID, creation date, modification date, guest permissions, and * group permissions for the structure. * @return the new structure */ @Override public DDMStructure copyStructure( long userId, long structureId, Map nameMap, Map descriptionMap, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); return addStructure( userId, structure.getGroupId(), structure.getParentStructureId(), structure.getClassNameId(), null, nameMap, descriptionMap, structure.getDDMForm(), structure.getDDMFormLayout(), structure.getStorageType(), structure.getType(), serviceContext); } @Override public DDMStructure copyStructure( long userId, long structureId, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); return addStructure( userId, structure.getGroupId(), structure.getParentStructureId(), structure.getClassNameId(), null, structure.getNameMap(), structure.getDescriptionMap(), structure.getDDMForm(), structure.getDDMFormLayout(), structure.getStorageType(), structure.getType(), serviceContext); } /** * Deletes the structure and its resources. * *

* Before deleting the structure, this method verifies whether the structure * is required by another entity. If it is needed, an exception is thrown. *

* * @param structure the structure to be deleted */ @Override @SystemEvent(type = SystemEventConstants.TYPE_DELETE) public void deleteStructure(DDMStructure structure) throws PortalException { if (!GroupThreadLocal.isDeleteInProcess()) { if (ddmStructureLinkPersistence.countByStructureId( structure.getStructureId()) > 0) { throw new RequiredStructureException. MustNotDeleteStructureReferencedByStructureLinks( structure.getStructureId()); } if (ddmStructurePersistence.countByParentStructureId( structure.getStructureId()) > 0) { throw new RequiredStructureException. MustNotDeleteStructureThatHasChild( structure.getStructureId()); } long classNameId = classNameLocalService.getClassNameId( DDMStructure.class); if (ddmTemplatePersistence.countByG_C_C( structure.getGroupId(), classNameId, structure.getPrimaryKey()) > 0) { throw new RequiredStructureException. MustNotDeleteStructureReferencedByTemplates( structure.getStructureId()); } } // Structure ddmStructurePersistence.remove(structure); // Data provider instance links ddmDataProviderInstanceLinkPersistence.removeByStructureId( structure.getStructureId()); // Structure links ddmStructureLinkPersistence.removeByStructureId( structure.getStructureId()); // Structure versions List structureVersions = ddmStructureVersionLocalService.getStructureVersions( structure.getStructureId()); for (DDMStructureVersion structureVersion : structureVersions) { ddmStructureLayoutPersistence.removeByStructureVersionId( structureVersion.getStructureVersionId()); ddmStructureVersionPersistence.remove(structureVersion); } // Resources String resourceName = DDMStructurePermission.getStructureModelResourceName( structure.getClassNameId()); resourceLocalService.deleteResource( structure.getCompanyId(), resourceName, ResourceConstants.SCOPE_INDIVIDUAL, structure.getStructureId()); // Background tasks String backgroundTaskName = DDMStructureIndexerBackgroundTaskExecutor.getBackgroundTaskName( structure.getStructureId()); backgroundTaskmanager.deleteGroupBackgroundTasks( structure.getGroupId(), backgroundTaskName, DDMStructureIndexerBackgroundTaskExecutor.class.getName()); } /** * Deletes the structure and its resources. * *

* Before deleting the structure, the system verifies whether the structure * is required by another entity. If it is needed, an exception is thrown. *

* * @param structureId the primary key of the structure to be deleted */ @Override public void deleteStructure(long structureId) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); ddmStructureLocalService.deleteStructure(structure); } /** * Deletes the matching structure and its resources. * *

* Before deleting the structure, the system verifies whether the structure * is required by another entity. If it is needed, an exception is thrown. *

* * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @param structureKey the unique string identifying the structure */ @Override public void deleteStructure( long groupId, long classNameId, String structureKey) throws PortalException { structureKey = getStructureKey(structureKey); DDMStructure structure = ddmStructurePersistence.findByG_C_S( groupId, classNameId, structureKey); ddmStructureLocalService.deleteStructure(structure); } /** * Deletes all the structures of the group. * *

* Before deleting the structures, the system verifies whether each * structure is required by another entity. If any of the structures are * needed, an exception is thrown. *

* * @param groupId the primary key of the group */ @Override public void deleteStructures(long groupId) throws PortalException { List structures = ddmStructurePersistence.findByGroupId( groupId); deleteStructures(structures); } @Override public void deleteStructures(long groupId, long classNameId) throws PortalException { List structures = ddmStructurePersistence.findByG_C( groupId, classNameId); deleteStructures(structures); } /** * Returns the structure with the ID. * * @param structureId the primary key of the structure * @return the structure with the structure ID, or null if a * matching structure could not be found */ @Override public DDMStructure fetchStructure(long structureId) { return ddmStructurePersistence.fetchByPrimaryKey(structureId); } /** * Returns the structure matching the class name ID, structure key, and * group. * * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @param structureKey the unique string identifying the structure * @return the matching structure, or null if a matching * structure could not be found */ @Override public DDMStructure fetchStructure( long groupId, long classNameId, String structureKey) { structureKey = getStructureKey(structureKey); return ddmStructurePersistence.fetchByG_C_S( groupId, classNameId, structureKey); } /** * Returns the structure matching the class name ID, structure key, and * group, optionally searching ancestor sites (that have sharing enabled) * and global scoped sites. * *

* This method first searches in the group. If the structure is still not * found and includeAncestorStructures is set to * true, this method searches the group's ancestor sites (that * have sharing enabled) and lastly searches global scoped sites. *

* * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @param structureKey the unique string identifying the structure * @param includeAncestorStructures whether to include ancestor sites (that * have sharing enabled) and include global scoped sites in the * search * @return the matching structure, or null if a matching * structure could not be found */ @Override public DDMStructure fetchStructure( long groupId, long classNameId, String structureKey, boolean includeAncestorStructures) throws PortalException { structureKey = getStructureKey(structureKey); DDMStructure structure = ddmStructurePersistence.fetchByG_C_S( groupId, classNameId, structureKey); if (structure != null) { return structure; } if (!includeAncestorStructures) { return null; } for (long ancestorSiteGroupId : PortalUtil.getAncestorSiteGroupIds(groupId)) { structure = ddmStructurePersistence.fetchByG_C_S( ancestorSiteGroupId, classNameId, structureKey); if (structure != null) { return structure; } } return null; } @Override public List getChildrenStructures(long parentStructureId) { return ddmStructurePersistence.findByParentStructureId( parentStructureId); } /** * Returns all the structures matching the class name ID. * * @param companyId the primary key of the structure's company * @param classNameId the primary key of the class name for the structure's * related model * @return the structures matching the class name ID */ @Override public List getClassStructures( long companyId, long classNameId) { return ddmStructurePersistence.findByC_C(companyId, classNameId); } /** * Returns a range of all the structures matching the class name ID. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param companyId the primary key of the structure's company * @param classNameId the primary key of the class name for the structure's * related model * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @return the range of matching structures */ @Override public List getClassStructures( long companyId, long classNameId, int start, int end) { return ddmStructurePersistence.findByC_C( companyId, classNameId, start, end); } /** * Returns all the structures matching the class name ID ordered by the * comparator. * * @param companyId the primary key of the structure's company * @param classNameId the primary key of the class name for the structure's * related model * @param orderByComparator the comparator to order the structures * (optionally null) * @return the matching structures ordered by the comparator */ @Override public List getClassStructures( long companyId, long classNameId, OrderByComparator orderByComparator) { return ddmStructurePersistence.findByC_C( companyId, classNameId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, orderByComparator); } /** * Returns the structure with the ID. * * @param structureId the primary key of the structure * @return the structure with the ID */ @Override public DDMStructure getStructure(long structureId) throws PortalException { return ddmStructurePersistence.findByPrimaryKey(structureId); } /** * Returns the structure matching the class name ID, structure key, and * group. * * @param groupId the primary key of the structure's group * @param classNameId the primary key of the class name for the structure's * related model * @param structureKey the unique string identifying the structure * @return the matching structure */ @Override public DDMStructure getStructure( long groupId, long classNameId, String structureKey) throws PortalException { structureKey = getStructureKey(structureKey); return ddmStructurePersistence.findByG_C_S( groupId, classNameId, structureKey); } /** * Returns the structure matching the class name ID, structure key, and * group, optionally searching ancestor sites (that have sharing enabled) * and global scoped sites. * *

* This method first searches in the group. If the structure is still not * found and includeAncestorStructures is set to * true, this method searches the group's ancestor sites (that * have sharing enabled) and lastly searches global scoped sites. *

* * @param groupId the primary key of the structure's group * @param classNameId the primary key of the class name for the structure's * related model * @param structureKey the unique string identifying the structure * @param includeAncestorStructures whether to include ancestor sites (that * have sharing enabled) and include global scoped sites in the * search in the search * @return the matching structure */ @Override public DDMStructure getStructure( long groupId, long classNameId, String structureKey, boolean includeAncestorStructures) throws PortalException { structureKey = getStructureKey(structureKey); DDMStructure structure = ddmStructurePersistence.fetchByG_C_S( groupId, classNameId, structureKey); if (structure != null) { return structure; } if (!includeAncestorStructures) { throw new NoSuchStructureException( "No DDMStructure exists with the structure key " + structureKey); } for (long curGroupId : PortalUtil.getAncestorSiteGroupIds(groupId)) { structure = ddmStructurePersistence.fetchByG_C_S( curGroupId, classNameId, structureKey); if (structure != null) { return structure; } } throw new NoSuchStructureException( "No DDMStructure exists with the structure key " + structureKey + " in the ancestor groups"); } /** * Returns all the structures matching the group, name, and description. * * @param groupId the primary key of the structure's group * @param name the structure's name * @param description the structure's description * @return the matching structures */ @Override public List getStructure( long groupId, String name, String description) { return ddmStructurePersistence.findByG_N_D(groupId, name, description); } @Override public DDMForm getStructureDDMForm(DDMStructure structure) throws PortalException { return ddmFormJSONDeserializer.deserialize(structure.getDefinition()); } /** * Returns all the structures present in the system. * * @return the structures present in the system */ @Override public List getStructures() { return ddmStructurePersistence.findAll(); } /** * Returns all the structures present in the group. * * @param groupId the primary key of the group * @return the structures present in the group */ @Override public List getStructures(long groupId) { return ddmStructurePersistence.findByGroupId(groupId); } /** * Returns a range of all the structures belonging to the group. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param groupId the primary key of the group * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @return the range of matching structures */ @Override public List getStructures(long groupId, int start, int end) { return ddmStructurePersistence.findByGroupId(groupId, start, end); } /** * Returns all the structures matching class name ID and group. * * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @return the matching structures */ @Override public List getStructures(long groupId, long classNameId) { return ddmStructurePersistence.findByG_C(groupId, classNameId); } /** * Returns a range of all the structures that match the class name ID and * group. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @return the range of matching structures */ @Override public List getStructures( long groupId, long classNameId, int start, int end) { return ddmStructurePersistence.findByG_C( groupId, classNameId, start, end); } /** * Returns an ordered range of all the structures matching the class name ID * and group. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @param orderByComparator the comparator to order the structures * (optionally null) * @return the range of matching structures ordered by the comparator */ @Override public List getStructures( long groupId, long classNameId, int start, int end, OrderByComparator orderByComparator) { return ddmStructurePersistence.findByG_C( groupId, classNameId, start, end, orderByComparator); } @Override public List getStructures( long groupId, String name, String description) { return ddmStructurePersistence.findByG_N_D(groupId, name, description); } /** * Returns all the structures belonging to the groups. * * @param groupIds the primary keys of the groups * @return the structures belonging to the groups */ @Override public List getStructures(long[] groupIds) { return ddmStructurePersistence.findByGroupId(groupIds); } /** * Returns all the structures matching the class name ID and belonging to * the groups. * * @param groupIds the primary keys of the groups * @param classNameId the primary key of the class name for the structure's * related model * @return the matching structures */ @Override public List getStructures(long[] groupIds, long classNameId) { return ddmStructurePersistence.findByG_C(groupIds, classNameId); } /** * Returns a range of all the structures matching the class name ID and * belonging to the groups. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param groupIds the primary keys of the groups * @param classNameId the primary key of the class name for the structure's * related model * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @return the range of matching structures */ @Override public List getStructures( long[] groupIds, long classNameId, int start, int end) { return ddmStructurePersistence.findByG_C( groupIds, classNameId, start, end); } /** * Returns the number of structures belonging to the group. * * @param groupId the primary key of the group * @return the number of structures belonging to the group */ @Override public int getStructuresCount(long groupId) { return ddmStructurePersistence.countByGroupId(groupId); } /** * Returns the number of structures matching the class name ID and group. * * @param groupId the primary key of the group * @param classNameId the primary key of the class name for the structure's * related model * @return the number of matching structures */ @Override public int getStructuresCount(long groupId, long classNameId) { return ddmStructurePersistence.countByG_C(groupId, classNameId); } /** * Returns the number of structures matching the class name ID and belonging * to the groups. * * @param groupIds the primary keys of the groups * @param classNameId the primary key of the class name for the structure's * related model * @return the number of matching structures */ @Override public int getStructuresCount(long[] groupIds, long classNameId) { return ddmStructurePersistence.countByG_C(groupIds, classNameId); } @Override public String prepareLocalizedDefinitionForImport( DDMStructure structure, Locale defaultImportLocale) { DDMForm ddmForm = ddm.updateDDMFormDefaultLocale( structure.getDDMForm(), defaultImportLocale); return ddmFormJSONSerializer.serialize(ddmForm); } @Override public void revertStructure( long userId, long structureId, String version, ServiceContext serviceContext) throws PortalException { DDMStructureVersion structureVersion = ddmStructureVersionLocalService.getStructureVersion( structureId, version); if (!structureVersion.isApproved()) { throw new InvalidStructureVersionException( "Unable to revert from an unapproved file version"); } DDMStructure structure = structureVersion.getStructure(); serviceContext.setAttribute("majorVersion", Boolean.TRUE); serviceContext.setAttribute( "status", WorkflowConstants.STATUS_APPROVED); serviceContext.setCommand(Constants.REVERT); ddmStructureLocalService.updateStructure( userId, structure.getGroupId(), structureVersion.getParentStructureId(), structure.getClassNameId(), structure.getStructureKey(), structureVersion.getNameMap(), structureVersion.getDescriptionMap(), structureVersion.getDDMForm(), structureVersion.getDDMFormLayout(), serviceContext); } /** * Returns an ordered range of all the structures matching the groups and * class name IDs, and matching the keywords in the structure names and * descriptions. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param companyId the primary key of the structure's company * @param groupIds the primary keys of the groups * @param classNameId the primary key of the class name of the model the * structure is related to * @param keywords the keywords (space separated), which may occur in the * structure's name or description (optionally null) * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @param orderByComparator the comparator to order the structures * (optionally null) * @return the range of matching structures ordered by the comparator */ @Override public List search( long companyId, long[] groupIds, long classNameId, String keywords, int status, int start, int end, OrderByComparator orderByComparator) { return ddmStructureFinder.findByKeywords( companyId, groupIds, classNameId, keywords, status, start, end, orderByComparator); } /** * Returns an ordered range of all the structures matching the groups, class * name IDs, name keyword, description keyword, storage type, and type. * *

* Useful when paginating results. Returns a maximum of end - * start instances. start and end are not * primary keys, they are indexes in the result set. Thus, 0 * refers to the first result in the set. Setting both start * and end to {@link QueryUtil#ALL_POS} will return the full * result set. *

* * @param companyId the primary key of the structure's company * @param groupIds the primary keys of the groups * @param classNameId the primary key of the class name of the model the * structure is related to * @param name the name keywords * @param description the description keywords * @param storageType the structure's storage type. It can be "xml" or * "expando". For more information, see {@link StorageType}. * @param type the structure's type. For more information, see {@link * DDMStructureConstants}. * @param andOperator whether every field must match its keywords, or just * one field * @param start the lower bound of the range of structures to return * @param end the upper bound of the range of structures to return (not * inclusive) * @param orderByComparator the comparator to order the structures * (optionally null) * @return the range of matching structures ordered by the comparator */ @Override public List search( long companyId, long[] groupIds, long classNameId, String name, String description, String storageType, int type, int status, boolean andOperator, int start, int end, OrderByComparator orderByComparator) { return ddmStructureFinder.findByC_G_C_N_D_S_T_S( companyId, groupIds, classNameId, name, description, storageType, type, status, andOperator, start, end, orderByComparator); } /** * Returns the number of structures matching the groups and class name IDs, * and matching the keywords in the structure names and descriptions. * * @param companyId the primary key of the structure's company * @param groupIds the primary keys of the groups * @param classNameId the primary key of the class name of the model the * structure is related to * @param keywords the keywords (space separated), which may occur in the * structure's name or description (optionally null) * @return the number of matching structures */ @Override public int searchCount( long companyId, long[] groupIds, long classNameId, String keywords, int status) { return ddmStructureFinder.countByKeywords( companyId, groupIds, classNameId, keywords, status); } /** * Returns the number of structures matching the groups, class name IDs, * name keyword, description keyword, storage type, and type * * @param companyId the primary key of the structure's company * @param groupIds the primary keys of the groups * @param classNameId * @param name the name keywords * @param description the description keywords * @param storageType the structure's storage type. It can be "xml" or * "expando". For more information, see {@link StorageType}. * @param type the structure's type. For more information, see {@link * DDMStructureConstants}. * @param andOperator whether every field must match its keywords, or just * one field * @return the number of matching structures */ @Override public int searchCount( long companyId, long[] groupIds, long classNameId, String name, String description, String storageType, int type, int status, boolean andOperator) { return ddmStructureFinder.countByC_G_C_N_D_S_T_S( companyId, groupIds, classNameId, name, description, storageType, type, status, andOperator); } @Override public DDMStructure updateStructure( long userId, long structureId, DDMForm ddmForm, DDMFormLayout ddmFormLayout, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); return doUpdateStructure( userId, structure.getParentStructureId(), structure.getNameMap(), structure.getDescriptionMap(), ddmForm, ddmFormLayout, serviceContext, structure); } @Override public DDMStructure updateStructure( long userId, long groupId, long parentStructureId, long classNameId, String structureKey, Map nameMap, Map descriptionMap, DDMForm ddmForm, DDMFormLayout ddmFormLayout, ServiceContext serviceContext) throws PortalException { structureKey = getStructureKey(structureKey); DDMStructure structure = ddmStructurePersistence.findByG_C_S( groupId, classNameId, structureKey); return doUpdateStructure( userId, parentStructureId, nameMap, descriptionMap, ddmForm, ddmFormLayout, serviceContext, structure); } @Override public DDMStructure updateStructure( long userId, long structureId, long parentStructureId, Map nameMap, Map descriptionMap, DDMForm ddmForm, DDMFormLayout ddmFormLayout, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); return doUpdateStructure( userId, parentStructureId, nameMap, descriptionMap, ddmForm, ddmFormLayout, serviceContext, structure); } /** * Updates the structure matching the class name ID, structure key, and * group, replacing its old parent structure, name map, description map, and * XSD with new ones. * * @param groupId the primary key of the group * @param parentStructureId the primary key of the new parent structure * @param classNameId the primary key of the class name for the * structure's related model * @param structureKey the unique string identifying the structure * @param nameMap the structure's new locales and localized names * @param descriptionMap the structure's new locales and localized * description * @param definition the structure's new XML schema definition * @param serviceContext the service context to be applied. Can set the * structure's modification date. * @return the updated structure * @deprecated As of 7.0.0, replaced by {@link #updateStructure(long, long, * long, long, String, Map, Map, DDMForm, DDMFormLayout, * ServiceContext)} */ @Deprecated @Override public DDMStructure updateStructure( long groupId, long parentStructureId, long classNameId, String structureKey, Map nameMap, Map descriptionMap, String definition, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByG_C_S( groupId, classNameId, structureKey); long userId = PortalUtil.getValidUserId( structure.getCompanyId(), serviceContext.getUserId()); ddmXML.validateXML(definition); DDMForm ddmForm = ddmFormXSDDeserializer.deserialize(definition); DDMFormLayout ddmFormLayout = ddm.getDefaultDDMFormLayout(ddmForm); structureKey = getStructureKey(structureKey); return doUpdateStructure( userId, parentStructureId, nameMap, descriptionMap, ddmForm, ddmFormLayout, serviceContext, structure); } /** * Updates the structure matching the structure ID, replacing its old parent * structure, name map, description map, and XSD with new ones. * * @param structureId the primary key of the structure * @param parentStructureId the primary key of the new parent structure * @param nameMap the structure's new locales and localized names * @param descriptionMap the structure's new locales and localized * descriptions * @param definition the structure's new XML schema definition * @param serviceContext the service context to be applied. Can set the * structure's modification date. * @return the updated structure * @deprecated As of 7.0.0, replaced by {@link #updateStructure(long, long, * long, Map, Map, DDMForm, DDMFormLayout, ServiceContext)} */ @Deprecated @Override public DDMStructure updateStructure( long structureId, long parentStructureId, Map nameMap, Map descriptionMap, String definition, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); long userId = PortalUtil.getValidUserId( structure.getCompanyId(), serviceContext.getUserId()); ddmXML.validateXML(definition); DDMForm ddmForm = ddmFormXSDDeserializer.deserialize(definition); DDMFormLayout ddmFormLayout = ddm.getDefaultDDMFormLayout(ddmForm); return doUpdateStructure( userId, parentStructureId, nameMap, descriptionMap, ddmForm, ddmFormLayout, serviceContext, structure); } /** * Updates the structure matching the structure ID, replacing its XSD with a * new one. * * @param structureId the primary key of the structure * @param definition the structure's new XML schema definition * @param serviceContext the service context to be applied. Can set the * structure's modification date. * @return the updated structure * @deprecated As of 7.0.0, replaced by {@link #updateStructure(long, * DDMForm, DDMFormLayout, ServiceContext)} */ @Deprecated @Override public DDMStructure updateXSD( long structureId, String definition, ServiceContext serviceContext) throws PortalException { DDMStructure structure = ddmStructurePersistence.findByPrimaryKey( structureId); long userId = PortalUtil.getValidUserId( structure.getCompanyId(), serviceContext.getUserId()); ddmXML.validateXML(definition); DDMForm ddmForm = ddmFormXSDDeserializer.deserialize(definition); DDMFormLayout ddmFormLayout = ddm.getDefaultDDMFormLayout(ddmForm); return doUpdateStructure( userId, structure.getParentStructureId(), structure.getNameMap(), structure.getDescriptionMap(), ddmForm, ddmFormLayout, serviceContext, structure); } protected void addDataProviderInstanceLinks( long structureId, DDMForm ddmForm) { Set dataProviderInstanceIds = getDataProviderInstanceIds(ddmForm); for (Long dataProviderInstanceId : dataProviderInstanceIds) { ddmDataProviderInstanceLinkLocalService.addDataProviderInstanceLink( dataProviderInstanceId, structureId); } } protected DDMStructureVersion addStructureVersion( User user, DDMStructure structure, String version, ServiceContext serviceContext) { long structureVersionId = counterLocalService.increment(); DDMStructureVersion structureVersion = ddmStructureVersionPersistence.create(structureVersionId); structureVersion.setGroupId(structure.getGroupId()); structureVersion.setCompanyId(structure.getCompanyId()); structureVersion.setUserId(structure.getUserId()); structureVersion.setUserName(structure.getUserName()); structureVersion.setCreateDate(structure.getModifiedDate()); structureVersion.setStructureId(structure.getStructureId()); structureVersion.setVersion(version); structureVersion.setParentStructureId(structure.getParentStructureId()); structureVersion.setName(structure.getName()); structureVersion.setDescription(structure.getDescription()); structureVersion.setDefinition(structure.getDefinition()); structureVersion.setStorageType(structure.getStorageType()); structureVersion.setType(structure.getType()); int status = GetterUtil.getInteger( serviceContext.getAttribute("status"), WorkflowConstants.STATUS_APPROVED); structureVersion.setStatus(status); structureVersion.setStatusByUserId(user.getUserId()); structureVersion.setStatusByUserName(user.getFullName()); structureVersion.setStatusDate(structure.getModifiedDate()); ddmStructureVersionPersistence.update(structureVersion); return structureVersion; } protected Set deleteStructures(List structures) throws PortalException { Set deletedStructureIds = new HashSet<>(); for (DDMStructure structure : structures) { if (deletedStructureIds.contains(structure.getStructureId())) { continue; } if (!GroupThreadLocal.isDeleteInProcess()) { List childDDMStructures = ddmStructurePersistence.findByParentStructureId( structure.getStructureId()); deletedStructureIds.addAll( deleteStructures(childDDMStructures)); } ddmStructureLocalService.deleteStructure(structure); deletedStructureIds.add(structure.getStructureId()); } return deletedStructureIds; } protected DDMStructure doUpdateStructure( long userId, long parentStructureId, Map nameMap, Map descriptionMap, DDMForm ddmForm, DDMFormLayout ddmFormLayout, ServiceContext serviceContext, DDMStructure structure) throws PortalException { // Structure User user = userPersistence.findByPrimaryKey(userId); DDMForm parentDDMForm = getParentDDMForm(parentStructureId); validate(nameMap, parentDDMForm, ddmForm); structure.setParentStructureId(parentStructureId); DDMStructureVersion latestStructureVersion = ddmStructureVersionLocalService.getLatestStructureVersion( structure.getStructureId()); boolean majorVersion = GetterUtil.getBoolean( serviceContext.getAttribute("majorVersion")); String version = getNextVersion( latestStructureVersion.getVersion(), majorVersion); structure.setVersion(version); structure.setNameMap(nameMap); structure.setVersionUserId(user.getUserId()); structure.setVersionUserName(user.getFullName()); structure.setDescriptionMap(descriptionMap); structure.setDefinition(ddmFormJSONSerializer.serialize(ddmForm)); // Structure version DDMStructureVersion structureVersion = addStructureVersion( user, structure, version, serviceContext); // Structure layout ddmStructureLayoutLocalService.addStructureLayout( structureVersion.getUserId(), structureVersion.getGroupId(), structureVersion.getStructureVersionId(), ddmFormLayout, serviceContext); if (!structureVersion.isApproved()) { return structure; } ddmStructurePersistence.update(structure); // Structure templates syncStructureTemplatesFields(structure); // Data provider instance links updateDataProviderInstanceLinks(structure.getStructureId(), ddmForm); // Indexer reindexStructure(structure, serviceContext); return structure; } protected Set getDataProviderInstanceIds(DDMForm ddmForm) { Set dataProviderInstanceIds = new HashSet<>(); Map ddmFormFieldsMap = ddmForm.getDDMFormFieldsMap(true); for (DDMFormField ddmFormField : ddmFormFieldsMap.values()) { long ddmDataProviderInstanceId = GetterUtil.getLong( ddmFormField.getProperty("ddmDataProviderInstanceId")); if (ddmDataProviderInstanceId > 0) { dataProviderInstanceIds.add(ddmDataProviderInstanceId); } } return dataProviderInstanceIds; } protected Set getDDMFormFieldsNames(DDMForm ddmForm) { Map ddmFormFieldsMap = ddmForm.getDDMFormFieldsMap(true); Set ddmFormFieldsNames = new HashSet<>(ddmFormFieldsMap.size()); for (String ddmFormFieldName : ddmFormFieldsMap.keySet()) { ddmFormFieldsNames.add(StringUtil.toLowerCase(ddmFormFieldName)); } return ddmFormFieldsNames; } protected String getNextVersion(String version, boolean majorVersion) { int[] versionParts = StringUtil.split(version, StringPool.PERIOD, 0); if (majorVersion) { versionParts[0]++; versionParts[1] = 0; } else { versionParts[1]++; } return versionParts[0] + StringPool.PERIOD + versionParts[1]; } protected DDMForm getParentDDMForm(long parentStructureId) { DDMStructure parentStructure = ddmStructurePersistence.fetchByPrimaryKey(parentStructureId); if (parentStructure == null) { return null; } return parentStructure.getFullHierarchyDDMForm(); } protected String getStructureKey(String structureKey) { if (structureKey != null) { structureKey = structureKey.trim(); return StringUtil.toUpperCase(structureKey); } return StringPool.BLANK; } protected List getStructureTemplates( DDMStructure structure, String type) { long classNameId = classNameLocalService.getClassNameId( DDMStructure.class); return ddmTemplateLocalService.getTemplates( structure.getGroupId(), classNameId, structure.getStructureId(), type); } protected void reindexStructure( DDMStructure structure, ServiceContext serviceContext) throws PortalException { Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer( structure.getClassName()); if (!(indexer instanceof DDMStructureIndexer)) { return; } String backgroundTaskName = DDMStructureIndexerBackgroundTaskExecutor.getBackgroundTaskName( structure.getStructureId()); Map taskContextMap = new HashMap<>(); taskContextMap.put("structureId", structure.getStructureId()); backgroundTaskmanager.addBackgroundTask( structure.getUserId(), structure.getGroupId(), backgroundTaskName, DDMStructureIndexerBackgroundTaskExecutor.class.getName(), taskContextMap, serviceContext); } protected void syncStructureTemplatesFields(final DDMStructure structure) { TransactionCommitCallbackUtil.registerCallback( new Callable() { @Override public Void call() throws Exception { DDMFormTemplateSynchonizer ddmFormTemplateSynchonizer = new DDMFormTemplateSynchonizer( structure.getDDMForm(), ddmFormJSONDeserializer, ddmFormJSONSerializer, ddmTemplateLocalService); List templates = getStructureTemplates( structure, DDMTemplateConstants.TEMPLATE_TYPE_FORM); ddmFormTemplateSynchonizer.setDDMFormTemplates(templates); ddmFormTemplateSynchonizer.synchronize(); return null; } }); } protected void updateDataProviderInstanceLinks( long structureId, DDMForm ddmForm) { Set dataProviderInstanceIds = getDataProviderInstanceIds(ddmForm); List dataProviderInstaceLinks = ddmDataProviderInstanceLinkLocalService. getDataProviderInstanceLinks(structureId); for (DDMDataProviderInstanceLink dataProviderInstanceLink : dataProviderInstaceLinks) { long dataProviderInstanceId = dataProviderInstanceLink.getDataProviderInstanceId(); if (dataProviderInstanceIds.remove(dataProviderInstanceId)) { continue; } ddmDataProviderInstanceLinkLocalService. deleteDataProviderInstanceLink(dataProviderInstanceLink); } for (Long dataProviderInstanceId : dataProviderInstanceIds) { ddmDataProviderInstanceLinkLocalService.addDataProviderInstanceLink( dataProviderInstanceId, structureId); } } protected void validate(DDMForm ddmForm) throws PortalException { ddmFormValidator.validate(ddmForm); } protected void validate(DDMForm parentDDMForm, DDMForm ddmForm) throws PortalException { Set commonDDMFormFieldNames = SetUtil.intersect( getDDMFormFieldsNames(parentDDMForm), getDDMFormFieldsNames(ddmForm)); if (!commonDDMFormFieldNames.isEmpty()) { throw new StructureDuplicateElementException( "Duplicate DDM form field names: " + StringUtil.merge(commonDDMFormFieldNames)); } } protected void validate( long groupId, long parentStructureId, long classNameId, String structureKey, Map nameMap, DDMForm ddmForm) throws PortalException { structureKey = getStructureKey(structureKey); DDMStructure structure = ddmStructurePersistence.fetchByG_C_S( groupId, classNameId, structureKey); if (structure != null) { StructureDuplicateStructureKeyException sdske = new StructureDuplicateStructureKeyException(); sdske.setStructureKey(structure.getStructureKey()); throw sdske; } DDMForm parentDDMForm = getParentDDMForm(parentStructureId); validate(nameMap, parentDDMForm, ddmForm); } protected void validate( Map nameMap, DDMForm parentDDMForm, DDMForm ddmForm) throws PortalException { try { validate(nameMap, ddmForm.getDefaultLocale()); validate(ddmForm); if (parentDDMForm != null) { validate(parentDDMForm, ddmForm); } } catch (DDMFormValidationException ddmfve) { throw ddmfve; } catch (LocaleException le) { throw le; } catch (StructureDuplicateElementException sdee) { throw sdee; } catch (StructureNameException sne) { throw sne; } catch (StructureDefinitionException sde) { throw sde; } catch (Exception e) { throw new StructureDefinitionException(e); } } protected void validate( Map nameMap, Locale contentDefaultLocale) throws PortalException { String name = nameMap.get(contentDefaultLocale); if (Validator.isNull(name)) { throw new StructureNameException( "Name is null for locale " + contentDefaultLocale.getDisplayName()); } if (!LanguageUtil.isAvailableLocale(contentDefaultLocale)) { Long companyId = CompanyThreadLocal.getCompanyId(); LocaleException le = new LocaleException( LocaleException.TYPE_CONTENT, "The locale " + contentDefaultLocale + " is not available in company " + companyId); le.setSourceAvailableLocales( Collections.singleton(contentDefaultLocale)); le.setTargetAvailableLocales(LanguageUtil.getAvailableLocales()); throw le; } } @ServiceReference(type = BackgroundTaskManager.class) protected BackgroundTaskManager backgroundTaskmanager; @ServiceReference(type = DDM.class) protected DDM ddm; @ServiceReference(type = DDMFormJSONDeserializer.class) protected DDMFormJSONDeserializer ddmFormJSONDeserializer; @ServiceReference(type = DDMFormJSONSerializer.class) protected DDMFormJSONSerializer ddmFormJSONSerializer; @ServiceReference(type = DDMFormValidator.class) protected DDMFormValidator ddmFormValidator; @ServiceReference(type = DDMFormXSDDeserializer.class) protected DDMFormXSDDeserializer ddmFormXSDDeserializer; @ServiceReference(type = DDMXML.class) protected DDMXML ddmXML; }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy