com.custom.portal.verify.CustomVerifyDynamicDataMapping.java Source code

Java tutorial

Introduction

Here is the source code for com.custom.portal.verify.CustomVerifyDynamicDataMapping.java

Source

/**
 * Copyright (c) 2000-2013 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.custom.portal.verify;

import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.FileVersion;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.Node;
import com.liferay.portal.kernel.xml.SAXReaderUtil;
import com.liferay.portal.kernel.xml.XPath;
import com.liferay.portal.model.BaseModel;
import com.liferay.portal.model.CompanyConstants;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.verify.VerifyProcess;
import com.liferay.portlet.documentlibrary.NoSuchFolderException;
import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
import com.liferay.portlet.documentlibrary.model.DLFileVersion;
import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
import com.liferay.portlet.documentlibrary.model.DLSyncConstants;
import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
import com.liferay.portlet.documentlibrary.store.DLStoreUtil;
import com.liferay.portlet.dynamicdatalists.model.DDLRecord;
import com.liferay.portlet.dynamicdatalists.model.DDLRecordModel;
import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
import com.liferay.portlet.dynamicdatalists.model.DDLRecordVersion;
import com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
import com.liferay.portlet.dynamicdatamapping.model.DDMStructureLink;
import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
import com.liferay.portlet.dynamicdatamapping.model.DDMTemplateConstants;
import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLinkLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
import com.liferay.portlet.dynamicdatamapping.storage.Field;
import com.liferay.portlet.dynamicdatamapping.storage.FieldConstants;
import com.liferay.portlet.dynamicdatamapping.storage.Fields;
import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
import com.liferay.portlet.dynamicdatamapping.util.DDMXMLUtil;

import java.io.File;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Marcellus Tavares
 */
public class CustomVerifyDynamicDataMapping extends VerifyProcess {

    protected FileEntry addFileEntry(long companyId, long userId, long groupId, long folderId, String fileName,
            String filePath, int status) throws Exception {

        String contentType = MimeTypesUtil.getContentType(fileName);

        String title = fileName;

        int index = title.indexOf(CharPool.PERIOD);

        if (index > 0) {
            title = title.substring(0, index);
        }

        try {
            File file = DLStoreUtil.getFile(companyId, CompanyConstants.SYSTEM, filePath);

            ServiceContext serviceContext = createServiceContext();

            FileEntry fileEntry = DLAppLocalServiceUtil.addFileEntry(userId, groupId, folderId, fileName,
                    contentType, title, StringPool.BLANK, StringPool.BLANK, file, serviceContext);

            updateFileEntryStatus(fileEntry, status, serviceContext);

            return fileEntry;
        } catch (Exception e) {
            if (_log.isWarnEnabled()) {
                _log.warn("Unable to add file entry " + fileName, e);
            }

            return null;
        }
    }

    protected Folder addFolder(long userId, long groupId, long primaryKey, String fieldName) throws Exception {

        Folder ddmFolder = addFolder(userId, groupId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, "DDM",
                StringPool.BLANK);

        Folder primaryKeyFolder = addFolder(userId, groupId, ddmFolder.getFolderId(), String.valueOf(primaryKey),
                StringPool.BLANK);

        return addFolder(userId, groupId, primaryKeyFolder.getFolderId(), fieldName, StringPool.BLANK);
    }

    protected Folder addFolder(long userId, long groupId, long parentFolderId, String name, String description)
            throws Exception {

        try {
            return DLAppLocalServiceUtil.getFolder(groupId, parentFolderId, name);
        } catch (NoSuchFolderException nsfe) {
            return DLAppLocalServiceUtil.addFolder(userId, groupId, parentFolderId, name, description,
                    createServiceContext());
        }
    }

    protected boolean createDefaultMetadataElement(Element dynamicElementElement, String defaultLanguageId) {

        boolean hasDefaultMetadataElement = hasDefaultMetadataElement(dynamicElementElement, defaultLanguageId);

        if (hasDefaultMetadataElement) {
            return false;
        }

        Element metadataElement = dynamicElementElement.addElement("meta-data");

        metadataElement.addAttribute("locale", defaultLanguageId);

        Element entryElement = metadataElement.addElement("entry");

        entryElement.addAttribute("name", "label");
        entryElement.addCDATA(StringPool.BLANK);

        return true;
    }

    protected ServiceContext createServiceContext() {
        ServiceContext serviceContext = new ServiceContext();

        serviceContext.setAddGroupPermissions(true);
        serviceContext.setAddGuestPermissions(true);

        return serviceContext;
    }

    @Override
    protected void doVerify() throws Exception {
        setUpClassNameIds();

        List<DDMStructure> structures = DDMStructureLocalServiceUtil.getStructures();

        for (DDMStructure structure : structures) {
            verifyStructure(structure);

            updateFileUploadReferences(structure);
        }
    }

