/* =============================================================================== * * 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.Statement; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; 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.kernel.BaseEntityVO; import org.infoglue.cms.entities.management.Language; import org.infoglue.cms.entities.management.LanguageVO; import org.infoglue.cms.entities.management.Repository; import org.infoglue.cms.entities.management.RepositoryLanguage; import org.infoglue.cms.entities.management.RepositoryLanguageVO; 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.ConstraintExceptionBuffer; import org.infoglue.deliver.util.CacheController; public class RepositoryLanguageController extends BaseController { private final static Logger logger = Logger.getLogger(RepositoryLanguageController.class.getName()); /** * Factory method */ public static RepositoryLanguageController getController() { return new RepositoryLanguageController(); } public RepositoryLanguage getRepositoryLanguageWithId(Integer id, Database db) throws SystemException, Bug { return (RepositoryLanguage) getObjectWithId(RepositoryLanguageImpl.class, id, db); } public RepositoryLanguage getRepositoryLanguageWithId(Integer repositoryLanguageId) throws ConstraintException, SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); RepositoryLanguage repositoryLanguage = null; try { beginTransaction(db); repositoryLanguage = getRepositoryLanguageWithId(repositoryLanguageId, db); //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 repositoryLanguage; } public List getRepositoryLanguageVOList() throws SystemException, Bug { return getAllVOObjects(RepositoryLanguageImpl.class, "repositoryLanguageImplId"); } public List getRepositoryLanguageVOListWithLanguageId(Integer languageId) throws SystemException, Bug { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); ArrayList repositoryLanguageList = new ArrayList(); beginTransaction(db); try { OQLQuery oql = db.getOQLQuery("SELECT rl FROM org.infoglue.cms.entities.management.impl.simple.RepositoryLanguageImpl rl WHERE rl.language = $1 order by rl.sortOrder, rl.language.languageId"); oql.bind(languageId); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { RepositoryLanguage repositoryLanguage = (RepositoryLanguage)results.next(); repositoryLanguageList.add(repositoryLanguage.getValueObject()); } results.close(); oql.close(); ceb.throwIfNotEmpty(); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not completes the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return repositoryLanguageList; } public List getRepositoryLanguageVOListWithRepositoryId(Integer repositoryId) throws SystemException, Bug { List repositoryLanguageList = new ArrayList(); Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); beginTransaction(db); try { repositoryLanguageList = getRepositoryLanguageVOListWithRepositoryId(repositoryId, db); ceb.throwIfNotEmpty(); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not completes the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } //} return repositoryLanguageList; } public List getRepositoryLanguageVOListWithRepositoryId(Integer repositoryId, Database db) throws SystemException, Bug, Exception { ArrayList repositoryLanguageList = new ArrayList(); OQLQuery oql = db.getOQLQuery("SELECT rl FROM org.infoglue.cms.entities.management.impl.simple.RepositoryLanguageImpl rl WHERE rl.repository = $1 ORDER BY rl.sortOrder, rl.language.languageId"); oql.bind(repositoryId); QueryResults results = oql.execute(Database.READONLY); while (results.hasMore()) { RepositoryLanguage repositoryLanguage = (RepositoryLanguage)results.next(); repositoryLanguageList.add(repositoryLanguage); } results.close(); oql.close(); return repositoryLanguageList; } public List<LanguageVO> getLanguageVOListForRepositoryId(Integer repositoryId) throws SystemException, Bug, Exception { List<LanguageVO> languageVOList = new ArrayList<LanguageVO>(); /* String repositoryLanguageListKey = "" + repositoryId; logger.info("repositoryLanguageListKey:" + repositoryLanguageListKey); repositoryLanguageList = (List)CacheController.getCachedObject("repositoryLanguageListCache", repositoryLanguageListKey); if(repositoryLanguageList != null) { logger.info("There was an cached list:" + repositoryLanguageList); } else { */ Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); beginTransaction(db); try { languageVOList = getLanguageVOListForRepositoryId(repositoryId, db); //if(repositoryLanguageList != null) //{ // CacheController.cacheObject("repositoryLanguageListCache", repositoryLanguageListKey, repositoryLanguageList); //} ceb.throwIfNotEmpty(); commitTransaction(db); } catch(Exception e) { logger.error("An error occurred so we should not completes the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } //} return languageVOList; } public List<LanguageVO> getLanguageVOListForRepositoryId(Integer repositoryId, Database db) throws SystemException, Bug, Exception { return LanguageController.getController().getLanguageVOList(repositoryId, db); } public List<LanguageVO> getAvailableLanguageVOListForRepositoryId(Integer repositoryId) throws ConstraintException, SystemException, Exception { return LanguageController.getController().getLanguageVOList(repositoryId); } public List getRepositoryLanguageListWithRepositoryId(Integer repositoryId, boolean readOnly, Database db) throws SystemException, Bug, Exception { ArrayList repositoryLanguageList = new ArrayList(); OQLQuery oql = db.getOQLQuery("SELECT rl FROM org.infoglue.cms.entities.management.impl.simple.RepositoryLanguageImpl rl WHERE rl.repository = $1 ORDER BY rl.sortOrder, rl.language.languageId"); oql.bind(repositoryId); QueryResults results = null; if(readOnly) results = oql.execute(Database.READONLY); else results = oql.execute(); this.logger.info("Fetching entity in read/write mode:" + readOnly); while (results.hasMore()) { RepositoryLanguage repositoryLanguage = (RepositoryLanguage)results.next(); repositoryLanguageList.add(repositoryLanguage); } results.close(); oql.close(); return repositoryLanguageList; } /** * This method removes a RepositoryLanguage from the system */ public void delete(RepositoryLanguageVO vo) throws ConstraintException, SystemException { deleteEntity(RepositoryLanguageImpl.class, vo.getRepositoryLanguageId()); } /* public RepositoryLanguage deleteAllRepositoryLanguageWithRepositoryId(Integer repositoryId) throws SystemException, Bug { try { List repositoryLanguages = getRepositoryLanguageVOListWithRepositoryId(repositoryId); Iterator iterator = repositoryLanguages.iterator(); while(iterator.hasNext()) { RepositoryLanguageVO repositoryLanguage = (RepositoryLanguageVO)iterator.next(); deleteEntity(RepositoryLanguageImpl.class, repositoryLanguage.getRepositoryLanguageId()); } } catch(Exception e) { throw new SystemException("An error occurred when we tried to find the matching RepositoryLanguage in the database. Reason: " + e.getMessage(), e); } return null; } */ /** * Rewrote method to be lock insensitive * @param repository * @param db * @throws SystemException * @throws Bug */ public void deleteRepositoryLanguagesLockless(Repository repository, Database db) throws SystemException, Bug { try { Connection conn = db.getJdbcConnection(); Statement stmt = conn.createStatement(); String sql = "DELETE FROM cmRepositoryLanguage WHERE repositoryId = " + repository.getId(); stmt.executeUpdate(sql); } catch(Exception e) { throw new SystemException("An error occurred when we tried to find the matching RepositoryLanguage in the database. Reason: " + e.getMessage(), e); } } public void deleteRepositoryLanguages(Repository repository, Database db) throws SystemException, Bug { try { Collection repositoryLanguages = repository.getRepositoryLanguages(); Iterator iterator = repositoryLanguages.iterator(); while(iterator.hasNext()) { RepositoryLanguage repositoryLanguage = (RepositoryLanguage)iterator.next(); Language language = repositoryLanguage.getLanguage(); language.getRepositoryLanguages().remove(repositoryLanguage); db.remove(repositoryLanguage); //deleteEntity(RepositoryLanguageImpl.class, repositoryLanguage.getRepositoryLanguageId(), db); } } catch(Exception e) { throw new SystemException("An error occurred when we tried to find the matching RepositoryLanguage in the database. Reason: " + e.getMessage(), e); } } /* public RepositoryLanguage deleteAllRepositoryLanguageWithRepositoryId(Integer repositoryId, Database db) throws SystemException, Bug { try { List repositoryLanguages = getRepositoryLanguageVOListWithRepositoryId(repositoryId); Iterator iterator = repositoryLanguages.iterator(); while(iterator.hasNext()) { RepositoryLanguageVO repositoryLanguage = (RepositoryLanguageVO)iterator.next(); deleteEntity(RepositoryLanguageImpl.class, repositoryLanguage.getRepositoryLanguageId(), db); } } catch(Exception e) { throw new SystemException("An error occurred when we tried to find the matching RepositoryLanguage in the database. Reason: " + e.getMessage(), e); } return null; } */ /** * This method deletes all repositoryLanguages with a certain languageId. */ public RepositoryLanguage deleteAllRepositoryLanguageWithLanguageId(Integer languageId) throws SystemException, Bug { try { List repositoryLanguages = getRepositoryLanguageVOListWithLanguageId(languageId); Iterator iterator = repositoryLanguages.iterator(); while(iterator.hasNext()) { RepositoryLanguageVO repositoryLanguage = (RepositoryLanguageVO)iterator.next(); deleteEntity(RepositoryLanguageImpl.class, repositoryLanguage.getRepositoryLanguageId()); } } catch(Exception e) { throw new SystemException("An error occurred when we tried to find the matching RepositoryLanguage in the database. Reason: " + e.getMessage(), e); } return null; } /** * This method deletes all repositoryLanguages with a certain languageId. */ public RepositoryLanguage deleteAllRepositoryLanguageWithLanguage(Language language, Database db) throws SystemException, Bug { try { Collection repositoryLanguages = language.getRepositoryLanguages(); Iterator iterator = repositoryLanguages.iterator(); while(iterator.hasNext()) { RepositoryLanguage repositoryLanguage = (RepositoryLanguage)iterator.next(); Repository repository = repositoryLanguage.getRepository(); repository.getRepositoryLanguages().remove(repositoryLanguage); db.remove(repositoryLanguage); } } catch(Exception e) { throw new SystemException("An error occurred when we tried to delete a RepositoryLanguage in the database. Reason: " + e.getMessage(), e); } return null; } public RepositoryLanguage create(Integer repositoryId, Integer languageId, Integer sortOrder, Database db) throws Exception { RepositoryLanguage repositoryLanguage = new RepositoryLanguageImpl(); repositoryLanguage.setIsPublished(new Boolean(false)); repositoryLanguage.setLanguage(LanguageController.getController().getLanguageWithId(languageId, db)); repositoryLanguage.setRepository(RepositoryController.getController().getRepositoryWithId(repositoryId, db)); repositoryLanguage.setSortOrder(sortOrder); db.create(repositoryLanguage); return repositoryLanguage; } public RepositoryLanguage create(Repository repository, Language language, Integer sortOrder, Database db) throws Exception { RepositoryLanguage repositoryLanguage = new RepositoryLanguageImpl(); repositoryLanguage.setIsPublished(new Boolean(false)); repositoryLanguage.setLanguage(language); repositoryLanguage.setRepository(repository); repositoryLanguage.setSortOrder(sortOrder); db.create(repositoryLanguage); return repositoryLanguage; } public void publishRepositoryLanguage(RepositoryLanguageVO repositoryLanguageVO) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); RepositoryLanguage repositoryLanguage = null; beginTransaction(db); try { repositoryLanguage = getRepositoryLanguageWithId(repositoryLanguageVO.getRepositoryLanguageId(), db); repositoryLanguage.setIsPublished(new Boolean(true)); 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()); } } public void unpublishRepositoryLanguage(RepositoryLanguageVO repositoryLanguageVO) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); RepositoryLanguage repositoryLanguage = null; beginTransaction(db); try { //Here we should do some serious cleanup.... take away all content-attributes that has this language for example? repositoryLanguage = getRepositoryLanguageWithId(repositoryLanguageVO.getRepositoryLanguageId(), db); repositoryLanguage.setIsPublished(new Boolean(false)); 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()); } } public void moveRepositoryLanguage(RepositoryLanguageVO repositoryLanguageVO, boolean down) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); beginTransaction(db); try { RepositoryLanguage originalRepositoryLanguage = this.getRepositoryLanguageWithId(repositoryLanguageVO.getRepositoryLanguageId(), db); List repositoryLanguages = this.getRepositoryLanguageListWithRepositoryId(originalRepositoryLanguage.getRepository().getId(), false, db); for(int i=0; i<repositoryLanguages.size(); i++) { RepositoryLanguage repositoryLanguage = (RepositoryLanguage)repositoryLanguages.get(i); if(repositoryLanguage.getRepositoryLanguageId().intValue() == repositoryLanguageVO.getRepositoryLanguageId().intValue()) { if(down && i != repositoryLanguages.size() - 1) { RepositoryLanguage nextRepositoryLanguage = (RepositoryLanguage)repositoryLanguages.get(i+1); Integer currentSortOrder = repositoryLanguage.getSortOrder(); repositoryLanguage.setSortOrder(nextRepositoryLanguage.getSortOrder()); nextRepositoryLanguage.setSortOrder(currentSortOrder); } else if(!down && i != 0) { RepositoryLanguage previousRepositoryLanguage = (RepositoryLanguage)repositoryLanguages.get(i-1); Integer currentSortOrder = repositoryLanguage.getSortOrder(); repositoryLanguage.setSortOrder(previousRepositoryLanguage.getSortOrder()); previousRepositoryLanguage.setSortOrder(currentSortOrder); } } } 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()); } } public void createRepositoryLanguage(Integer repositoryId, Integer languageId, Integer sortOrder) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); RepositoryLanguage repositoryLanguage = null; beginTransaction(db); try { repositoryLanguage = create(repositoryId, languageId, sortOrder, db); 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()); } } public void updateRepositoryLanguages(Integer repositoryId, String[] languageValues) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); beginTransaction(db); try { Repository repository = RepositoryController.getController().getRepositoryWithId(repositoryId, db); deleteRepositoryLanguages(repository, db); //add validation here if needed List repositoryLanguageList = new ArrayList(); if(languageValues != null) { for (int i=0; i < languageValues.length; i++) { //Language language = LanguageController.getController().getLanguageWithId(new Integer(languageValues[i]), db); RepositoryLanguage repositoryLanguage = create(repository.getId(), new Integer(languageValues[i]), new Integer(i), db); repositoryLanguageList.add(repositoryLanguage); } } //repository = RepositoryController.getController().getRepositoryWithId(repositoryVO.getRepositoryId(), db); //repository.setValueObject(repositoryVO); repository.setRepositoryLanguages(repositoryLanguageList); //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 completes the transaction:" + ce, ce); rollbackTransaction(db); throw ce; } catch(Exception e) { logger.error("An error occurred so we should not completes the transaction:" + e, e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } } /** * 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 RepositoryLanguageVO(); } }