/* ===============================================================================
*
* 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.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController;
import org.infoglue.cms.controllers.kernel.impl.simple.DigitalAssetController;
import org.infoglue.cms.controllers.kernel.impl.simple.ServerNodeController;
import org.infoglue.cms.controllers.kernel.impl.simple.UserControllerProxy;
import org.infoglue.cms.controllers.kernel.impl.simple.UserPropertiesController;
import org.infoglue.cms.entities.content.DigitalAssetVO;
import org.infoglue.cms.entities.management.UserProperties;
import org.infoglue.cms.entities.management.UserPropertiesVO;
import org.infoglue.cms.entities.management.impl.simple.SystemUserImpl;
import org.infoglue.cms.entities.management.impl.simple.UserPropertiesImpl;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.util.ChangeNotificationController;
import org.infoglue.cms.util.NotificationMessage;
import org.infoglue.cms.util.dom.DOMBuilder;
import org.infoglue.cms.webservices.elements.RemoteAttachment;
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 user properties.
*
* @author Mattias Bogeblad
*/
public class RemoteUserPropertiesServiceImpl extends RemoteInfoGlueService
{
private final static Logger logger = Logger.getLogger(RemoteUserPropertiesServiceImpl.class.getName());
/**
* The principal executing the workflow.
*/
private InfoGluePrincipal principal;
private static UserPropertiesController userPropertiesController = UserPropertiesController.getController();
/**
* Inserts a new UserProperty.
*/
public int updateUserProperties(final String principalName, UserPropertiesVO userPropertiesVO)
{
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 newUserPropertiesId = 0;
logger.info("***********************************************");
logger.info("Creating user properties through webservice....");
logger.info("***********************************************");
try
{
initializePrincipal(principalName);
UserPropertiesVO newUserPropertiesVO = userPropertiesController.update(userPropertiesVO.getLanguageId(), userPropertiesVO.getContentTypeDefinitionId(), userPropertiesVO);
newUserPropertiesId = newUserPropertiesVO.getId().intValue();
NotificationMessage notificationMessage = new NotificationMessage("RemoteUserProperties.updateUserProperties", UserPropertiesImpl.class.getName(), principalName, NotificationMessage.PUBLISHING, newUserPropertiesVO.getId(), newUserPropertiesVO.getUserName());
ChangeNotificationController.getInstance().addNotificationMessage(notificationMessage);
}
catch(Exception e)
{
logger.error("En error occurred when we tried to create a new userProperty:" + e.getMessage(), e);
}
updateCaches();
return newUserPropertiesId;
}
/**
* Inserts a new UserProperty.
*/
public Boolean updateUserProperties(final String principalName, int languageId, int contentTypeDefinitionId, boolean forcePublication, boolean allowHTMLContent, boolean allowExternalLinks, boolean allowDollarSigns, boolean allowAnchorSigns, boolean keepExistingAttributes, boolean keepExistingCategories, boolean updateExistingAssets, final Object[] inputsArray, final Object[] assetsArray)
{
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 Boolean(false);
}
Boolean status = new Boolean(true);
int newUserPropertiesId = 0;
logger.info("***********************************************");
logger.info("Creating user properties through webservice....");
logger.info("***********************************************");
try
{
final DynamicWebserviceSerializer serializer = new DynamicWebserviceSerializer();
Map userPropertiesAttributesMap = (Map)serializer.deserialize(inputsArray);
List assets = (List)serializer.deserialize(assetsArray);
initializePrincipal(principalName);
logger.info("principalName:" + principalName);
logger.info("principal:" + principal);
logger.info("languageId:" + languageId);
logger.info("contentTypeDefinitionId:" + contentTypeDefinitionId);
UserPropertiesVO userPropertiesVO = new UserPropertiesVO();
userPropertiesVO.setUserName(principal.getName());
Collection userPropertiesVOList = UserPropertiesController.getController().getUserPropertiesVOList(principal.getName(), languageId);
Iterator userPropertiesVOListIterator = userPropertiesVOList.iterator();
while(userPropertiesVOListIterator.hasNext())
{
UserPropertiesVO userProperties = (UserPropertiesVO)userPropertiesVOListIterator.next();
if(userProperties != null && userProperties.getLanguageId().equals(languageId) && userProperties.getValue() != null)
{
userPropertiesVO = userProperties;
break;
}
}
logger.info("userPropertiesAttributesMap:" + userPropertiesAttributesMap.size());
DOMBuilder domBuilder = new DOMBuilder();
Document document = domBuilder.createDocument();
Element rootElement = null;
Element attributesRoot = null;
logger.info("keepExistingAttributes:" + keepExistingAttributes);
if(keepExistingAttributes && userPropertiesVO.getValue() != null)
{
String propertyXML = userPropertiesVO.getValue();
document = domBuilder.getDocument(propertyXML);
attributesRoot = (Element)document.getRootElement().element("attributes");
}
else
{
rootElement = domBuilder.addElement(document, "article");
attributesRoot = domBuilder.addElement(rootElement, "attributes");
}
logger.info("attributesRoot:" + attributesRoot);
logger.info("XML before:" + document.asXML());
Iterator attributesIterator = userPropertiesAttributesMap.keySet().iterator();
while(attributesIterator.hasNext())
{
String attributeName = (String)attributesIterator.next();
String attributeValue = (String)userPropertiesAttributesMap.get(attributeName);
logger.info(attributeName + "=" + attributeValue);
List<Element> elements = attributesRoot.elements(attributeName);
logger.info("elements:" + elements.size());
for(Element attribute : elements)
{
logger.info("attribute:" + attribute);
if(attribute != null)
attributesRoot.remove(attribute);
}
Element attribute = domBuilder.addElement(attributesRoot, attributeName);
logger.info("attribute after:" + attribute);
domBuilder.addCDATAElement(attribute, attributeValue);
}
logger.info("XML:" + document.asXML());
userPropertiesVO.setValue(document.asXML());
UserPropertiesVO newUserPropertiesVO = userPropertiesController.update(new Integer(languageId), new Integer(contentTypeDefinitionId), userPropertiesVO);
newUserPropertiesId = newUserPropertiesVO.getId().intValue();
List existingDigitalAssetVOList = userPropertiesController.getDigitalAssetVOList(newUserPropertiesId);
List digitalAssets = assets;
logger.info("digitalAssets:" + digitalAssets);
//logger.info("digitalAssets:" + digitalAssets.size());
if(digitalAssets != null)
{
Iterator digitalAssetIterator = digitalAssets.iterator();
while(digitalAssetIterator.hasNext())
{
RemoteAttachment remoteAttachment = (RemoteAttachment)digitalAssetIterator.next();
logger.info("digitalAssets in ws:" + remoteAttachment);
//logger.info("remoteAttachment:" + remoteAttachment.getName() + ":" + remoteAttachment.getSize() + ":" + remoteAttachment.getFilePath());
DigitalAssetVO newAsset = new DigitalAssetVO();
newAsset.setAssetContentType(remoteAttachment.getContentType());
newAsset.setAssetKey(remoteAttachment.getName());
newAsset.setAssetFileName(remoteAttachment.getFileName());
newAsset.setAssetFilePath(remoteAttachment.getFilePath());
newAsset.setAssetFileSize(new Integer(new Long(remoteAttachment.getBytes().length).intValue()));
//is = new FileInputStream(renamedFile);
InputStream is = new ByteArrayInputStream(remoteAttachment.getBytes());
Iterator existingDigitalAssetVOListIterator = existingDigitalAssetVOList.iterator();
while(existingDigitalAssetVOListIterator.hasNext())
{
DigitalAssetVO assetVO = (DigitalAssetVO)existingDigitalAssetVOListIterator.next();
//logger.info("assetVO:" + assetVO.getAssetKey());
if(assetVO.getAssetKey().equals(newAsset.getAssetKey()))
{
//logger.info("Removing:" + assetVO.getAssetKey() + ":" + assetVO.getAssetFileName());
DigitalAssetController.getController().delete(assetVO.getId(), UserProperties.class.getName(), newUserPropertiesId);
}
}
DigitalAssetController.create(newAsset, is, UserProperties.class.getName(), newUserPropertiesVO.getId());
}
}
if(forcePublication)
{
NotificationMessage notificationMessage = new NotificationMessage("RemoteUserProperties.updateUserProperties", UserPropertiesImpl.class.getName(), principalName, NotificationMessage.PUBLISHING, newUserPropertiesVO.getId(), newUserPropertiesVO.getUserName());
ChangeNotificationController.getInstance().addNotificationMessage(notificationMessage);
}
}
catch(Throwable e)
{
status = new Boolean(false);
logger.error("En error occurred when we tried to create a new userProperty:" + e.getMessage(), e);
}
updateCaches();
return status;
}
/**
* Deletes a digital asset.
*/
public Boolean deleteDigitalAsset(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 Boolean(false);
}
Boolean status = new Boolean(true);
logger.info("****************************************");
logger.info("Updating content through webservice....");
logger.info("****************************************");
logger.info("principalName:" + principalName);
logger.info("inputsArray:" + inputsArray);
//logger.warn("contents:" + contents);
try
{
final DynamicWebserviceSerializer serializer = new DynamicWebserviceSerializer();
Map digitalAsset = (Map) serializer.deserialize(inputsArray);
logger.info("digitalAsset:" + digitalAsset);
initializePrincipal(principalName);
Integer contentVersionId = (Integer)digitalAsset.get("contentVersionId");
Integer contentId = (Integer)digitalAsset.get("contentId");
Integer languageId = (Integer)digitalAsset.get("languageId");
String assetKey = (String)digitalAsset.get("assetKey");
logger.info("contentVersionId:" + contentVersionId);
logger.info("contentId:" + contentId);
logger.info("languageId:" + languageId);
logger.info("assetKey:" + assetKey);
ContentVersionController.getContentVersionController().deleteDigitalAsset(contentId, languageId, assetKey);
logger.info("Done with contents..");
NotificationMessage notificationMessage = new NotificationMessage("RemoteUserProperties.deleteDigitalAsset", SystemUserImpl.class.getName(), principalName, NotificationMessage.PUBLISHING, principalName, principalName);
ChangeNotificationController.getInstance().addNotificationMessage(notificationMessage);
}
catch(Throwable e)
{
status = new Boolean(false);
logger.error("En error occurred when we tried to delete a digitalAsset:" + e.getMessage(), e);
}
updateCaches();
return status;
}
/**
* 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 + "].");
}
}
}