com.liferay.dynamic.data.mapping.service.impl.DDMFormInstanceLocalServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.dynamic.data.mapping.service.impl.DDMFormInstanceLocalServiceImpl.java

Source

/**
 * 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.exception.FormInstanceNameException;
import com.liferay.dynamic.data.mapping.exception.FormInstanceStructureIdException;
import com.liferay.dynamic.data.mapping.io.DDMFormValuesJSONDeserializer;
import com.liferay.dynamic.data.mapping.io.DDMFormValuesJSONSerializer;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormInstance;
import com.liferay.dynamic.data.mapping.model.DDMFormInstanceSettings;
import com.liferay.dynamic.data.mapping.model.DDMFormInstanceVersion;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMStructureVersion;
import com.liferay.dynamic.data.mapping.service.base.DDMFormInstanceLocalServiceBaseImpl;
import com.liferay.dynamic.data.mapping.storage.DDMFormValues;
import com.liferay.dynamic.data.mapping.util.DDMFormFactory;
import com.liferay.dynamic.data.mapping.util.DDMFormInstanceFactory;
import com.liferay.dynamic.data.mapping.validator.DDMFormValuesValidator;
import com.liferay.portal.kernel.exception.PortalException;
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.service.ServiceContext;
import com.liferay.portal.kernel.systemevent.SystemEvent;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
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.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
 * @author Leonardo Barros
 */
public class DDMFormInstanceLocalServiceImpl extends DDMFormInstanceLocalServiceBaseImpl {

    @Override
    public DDMFormInstance addFormInstance(long userId, long groupId, long ddmStructureId,
            Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, DDMFormValues settingsDDMFormValues,
            ServiceContext serviceContext) throws PortalException {

        Locale defaultLocale = getDDMFormDefaultLocale(ddmStructureId);

        validate(ddmStructureId, nameMap, settingsDDMFormValues, defaultLocale);

        User user = userLocalService.getUser(userId);

        long ddmFormInstanceId = counterLocalService.increment();

        DDMFormInstance ddmFormInstance = ddmFormInstancePersistence.create(ddmFormInstanceId);

        ddmFormInstance.setUuid(serviceContext.getUuid());
        ddmFormInstance.setGroupId(groupId);
        ddmFormInstance.setCompanyId(user.getCompanyId());
        ddmFormInstance.setUserId(user.getUserId());
        ddmFormInstance.setUserName(user.getFullName());
        ddmFormInstance.setStructureId(ddmStructureId);
        ddmFormInstance.setVersion(_VERSION_DEFAULT);
        ddmFormInstance.setNameMap(nameMap, defaultLocale);
        ddmFormInstance.setDescriptionMap(descriptionMap, defaultLocale);
        ddmFormInstance.setSettings(ddmFormValuesJSONSerializer.serialize(settingsDDMFormValues));

        DDMFormInstance updatedDDMFormInstance = ddmFormInstancePersistence.update(ddmFormInstance);

        updateWorkflowDefinitionLink(ddmFormInstance, settingsDDMFormValues, serviceContext);

        if (serviceContext.isAddGroupPermissions() || serviceContext.isAddGuestPermissions()) {

            addFormInstanceResources(ddmFormInstance, serviceContext.isAddGroupPermissions(),
                    serviceContext.isAddGuestPermissions());
        } else {
            addFormInstanceResources(ddmFormInstance, serviceContext.getGroupPermissions(),
                    serviceContext.getGuestPermissions());
        }

        long structureVersionId = getStructureVersionId(ddmStructureId);

        addFormInstanceVersion(structureVersionId, user, ddmFormInstance, _VERSION_DEFAULT, serviceContext);

        return updatedDDMFormInstance;
    }

    @Override
    public DDMFormInstance addFormInstance(long userId, long groupId, long ddmStructureId,
            Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, String serializedSettingsDDMFormValues,
            ServiceContext serviceContext) throws PortalException {

        DDMFormValues settingsDDMFormValues = getFormInstanceSettingsFormValues(serializedSettingsDDMFormValues);

        return addFormInstance(userId, groupId, ddmStructureId, nameMap, descriptionMap, settingsDDMFormValues,
                serviceContext);
    }