    protected String getFileUploadPath(BaseModel<?> baseModel) throws Exception {

        StringBundler sb = new StringBundler(7);

        long primaryKey = 0;

        String version = StringPool.BLANK;

        if (baseModel instanceof DDLRecordModel) {
            DDLRecord ddlRecord = (DDLRecord) baseModel;

            primaryKey = ddlRecord.getPrimaryKey();

            DDLRecordVersion ddlRecordVersion = ddlRecord.getRecordVersion();

            version = ddlRecordVersion.getVersion();
        } else {
            DLFileEntryMetadata dlFileEntryMetadata = (DLFileEntryMetadata) baseModel;

            primaryKey = dlFileEntryMetadata.getPrimaryKey();

            DLFileVersion dlFileVersion = dlFileEntryMetadata.getFileVersion();

            version = dlFileVersion.getVersion();
        }

        sb.append("ddm");
        sb.append(StringPool.SLASH);
        sb.append(baseModel.getModelClassName());
        sb.append(StringPool.SLASH);
        sb.append(primaryKey);
        sb.append(StringPool.SLASH);
        sb.append(version);

        return sb.toString();
    }

    protected String getJSON(FileEntry fileEntry) {
        JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

        jsonObject.put("groupId", fileEntry.getGroupId());
        jsonObject.put("uuid", fileEntry.getUuid());

        return jsonObject.toString();
    }

    protected boolean hasDefaultMetadataElement(Element dynamicElementElement, String defaultLanguageId) {

        List<Element> metadataElements = dynamicElementElement.elements("meta-data");

        for (Element metadataElement : metadataElements) {
            String languageId = metadataElement.attributeValue("locale");

            if (languageId.equals(defaultLanguageId)) {
                return true;
            }
        }

        return false;
    }

    protected boolean hasFileUploadFields(DDMStructure structure) throws Exception {

        Map<String, Map<String, String>> fieldsMap = structure.getFieldsMap();

        for (Map<String, String> field : fieldsMap.values()) {
            String dataType = field.get(FieldConstants.DATA_TYPE);

            if (dataType.equals("file-upload")) {
                return true;
            }
        }

        return false;
    }

    protected void setUpClassNameIds() {
        _ddlRecordSetClassNameId = PortalUtil.getClassNameId(DDLRecordSet.class);
        _ddmStructureClassNameId = PortalUtil.getClassNameId(DDMStructure.class);
        _dlFileEntryMetadataClassNameId = PortalUtil.getClassNameId(DLFileEntryMetadata.class);
    }

    protected void updateDDLFileUploadReferences(long ddlRecordSetId) throws Exception {

        List<DDLRecord> ddlRecords = DDLRecordLocalServiceUtil.getRecords(ddlRecordSetId);

        for (DDLRecord ddlRecord : ddlRecords) {
            updateFileUploadReferences(ddlRecord.getCompanyId(), ddlRecord.getDDMStorageId(), ddlRecord.getUserId(),
                    ddlRecord.getGroupId(), ddlRecord, ddlRecord.getStatus());
        }
    }

    protected void updateDLFileUploadReferences(long dlFileEntryMetadataId) throws Exception {

        DLFileEntryMetadata dlFileEntryMetadata = DLFileEntryMetadataLocalServiceUtil
                .getFileEntryMetadata(dlFileEntryMetadataId);

        FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(dlFileEntryMetadata.getFileEntryId());

        FileVersion fileVersion = fileEntry.getFileVersion();

        updateFileUploadReferences(fileEntry.getCompanyId(), dlFileEntryMetadata.getDDMStorageId(),
                fileEntry.getUserId(), fileEntry.getGroupId(), dlFileEntryMetadata, fileVersion.getStatus());
    }

    protected void updateFieldValues(long storageId, Map<String, String> fieldValues) throws Exception {

        Fields fields = new Fields();

        for (Map.Entry<String, String> entry : fieldValues.entrySet()) {
            Field field = new Field(storageId, entry.getKey(), entry.getValue());

            fields.put(field);
        }

        ServiceContext serviceContext = new ServiceContext();

        StorageEngineUtil.update(storageId, fields, true, serviceContext);
    }

    protected void updateFileEntryStatus(FileEntry fileEntry, int status, ServiceContext serviceContext)
            throws Exception {

        FileVersion fileVersion = fileEntry.getFileVersion();

        Map<String, Serializable> workflowContext = new HashMap<String, Serializable>();

        workflowContext.put("event", DLSyncConstants.EVENT_ADD);

        DLFileEntryLocalServiceUtil.updateStatus(fileVersion.getUserId(), fileVersion.getFileVersionId(), status,
                workflowContext, serviceContext);
    }

