/* * * This is a simple Content Management System (CMS) * Copyright (C) 2010 Imran M Yousuf (imyousuf@smartitengineering.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.smartitengineering.cms.spi.impl.content; import com.google.inject.Inject; import com.google.inject.Singleton; import com.smartitengineering.cms.api.content.Content; import com.smartitengineering.cms.api.content.ContentId; import com.smartitengineering.cms.api.content.Field; import com.smartitengineering.cms.api.factory.SmartContentAPI; import com.smartitengineering.cms.api.factory.content.WriteableContent; import com.smartitengineering.cms.spi.SmartContentSPI; import com.smartitengineering.cms.spi.content.PersistableContent; import com.smartitengineering.cms.spi.content.PersistentContentReader; import com.smartitengineering.cms.spi.persistence.PersistentService; import com.smartitengineering.dao.common.CommonReadDao; import com.smartitengineering.dao.common.CommonWriteDao; import com.smartitengineering.util.bean.adapter.GenericAdapter; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.Set; /** * * @author imyousuf */ @Singleton public class ContentPersistentService implements PersistentService<WriteableContent>, PersistentContentReader { @Inject private GenericAdapter<WriteableContent, PersistentContent> adapter; @Inject private CommonReadDao<PersistentContent, ContentId> commonReadDao; @Inject private CommonWriteDao<PersistentContent> commonWriteDao; //For Fields @Inject private GenericAdapter<Map<String, Field>, PersistentContentFields> fieldsAdapter; @Inject private CommonReadDao<PersistentContentFields, ContentId> fieldsReadDao; @Inject private CommonWriteDao<PersistentContentFields> fieldsWriteDao; public GenericAdapter<WriteableContent, PersistentContent> getAdapter() { return adapter; } public CommonReadDao<PersistentContent, ContentId> getCommonReadDao() { return commonReadDao; } public CommonWriteDao<PersistentContent> getCommonWriteDao() { return commonWriteDao; } @Override public void create(WriteableContent bean) throws Exception { final PersistableContent content; if (bean instanceof PersistableContent) { content = (PersistableContent) bean; } else { content = SmartContentSPI.getInstance().getPersistableDomainFactory().createPersistableContent(false); copy(bean, content); } Date date = new Date(); content.setCreationDate(date); content.setLastModifiedDate(date); content.setEntityTagValue(SmartContentAPI.getInstance().getContentLoader().getEntityTagValueForContent(content)); commonWriteDao.save(adapter.convert(content)); final PersistentContentFields converted = fieldsAdapter.convert(content.getOwnFields()); converted.setId(content.getContentId()); fieldsWriteDao.save(converted); } @Override public void update(WriteableContent bean) throws Exception { final PersistableContent content; if (bean instanceof PersistableContent) { content = (PersistableContent) bean; } else { content = SmartContentSPI.getInstance().getPersistableDomainFactory().createPersistableContent(false); copy(bean, content); } content.setLastModifiedDate(new Date()); content.setEntityTagValue(SmartContentAPI.getInstance().getContentLoader().getEntityTagValueForContent(content)); final PersistentContentFields converted = fieldsAdapter.convert(content.getOwnFields()); converted.setId(content.getContentId()); fieldsWriteDao.update(converted); commonWriteDao.update(adapter.convert(content)); } @Override public void delete(WriteableContent content) throws Exception { commonWriteDao.delete(adapter.convert(content)); final PersistentContentFields converted = fieldsAdapter.convert(content.getOwnFields()); converted.setId(content.getContentId()); fieldsWriteDao.delete(converted); } @Override public Collection<Content> readContentsFromPersistentStorage(ContentId... ids) { final Set<PersistentContent> byIds = commonReadDao.getByIds(Arrays.asList(ids)); return Collections.<Content>unmodifiableCollection(adapter.convertInversely(byIds.toArray(new PersistentContent[byIds. size()]))); } protected void copy(WriteableContent from, PersistableContent to) { to.setContentDefinition(from.getContentDefinition()); to.setContentId(from.getContentId()); to.setCreationDate(from.getCreationDate()); to.setLastModifiedDate(from.getLastModifiedDate()); to.setParentId(from.getParentId()); to.setStatus(from.getStatus()); for (Field field : from.getFields().values()) { to.setField(field); } } public Map<String, Field> getFieldsForContent(ContentId contentId) { if (contentId == null) { return Collections.emptyMap(); } final PersistentContentFields content = fieldsReadDao.getById(contentId); if (content == null) { return Collections.emptyMap(); } return fieldsAdapter.convertInversely(content); } }