    @Override
    public void addFormInstanceResources(DDMFormInstance ddmFormInstance, boolean addGroupPermissions,
            boolean addGuestPermissions) throws PortalException {

        resourceLocalService.addResources(ddmFormInstance.getCompanyId(), ddmFormInstance.getGroupId(),
                ddmFormInstance.getUserId(), DDMFormInstance.class.getName(), ddmFormInstance.getFormInstanceId(),
                false, addGroupPermissions, addGuestPermissions);
    }

    @Override
    public void addFormInstanceResources(DDMFormInstance ddmFormInstance, String[] groupPermissions,
            String[] guestPermissions) throws PortalException {

        resourceLocalService.addModelResources(ddmFormInstance.getCompanyId(), ddmFormInstance.getGroupId(),
                ddmFormInstance.getUserId(), DDMFormInstance.class.getName(), ddmFormInstance.getFormInstanceId(),
                groupPermissions, guestPermissions);
    }

    @Override
    @SystemEvent(action = SystemEventConstants.ACTION_SKIP, type = SystemEventConstants.TYPE_DELETE)
    public void deleteFormInstance(DDMFormInstance ddmFormInstance) throws PortalException {

        deleteDDMFormInstance(ddmFormInstance);

        resourceLocalService.deleteResource(ddmFormInstance.getCompanyId(), DDMFormInstance.class.getName(),
                ResourceConstants.SCOPE_INDIVIDUAL, ddmFormInstance.getFormInstanceId());

        ddmFormInstanceRecordLocalService.deleteFormInstanceRecords(ddmFormInstance.getFormInstanceId());

        ddmFormInstanceVersionLocalService.deleteByFormInstanceId(ddmFormInstance.getFormInstanceId());

        workflowDefinitionLinkLocalService.deleteWorkflowDefinitionLink(ddmFormInstance.getCompanyId(),
                ddmFormInstance.getGroupId(), DDMFormInstance.class.getName(), ddmFormInstance.getFormInstanceId(),
                0);
    }

    @Override
    public void deleteFormInstance(long ddmFormInstanceId) throws PortalException {

        DDMFormInstance ddmFormInstance = ddmFormInstancePersistence.findByPrimaryKey(ddmFormInstanceId);

        deleteFormInstance(ddmFormInstance);
    }

    @Override
    public void deleteFormInstances(long groupId) throws PortalException {
        List<DDMFormInstance> ddmFormInstances = ddmFormInstancePersistence.findByGroupId(groupId);

        for (DDMFormInstance ddmFormInstance : ddmFormInstances) {
            deleteFormInstance(ddmFormInstance);
        }
    }

    @Override
    public DDMFormInstance fetchFormInstance(long ddmFormInstanceId) {
        return ddmFormInstancePersistence.fetchByPrimaryKey(ddmFormInstanceId);
    }

    @Override
    public DDMFormInstance getFormInstance(long ddmFormInstanceId) throws PortalException {

        return ddmFormInstancePersistence.findByPrimaryKey(ddmFormInstanceId);
    }

    @Override
    public DDMFormInstance getFormInstance(String uuid, long ddmFormInstanceId) throws PortalException {

        return ddmFormInstancePersistence.findByUUID_G(uuid, ddmFormInstanceId);
    }

    @Override
    public List<DDMFormInstance> getFormInstances(long groupId) {
        return ddmFormInstancePersistence.findByGroupId(groupId);
    }

    @Override
    public int getFormInstancesCount(long groupId) {
        return ddmFormInstancePersistence.countByGroupId(groupId);
    }

    @Override
    public DDMFormValues getFormInstanceSettingsFormValues(DDMFormInstance formInstance) throws PortalException {

        return getFormInstanceSettingsFormValues(formInstance.getSettings());
    }

    @Override
    public DDMFormInstanceSettings getFormInstanceSettingsModel(DDMFormInstance formInstance)
            throws PortalException {

        DDMFormValues formValues = getFormInstanceSettingsFormValues(formInstance);

        return DDMFormInstanceFactory.create(DDMFormInstanceSettings.class, formValues);
    }

