/* =============================================================================== * * 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.controllers.kernel.impl.simple; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Locale; import org.apache.log4j.Logger; import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.OQLQuery; import org.exolab.castor.jdo.QueryResults; import org.infoglue.cms.entities.content.ContentVersionVO; import org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl; import org.infoglue.cms.entities.kernel.BaseEntityVO; import org.infoglue.cms.entities.management.Language; import org.infoglue.cms.entities.management.LanguageVO; import org.infoglue.cms.entities.management.PageDeliveryMetaData; import org.infoglue.cms.entities.management.PageDeliveryMetaDataEntity; import org.infoglue.cms.entities.management.PageDeliveryMetaDataEntityVO; import org.infoglue.cms.entities.management.PageDeliveryMetaDataVO; import org.infoglue.cms.entities.management.Repository; import org.infoglue.cms.entities.management.RepositoryLanguage; import org.infoglue.cms.entities.management.impl.simple.LanguageImpl; import org.infoglue.cms.entities.management.impl.simple.PageDeliveryMetaDataEntityImpl; import org.infoglue.cms.entities.management.impl.simple.PageDeliveryMetaDataImpl; import org.infoglue.cms.entities.management.impl.simple.RepositoryLanguageImpl; import org.infoglue.cms.exception.Bug; import org.infoglue.cms.exception.ConstraintException; import org.infoglue.cms.exception.SystemException; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.cms.util.ConstraintExceptionBuffer; import org.infoglue.deliver.util.CacheController; /** * This class handles all interaction with Languages and persistence of them. * * @author mattias */ public class PageDeliveryMetaDataController extends BaseController { private final static Logger logger = Logger.getLogger(PageDeliveryMetaDataController.class.getName()); /** * Factory method */ public static PageDeliveryMetaDataController getController() { return new PageDeliveryMetaDataController(); } /** * This method return a LanguageVO */ public PageDeliveryMetaDataVO getPageDeliveryMetaDataVO(Database db, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception { if(contentId == null) contentId = -1; //System.out.println("siteNodeId:" + siteNodeId); //System.out.println("languageId:" + languageId); //System.out.println("contentId:" + contentId); String key = "" + siteNodeId + "_" + languageId + "_" + contentId; //System.out.println("key on fetch 1:" + key); PageDeliveryMetaDataVO pageDeliveryMetaDataVO = (PageDeliveryMetaDataVO)CacheController.getCachedObjectFromAdvancedCache("pageDeliveryMetaDataCache", key); //System.out.println("pageDeliveryMetaDataVO:" + pageDeliveryMetaDataVO); if(pageDeliveryMetaDataVO == null) { //System.out.println("key on fetch:" + key); try { OQLQuery oql = db.getOQLQuery("SELECT f FROM org.infoglue.cms.entities.management.impl.simple.PageDeliveryMetaDataImpl f WHERE f.siteNodeId = $1 AND f.languageId = $2 AND f.contentId = $3"); oql.bind(siteNodeId); oql.bind(languageId); oql.bind(contentId); QueryResults results = oql.execute(Database.READONLY); if (results.hasMore()) { PageDeliveryMetaData pageDeliveryMetaData = (PageDeliveryMetaData)results.next(); if(pageDeliveryMetaData != null) { pageDeliveryMetaDataVO = pageDeliveryMetaData.getValueObject(); CacheController.cacheObjectInAdvancedCache("pageDeliveryMetaDataCache", key, pageDeliveryMetaDataVO); } } results.close(); oql.close(); } catch(Exception e) { throw new SystemException("An error occurred when we tried to fetch a PageDeliveryMetaData. Reason:" + e.getMessage(), e); } } return pageDeliveryMetaDataVO; } public PageDeliveryMetaDataVO create(PageDeliveryMetaDataVO pageDeliveryMetaDataVO) throws ConstraintException, SystemException { PageDeliveryMetaData ent = new PageDeliveryMetaDataImpl(); ent.setValueObject(pageDeliveryMetaDataVO); ent = (PageDeliveryMetaData) createEntity(ent); return ent.getValueObject(); } /** * This method removes a Language from the system and also cleans out all depending repositoryLanguages. */ public PageDeliveryMetaDataVO create(PageDeliveryMetaDataVO pageDeliveryMetaDataVO, Collection<PageDeliveryMetaDataEntityVO> entitiesCollection) throws ConstraintException, SystemException, Exception { PageDeliveryMetaDataVO result = null; Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); result = create(db, pageDeliveryMetaDataVO, entitiesCollection); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not complete the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return result; } public PageDeliveryMetaDataVO create(Database db, PageDeliveryMetaDataVO pageDeliveryMetaDataVO, Collection<PageDeliveryMetaDataEntityVO> entitiesCollection) throws ConstraintException, SystemException, Exception { PageDeliveryMetaData ent = new PageDeliveryMetaDataImpl(); ent.setValueObject(pageDeliveryMetaDataVO); ent = (PageDeliveryMetaData) createEntity(ent, db); for(PageDeliveryMetaDataEntityVO entity : entitiesCollection) { PageDeliveryMetaDataEntity ent2 = new PageDeliveryMetaDataEntityImpl(); ent2.setPageDeliveryMetaData(ent); ent2.setValueObject(entity); ent2 = (PageDeliveryMetaDataEntity) createEntity(ent2, db); } ent.setEntities(entitiesCollection); return ent.getValueObject(); } /** * This method removes a Language from the system and also cleans out all depending repositoryLanguages. */ public void deletePageDeliveryMetaData(Integer siteNodeId, Integer contentId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); deletePageDeliveryMetaData(db, siteNodeId, contentId); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not complete the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } } /** * This method return a LanguageVO */ public void deletePageDeliveryMetaData(Database db, Integer siteNodeId, Integer contentId) throws SystemException, Exception { //System.out.println("deletePageDeliveryMetaData...."); //System.out.println("siteNodeId:" + siteNodeId); //System.out.println("contentId:" + contentId); try { String sql = null; Integer id = null; if(siteNodeId != null) { sql = "DELETE FROM cmPageDeliveryMetaData WHERE siteNodeId = ?"; id = siteNodeId; } if(siteNodeId == null && contentId != null) { sql = "DELETE FROM cmPageDeliveryMetaData WHERE where contentId = ?"; id = contentId; } if(siteNodeId != null && contentId != null) { sql = "DELETE FROM cmPageDeliveryMetaData WHERE siteNodeId = ? AND contentId = ?"; id = siteNodeId; } //System.out.println("sql: " + sql); if(sql != null) { Connection conn = (Connection) db.getJdbcConnection(); PreparedStatement psmt = conn.prepareStatement(sql); psmt.setInt(1, id); //System.out.println("id: " + id); if(siteNodeId != null && contentId != null) { psmt.setInt(2, contentId); //System.out.println("contentId: " + contentId); } int result = psmt.executeUpdate(); //System.out.println("result:" + result); String sql2 = "DELETE FROM cmPageDeliveryMetaDataEntity WHERE pageDeliveryMetaDataId NOT IN (select pageDeliveryMetaDataId from cmPageDeliveryMetaData)"; if(CmsPropertyHandler.getUseShortTableNames().equals("true")) sql2 = "DELETE FROM cmPageDeliveryMetaDataEnt WHERE pageDeliveryMetaDataId NOT IN (select pageDeliveryMetaDataId from cmPageDeliveryMetaData)"; //System.out.println("sql2: " + sql2); PreparedStatement psmt2 = conn.prepareStatement(sql2); int result2 = psmt2.executeUpdate(); //System.out.println("result2:" + result2); CacheController.clearCache("pageDeliveryMetaDataCache"); } } catch(Exception e) { e.printStackTrace(); throw new SystemException("An error occurred when we tried to fetch a PageDeliveryMetaData. Reason:" + e.getMessage(), e); } } /** * This method removes a Language from the system and also cleans out all depending repositoryLanguages. */ public void deletePageDeliveryMetaDataByReferencingEntity(Integer siteNodeId, Integer contentId) throws SystemException, Exception { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); deletePageDeliveryMetaDataByReferencingEntity(db, siteNodeId, contentId); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not complete the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } } /** * This method return a LanguageVO */ public void deletePageDeliveryMetaDataByReferencingEntity(Database db, Integer siteNodeId, Integer contentId) throws SystemException, Exception { //System.out.println("deletePageDeliveryMetaData...."); //System.out.println("siteNodeId:" + siteNodeId); //System.out.println("contentId:" + contentId); String selectiveCacheUpdateNotApplicableColumnName = "selectiveCacheUpdateNotApplicable"; if(CmsPropertyHandler.getUseShortTableNames().equals("true")) selectiveCacheUpdateNotApplicableColumnName = "selectiveCacheUpdateNotAppl"; String entityTableName = "cmPageDeliveryMetaDataEntity"; if(CmsPropertyHandler.getUseShortTableNames().equals("true")) entityTableName = "cmPageDeliveryMetaDataEnt"; try { String sql = null; Integer id = null; if(siteNodeId != null) { sql = "DELETE FROM cmPageDeliveryMetaData WHERE " + selectiveCacheUpdateNotApplicableColumnName + " = 1 OR pageDeliveryMetaDataId IN (SELECT distinct pageDeliveryMetaDataId FROM " + entityTableName + " WHERE siteNodeId = ?)"; id = siteNodeId; } if(siteNodeId == null && contentId != null) { sql = "DELETE FROM cmPageDeliveryMetaData WHERE " + selectiveCacheUpdateNotApplicableColumnName + " = 1 OR pageDeliveryMetaDataId IN (SELECT distinct pageDeliveryMetaDataId FROM " + entityTableName + " WHERE contentId = ?)"; id = contentId; } if(siteNodeId != null && contentId != null) { sql = "DELETE FROM cmPageDeliveryMetaData WHERE " + selectiveCacheUpdateNotApplicableColumnName + " = 1 OR pageDeliveryMetaDataId IN (SELECT distinct pageDeliveryMetaDataId FROM " + entityTableName + " WHERE siteNodeId = ? AND contentId = ?)"; id = siteNodeId; } //System.out.println("sql: " + sql); if(sql != null) { Connection conn = (Connection) db.getJdbcConnection(); PreparedStatement psmt = conn.prepareStatement(sql); psmt.setInt(1, id); //System.out.println("id: " + id); if(siteNodeId != null && contentId != null) { psmt.setInt(2, contentId); //System.out.println("contentId: " + contentId); } int result = psmt.executeUpdate(); //System.out.println("result:" + result); String sql2 = "DELETE FROM cmPageDeliveryMetaDataEntity WHERE pageDeliveryMetaDataId NOT IN (select pageDeliveryMetaDataId from cmPageDeliveryMetaData)"; if(CmsPropertyHandler.getUseShortTableNames().equals("true")) sql2 = "DELETE FROM cmPageDeliveryMetaDataEnt WHERE pageDeliveryMetaDataId NOT IN (select pageDeliveryMetaDataId from cmPageDeliveryMetaData)"; //System.out.println("sql2: " + sql2); PreparedStatement psmt2 = conn.prepareStatement(sql2); int result2 = psmt2.executeUpdate(); //System.out.println("result2:" + result2); CacheController.clearCache("pageDeliveryMetaDataCache"); } } catch(Exception e) { e.printStackTrace(); throw new SystemException("An error occurred when we tried to fetch a PageDeliveryMetaData. Reason:" + e.getMessage(), e); } } /** * This method removes a Language from the system and also cleans out all depending repositoryLanguages. */ public void delete(Database db, LanguageVO languageVO) throws ConstraintException, SystemException { Language language = getLanguageWithId(languageVO.getId(), db); RepositoryLanguageController.getController().deleteAllRepositoryLanguageWithLanguage(language, db); deleteEntity(LanguageImpl.class, languageVO.getLanguageId(), db); } public Language getLanguageWithId(Integer languageId, Database db) throws SystemException, Bug { return (Language) getObjectWithId(LanguageImpl.class, languageId, db); } public Language getLanguageWithId(Integer languageId) throws ConstraintException, SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); Language language = null; try { beginTransaction(db); language = getLanguageWithId(languageId, db); //If any of the validations or setMethods reported an error, we throw them up now before create. ceb.throwIfNotEmpty(); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not complete the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return language; } /** * This method deletes the Repository sent in from the system. */ public void deleteLanguage(Integer languageId, Database db) throws SystemException, Bug { try { db.remove(getLanguageWithId(languageId, db)); } catch(Exception e) { throw new SystemException("An error occurred when we tried to delete Language in the database. Reason: " + e.getMessage(), e); } } public LanguageVO update(LanguageVO languageVO) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); Language language = null; beginTransaction(db); try { //add validation here if needed language = getLanguageWithId(languageVO.getLanguageId(), db); language.setValueObject(languageVO); //If any of the validations or setMethods reported an error, we throw them up now before create. ceb.throwIfNotEmpty(); commitTransaction(db); } catch(ConstraintException ce) { logger.warn("An error occurred so we should not complete the transaction:" + ce, ce); rollbackTransaction(db); throw ce; } catch(Exception e) { logger.error("An error occurred so we should not complete the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return language.getValueObject(); } /** * This is a method that gives the user back an newly initialized ValueObject for this entity that the controller * is handling. */ public BaseEntityVO getNewVO() { return new LanguageVO(); } }