Package org.infoglue.cms.applications.workflowtool.util

Source Code of org.infoglue.cms.applications.workflowtool.util.ContentFactory

/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
*  Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including 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, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.applications.workflowtool.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.exolab.castor.jdo.Database;
import org.infoglue.cms.controllers.kernel.impl.simple.CategoryController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentCategoryController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentControllerProxy;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController;
import org.infoglue.cms.entities.content.Content;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.content.ContentVersion;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.management.CategoryVO;
import org.infoglue.cms.entities.management.ContentTypeAttribute;
import org.infoglue.cms.entities.management.ContentTypeDefinitionVO;
import org.infoglue.cms.entities.management.LanguageVO;
import org.infoglue.cms.exception.ConstraintException;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.util.ConstraintExceptionBuffer;
import org.infoglue.cms.util.dom.DOMBuilder;

/**
*
*/
public class ContentFactory
{
  /**
   * The class logger.
   */
    private final static Logger logger = Logger.getLogger(ContentFactory.class.getName());
 
 
  /**
   * The content type.
   */
  private final ContentTypeDefinitionVO contentTypeDefinitionVO;
 
  /**
   * The content bean.
   */
  private final ContentValues contentValues;
 
  /**
   * The content version bean.
   */
  private final ContentVersionValues contentVersionValues;
 
  /**
   * The creator.
   */
  private final InfoGluePrincipal principal;

  /**
   * The language associated with the content version.
   */
  private final LanguageVO language;

  /**
   * The database to use.
   */
  private Database db;
 
  /**
   *
   * @param contentTypeDefinitionVO
   * @param contentValues
   * @param contentVersionValues
   * @param principal
   * @param language
   */
  public ContentFactory(final ContentTypeDefinitionVO contentTypeDefinitionVO, final ContentValues contentValues, final ContentVersionValues contentVersionValues, final InfoGluePrincipal principal, final LanguageVO language)
  {
    this.contentTypeDefinitionVO = contentTypeDefinitionVO;
    this.contentValues           = contentValues;
    this.contentVersionValues    = contentVersionValues;
    this.principal               = principal;
    this.language                = language;
   
    if(logger.isDebugEnabled())
    {
      logger.info("*********ContentFactory**********");
      logger.info("contentTypeDefinitionVO:" + contentTypeDefinitionVO);
      logger.info("contentValues:" + contentValues);
      logger.info("contentVersionValues:" + contentVersionValues);
      logger.info("principal:" + principal);
      logger.info("language:" + language);
      logger.info("*********END ContentFactory**********");
    }
  }

  /**
   *
   * @param parentContent
   * @param categories
   * @param db
   * @return
   * @throws ConstraintException
   */
  public ContentVO create(final ContentVO parentContent, final Map categories, final Database db) throws ConstraintException, SystemException, Exception
  {
    if(logger.isDebugEnabled())
    {
      logger.info("*********ContentFactory.create**********");
      logger.info("contentTypeDefinitionVO:" + contentTypeDefinitionVO);
      logger.info("contentValues:" + contentValues);
      logger.info("contentVersionValues:" + contentVersionValues);
      logger.info("principal:" + principal);
      logger.info("language:" + language);
      logger.info("parentContent:" + parentContent);
      logger.info("categories:" + categories);
    }
   
    this.db = db;
    final ContentVO contentVO = createContentVO();
    final Document contentVersionDocument = buildContentVersionDocument();
    final ContentVersionVO contentVersionVO = createContentVersionVO(contentVersionDocument.asXML());
   
    ConstraintExceptionBuffer ceb = validate(contentVO, contentVersionVO);
    if(ceb.isEmpty())
    {
      return createContent(parentContent, contentVO, contentVersionVO, categories);
    }
    else
    {
      try
      {
        ceb.throwIfNotEmpty();
      }
      catch (ConstraintException e)
      {
        logger.error("Problem creating content:" + e.getMessage());
      }
      catch (Exception e)
      {
        logger.error("Problem creating content:" + e.getMessage(), e);
      }
    }

    return null;
  }