    @Override
    public List<DDMFormInstance> search(long companyId, long groupId, String keywords, int start, int end,
            OrderByComparator<DDMFormInstance> orderByComparator) {

        return ddmFormInstanceFinder.findByKeywords(companyId, groupId, keywords, start, end, orderByComparator);
    }

    @Override
    public List<DDMFormInstance> search(long companyId, long groupId, String[] names, String[] descriptions,
            boolean andOperator, int start, int end, OrderByComparator<DDMFormInstance> orderByComparator) {

        return ddmFormInstanceFinder.findByC_G_N_D(companyId, groupId, names, descriptions, andOperator, start, end,
                orderByComparator);
    }

    @Override
    public int searchCount(long companyId, long groupId, String keywords) {
        return ddmFormInstanceFinder.countByKeywords(companyId, groupId, keywords);
    }

    @Override
    public int searchCount(long companyId, long groupId, String[] names, String[] descriptions,
            boolean andOperator) {

        return ddmFormInstanceFinder.countByC_G_N_D(companyId, groupId, names, descriptions, andOperator);
    }

    @Override
    public DDMFormInstance updateFormInstance(long formInstanceId, DDMFormValues settingsDDMFormValues)
            throws PortalException {

        Date now = new Date();

        validateFormInstanceSettings(settingsDDMFormValues);

        DDMFormInstance formInstance = ddmFormInstancePersistence.findByPrimaryKey(formInstanceId);

        formInstance.setModifiedDate(now);
        formInstance.setSettings(ddmFormValuesJSONSerializer.serialize(settingsDDMFormValues));

        return ddmFormInstancePersistence.update(formInstance);
    }

    @Override
    public DDMFormInstance updateFormInstance(long ddmFormInstanceId, long ddmStructureId,
            Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, DDMFormValues settingsDDMFormValues,
            ServiceContext serviceContext) throws PortalException {

        DDMFormInstance ddmFormInstance = ddmFormInstancePersistence.findByPrimaryKey(ddmFormInstanceId);

        return doUpdateFormInstance(serviceContext.getUserId(), ddmStructureId, nameMap, descriptionMap,
                settingsDDMFormValues, serviceContext, ddmFormInstance);
    }

    @Override
    public DDMFormInstance updateFormInstance(long ddmFormInstanceId, long ddmStructureId,
            Map<Locale, String> nameMap, Map<Locale, String> descriptionMap, String serializedSettingsDDMFormValues,
            ServiceContext serviceContext) throws PortalException {

        DDMFormInstance ddmFormInstance = ddmFormInstancePersistence.findByPrimaryKey(ddmFormInstanceId);

        DDMFormValues settingsDDMFormValues = getFormInstanceSettingsFormValues(serializedSettingsDDMFormValues);

        return doUpdateFormInstance(serviceContext.getUserId(), ddmStructureId, nameMap, descriptionMap,
                settingsDDMFormValues, serviceContext, ddmFormInstance);
    }

    protected DDMFormInstanceVersion addFormInstanceVersion(long ddmStructureVersionId, User user,
            DDMFormInstance ddmFormInstance, String version, ServiceContext serviceContext) throws PortalException {

        long ddmFormInstanceVersionId = counterLocalService.increment();

        DDMFormInstanceVersion ddmFormInstanceVersion = ddmFormInstanceVersionPersistence
                .create(ddmFormInstanceVersionId);

        ddmFormInstanceVersion.setGroupId(ddmFormInstance.getGroupId());
        ddmFormInstanceVersion.setCompanyId(ddmFormInstance.getCompanyId());
        ddmFormInstanceVersion.setUserId(ddmFormInstance.getUserId());
        ddmFormInstanceVersion.setUserName(ddmFormInstance.getUserName());
        ddmFormInstanceVersion.setCreateDate(ddmFormInstance.getModifiedDate());
        ddmFormInstanceVersion.setFormInstanceId(ddmFormInstance.getFormInstanceId());
        ddmFormInstanceVersion.setStructureVersionId(ddmStructureVersionId);
        ddmFormInstanceVersion.setVersion(version);
        ddmFormInstanceVersion.setName(ddmFormInstance.getName());
        ddmFormInstanceVersion.setDescription(ddmFormInstance.getDescription());

        int status = GetterUtil.getInteger(serviceContext.getAttribute("status"),
                WorkflowConstants.STATUS_APPROVED);

        ddmFormInstanceVersion.setStatus(status);

        ddmFormInstanceVersion.setStatusByUserId(user.getUserId());
        ddmFormInstanceVersion.setStatusByUserName(user.getFullName());
        ddmFormInstanceVersion.setStatusDate(ddmFormInstance.getModifiedDate());

        ddmFormInstanceVersionPersistence.update(ddmFormInstanceVersion);

        return ddmFormInstanceVersion;
    }

