/* =============================================================================== * * 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.webservices; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.exolab.castor.jdo.Database; import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; import org.infoglue.cms.controllers.kernel.impl.simple.CategoryController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionControllerProxy; import org.infoglue.cms.controllers.kernel.impl.simple.ServerNodeController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeControllerProxy; import org.infoglue.cms.controllers.kernel.impl.simple.UserControllerProxy; import org.infoglue.cms.entities.content.Content; import org.infoglue.cms.entities.content.ContentVO; import org.infoglue.cms.entities.management.CategoryVO; import org.infoglue.cms.entities.structure.SiteNode; import org.infoglue.cms.entities.structure.SiteNodeVO; import org.infoglue.cms.exception.SystemException; import org.infoglue.cms.security.InfoGluePrincipal; import org.infoglue.cms.util.ConstraintExceptionBuffer; import org.infoglue.cms.webservices.elements.CreatedEntityBean; import org.infoglue.cms.webservices.elements.StatusBean; import org.infoglue.deliver.util.webservices.DynamicWebserviceSerializer; /** * This class is responsible for letting an external application call InfoGlue * API:s remotely. It handles api:s to manage contents and associated entities. * * @author Mattias Bogeblad */ public class RemoteSiteNodeServiceImpl extends RemoteInfoGlueService { private final static Logger logger = Logger.getLogger(RemoteSiteNodeServiceImpl.class.getName()); /** * The principal executing the workflow. */ private InfoGluePrincipal principal; private static SiteNodeControllerProxy siteNodeControllerProxy = SiteNodeControllerProxy.getSiteNodeControllerProxy(); private static ContentVersionControllerProxy contentVersionControllerProxy = ContentVersionControllerProxy.getController(); /** * Gets a content version from the cms. Very useful for getting the latest working version. */ /* public ContentVersionVO getContentVersion(final String principalName, final Object[] inputsArray) { if(!ServerNodeController.getController().getIsIPAllowed(getRequest())) { logger.error("A client with IP " + getRequest().getRemoteAddr() + " was denied access to the webservice. Could be a hack attempt or you have just not configured the allowed IP-addresses correct."); return null; } if(logger.isInfoEnabled()) { logger.info("**************************************"); logger.info("* Getting content through webservice *"); logger.info("**************************************"); } ContentVersionVO contentVersionVO = null; try { final DynamicWebserviceSerializer serializer = new DynamicWebserviceSerializer(); Map args = (Map) serializer.deserialize(inputsArray); logger.info("args:" + args); Integer contentId = (Integer)args.get("contentId"); Integer languageId = (Integer)args.get("languageId"); if(logger.isInfoEnabled()) { logger.info("principalName:" + principalName); logger.info("contentId:" + contentId); logger.info("languageId:" + languageId); } initializePrincipal(principalName); contentVersionVO = contentVersionControllerProxy.getACLatestActiveContentVersionVO(this.principal, contentId, languageId); } catch(Throwable t) { logger.error("En error occurred when we tried to get the contentVersionVO:" + t.getMessage(), t); } return contentVersionVO; } */ /** * Inserts a new SiteNode including versions etc. */ /* public int createSiteNode(final String principalName, ContentVO contentVO, int parentContentId, int contentTypeDefinitionId, int repositoryId) { if(!ServerNodeController.getController().getIsIPAllowed(getRequest())) { logger.error("A client with IP " + getRequest().getRemoteAddr() + " was denied access to the webservice. Could be a hack attempt or you have just not configured the allowed IP-addresses correct."); return -1; } int newContentId = 0; logger.info("***************************************"); logger.info("Creating sitenode through webservice...."); logger.info("***************************************"); logger.info("parentContentId:" + parentContentId); logger.info("contentTypeDefinitionId:" + contentTypeDefinitionId); logger.info("repositoryId:" + repositoryId); try { initializePrincipal(principalName); SiteNode newSiteNode = SiteNodeControllerProxy.getSiteNodeControllerProxy().acCreate(this.principal, this.parentSiteNodeId, this.siteNodeTypeDefinitionId, this.repositoryId, this.siteNodeVO, db); newSiteNodeVO = newSiteNode.getValueObject(); SiteNodeController.getController().createSiteNodeMetaInfoContent(db, newSiteNode, this.repositoryId, this.getInfoGluePrincipal(), this.pageTemplateContentId); } catch(Exception e) { logger.error("En error occurred when we tried to create a new content:" + e.getMessage(), e); } updateCaches(); return newContentId; } */ /** * Inserts a new ContentVersion. */ /* public int createContentVersion(final String principalName, ContentVersionVO contentVersionVO, int contentId, int languageId) { if(!ServerNodeController.getController().getIsIPAllowed(getRequest())) { logger.error("A client with IP " + getRequest().getRemoteAddr() + " was denied access to the webservice. Could be a hack attempt or you have just not configured the allowed IP-addresses correct."); return -1; } int newContentVersionId = 0; logger.info("***************************************"); logger.info("Creating content through webservice...."); logger.info("***************************************"); try { initializePrincipal(principalName); ContentVersionVO newContentVersionVO = contentVersionControllerProxy.acCreate(this.principal, new Integer(contentId), new Integer(languageId), contentVersionVO); newContentVersionId = newContentVersionVO.getId().intValue(); } catch(Exception e) { logger.error("En error occurred when we tried to create a new contentVersion:" + e.getMessage(), e); } updateCaches(); return newContentVersionId; } */ /** * Inserts one or many new SiteNode including versions etc. */ public StatusBean createSiteNodes(final String principalName, final Object[] inputsArray) { if(!ServerNodeController.getController().getIsIPAllowed(getRequest())) { logger.error("A client with IP " + getRequest().getRemoteAddr() + " was denied access to the webservice. Could be a hack attempt or you have just not configured the allowed IP-addresses correct."); return new StatusBean(false, "You are not allowed to talk to this service"); } StatusBean statusBean = new StatusBean(true, "ok"); List newSiteNodeIdList = new ArrayList(); logger.info("****************************************"); logger.info("Creating sitenodes through webservice...."); logger.info("****************************************"); logger.info("principalName:" + principalName); logger.info("inputsArray:" + inputsArray); try { final DynamicWebserviceSerializer serializer = new DynamicWebserviceSerializer(); List siteNodes = (List) serializer.deserialize(inputsArray); logger.info("siteNodes:" + siteNodes); initializePrincipal(principalName); Iterator siteNodesIterator = siteNodes.iterator(); while(siteNodesIterator.hasNext()) { Map siteNode = (Map)siteNodesIterator.next(); String name = (String)siteNode.get("name"); Integer siteNodeTypeDefinitionId = (Integer)siteNode.get("siteNodeTypeDefinitionId"); Integer repositoryId = (Integer)siteNode.get("repositoryId"); Integer parentSiteNodeId = (Integer)siteNode.get("parentSiteNodeId"); //String siteNodePath = (String)siteNode.get("siteNodePath"); Integer pageTemplateContentId = (Integer)siteNode.get("pageTemplateContentId"); logger.info("name:" + name); logger.info("siteNodeTypeDefinitionId:" + siteNodeTypeDefinitionId); logger.info("repositoryId:" + repositoryId); logger.info("parentSiteNodeId:" + parentSiteNodeId); //logger.info("contentPath:" + contentPath); /* if(contentPath != null && !contentPath.equals("")) { Database db = CastorDatabaseService.getDatabase(); beginTransaction(db); try { if(parentContentId != null) { StringBuffer path = new StringBuffer(); Content parentContent = ContentController.getContentController().getContentWithId(parentContentId, db); path.insert(0, parentContent.getName() + "/"); while(parentContent.getParentContent() != null) { parentContent = parentContent.getParentContent(); if(parentContent != null && parentContent.getParentContent() != null) path.insert(0, parentContent.getName() + "/"); } contentPath = path.toString() + contentPath; } ContentVO parentContentVO = ContentController.getContentController().getContentVOWithPath(repositoryId, contentPath, true, this.principal, db); parentContentId = parentContentVO.getId(); 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()); } } */ SiteNodeVO siteNodeVO = new SiteNodeVO(); siteNodeVO.setName(name); siteNodeVO.setSiteNodeTypeDefinitionId(siteNodeTypeDefinitionId); siteNodeVO.setRepositoryId(repositoryId); siteNodeVO.setParentSiteNodeId(parentSiteNodeId); siteNodeVO.setIsBranch(true); if(siteNodeVO.getCreatorName() == null) siteNodeVO.setCreatorName(this.principal.getName()); int childCount = 0; if(siteNodeVO.getParentSiteNodeId() != null) { SiteNodeVO parentSiteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(siteNodeVO.getParentSiteNodeId(), false); childCount = parentSiteNodeVO.getChildCount(); } Database db = CastorDatabaseService.getDatabase(); ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); beginTransaction(db); try { SiteNode newSiteNode = siteNodeControllerProxy.acCreatePure(this.principal, siteNodeVO.getParentSiteNodeId(), siteNodeVO.getSiteNodeTypeDefinitionId(), siteNodeVO.getRepositoryId(), siteNodeVO, childCount, db); SiteNodeVO newSiteNodeVO = newSiteNode.getValueObject(); if(newSiteNode != null) statusBean.getCreatedBeans().add(new CreatedEntityBean(SiteNodeVO.class.getName(), new Long(newSiteNodeVO.getId()))); Content newMetaInfoContent = SiteNodeController.getController().createSiteNodeMetaInfoContent(db, newSiteNodeVO, siteNodeVO.getRepositoryId(), this.principal, pageTemplateContentId, new ArrayList()); if(newMetaInfoContent != null) statusBean.getCreatedBeans().add(new CreatedEntityBean(ContentVO.class.getName(), new Long(newMetaInfoContent.getId()))); //Should we also change state on newly created content version? /* if(stateId != null && !stateId.equals(ContentVersionVO.WORKING_STATE)) { List events = new ArrayList(); ContentStateController.changeState(newContentVersionId, stateId, "Remote update from deliver", false, this.principal, newContentVO.getId(), events); if(stateId.equals(ContentVersionVO.PUBLISHED_STATE)) { PublicationVO publicationVO = new PublicationVO(); publicationVO.setName("Direct publication by " + this.principal.getName()); publicationVO.setDescription("Direct publication from deliver"); publicationVO.setRepositoryId(repositoryId); publicationVO = PublicationController.getController().createAndPublish(publicationVO, events, false, this.principal); } } */ 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()); } } logger.info("Done with site nodes.."); } catch(Throwable e) { statusBean.setStatus(false); logger.error("En error occurred when we tried to create a new siteNode:" + e.getMessage(), e); } updateCaches(); return statusBean; } /** * * @param db the database to use in the operation. * @param categoryVOList * @return * @throws Exception */ private List categoryVOListToCategoryList(final List categoryVOList, Database db) 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; } /** * Checks if the principal exists and if the principal is allowed to create the workflow. * * @param userName the name of the user. * @param workflowName the name of the workflow to create. * @throws SystemException if the principal doesn't exists or doesn't have permission to create the workflow. */ private void initializePrincipal(final String userName) throws SystemException { try { principal = UserControllerProxy.getController().getUser(userName); } catch(SystemException e) { throw e; } catch(Exception e) { throw new SystemException(e); } if(principal == null) { throw new SystemException("No such principal [" + userName + "]."); } } }