/** * 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.skinny.service.impl; import com.liferay.dynamic.data.lists.model.DDLRecord; import com.liferay.dynamic.data.lists.model.DDLRecordSet; import com.liferay.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.model.Value; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.journal.exception.NoSuchArticleException; import com.liferay.journal.model.JournalArticle; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.security.access.control.AccessControlled; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import com.liferay.skinny.model.SkinnyDDLRecord; import com.liferay.skinny.model.SkinnyJournalArticle; import com.liferay.skinny.service.base.SkinnyServiceBaseImpl; import java.text.Format; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; /** * @author James Falkner * @author Amos Fong */ public class SkinnyServiceImpl extends SkinnyServiceBaseImpl { @AccessControlled(guestAccessEnabled = true) @Override public List<SkinnyDDLRecord> getSkinnyDDLRecords(long ddlRecordSetId) throws Exception { List<SkinnyDDLRecord> skinnyDDLRecords = new ArrayList<>(); PermissionChecker permissionChecker = getPermissionChecker(); DDLRecordSet ddlRecordSet = ddlRecordSetLocalService.getRecordSet( ddlRecordSetId); if (permissionChecker.hasPermission( ddlRecordSet.getGroupId(), DDLRecordSet.class.getName(), ddlRecordSet.getRecordSetId(), ActionKeys.VIEW)) { for (DDLRecord ddlRecord : ddlRecordSet.getRecords()) { SkinnyDDLRecord skinnyDDLRecord = getSkinnyDDLRecord(ddlRecord); skinnyDDLRecords.add(skinnyDDLRecord); } } return skinnyDDLRecords; } @AccessControlled(guestAccessEnabled = true) @Override public List<SkinnyJournalArticle> getSkinnyJournalArticles( long companyId, String groupName, long ddmStructureId, String locale) throws Exception { List<SkinnyJournalArticle> skinnyJournalArticles = new ArrayList<>(); Group group = groupLocalService.getGroup(companyId, groupName); DDMStructure ddmStructure = ddmStructureLocalService.getDDMStructure( ddmStructureId); Set<String> journalArticleIds = new HashSet<>(); List<JournalArticle> journalArticles = journalArticleLocalService.getStructureArticles( group.getGroupId(), ddmStructure.getStructureKey()); for (JournalArticle journalArticle : journalArticles) { if (journalArticleIds.contains(journalArticle.getArticleId())) { continue; } journalArticleIds.add(journalArticle.getArticleId()); try { PermissionChecker permissionChecker = getPermissionChecker(); if (permissionChecker.hasPermission( group.getGroupId(), JournalArticle.class.getName(), journalArticle.getResourcePrimKey(), ActionKeys.VIEW)) { JournalArticle latestJournalArticle = journalArticleLocalService.getLatestArticle( group.getGroupId(), journalArticle.getArticleId(), WorkflowConstants.STATUS_APPROVED); SkinnyJournalArticle skinnyJournalArticle = getSkinnyJournalArticle(latestJournalArticle, locale); skinnyJournalArticles.add(skinnyJournalArticle); } } catch (NoSuchArticleException nsae) { } } return skinnyJournalArticles; } protected SkinnyDDLRecord getSkinnyDDLRecord(DDLRecord ddlRecord) throws Exception { SkinnyDDLRecord skinnyDDLRecord = new SkinnyDDLRecord(); skinnyDDLRecord.addDynamicElement("uuid", ddlRecord.getUuid()); DDMFormValues ddmFormValues = ddlRecord.getDDMFormValues(); populateSkinnyDDLRecord( skinnyDDLRecord, ddmFormValues.getDDMFormFieldValues(), ddmFormValues.getDefaultLocale()); return skinnyDDLRecord; } protected SkinnyJournalArticle getSkinnyJournalArticle( JournalArticle journalArticle, String languageId) throws Exception { SkinnyJournalArticle skinnyJournalArticle = new SkinnyJournalArticle(); String content = null; if (ArrayUtil.contains( journalArticle.getAvailableLanguageIds(), languageId)) { content = journalArticle.getContentByLocale(languageId); } else { content = journalArticle.getContent(); } Document document = SAXReaderUtil.read(content); Element rootElement = document.getRootElement(); populateSkinnyJournalArticle(skinnyJournalArticle, rootElement); return skinnyJournalArticle; } protected void populateSkinnyDDLRecord( SkinnyDDLRecord skinnyDDLRecord, List<DDMFormFieldValue> ddmFormFieldValues, Locale defaultLocale) { for (DDMFormFieldValue ddmFormFieldValue : ddmFormFieldValues) { Value value = ddmFormFieldValue.getValue(); skinnyDDLRecord.addDynamicElement( ddmFormFieldValue.getName(), value.getString(defaultLocale)); populateSkinnyDDLRecord( skinnyDDLRecord, ddmFormFieldValue.getNestedDDMFormFieldValues(), defaultLocale); } } protected void populateSkinnyJournalArticle( SkinnyJournalArticle skinnyJournalArticle, Element parentElement) { List<Element> elements = parentElement.elements(); for (Element element : elements) { String elementName = element.getName(); if (elementName.equals("dynamic-element")) { Element dynamicElementElement = element.element( "dynamic-content"); if (dynamicElementElement != null) { skinnyJournalArticle.addDynamicElement( element.attributeValue("name"), dynamicElementElement.getTextTrim()); } } else { populateSkinnyJournalArticle(skinnyJournalArticle, element); } } } private Format _format = FastDateFormatFactoryUtil.getSimpleDateFormat( "yyyy-MM-dd"); }