/* ===============================================================================
*
* 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.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.exolab.castor.jdo.Database;
import org.exolab.castor.jdo.OQLQuery;
import org.exolab.castor.jdo.PersistenceException;
import org.exolab.castor.jdo.QueryResults;
import org.infoglue.cms.entities.content.Content;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.kernel.BaseEntityVO;
import org.infoglue.cms.entities.management.impl.simple.AvailableServiceBindingImpl;
import org.infoglue.cms.entities.management.impl.simple.ServiceDefinitionImpl;
import org.infoglue.cms.entities.structure.Qualifyer;
import org.infoglue.cms.entities.structure.ServiceBinding;
import org.infoglue.cms.entities.structure.ServiceBindingVO;
import org.infoglue.cms.entities.structure.SiteNode;
import org.infoglue.cms.entities.structure.SiteNodeVO;
import org.infoglue.cms.entities.structure.SiteNodeVersion;
import org.infoglue.cms.entities.structure.SiteNodeVersionVO;
import org.infoglue.cms.entities.structure.impl.simple.ServiceBindingImpl;
import org.infoglue.cms.entities.structure.impl.simple.SiteNodeVersionImpl;
import org.infoglue.cms.entities.structure.impl.simple.SmallServiceBindingImpl;
import org.infoglue.cms.exception.Bug;
import org.infoglue.cms.exception.ConstraintException;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.util.ConstraintExceptionBuffer;
/**
* @author ss
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class ServiceBindingController extends BaseController
{
private final static Logger logger = Logger.getLogger(ServiceBindingController.class.getName());
public static ServiceBindingController getController()
{
return new ServiceBindingController();
}
public static ServiceBindingVO getServiceBindingVOWithId(Integer serviceBindingId) throws SystemException, Bug
{
return (ServiceBindingVO) getVOWithId(ServiceBindingImpl.class, serviceBindingId);
}
/*
public static ServiceBinding getServiceBindingWithId(Integer serviceBindingId) throws SystemException, Bug
{
return (ServiceBinding) getObjectWithId(ServiceBindingImpl.class, serviceBindingId);
}
*/
public static ServiceBinding getServiceBindingWithId(Integer serviceBindingId, Database db) throws SystemException, Bug
{
return (ServiceBinding) getObjectWithId(ServiceBindingImpl.class, serviceBindingId, db);
}
public static ServiceBinding getReadOnlyServiceBindingWithId(Integer serviceBindingId, Database db) throws SystemException, Bug
{
return (ServiceBinding) getObjectWithIdAsReadOnly(ServiceBindingImpl.class, serviceBindingId, db);
}
public List getServiceBindingVOList() throws SystemException, Bug
{
return getAllVOObjects(ServiceBindingImpl.class, "serviceBindingId");
}
/**
* This method deletes all service bindings pointing to a content.
*/
public List getServiceBindingList(Integer availableServiceBindingId, Database db) throws ConstraintException, SystemException, Exception
{
List serviceBindings = new ArrayList();
OQLQuery oql = db.getOQLQuery( "SELECT sb FROM org.infoglue.cms.entities.structure.impl.simple.ServiceBindingImpl sb WHERE sb.availableServiceBinding = $1 ORDER BY sb.serviceBindingId");
oql.bind(availableServiceBindingId);
QueryResults results = oql.execute();
logger.info("Fetching entity in read/write mode");
while(results.hasMore())
{
ServiceBinding serviceBinding = (ServiceBindingImpl)results.next();
serviceBindings.add(serviceBinding);
}
results.close();
oql.close();
return serviceBindings;
}
/**
* Returns a list of ServiceBindings that are bound to the given SiteNodeVersion.
*
* @param siteNodeVersionId
* @return
* @throws SystemException If something goes wrong in the operation (most likely a database related error).
*/
public List<SmallServiceBindingImpl> getSmallServiceBindingsListForSiteNodeVersion(Integer siteNodeVersionId) throws SystemException
{
Database db = null;
List<SmallServiceBindingImpl> serviceBindings = new ArrayList<SmallServiceBindingImpl>();
try
{
db = CastorDatabaseService.getDatabase();
beginTransaction(db);
serviceBindings = getSmallServiceBindingsListForSiteNodeVersion(siteNodeVersionId, db);
rollbackTransaction(db);
}
catch(Exception ex)
{
logger.error("An error occurred so we should not complete the transaction when getting service bindings for SiteNodeVersion. Message: " + ex.getMessage() + ". Type: " + ex.getClass());
logger.warn("An error occurred so we should not complete the transaction when getting service bindings for SiteNodeVersion", ex);
rollbackTransaction(db);
throw new SystemException(ex.getMessage());
}
return serviceBindings;
}
public List<SmallServiceBindingImpl> getSmallServiceBindingsListForSiteNodeVersion(Integer siteNodeVersionId, Database db) throws PersistenceException
{
List<SmallServiceBindingImpl> serviceBindings = new ArrayList<SmallServiceBindingImpl>();
OQLQuery oql = db.getOQLQuery( "SELECT sb FROM org.infoglue.cms.entities.structure.impl.simple.SmallServiceBindingImpl sb WHERE sb.siteNodeVersionId = $1 ORDER BY sb.serviceBindingId");
oql.bind(siteNodeVersionId);
QueryResults results = oql.execute();
//logger.info("Fetching entity in read/write mode");
while(results.hasMore())
{
SmallServiceBindingImpl serviceBinding = (SmallServiceBindingImpl)results.next();
serviceBindings.add(serviceBinding);
}
if (logger.isDebugEnabled())
{
logger.debug("Lookup of Service bindings for SiteNodeVersion: " + siteNodeVersionId + " got results: " + results.size());
}
results.close();
oql.close();
return serviceBindings;
}
public static ServiceBindingVO create(ServiceBindingVO serviceBindingVO, String qualifyerXML, Integer availableServiceBindingId, Integer siteNodeVersionId, Integer serviceDefinitionId) throws ConstraintException, SystemException
{
logger.info("Creating a serviceBinding with the following...");
logger.info("name:" + serviceBindingVO.getName());
logger.info("bindingTypeId:" + serviceBindingVO.getBindingTypeId());
logger.info("availableServiceBindingId:" + availableServiceBindingId);
logger.info("siteNodeVersionId:" + siteNodeVersionId);
logger.info("serviceDefinitionId:" + serviceDefinitionId);
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
ServiceBinding serviceBinding = null;
beginTransaction(db);
try
{
SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(siteNodeVersionId, db);
serviceBinding = new ServiceBindingImpl();
serviceBinding.setValueObject(serviceBindingVO);
serviceBinding.setAvailableServiceBinding((AvailableServiceBindingImpl)AvailableServiceBindingController.getController().getAvailableServiceBindingWithId(availableServiceBindingId, db));
serviceBinding.setServiceDefinition((ServiceDefinitionImpl)ServiceDefinitionController.getController().getServiceDefinitionWithId(serviceDefinitionId, db));
serviceBinding.setSiteNodeVersion((SiteNodeVersionImpl)siteNodeVersion);
//siteNodeVersion.getServiceBindings().add(serviceBinding);
logger.info("createEntity: " + serviceBinding.getSiteNodeVersion().getSiteNodeVersionId());
serviceBinding.setBindingQualifyers(QualifyerController.createQualifyers(qualifyerXML, serviceBinding));
db.create(serviceBinding);
siteNodeVersion.getServiceBindings().add(serviceBinding);
RegistryController.getController().updateSiteNodeVersionThreaded(siteNodeVersion.getValueObject());
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
e.printStackTrace();
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return serviceBinding.getValueObject();
}
/**
* This is a method that lets you create a new service binding within a transaction.
*/
public ServiceBindingVO create(Database db, ServiceBindingVO serviceBindingVO, String qualifyerXML, Integer availableServiceBindingId, Integer siteNodeVersionId, Integer serviceDefinitionId) throws ConstraintException, SystemException
{
logger.info("Creating a serviceBinding with the following...");
logger.info("name:" + serviceBindingVO.getName());
logger.info("bindingTypeId:" + serviceBindingVO.getBindingTypeId());
logger.info("availableServiceBindingId:" + availableServiceBindingId);
logger.info("siteNodeVersionId:" + siteNodeVersionId);
logger.info("serviceDefinitionId:" + serviceDefinitionId);
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
ServiceBinding serviceBinding = null;
try
{
SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(siteNodeVersionId, db);
serviceBinding = new ServiceBindingImpl();
serviceBinding.setValueObject(serviceBindingVO);
serviceBinding.setAvailableServiceBinding((AvailableServiceBindingImpl)AvailableServiceBindingController.getController().getAvailableServiceBindingWithId(availableServiceBindingId, db));
serviceBinding.setServiceDefinition((ServiceDefinitionImpl)ServiceDefinitionController.getController().getServiceDefinitionWithId(serviceDefinitionId, db));
serviceBinding.setSiteNodeVersion((SiteNodeVersionImpl)siteNodeVersion);
//siteNodeVersion.getServiceBindings().add(serviceBinding);
logger.info("createEntity: " + serviceBinding.getSiteNodeVersion().getSiteNodeVersionId());
serviceBinding.setBindingQualifyers(QualifyerController.createQualifyers(qualifyerXML, serviceBinding));
db.create((ServiceBinding)serviceBinding);
siteNodeVersion.getServiceBindings().add(serviceBinding);
RegistryController.getController().updateSiteNodeVersionThreaded(siteNodeVersion.getValueObject());
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
e.printStackTrace();
throw new SystemException(e.getMessage());
}
return serviceBinding.getValueObject();
}
protected static SmallServiceBindingImpl create(ServiceBindingVO serviceBindingVO, Integer availableServiceBindingId, Integer siteNodeVersionId, Integer serviceDefinitionId, Database db) throws ConstraintException, SystemException, Exception
{
logger.info("Creating a serviceBinding with the following...");
logger.info("name:" + serviceBindingVO.getName());
logger.info("bindingTypeId:" + serviceBindingVO.getBindingTypeId());
logger.info("availableServiceBindingId:" + availableServiceBindingId);
logger.info("siteNodeVersionId:" + siteNodeVersionId);
logger.info("serviceDefinitionId:" + serviceDefinitionId);
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(siteNodeVersionId, db);
SmallServiceBindingImpl serviceBinding = new SmallServiceBindingImpl();
serviceBinding.setValueObject(serviceBindingVO);
serviceBinding.setAvailableServiceBinding((AvailableServiceBindingImpl)AvailableServiceBindingController.getController().getAvailableServiceBindingWithId(availableServiceBindingId, db));
serviceBinding.setServiceDefinition((ServiceDefinitionImpl)ServiceDefinitionController.getController().getServiceDefinitionWithId(serviceDefinitionId, db));
//serviceBinding.setSiteNodeVersion((SiteNodeVersionImpl)siteNodeVersion);
serviceBinding.setSiteNodeVersionId(siteNodeVersionId);
db.create(serviceBinding);
RegistryController.getController().updateSiteNodeVersionThreaded(siteNodeVersionVO);
return serviceBinding;
}
/*
protected static ServiceBinding create(ServiceBindingVO serviceBindingVO, Integer availableServiceBindingId, Integer siteNodeVersionId, Integer serviceDefinitionId, Database db) throws ConstraintException, SystemException, Exception
{
logger.info("Creating a serviceBinding with the following...");
logger.info("name:" + serviceBindingVO.getName());
logger.info("bindingTypeId:" + serviceBindingVO.getBindingTypeId());
logger.info("availableServiceBindingId:" + availableServiceBindingId);
logger.info("siteNodeVersionId:" + siteNodeVersionId);
logger.info("serviceDefinitionId:" + serviceDefinitionId);
SiteNodeVersion siteNodeVersion = SiteNodeVersionController.getController().getSiteNodeVersionWithId(siteNodeVersionId, db);
ServiceBinding serviceBinding = new ServiceBindingImpl();
serviceBinding.setValueObject(serviceBindingVO);
serviceBinding.setAvailableServiceBinding((AvailableServiceBindingImpl)AvailableServiceBindingController.getController().getAvailableServiceBindingWithId(availableServiceBindingId, db));
serviceBinding.setServiceDefinition((ServiceDefinitionImpl)ServiceDefinitionController.getController().getServiceDefinitionWithId(serviceDefinitionId, db));
serviceBinding.setSiteNodeVersion((SiteNodeVersionImpl)siteNodeVersion);
serviceBinding.setSiteNodeVersion(siteNodeVersionId);
logger.info("createEntity: " + serviceBinding.getSiteNodeVersion().getSiteNodeVersionId());
db.create(serviceBinding);
RegistryController.getController().updateSiteNodeVersion(siteNodeVersion.getValueObject(), db);
return serviceBinding;
}
*/
public static ServiceBindingVO update(ServiceBindingVO serviceBindingVO, String qualifyerXML) throws ConstraintException, SystemException
{
logger.info("Updating a serviceBinding with the following...");
logger.info("name:" + serviceBindingVO.getName());
logger.info("bindingTypeId:" + serviceBindingVO.getBindingTypeId());
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
ServiceBinding serviceBinding = null;
beginTransaction(db);
try
{
serviceBinding = getServiceBindingWithId(serviceBindingVO.getServiceBindingId(), db);
serviceBinding.setPath(serviceBindingVO.getPath());
serviceBinding.getBindingQualifyers().clear();
Collection newQualifyers = QualifyerController.createQualifyers(qualifyerXML, serviceBinding);
serviceBinding.setBindingQualifyers(newQualifyers);
RegistryController.getController().updateSiteNodeVersionThreaded(serviceBinding.getSiteNodeVersion().getValueObject());
commitTransaction(db);
}
catch(Exception e)
{
logger.error("An error occurred so we should not complete the transaction:" + e, e);
e.printStackTrace();
rollbackTransaction(db);
throw new SystemException(e.getMessage());
}
return serviceBinding.getValueObject();
}
/**
* This method deletes all service bindings pointing to a content.
*/
public static void deleteServiceBindingsReferencingContent(Content content, Database db) throws ConstraintException, SystemException, Exception
{
OQLQuery oql = db.getOQLQuery( "SELECT sb FROM org.infoglue.cms.entities.structure.impl.simple.ServiceBindingImpl sb WHERE sb.bindingQualifyers.name = $1 AND sb.bindingQualifyers.value = $2 ORDER BY sb.serviceBindingId");
oql.bind("contentId");
oql.bind(content.getContentId().toString());
QueryResults results = oql.execute();
logger.info("Fetching entity in read/write mode");
while(results.hasMore())
{
ServiceBinding serviceBinding = (ServiceBindingImpl)results.next();
//logger.info("serviceBinding:" + serviceBinding.getServiceBindingId());
Collection qualifyers = serviceBinding.getBindingQualifyers();
Iterator qualifyersIterator = qualifyers.iterator();
while(qualifyersIterator.hasNext())
{
Qualifyer qualifyer = (Qualifyer)qualifyersIterator.next();
//logger.info("qualifyer:" + qualifyer.getName() + ":" + qualifyer.getValue() + " == " + qualifyer.getValue().equals(content.getContentId().toString()));
if(qualifyer.getName().equalsIgnoreCase("contentId") && qualifyer.getValue().equals(content.getContentId().toString()))
{
//db.remove(qualifyer);
qualifyersIterator.remove();
//logger.info("Qualifyers:" + serviceBinding.getBindingQualifyers().size());
serviceBinding.getBindingQualifyers().remove(qualifyer);
//logger.info("Qualifyers2:" + serviceBinding.getBindingQualifyers().size());
if(serviceBinding.getBindingQualifyers() == null || serviceBinding.getBindingQualifyers().size() == 0)
{
//logger.info("Removing service binding...");
db.remove(serviceBinding);
}
}
}
SiteNodeVersion siteNodeVersion = serviceBinding.getSiteNodeVersion();
if(siteNodeVersion.getOwningSiteNode() == null)
SiteNodeVersionController.getController().delete(siteNodeVersion, db);
}
results.close();
oql.close();
}
/**
* This method deletes all service bindings pointing to a content.
*/
public static void deleteServiceBindingsReferencingSiteNode(SiteNodeVO siteNodeVO, Database db) throws ConstraintException, SystemException, Exception
{
OQLQuery oql = db.getOQLQuery( "SELECT sb FROM org.infoglue.cms.entities.structure.impl.simple.ServiceBindingImpl sb WHERE sb.bindingQualifyers.name = $1 AND sb.bindingQualifyers.value = $2 ORDER BY sb.serviceBindingId");
oql.bind("siteNodeId");
oql.bind(siteNodeVO.getId().toString());
QueryResults results = oql.execute();
logger.info("Fetching entity in read/write mode");
while(results.hasMore())
{
ServiceBinding serviceBinding = (ServiceBindingImpl)results.next();
//logger.info("serviceBinding:" + serviceBinding.getServiceBindingId());
Collection qualifyers = serviceBinding.getBindingQualifyers();
Iterator qualifyersIterator = qualifyers.iterator();
while(qualifyersIterator.hasNext())
{
Qualifyer qualifyer = (Qualifyer)qualifyersIterator.next();
//logger.info("qualifyer:" + qualifyer.getName() + ":" + qualifyer.getValue() + " == " + qualifyer.getValue().equals(content.getContentId().toString()));
if(qualifyer.getName().equalsIgnoreCase("siteNodeId") && qualifyer.getValue().equals(siteNodeVO.getId().toString()))
{
//db.remove(qualifyer);
qualifyersIterator.remove();
//logger.info("Qualifyers:" + serviceBinding.getBindingQualifyers().size());
serviceBinding.getBindingQualifyers().remove(qualifyer);
//logger.info("Qualifyers2:" + serviceBinding.getBindingQualifyers().size());
if(serviceBinding.getBindingQualifyers() == null || serviceBinding.getBindingQualifyers().size() == 0)
{
//logger.info("Removing service binding...");
db.remove(serviceBinding);
}
}
}
}
results.close();
oql.close();
}
/**
* This method deletes all service bindings pointing to a site node version.
*/
public static void deleteServiceBindingsReferencingSiteNodeVersion(SiteNodeVersion siteNodeVersion, Database db) throws ConstraintException, SystemException, Exception
{
OQLQuery oql = db.getOQLQuery( "SELECT sb FROM org.infoglue.cms.entities.structure.impl.simple.ServiceBindingImpl sb WHERE sb.siteNodeVersion = $1 ORDER BY sb.serviceBindingId");
oql.bind(siteNodeVersion);
QueryResults results = oql.execute();
logger.info("Fetching entity in read/write mode");
while(results.hasMore())
{
ServiceBinding serviceBinding = (ServiceBindingImpl)results.next();
//logger.info("serviceBinding:" + serviceBinding.getServiceBindingId());
Collection qualifyers = serviceBinding.getBindingQualifyers();
Iterator qualifyersIterator = qualifyers.iterator();
while(qualifyersIterator.hasNext())
{
Qualifyer qualifyer = (Qualifyer)qualifyersIterator.next();
qualifyersIterator.remove();
serviceBinding.getBindingQualifyers().remove(qualifyer);
}
db.remove(serviceBinding);
}
results.close();
oql.close();
}
/**
* This method deletes a service binding an all associated qualifyers.
*/
public static void delete(ServiceBindingVO serviceBindingVO) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
beginTransaction(db);
try
{
ServiceBinding serviceBinding = ServiceBindingController.getServiceBindingWithId(serviceBindingVO.getServiceBindingId(), db);
//QualifyerController.deleteQualifyersForServiceBinding(serviceBinding, db);
//deleteEntity(ServiceBindingImpl.class, serviceBindingVO.getServiceBindingId(), db);
SiteNodeVersion siteNodeVersion = serviceBinding.getSiteNodeVersion();
db.remove(serviceBinding);
siteNodeVersion.getServiceBindings().remove(serviceBinding);
RegistryController.getController().updateSiteNodeVersionThreaded(siteNodeVersion.getValueObject());
commitTransaction(db);
}
catch(Exception e)
{
e.printStackTrace();
rollbackTransaction(db);
throw new SystemException("An error occurred when we tried to remove a serviceBinding and it's qualifyers.");
}
}
/**
* This method deletes a service binding an all associated qualifyers.
*/
public static void delete(ServiceBindingVO serviceBindingVO, Database db) throws ConstraintException, SystemException, Exception
{
ServiceBinding serviceBinding = ServiceBindingController.getServiceBindingWithId(serviceBindingVO.getServiceBindingId(), db);
db.remove(serviceBinding);
RegistryController.getController().updateSiteNodeVersionThreaded(serviceBinding.getSiteNodeVersion().getValueObject());
}
/**
* This method returns a list with QualifyerVO-objects which are available for the
* serviceBinding sent in
*/
public static List getQualifyerVOList(Integer serviceBindingId) throws ConstraintException, SystemException
{
Database db = CastorDatabaseService.getDatabase();
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
List qualifyerVOList = null;
beginTransaction(db);
try
{
ServiceBinding serviceBinding = getReadOnlyServiceBindingWithId(serviceBindingId, db);
Collection qualifyerList = serviceBinding.getBindingQualifyers();
qualifyerVOList = toVOList(qualifyerList);
//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 qualifyerVOList;
}
/**
* 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 ServiceBindingVO();
}
}