    protected DDMFormInstance doUpdateFormInstance(long userId, long ddmStructureId, Map<Locale, String> nameMap,
            Map<Locale, String> descriptionMap, DDMFormValues settingsDDMFormValues, ServiceContext serviceContext,
            DDMFormInstance ddmFormInstance) throws PortalException {

        Locale defaultLocale = getDDMFormDefaultLocale(ddmStructureId);

        validate(ddmStructureId, nameMap, settingsDDMFormValues, defaultLocale);

        User user = userLocalService.getUser(userId);

        long oldDDMStructureId = ddmFormInstance.getStructureId();

        ddmFormInstance.setStructureId(ddmStructureId);

        DDMFormInstanceVersion latestDDMFormInstanceVersion = ddmFormInstanceVersionLocalService
                .getLatestFormInstanceVersion(ddmFormInstance.getFormInstanceId());

        int status = GetterUtil.getInteger(serviceContext.getAttribute("status"),
                WorkflowConstants.STATUS_APPROVED);

        boolean updateVersion = false;

        if ((latestDDMFormInstanceVersion.getStatus() == WorkflowConstants.STATUS_DRAFT)
                && (status == WorkflowConstants.STATUS_DRAFT)) {

            updateVersion = true;
        }

        boolean majorVersion = GetterUtil.getBoolean(serviceContext.getAttribute("majorVersion"));

        String version = getNextVersion(latestDDMFormInstanceVersion.getVersion(), majorVersion);

        if (!updateVersion) {
            ddmFormInstance.setVersion(version);

            ddmFormInstance.setVersionUserId(user.getUserId());
            ddmFormInstance.setVersionUserName(user.getFullName());
        }

        ddmFormInstance.setNameMap(nameMap, defaultLocale);
        ddmFormInstance.setDescriptionMap(descriptionMap, defaultLocale);
        ddmFormInstance.setSettings(ddmFormValuesJSONSerializer.serialize(settingsDDMFormValues));

        DDMFormInstance updatedDDMFormInstance = ddmFormInstancePersistence.update(ddmFormInstance);

        updateWorkflowDefinitionLink(ddmFormInstance, settingsDDMFormValues, serviceContext);

        long ddmStructureVersionId = getStructureVersionId(ddmStructureId);

        if (updateVersion) {
            updateFormInstanceVersion(ddmStructureVersionId, user, ddmFormInstance);
        } else {
            addFormInstanceVersion(ddmStructureVersionId, user, ddmFormInstance, version, serviceContext);
        }

        if (oldDDMStructureId != ddmStructureId) {
            ddmFormInstanceRecordLocalService.deleteFormInstanceRecords(ddmFormInstance.getFormInstanceId());
        }

        return updatedDDMFormInstance;
    }

    protected Locale getDDMFormDefaultLocale(DDMFormInstance ddmFormInstance) throws PortalException {

        DDMStructure ddmStructure = ddmFormInstance.getStructure();

        DDMForm ddmForm = ddmStructure.getDDMForm();

        return ddmForm.getDefaultLocale();
    }

    protected Locale getDDMFormDefaultLocale(long ddmStructureId) throws PortalException {

        DDMStructure ddmStructure = ddmStructureLocalService.getDDMStructure(ddmStructureId);

        DDMForm ddmForm = ddmStructure.getDDMForm();

        return ddmForm.getDefaultLocale();
    }