  /**
   *
   * @param contentVO
   * @param categories
   * @return
   * @throws ConstraintException
   */
  public ContentVO update(final ContentVO contentVO, final Map categories, final Database db) throws ConstraintException
  {
    this.db = db;
    populateContentVO(contentVO);
    final ContentVersionVO contentVersionVO = createContentVersionVO(buildContentVersionDocument().asXML());
   
    ConstraintExceptionBuffer ceb = validate(contentVO, contentVersionVO);
    if(ceb.isEmpty())
    {
      return updateContent(contentVO, contentVersionVO, categories);
    }
    else
    {
      logger.error("Error: Not valid content or version - cancelling update.");
      /*
      try
      {
        ceb.throwIfNotEmpty();
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }
      */
    }
   
    return null;
  }

  /**
   *
   * @return
   */
  public ConstraintExceptionBuffer validate()
  {
    final ContentVO contentVO               = createContentVO();
    final ContentVersionVO contentVersionVO = createContentVersionVO(buildContentVersionDocument().asXML());
    return validate(contentVO, contentVersionVO);
  }

  /**
   *
   * @param contentVO
   * @param contentVersionVO
   * @return
   */
  private ConstraintExceptionBuffer validate(final ContentVO contentVO, final ContentVersionVO contentVersionVO)
  {
    final ConstraintExceptionBuffer ceb = contentVO.validate();
    ceb.add(contentVersionVO.validateAdvanced(contentTypeDefinitionVO, "en"));
    return ceb;
  }

  /**
   *
   * @param parentContent
   * @param contentVO
   * @param contentVersionVO
   * @param categories
   * @return
   */
  private ContentVO createContent(final ContentVO parentContent, final ContentVO contentVO, final ContentVersionVO contentVersionVO, final Map categories) throws Exception
  {
      try
      {
        if(logger.isDebugEnabled())
        {
        logger.info("************createContent**********");
        logger.info("parentContent:" + parentContent);
        logger.info("contentVO:" + contentVO);
        logger.info("contentVersionVO:" + contentVersionVO);
        logger.info("categories:" + categories);
        }
       
      final Content content = ContentControllerProxy.getContentController().create(db, parentContent.getId(), contentTypeDefinitionVO.getId(), parentContent.getRepositoryId(), contentVO);
      final ContentVersion newContentVersion = ContentVersionController.getContentVersionController().create(content.getId(), language.getId(), contentVersionVO, null, db);
      createCategories(newContentVersion, categories);
     
      if(logger.isDebugEnabled())
        logger.info("Returning:" + content + ":" + content.getValueObject());
     
      return content.getValueObject();
      }
      catch(Exception e)
      {
      //logger.error(e);
        throw e;
    }
     
    //if(logger.isDebugEnabled())
      //    logger.info("Returning null....");
   
      //return null;
  }

  /**
   *
   * @param contentVO
   * @param contentVersionVO
   * @param categories
   * @return
   */
  private ContentVO updateContent(final ContentVO contentVO, final ContentVersionVO contentVersionVO, final Map categories)
  {
    try
    {
      final Content content = ContentControllerProxy.getContentController().getContentWithId(contentVO.getId(), db);
      content.setValueObject(contentVO);
      final ContentVersion contentVersion = ContentVersionController.getContentVersionController().getLatestActiveContentVersion(content.getId(), language.getId(), db);
      if(contentVersion != null)
      {
        contentVersion.getValueObject().setVersionValue(contentVersionVO.getVersionValue());
        deleteCategories(contentVersion);
        createCategories(contentVersion, categories);
      }
      else
      {
        final ContentVersion newContentVersion = ContentVersionController.getContentVersionController().create(content.getId(), language.getId(), contentVersionVO, null, db);
        createCategories(newContentVersion, categories);
      }
     
      return content.getValueObject();
      }
    catch(Exception e)
    {
      e.printStackTrace();
      logger.warn(e);
      }
    return null;
  }

  /**
   * Deletes all content categories associated with the specified content version.
   *
   * @param contentVersion the content version.
   * @throws Exception if an exception occurs while deleting the content categories.
   */
  private void deleteCategories(final ContentVersion contentVersion) throws Exception
  {
    ContentCategoryController.getController().deleteByContentVersion(contentVersion.getId(), db);
  }

