/** * Copyright (c) 2009 Juwi MacMillan Group GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // license-header java merge-point /** * This is only generated once! It will never be overwritten. * You can (and have to!) safely modify it by hand. */ package de.juwimm.cms.model; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.tizzit.util.XercesHelper; import org.w3c.dom.Element; import de.juwimm.cms.remote.helper.AuthenticationHelper; import de.juwimm.cms.vo.ContentValue; /** * @see de.juwimm.cms.model.ContentHbm * @author <a href="mailto:carsten.schalm@juwimm.com">Carsten Schalm</a> , * Juwi|MacMillan Group Gmbh, Walsrode, Germany * @version $Id$ */ public class ContentHbmDaoImpl extends ContentHbmDaoBase { private static Logger log = Logger.getLogger(ContentHbmDaoImpl.class); @Autowired private SequenceHbmDao sequenceHbmDao; @Override protected ContentHbm handleCreate(ContentValue content, String creator) throws Exception { ContentHbm contentHbm = ContentHbm.Factory.newInstance(); if (contentHbm.getContentId() == null || contentHbm.getContentId().intValue() == 0) { contentHbm.setContentId(sequenceHbmDao.getNextSequenceNumber("content.content_id")); } else { contentHbm.setContentId(content.getContentId()); } contentHbm.setStatus(content.getStatus()); contentHbm.setTemplate(content.getTemplate()); // removeSpareContentVersions(); return this.create(contentHbm); } /** * @see de.juwimm.cms.model.ContentHbm#setContent(java.lang.String) */ @Override public void handleSetContent(ContentHbm content, String ct) { ContentVersionHbm contentVersion = content.getLastContentVersion(); if (contentVersion != null) { updateDocumentUseCountLastVersion(contentVersion.getText(), ct); contentVersion.setText(ct); } // -- Indexing through No-Messaging content.setUpdateSearchIndex(true); } /** * @see de.juwimm.cms.model.ContentHbmDao#updateDocumentUseCountLastVersion(java.lang.String, * java.lang.String) */ @Override protected void handleUpdateDocumentUseCountLastVersion(String oldContentText, String newContentText) { HashMap<Integer, Integer> deltaMap = this.getDeltaDocumentCounts(oldContentText, newContentText); this.updateDocumentUseCounts(deltaMap, true); } /** * @see de.juwimm.cms.model.ContentHbmDao#updateDocumentUseCountPublishVersion(java.lang.String, * java.lang.String) */ @Override protected void handleUpdateDocumentUseCountPublishVersion(String oldContentText, String newContentText) { HashMap<Integer, Integer> deltaMap = this.getDeltaDocumentCounts(oldContentText, newContentText); this.updateDocumentUseCounts(deltaMap, false); } private HashMap<Integer, Integer> getDeltaDocumentCounts(String oldContentText, String newContentText) { HashMap<Integer, Integer> deltaMap = new HashMap<Integer, Integer>(); if (oldContentText != null && !"".equalsIgnoreCase(oldContentText)) { deltaMap = this.getDocumentCountWrapper(deltaMap, oldContentText, true).getDeltaDocuments(); } if (newContentText != null && !"".equalsIgnoreCase(newContentText)) { deltaMap = this.getDocumentCountWrapper(deltaMap, newContentText, false).getDeltaDocuments(); } return deltaMap; } private DocumentCountWrapper getDocumentCountWrapper(HashMap<Integer, Integer> startMap, String contentText, boolean isOld) { DocumentCountWrapper dcw = new DocumentCountWrapper(startMap); org.w3c.dom.Document contentNode = null; try { contentNode = XercesHelper.string2Dom(contentText); } catch (Exception e) { if (log.isDebugEnabled()) log.debug("Content is not valid XML!"); } if (contentNode != null) { Iterator it = XercesHelper.findNodes(contentNode, "//document"); while (it.hasNext()) { Element doc = (Element) it.next(); Integer docId = null; try { docId = Integer.valueOf(doc.getAttribute("src")); } catch (NumberFormatException nfe) { if (log.isDebugEnabled()) log.debug(doc.getAttribute("src") + " is not a valid Number (DocumentId)!"); } if (docId != null) { dcw.addDocument(docId, new Integer(isOld ? -1 : +1)); } } } return dcw; } public class DocumentCountWrapper { private HashMap<Integer, Integer> deltaDocuments = null; public DocumentCountWrapper(HashMap<Integer, Integer> startMap) { this.deltaDocuments = startMap; } public HashMap<Integer, Integer> getDeltaDocuments() { return deltaDocuments; } public void addDocument(Integer docId, Integer docDelta) { Integer docCount = this.deltaDocuments.get(docId); if (docCount == null) docCount = new Integer(0); docCount = new Integer(docCount.intValue() + docDelta.intValue()); this.deltaDocuments.put(docId, docCount); } } private void updateDocumentUseCounts(HashMap<Integer, Integer> deltaMap, boolean isLastVersion) { Iterator<Integer> it = deltaMap.keySet().iterator(); while (it.hasNext()) { Integer docId = it.next(); Integer docCountDelta = deltaMap.get(docId); if (docCountDelta != null && docCountDelta.intValue() != 0) { try { DocumentHbm doc = getDocumentHbmDao().load(docId); if (isLastVersion) { int newCount = doc.getUseCountLastVersion() + docCountDelta.intValue(); if (newCount < 0) newCount = 0; doc.setUseCountLastVersion(newCount); } else { int newCount = doc.getUseCountPublishVersion() + docCountDelta.intValue(); if (newCount < 0) newCount = 0; doc.setUseCountPublishVersion(newCount); } } catch (Exception e) { log.error("Error updating documentCount: " + e.getMessage(), e); } } } } @Override protected void handleSetLatestContentVersionAsPublishVersion(Integer contentId) throws Exception { ContentHbm content = super.load(contentId); ContentVersionHbm latestVersion = content.getLastContentVersion(); ContentVersionHbm publsVersion = content.getContentVersionForPublish(); if (publsVersion != null) { String oldPublishContentText = publsVersion.getText() == null ? null : publsVersion.getText(); this.updateDocumentUseCountPublishVersion(oldPublishContentText, latestVersion.getText()); publsVersion.setText(latestVersion.getText()); publsVersion.setHeading(latestVersion.getHeading()); publsVersion.setCreateDate(System.currentTimeMillis()); publsVersion.setCreator(AuthenticationHelper.getUserName()); } else { publsVersion = ContentVersionHbm.Factory.newInstance(); publsVersion.setCreateDate(System.currentTimeMillis()); publsVersion.setText(latestVersion.getText()); publsVersion.setHeading(latestVersion.getHeading()); publsVersion.setCreator(AuthenticationHelper.getUserName()); publsVersion.setVersion("PUBLS"); publsVersion = super.getContentVersionHbmDao().create(publsVersion); content.getContentVersions().add(publsVersion); } // -- Indexing through Messaging if (publsVersion.getText() != null) { content.setUpdateSearchIndex(true); // -- Indexing } } /** * @see de.juwimm.cms.model.ContentHbm#toXml(int) */ @Override public String handleToXml(ContentHbm content) { StringBuilder sb = new StringBuilder(); sb.append("<content id=\""); sb.append(content.getContentId()); sb.append("\">\n"); sb.append("\t<template>").append(content.getTemplate()).append("</template>\n"); sb.append("\t<status>").append(content.getStatus()).append("</status>\n"); Collection coll = content.getContentVersions(); Iterator it = coll.iterator(); while (it.hasNext()) { ContentVersionHbm cvl = (ContentVersionHbm) it.next(); // getContentVersionForPublish(); if (cvl != null) { sb.append(getContentVersionHbmDao().toXml(cvl)); } } sb.append("</content>\n"); return sb.toString(); } @Override protected ContentHbm handleCreateWithContentVersion(ContentValue contentValue, String creator) throws Exception { ContentHbm contentHbm = ContentHbm.Factory.newInstance(); if (contentHbm.getContentId() == null || contentHbm.getContentId().intValue() == 0) { contentHbm.setContentId(sequenceHbmDao.getNextSequenceNumber("content.content_id")); } else { contentHbm.setContentId(contentValue.getContentId()); } contentHbm.setStatus(contentValue.getStatus()); contentHbm.setTemplate(contentValue.getTemplate()); ContentHbm content = this.create(contentHbm); ContentVersionHbm cv = ContentVersionHbm.Factory.newInstance(); cv.setVersion("1"); cv.setText(contentValue.getContentText()); cv.setHeading(contentValue.getHeading()); cv = getContentVersionHbmDao().create(cv); content.getContentVersions().add(cv); return content; } @Override protected ContentHbm handleCloneContent(ContentHbm oldContent, Map picturesIds, Map documentsIds, Map personsIds, Integer unitId) throws Exception { ContentHbm contentHbm = ContentHbm.Factory.newInstance(); try { contentHbm.setContentId(sequenceHbmDao.getNextSequenceNumber("content.content_id")); } catch (Exception e) { log.error("error at creating primary key for content"); } contentHbm.setStatus(oldContent.getStatus()); contentHbm.setTemplate(oldContent.getTemplate()); contentHbm.setUpdateSearchIndex(oldContent.isUpdateSearchIndex()); ContentVersionHbm contentVersion = getContentVersionHbmDao().cloneContentVersion(oldContent.getLastContentVersion(), picturesIds, documentsIds, personsIds, unitId); contentHbm = this.create(contentHbm); contentHbm.getContentVersions().add(contentVersion); return contentHbm; } @Override protected String handleToXmlWithLastContentVersion(ContentHbm content) throws Exception { StringBuilder sb = new StringBuilder(); sb.append("<content id=\""); sb.append(content.getContentId()); sb.append("\">\n"); sb.append("\t<template>").append(content.getTemplate()).append("</template>\n"); sb.append("\t<status>").append(content.getStatus()).append("</status>\n"); ContentVersionHbm lastContentVersion = content.getLastContentVersion(); sb.append(getContentVersionHbmDao().toXml(lastContentVersion)); sb.append("</content>\n"); return sb.toString(); } @Override protected ContentHbm handleCreateFromXml(Element cnde, boolean reusePrimaryKey, boolean liveDeploy, Map pictureIds, Map documentIds, Map personsIds, Integer newUniId) throws Exception { ContentHbm content = ContentHbm.Factory.newInstance(); if (reusePrimaryKey) { Integer id = new Integer(cnde.getAttribute("id")); if (log.isDebugEnabled()) log.debug("creating Content with existing id " + id); content.setContentId(id); } else { content.setContentId(sequenceHbmDao.getNextSequenceNumber("content.content_id")); } content.setStatus(Integer.parseInt(XercesHelper.getNodeValue(cnde, "./status"))); content.setUpdateSearchIndex(true); content.setTemplate(XercesHelper.getNodeValue(cnde, "./template")); content = create(content); Iterator cvit = XercesHelper.findNodes(cnde, "./contentVersion"); while (cvit.hasNext()) { Element cvnde = (Element) cvit.next(); String version = XercesHelper.getNodeValue(cvnde, "./version"); // import contentVersion: PUBLS only on livedeploy, all but PUBLS on import if ((liveDeploy && version.equalsIgnoreCase("PUBLS")) || (!liveDeploy && !version.equalsIgnoreCase("PUBLS"))) { ContentVersionHbm contentVersion; if ((pictureIds == null) && (documentIds == null)) { contentVersion = getContentVersionHbmDao().createFromXml(cvnde, reusePrimaryKey, liveDeploy); } else { contentVersion = getContentVersionHbmDao().createFromXmlWIthMedia(cvnde, reusePrimaryKey, liveDeploy, pictureIds, documentIds, personsIds, newUniId); } content.getContentVersions().add(contentVersion); } } return content; } }