    protected DDMFormValues getFormInstanceSettingsFormValues(String serializedSettingsDDMFormValues)
            throws PortalException {

        DDMForm form = DDMFormFactory.create(DDMFormInstanceSettings.class);

        return ddmFormValuesJSONDeserializer.deserialize(form, serializedSettingsDDMFormValues);
    }

    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 long getStructureVersionId(long ddmStructureId) throws PortalException {

        DDMStructure ddmStructure = ddmStructureLocalService.getStructure(ddmStructureId);

        DDMStructureVersion ddmStructureVersion = ddmStructure.getStructureVersion();

        return ddmStructureVersion.getStructureVersionId();
    }

    protected String getWorkflowDefinition(DDMFormValues ddmFormValues) throws PortalException {

        DDMFormInstanceSettings ddmFormInstanceSettings = DDMFormInstanceFactory
                .create(DDMFormInstanceSettings.class, ddmFormValues);

        return ddmFormInstanceSettings.workflowDefinition();
    }

    protected void updateFormInstanceVersion(long ddmStructureVersionId, User user, DDMFormInstance ddmFormInstance)
            throws PortalException {

        DDMFormInstanceVersion ddmFormInstanceVersion = ddmFormInstanceVersionLocalService
                .getLatestFormInstanceVersion(ddmFormInstance.getFormInstanceId());

        ddmFormInstanceVersion.setUserId(ddmFormInstance.getUserId());
        ddmFormInstanceVersion.setUserName(ddmFormInstance.getUserName());
        ddmFormInstanceVersion.setStructureVersionId(ddmStructureVersionId);
        ddmFormInstanceVersion.setName(ddmFormInstance.getName());
        ddmFormInstanceVersion.setDescription(ddmFormInstance.getDescription());
        ddmFormInstanceVersion.setStatusByUserId(user.getUserId());
        ddmFormInstanceVersion.setStatusByUserName(user.getFullName());
        ddmFormInstanceVersion.setStatusDate(ddmFormInstance.getModifiedDate());

        ddmFormInstanceVersionPersistence.update(ddmFormInstanceVersion);
    }

    protected void updateWorkflowDefinitionLink(DDMFormInstance formInstance, DDMFormValues settingsDDMFormValues,
            ServiceContext serviceContext) throws PortalException {

        String workflowDefinition = getWorkflowDefinition(settingsDDMFormValues);

        if (workflowDefinition.equals("no-workflow")) {
            workflowDefinition = "";
        }

        workflowDefinitionLinkLocalService.updateWorkflowDefinitionLink(serviceContext.getUserId(),
                serviceContext.getCompanyId(), formInstance.getGroupId(), DDMFormInstance.class.getName(),
                formInstance.getFormInstanceId(), 0, workflowDefinition);
    }

    protected void validate(long ddmStructureId, Map<Locale, String> nameMap, DDMFormValues settingsDDMFormValues,
            Locale defaultLocale) throws PortalException {

        validateStructureId(ddmStructureId);

        validateName(nameMap, defaultLocale);

        validateFormInstanceSettings(settingsDDMFormValues);
    }

    protected void validateFormInstanceSettings(DDMFormValues settingsDDMFormValues) throws PortalException {

        ddmFormValuesValidator.validate(settingsDDMFormValues);
    }

    protected void validateName(Map<Locale, String> nameMap, Locale defaultLocale) throws PortalException {

        String name = nameMap.get(defaultLocale);

        if (Validator.isNull(name)) {
            throw new FormInstanceNameException("Name is null for locale " + defaultLocale.getDisplayName());
        }
    }

    protected void validateStructureId(long ddmStructureId) throws PortalException {

        DDMStructure ddmStructure = ddmStructureLocalService.fetchStructure(ddmStructureId);

        if (ddmStructure == null) {
            throw new FormInstanceStructureIdException(
                    "No DDM structure exists with the DDM structure ID " + ddmStructureId);
        }
    }

    @ServiceReference(type = DDMFormValuesJSONDeserializer.class)
    protected DDMFormValuesJSONDeserializer ddmFormValuesJSONDeserializer;

    @ServiceReference(type = DDMFormValuesJSONSerializer.class)
    protected DDMFormValuesJSONSerializer ddmFormValuesJSONSerializer;

    @ServiceReference(type = DDMFormValuesValidator.class)
    protected DDMFormValuesValidator ddmFormValuesValidator;

    private static final String _VERSION_DEFAULT = "1.0";

}