  /**
   *
   * @param contentVersion
   * @param categorieVOs
   * @throws Exception
   */
  private void createCategories(final ContentVersion contentVersion, final Map categorieVOs) throws Exception
  {
    if(categorieVOs != null)
    {
      for(Iterator i=categorieVOs.keySet().iterator(); i.hasNext(); )
      {
        String attributeName = (String) i.next();
        List categoryVOs     = (List) categorieVOs.get(attributeName);
        createCategory(contentVersion, attributeName, categoryVOs);
      }
    }
  }

  /**
   *
   * @param contentVersion
   * @param attributeName
   * @param categoryVOs
   * @throws Exception
   */
  private void createCategory(final ContentVersion contentVersion, final String attributeName, final List categoryVOs) throws Exception
  {
    final List categories = categoryVOListToCategoryList(categoryVOs);
    ContentCategoryController.getController().create(categories, contentVersion, attributeName, db);
  }

  /**
   *
   * @param db the database to use in the operation.
   * @param categoryVOList
   * @return
   * @throws Exception
   */
  private List categoryVOListToCategoryList(final List categoryVOList) throws Exception
  {
    final List result = new ArrayList();
    for(Iterator i=categoryVOList.iterator(); i.hasNext(); )
    {
      CategoryVO categoryVO = (CategoryVO) i.next();
      result.add(CategoryController.getController().findById(categoryVO.getCategoryId(), db));
    }
    return result;
  }
 

  /**
   * Creates a new content value object and populates it using the content bean.
   *
   * @return the content value object.
   */
  private ContentVO createContentVO()
  {
    final ContentVO contentVO = new ContentVO();
    populateContentVO(contentVO);
    return contentVO;
  }

  /**
   * Populates the specified content value object using the content bean.
   *
   * @param contentVO the content value object.
   */
  private void populateContentVO(final ContentVO contentVO)
  {
    contentVO.setName(contentValues.getName());
    if(contentValues.getPublishDateTime() != null)
      contentVO.setPublishDateTime(contentValues.getPublishDateTime());
   
    if(contentValues.getExpireDateTime() != null)
      contentVO.setExpireDateTime(contentValues.getExpireDateTime());
   
    contentVO.setIsBranch(Boolean.FALSE);
    contentVO.setCreatorName(principal.getName());
  }

  /**
   * Creates a new content version value object with the specified version value.
   *
   * @param versionValue the version value.
   * @return the content version value object.
   */
  private ContentVersionVO createContentVersionVO(final String versionValue)
  {
    final ContentVersionVO contentVersion = new ContentVersionVO();
    contentVersion.setVersionComment("");
    contentVersion.setVersionModifier(principal.getName());
    contentVersion.setVersionValue(versionValue);
    return contentVersion;
  }

  /**
   * Returns all attributes of the content type.
   *
   * @return the attributes.
   */
  private Collection getContentTypeAttributes()
  {
    return ContentTypeDefinitionController.getController().getContentTypeAttributes(contentTypeDefinitionVO, true);
  }
 
  /**
   * Builds the content version value document using the content version bean.
   *
   * @return the document.
   */
  private Document buildContentVersionDocument()
  {
    final DOMBuilder builder  = new DOMBuilder();
    final Document document   = builder.createDocument();
    final Element rootElement = builder.addElement(document, "root");
    builder.addAttribute(rootElement, "xmlns", "x-schema:Schema.xml");
    final Element attributesRoot =  builder.addElement(rootElement, "attributes");
   
    buildAttributes(builder, attributesRoot);
   
    return document;
  }

  /**
   * Builds the attributes part of the content version value document.
   *
   * @param domBuilder the document builder.
   * @param parentElement the parent element of all the attributes.
   */
  private void buildAttributes(final DOMBuilder domBuilder, final Element parentElement)
  { 
    final Collection typeAttributes = getContentTypeAttributes();
    for(final Iterator i=typeAttributes.iterator(); i.hasNext(); )
    {
      final ContentTypeAttribute attribute = (ContentTypeAttribute) i.next();
      final Element element = domBuilder.addElement(parentElement, attribute.getName());
      final String value = contentVersionValues.get(attribute.getName());
      if(value != null)
      {
        domBuilder.addCDATAElement(element, value);
      }
    }   
  }
}
TOP

Related Classes of org.infoglue.cms.applications.workflowtool.util.ContentFactory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.