/* =============================================================================== * * 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.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; 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.InterceptionPoint; import org.infoglue.cms.entities.management.Interceptor; import org.infoglue.cms.entities.management.InterceptorVO; import org.infoglue.cms.entities.management.impl.simple.InterceptorImpl; 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; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.module.propertyset.PropertySetManager; /** * This class is a helper class for the use case handle Interceptor * * @author Mattias Bogeblad */ public class InterceptorController extends BaseController { private final static Logger logger = Logger.getLogger(InterceptorController.class.getName()); /** * Factory method */ public static InterceptorController getController() { return new InterceptorController(); } public Interceptor getInterceptorWithId(Integer interceptorId, Database db) throws SystemException, Bug { return (Interceptor) getObjectWithId(InterceptorImpl.class, interceptorId, db); } public InterceptorVO getInterceptorVOWithId(Integer interceptorId) throws SystemException, Bug { return (InterceptorVO) getVOWithId(InterceptorImpl.class, interceptorId); } public List getInterceptorVOList() throws SystemException, Bug { return getAllVOObjects(InterceptorImpl.class, "interceptorId"); } public List getInterceptorsVOList(Integer interceptionPointId) throws SystemException, Bug { List interceptorVOList = null; Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); interceptorVOList = getInterceptorsVOList(interceptionPointId, db); commitTransaction(db); } catch (Exception e) { e.printStackTrace(); logger.info("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return interceptorVOList; } /** * Gets the interceptors for this interceptionPoint withing a transaction * * @param interceptionPointId * @param db * @return * @throws SystemException * @throws Bug */ public List getInterceptorsVOList(Integer interceptionPointId, Database db) throws SystemException, Bug, Exception { String key = "" + interceptionPointId; logger.info("key:" + key); List cachedInterceptorVOList = (List)CacheController.getCachedObject("interceptorsCache", key); if(cachedInterceptorVOList != null) { logger.info("There was an cached InterceptorVOList:" + cachedInterceptorVOList.size()); return cachedInterceptorVOList; } //List<InterceptorVO> interceptorsVOList = getInterceptorVOList(interceptionPointId, db); InterceptionPoint interceptionPoint = InterceptionPointController.getController().getReadOnlyInterceptionPointWithId(interceptionPointId, db); Collection interceptors = interceptionPoint.getInterceptors(); List interceptorsVOList = toVOList(interceptors); CacheController.cacheObject("interceptorsCache", key, interceptorsVOList); return interceptorsVOList; } public List<InterceptorVO> getInterceptorVOList(Integer interceptionPointId, Database db) throws SystemException, Bug, Exception { OQLQuery oql = db.getOQLQuery("SELECT i FROM org.infoglue.cms.entities.management.impl.simple.InterceptorImpl i WHERE i.interceptionPoints.interceptionPointId = $1 ORDER BY i.interceptorId"); oql.bind(interceptionPointId); List<InterceptorVO> result = new ArrayList<InterceptorVO>(); QueryResults results = oql.execute(); while (results.hasMore()) { Interceptor interceptor = (Interceptor)results.next(); result.add(interceptor.getValueObject()); } results.close(); oql.close(); return result; } public List getInterceptionPointVOList(Integer interceptorId) throws SystemException, Bug { List interceptionPointVOList = null; Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); interceptionPointVOList = getInterceptionPointVOList(interceptorId, db); commitTransaction(db); } catch (Exception e) { logger.info("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return interceptionPointVOList; } public List getInterceptionPointVOList(Integer interceptorId, Database db) throws SystemException, Bug { Interceptor interceptor = this.getInterceptorWithId(interceptorId, db); Collection interceptionPoints = interceptor.getInterceptionPoints(); return toVOList(interceptionPoints); } /** * Creates a new InterceptorVO * * @param interceptorVO * @return * @throws ConstraintException * @throws SystemException */ public InterceptorVO create(InterceptorVO interceptorVO) throws ConstraintException, SystemException { InterceptorVO newinterceptorVO = null; Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); newinterceptorVO = create(interceptorVO, db); commitTransaction(db); } catch (Exception e) { logger.info("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } return newinterceptorVO; } /** * Creates a new InterceptorVO within a transaction * * @param interceptorVO * @return * @throws ConstraintException * @throws SystemException */ public InterceptorVO create(InterceptorVO interceptorVO, Database db) throws SystemException, Exception { Interceptor interceptor = new InterceptorImpl(); interceptor.setValueObject(interceptorVO); db.create(interceptor); return interceptor.getValueObject(); } public InterceptorVO update(InterceptorVO interceptorVO) throws ConstraintException, SystemException { return (InterceptorVO) updateEntity(InterceptorImpl.class, (BaseEntityVO)interceptorVO); } public void update(InterceptorVO interceptorVO, String[] values, String configuration) throws ConstraintException, SystemException { Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); ConstraintExceptionBuffer ceb = interceptorVO.validate(); ceb.throwIfNotEmpty(); Interceptor interceptor = this.getInterceptorWithId(interceptorVO.getInterceptorId(), db); interceptor.setValueObject(interceptorVO); Collection interceptionPoints = interceptor.getInterceptionPoints(); Iterator interceptionPointsIterator = interceptionPoints.iterator(); while(interceptionPointsIterator.hasNext()) { InterceptionPoint interceptionPoint = (InterceptionPoint)interceptionPointsIterator.next(); interceptionPoint.getInterceptors().remove(interceptor); } interceptor.getInterceptionPoints().clear(); if(values != null) { for(int i=0; i<values.length; i++) { String interceptionPointId = values[i]; InterceptionPoint interceptionPoint = InterceptionPointController.getController().getInterceptionPointWithId(new Integer(interceptionPointId), db); interceptor.getInterceptionPoints().add(interceptionPoint); interceptionPoint.getInterceptors().add(interceptor); } } if(configuration != null) InterceptorController.getController().updateInterceptorConfiguration(interceptorVO.getInterceptorId(), configuration); commitTransaction(db); } catch (Exception e) { logger.error("An error occurred so we should not complete the transaction:" + e); rollbackTransaction(db); throw new SystemException(e.getMessage()); } } public void delete(InterceptorVO interceptorVO) throws ConstraintException, SystemException { deleteEntity(InterceptorImpl.class, interceptorVO.getInterceptorId()); } public Properties getInterceptorProperties(Integer interceptorId) throws Exception { String configuration = getInterceptorConfiguration(interceptorId); if(configuration != null && !configuration.equals("")) { try { Properties properties = new Properties(); properties.load(new ByteArrayInputStream(configuration.getBytes("UTF-8"))); return properties; } catch(Exception e) { logger.error("Error loading properties from string. Reason:" + e.getMessage()); } } return null; } public String getInterceptorConfiguration(Integer interceptorId) throws Exception { Map args = new HashMap(); args.put("globalKey", "infoglue"); PropertySet ps = PropertySetManager.getInstance("jdbc", args); byte[] configurationBytes = ps.getData("interceptor_" + interceptorId + "_Configuration"); if(configurationBytes != null) { String configuration = new String(configurationBytes, "utf-8"); if(configuration != null && !configuration.equals("")) { return configuration; } } return ""; } public void updateInterceptorConfiguration(Integer interceptorId, String configuration) throws Exception { Map args = new HashMap(); args.put("globalKey", "infoglue"); PropertySet ps = PropertySetManager.getInstance("jdbc", args); ps.setData("interceptor_" + interceptorId + "_Configuration", configuration.getBytes("utf-8")); } /* public void delete(String name, String value, Database db) throws SystemException, Exception { List AccessList = getAccessList(name, value, db); Iterator i = AccessList.iterator(); while(i.hasNext()) { Access Access = (Access)i.next(); db.remove(Access); } } */ /** * 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 InterceptorVO(); } }