    protected void updateFileUploadReferences(DDMStructure structure) throws Exception {

        if (!hasFileUploadFields(structure)) {
            return;
        }

        List<DDMStructureLink> structureLinks = DDMStructureLinkLocalServiceUtil
                .getStructureLinks(structure.getStructureId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS);

        for (DDMStructureLink structureLink : structureLinks) {
            updateFileUploadReferences(structureLink);
        }

        updateStructure(structure, updateXSD(structure.getXsd()));

        List<DDMTemplate> templates = DDMTemplateLocalServiceUtil.getTemplates(structure.getGroupId(),
                _ddmStructureClassNameId, structure.getStructureId(), DDMTemplateConstants.TEMPLATE_TYPE_FORM);

        for (DDMTemplate template : templates) {
            updateTemplate(template, updateXSD(template.getScript()));
        }
    }

    protected void updateFileUploadReferences(DDMStructureLink structureLink) throws Exception {

        long classNameId = structureLink.getClassNameId();

        if (classNameId == _ddlRecordSetClassNameId) {
            updateDDLFileUploadReferences(structureLink.getClassPK());
        } else if (classNameId == _dlFileEntryMetadataClassNameId) {
            updateDLFileUploadReferences(structureLink.getClassPK());
        }
    }

    protected void updateFileUploadReferences(long companyId, long storageId, long userId, long groupId,
            BaseModel<?> baseModel, int status) throws Exception {

        Map<String, String> fieldValues = new HashMap<String, String>();

        Fields fields = StorageEngineUtil.getFields(storageId);

        for (Field field : fields) {
            String dataType = field.getDataType();

            if (!dataType.equals("file-upload") || Validator.isNull(field.getValue())) {

                continue;
            }

            long primaryKey = GetterUtil.getLong(baseModel.getPrimaryKeyObj());

            Folder folder = addFolder(userId, groupId, primaryKey, field.getName());

            String valueString = String.valueOf(field.getValue());

            JSONObject jsonObject = JSONFactoryUtil.createJSONObject(valueString);

            String filePath = getFileUploadPath(baseModel) + StringPool.SLASH + field.getName();

            FileEntry fileEntry = addFileEntry(companyId, userId, groupId, folder.getFolderId(),
                    jsonObject.getString("name"), filePath, status);

            if (fileEntry != null) {
                fieldValues.put(field.getName(), getJSON(fileEntry));
            }
        }

        updateFieldValues(storageId, fieldValues);
    }

    protected void updateStructure(DDMStructure structure, String xsd) throws Exception {

        xsd = DDMXMLUtil.formatXML(xsd);

        structure.setXsd(xsd);

        DDMStructureLocalServiceUtil.updateDDMStructure(structure);
    }

    protected void updateTemplate(DDMTemplate template, String script) throws Exception {

        script = DDMXMLUtil.formatXML(script);

        template.setScript(script);

        DDMTemplateLocalServiceUtil.updateDDMTemplate(template);
    }

    protected String updateXSD(String xsd) throws Exception {
        Document document = SAXReaderUtil.read(xsd);

        Element rootElement = document.getRootElement();

        List<Element> dynamicElementElements = rootElement.elements("dynamic-element");

        for (Element dynamicElementElement : dynamicElementElements) {
            updateXSDDynamicElement(dynamicElementElement);
        }

        return document.asXML();
    }

    protected void updateXSDDynamicElement(Element element) {
        String dataType = element.attributeValue("dataType");

        if (Validator.equals(dataType, "file-upload")) {
            element.addAttribute("dataType", "document-library");
            element.addAttribute("type", "ddm-documentlibrary");
        }

        List<Element> dynamicElementElements = element.elements("dynamic-element");

        for (Element dynamicElementElement : dynamicElementElements) {
            updateXSDDynamicElement(dynamicElementElement);
        }
    }

    protected void verifyStructure(DDMStructure structure) throws Exception {
        boolean modified = false;

        String defaultLanguageId = structure.getDefaultLanguageId();

        XPath xPathSelector = SAXReaderUtil.createXPath("//dynamic-element");

        Document document = structure.getDocument();

        List<Node> nodes = xPathSelector.selectNodes(document);

        for (Node node : nodes) {
            Element dynamicElementElement = (Element) node;

            if (createDefaultMetadataElement(dynamicElementElement, defaultLanguageId)) {

                modified = true;
            }
        }

        if (modified) {
            updateStructure(structure, document.asXML());
        }
    }

    private static Log _log = LogFactoryUtil.getLog(CustomVerifyDynamicDataMapping.class);

    private long _ddlRecordSetClassNameId;
    private long _ddmStructureClassNameId;
    private long _dlFileEntryMetadataClassNameId;

}