From f12b5edafa6fea81958dc12d4ba18fd53268d4c3 Mon Sep 17 00:00:00 2001 From: Brian Remmington Date: Wed, 13 Jul 2011 08:21:05 +0000 Subject: [PATCH] Publishing: - SlideShare channel now tested (the service seems pretty flaky, but the publishing works fine). - A couple of tweaks to ensure that credentials are being stored correctly for each channel. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28966 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/model/publishingModel.xml | 11 + .../slideshare-publishing-context.xml | 6 + config/test/alfresco/TestPresentation.pptx | Bin 0 -> 46968 bytes .../repo/publishing/AbstractChannelType.java | 21 +- .../repo/publishing/ChannelHelper.java | 4 +- .../repo/publishing/ChannelServiceImpl.java | 18 +- .../ChannelServiceImplIntegratedTest.java | 2 +- .../repo/publishing/PublishingModel.java | 1 + .../slideshare/SlideShareApiImpl.java | 303 ++++++++++++++++++ .../slideshare/SlideShareChannelType.java | 2 +- .../slideshare/SlideSharePublishAction.java | 13 +- .../SlideSharePublishingHelper.java | 23 +- .../slideshare/SlideSharePublishingModel.java | 6 +- .../publishing/slideshare/SlideShareTest.java | 163 ++++++++++ .../twitter/TwitterChannelType.java | 13 +- .../repo/publishing/youtube/YouTubeTest.java | 4 +- .../publishing/channels/ChannelService.java | 10 +- 17 files changed, 563 insertions(+), 37 deletions(-) create mode 100644 config/test/alfresco/TestPresentation.pptx create mode 100644 source/java/org/alfresco/repo/publishing/slideshare/SlideShareApiImpl.java create mode 100644 source/java/org/alfresco/repo/publishing/slideshare/SlideShareTest.java diff --git a/config/alfresco/model/publishingModel.xml b/config/alfresco/model/publishingModel.xml index 61630cfdbd..28e9e83aed 100644 --- a/config/alfresco/model/publishingModel.xml +++ b/config/alfresco/model/publishingModel.xml @@ -34,6 +34,17 @@ + + + false + false + + + pub:DeliveryChannel + false + false + + false diff --git a/config/alfresco/slideshare-publishing-context.xml b/config/alfresco/slideshare-publishing-context.xml index af80052544..7963c03c67 100644 --- a/config/alfresco/slideshare-publishing-context.xml +++ b/config/alfresco/slideshare-publishing-context.xml @@ -12,6 +12,12 @@ + + + + + + diff --git a/config/test/alfresco/TestPresentation.pptx b/config/test/alfresco/TestPresentation.pptx new file mode 100644 index 0000000000000000000000000000000000000000..6751ae084d3954922981a2771e6a16ebc1dbba8c GIT binary patch literal 46968 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 props = new HashMap(); + props.put(PublishingModel.PROP_CHANNEL_USERNAME, username[0]); + props.put(PublishingModel.PROP_CHANNEL_PASSWORD, password[0]); + channelService.updateChannel(channel, props); //TODO: BJR: 20110707: Should test the connection here result = true; } diff --git a/source/java/org/alfresco/repo/publishing/ChannelHelper.java b/source/java/org/alfresco/repo/publishing/ChannelHelper.java index 3b6a1b2286..941d6fa777 100644 --- a/source/java/org/alfresco/repo/publishing/ChannelHelper.java +++ b/source/java/org/alfresco/repo/publishing/ChannelHelper.java @@ -109,7 +109,9 @@ public class ChannelHelper { ChannelType channelType = channel.getChannelType(); String channelName = channel.getName(); - return createChannelNode(environment, channelType, channelName, properties); + NodeRef envChannel = createChannelNode(environment, channelType, channelName, properties); + nodeService.createAssociation(envChannel, channel.getNodeRef(), PublishingModel.ASSOC_EDITORIAL_CHANNEL); + return envChannel; } public Channel getChannel(NodeRef environment, String channelName, ChannelService channelService) diff --git a/source/java/org/alfresco/repo/publishing/ChannelServiceImpl.java b/source/java/org/alfresco/repo/publishing/ChannelServiceImpl.java index ff9a0ba830..4d68e8b26d 100644 --- a/source/java/org/alfresco/repo/publishing/ChannelServiceImpl.java +++ b/source/java/org/alfresco/repo/publishing/ChannelServiceImpl.java @@ -39,6 +39,7 @@ import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.publishing.channels.Channel; import org.alfresco.service.cmr.publishing.channels.ChannelService; import org.alfresco.service.cmr.publishing.channels.ChannelType; +import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.site.SiteInfo; @@ -379,15 +380,20 @@ public class ChannelServiceImpl implements ChannelService * (java.lang.String, java.lang.String, java.util.Map) */ @Override - public void updateChannel(String siteId, String channelName, Map properties) + public void updateChannel(Channel channel, Map properties) { - Set containers = getAllChannelContainers(siteId); - for (NodeRef channelContainer : containers) + List allChannelNodes = new ArrayList(); + NodeRef editorialNode = channel.getNodeRef(); + allChannelNodes.add(editorialNode); + for (AssociationRef assoc : nodeService.getSourceAssocs(editorialNode, PublishingModel.ASSOC_EDITORIAL_CHANNEL)) { - NodeRef channel = nodeService.getChildByName(channelContainer, ContentModel.ASSOC_CONTAINS, channelName); - if (channel != null) + allChannelNodes.add(assoc.getSourceRef()); + } + for (NodeRef channelNode : allChannelNodes) + { + for (Map.Entry entry : properties.entrySet()) { - nodeService.setProperties(channel, properties); + nodeService.setProperty(channelNode, entry.getKey(), entry.getValue()); } } } diff --git a/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java b/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java index be595a7e17..743815db54 100644 --- a/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java +++ b/source/java/org/alfresco/repo/publishing/ChannelServiceImplIntegratedTest.java @@ -139,7 +139,7 @@ public class ChannelServiceImplIntegratedTest extends AbstractPublishingIntegrat assertNull(props.get(ContentModel.PROP_TITLE)); props.put(ContentModel.PROP_TITLE, newTitle); - channelService.updateChannel(siteId, channelName, props); + channelService.updateChannel(channel, props); channels = channelService.getChannels(siteId); assertEquals(1, channels.size()); diff --git a/source/java/org/alfresco/repo/publishing/PublishingModel.java b/source/java/org/alfresco/repo/publishing/PublishingModel.java index 88c8d6739b..e263ec8900 100644 --- a/source/java/org/alfresco/repo/publishing/PublishingModel.java +++ b/source/java/org/alfresco/repo/publishing/PublishingModel.java @@ -87,6 +87,7 @@ public interface PublishingModel public static final QName ASSOC_PUBLISHING_EVENT = QName.createQName(NAMESPACE, "publishingEventAssoc"); public static final QName ASSOC_SOURCE = QName.createQName(NAMESPACE, "source"); public static final QName ASSOC_LAST_PUBLISHING_EVENT= QName.createQName(NAMESPACE, "lastPublishingEvent"); + public static final QName ASSOC_EDITORIAL_CHANNEL= QName.createQName(NAMESPACE, "editorialChannel"); // Workflow Properties public static final QName PROP_WF_PUBLISHING_EVENT= QName.createQName(WF_NAMESPACE, "publishingEvent"); diff --git a/source/java/org/alfresco/repo/publishing/slideshare/SlideShareApiImpl.java b/source/java/org/alfresco/repo/publishing/slideshare/SlideShareApiImpl.java new file mode 100644 index 0000000000..264c8a8404 --- /dev/null +++ b/source/java/org/alfresco/repo/publishing/slideshare/SlideShareApiImpl.java @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.publishing.slideshare; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.benfante.jslideshare.DocumentParser; +import com.benfante.jslideshare.DocumentParserResult; +import com.benfante.jslideshare.SlideShareAPI; +import com.benfante.jslideshare.SlideShareConnector; +import com.benfante.jslideshare.SlideShareErrorException; +import com.benfante.jslideshare.SlideShareException; +import com.benfante.jslideshare.messages.Group; +import com.benfante.jslideshare.messages.Slideshow; +import com.benfante.jslideshare.messages.SlideshowInfo; +import com.benfante.jslideshare.messages.Tag; +import com.benfante.jslideshare.messages.User; + +public class SlideShareApiImpl implements SlideShareAPI +{ + private static final Log logger = LogFactory.getLog(SlideShareApiImpl.class); + + public static final String URL_GET_SLIDESHOW = "URL_GET_SLIDESHOW"; + public static final String URL_GET_SLIDESHOW_INFO = "URL_GET_SLIDESHOW_INFO"; + public static final String URL_GET_SLIDESHOW_BY_USER = "URL_GET_SLIDESHOW_BY_USER"; + public static final String URL_GET_SLIDESHOW_BY_TAG = "URL_GET_SLIDESHOW_BY_TAG"; + public static final String URL_GET_SLIDESHOW_BY_GROUP = "URL_GET_SLIDESHOW_BY_GROUP"; + public static final String URL_UPLOAD_SLIDESHOW = "URL_UPLOAD_SLIDESHOW"; + public static final String URL_DELETE_SLIDESHOW = "URL_DELETE_SLIDESHOW"; + + private static Map DEFAULT_API_URLS = new TreeMap(); + + static + { + DEFAULT_API_URLS.put(URL_GET_SLIDESHOW, "http://www.slideshare.net/api/2/get_slideshow"); + DEFAULT_API_URLS.put(URL_GET_SLIDESHOW_INFO, "https://www.slideshare.net/api/2/get_slideshow_info"); + DEFAULT_API_URLS.put(URL_GET_SLIDESHOW_BY_USER, "https://www.slideshare.net/api/2/get_slideshow_by_user"); + DEFAULT_API_URLS.put(URL_GET_SLIDESHOW_BY_TAG, "https://www.slideshare.net/api/2/get_slideshow_by_tag"); + DEFAULT_API_URLS.put(URL_GET_SLIDESHOW_BY_GROUP, "https://www.slideshare.net/api/2/get_slideshow_from_group"); + DEFAULT_API_URLS.put(URL_UPLOAD_SLIDESHOW, "http://www.slideshare.net/api/2/upload_slideshow"); + DEFAULT_API_URLS.put(URL_DELETE_SLIDESHOW, "https://www.slideshare.net/api/2/delete_slideshow"); + } + + private Map apiUrls = new TreeMap(DEFAULT_API_URLS); + + protected SlideShareConnector connector; + + private String username; + + private String password; + + public SlideShareApiImpl() + { + } + + public SlideShareApiImpl(SlideShareConnector connector) + { + this.connector = connector; + } + + public SlideShareConnector getConnector() + { + return connector; + } + + public void setConnector(SlideShareConnector connector) + { + this.connector = connector; + } + + public void setApiUrls(Map urls) + { + if (urls == null || !urls.keySet().containsAll(DEFAULT_API_URLS.keySet())) + { + throw new IllegalArgumentException("Specified URL set is missing one or more values. Expected " + + DEFAULT_API_URLS.keySet() + "; Received " + (urls == null ? urls : urls.keySet())); + } + } + + public Slideshow getSlideshow(String id) throws SlideShareException, SlideShareErrorException + { + logger.info("Called getSlideshow with id=" + id); + Map parameters = new HashMap(); + addParameter(parameters, "slideshow_id", id); + return sendMessage(URL_GET_SLIDESHOW, parameters).getSlideShow(); + } + + public SlideshowInfo getSlideshowInfo(String id, String url) throws SlideShareException, SlideShareErrorException + { + logger.info("Called getSlideshowInfo with id=" + id + ", url=" + url); + Map parameters = new HashMap(); + addParameter(parameters, "slideshow_id", id); + addParameter(parameters, "slideshow_url", url); + return sendGetMessage(URL_GET_SLIDESHOW_INFO, parameters).getSlideShowInfo(); + } + + public User getSlideshowByUser(String username) throws SlideShareException, SlideShareErrorException + { + logger.info("Called getSlideshowByUser with username=" + username); + return getSlideshowByUser(username, -1, -1); + } + + public User getSlideshowByUser(String username, int offset, int limit) throws SlideShareException, + SlideShareErrorException + { + logger.info("Called getSlideshowByUser with username=" + username + ", offset=" + offset + ", limit=" + limit); + Map parameters = new HashMap(); + addParameter(parameters, "username_for", username); + addLimits(parameters, offset, limit); + return sendMessage(URL_GET_SLIDESHOW_BY_USER, parameters).getUser(); + } + + public Tag getSlideshowByTag(String tag) throws SlideShareException, SlideShareErrorException + { + logger.info("Called getSlideshowByTag with tag=" + tag); + return getSlideshowByTag(tag, -1, -1); + } + + public Tag getSlideshowByTag(String tag, int offset, int limit) throws SlideShareException, + SlideShareErrorException + { + logger.info("Called getSlideshowByTag with tag=" + tag + ", offset=" + offset + ", limit=" + limit); + Map parameters = new HashMap(); + addParameter(parameters, "tag", tag); + addLimits(parameters, offset, limit); + return sendMessage(URL_GET_SLIDESHOW_BY_TAG, parameters).getTag(); + } + + public Group getSlideshowByGroup(String groupName) throws SlideShareException, SlideShareErrorException + { + logger.info("Called getSlideshowByGroup with groupName=" + groupName); + return getSlideshowByGroup(groupName, -1, -1); + } + + public Group getSlideshowByGroup(String groupName, int offset, int limit) throws SlideShareException, + SlideShareErrorException + { + logger + .info("Called getSlideshowByGrop with groupName=" + groupName + ", offset=" + offset + ", limit=" + + limit); + Map parameters = new HashMap(); + addParameter(parameters, "group_name", groupName); + addLimits(parameters, offset, limit); + return sendMessage(URL_GET_SLIDESHOW_BY_GROUP, parameters).getGroup(); + } + + public String uploadSlideshow(String username, String password, String title, File src, String description, + String tags, boolean makeSrcPublic, boolean makeSlideshowPrivate, boolean generateSecretUrl, + boolean allowEmbeds, boolean shareWithContacts) throws SlideShareException, SlideShareErrorException + { + logger.info("Called uploadSlideshow with username=" + username + ", password=XXX, title=" + title + + ", description=" + description + ", tags=" + tags + ", makeSrcPublic=" + makeSrcPublic + + ", makeSlideshowPrivate=" + makeSlideshowPrivate + ", generateSecretUrl=" + generateSecretUrl + + ", allowEmbeds=" + allowEmbeds + ", shareWithContacts=" + shareWithContacts); + Map parameters = new HashMap(); + addParameter(parameters, "username", username); + addParameter(parameters, "password", password); + addParameter(parameters, "slideshow_title", title); + addParameter(parameters, "slideshow_description", description); + addParameter(parameters, "slideshow_tags", tags); + addParameter(parameters, "make_src_public", makeSrcPublic); + addParameter(parameters, "make_slideshow_private", makeSlideshowPrivate); + addParameter(parameters, "generate_secret_url", generateSecretUrl); + addParameter(parameters, "allow_embeds", allowEmbeds); + addParameter(parameters, "share_with_contacts", shareWithContacts); + Map files = new HashMap(); + files.put("slideshow_srcfile", src); + return sendMessage(URL_UPLOAD_SLIDESHOW, parameters, files).getSlideShowId(); + } + + public String deleteSlideshow(String username, String password, String id) throws SlideShareException, + SlideShareErrorException + { + logger.info("Called deleteSlideshow with username=" + username + ", password=XXX, id=" + id); + Map parameters = new HashMap(); + addParameter(parameters, "username", username); + addParameter(parameters, "password", password); + addParameter(parameters, "slideshow_id", id); + return sendGetMessage(URL_DELETE_SLIDESHOW, parameters).getSlideShowId(); + } + + private Map addParameter(Map parameters, String name, String value) + { + if (value != null) + { + parameters.put(name, value); + } + return parameters; + } + + private Map addParameter(Map parameters, String name, boolean value) + { + parameters.put(name, value ? "Y" : "N"); + return parameters; + } + + private Map addLimits(Map parameters, int offset, int limit) + { + if (offset >= 0) + { + parameters.put("offset", Integer.toString(offset)); + } + if (limit >= 0) + { + parameters.put("limit", Integer.toString(limit)); + } + return parameters; + } + + private DocumentParserResult sendMessage(String url, Map parameters) + throws SlideShareErrorException + { + addCredentials(parameters); + DocumentParserResult result; + try + { + InputStream response = connector.sendMessage(apiUrls.get(url), parameters); + result = DocumentParser.parse(response); + } + catch (IOException iOException) + { + throw new SlideShareErrorException(-1, "Error sending a message to the url " + apiUrls.get(url), iOException); + } + return result; + } + + private DocumentParserResult sendGetMessage(String url, Map parameters) + throws SlideShareErrorException + { + addCredentials(parameters); + DocumentParserResult result; + try + { + InputStream response = connector.sendGetMessage(apiUrls.get(url), parameters); + result = DocumentParser.parse(response); + } + catch (IOException iOException) + { + throw new SlideShareErrorException(-1, "Error sending a message to the url " + apiUrls.get(url), iOException); + } + return result; + } + + private DocumentParserResult sendMessage(String url, Map parameters, Map files) + throws SlideShareErrorException + { + addCredentials(parameters); + DocumentParserResult result; + try + { + InputStream response = connector.sendMultiPartMessage(apiUrls.get(url), parameters, files); + result = DocumentParser.parse(response); + } + catch (IOException iOException) + { + throw new SlideShareErrorException(-1, "Error sending a multipart message to the url " + apiUrls.get(url), iOException); + } + return result; + } + + private void addCredentials(Map parameters) + { + if (username != null && password != null) + { + addParameter(parameters, "username", username); + addParameter(parameters, "password", password); + } + } + + public void setUsername(String username) + { + this.username = username; + } + + public void setPassword(String password) + { + this.password = password; + } +} diff --git a/source/java/org/alfresco/repo/publishing/slideshare/SlideShareChannelType.java b/source/java/org/alfresco/repo/publishing/slideshare/SlideShareChannelType.java index 4f6f32dbea..db2d8ffa0f 100644 --- a/source/java/org/alfresco/repo/publishing/slideshare/SlideShareChannelType.java +++ b/source/java/org/alfresco/repo/publishing/slideshare/SlideShareChannelType.java @@ -144,7 +144,7 @@ public class SlideShareChannelType extends AbstractChannelType String url = null; if (node != null && nodeService.exists(node) && nodeService.hasAspect(node, SlideSharePublishingModel.ASPECT_ASSET)) { - url = (String)nodeService.getProperty(node, SlideSharePublishingModel.PROP_PLAYER_URL); + url = (String)nodeService.getProperty(node, SlideSharePublishingModel.PROP_ASSET_URL); } return url; } diff --git a/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishAction.java b/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishAction.java index e93fe2a6b9..a8020d03e0 100644 --- a/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishAction.java +++ b/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishAction.java @@ -73,12 +73,12 @@ public class SlideSharePublishAction extends ActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef nodeRef) { - SlideShareAPI api = slideShareHelper.getSlideShareApi(); Pair usernamePassword = slideShareHelper.getSlideShareCredentialsForNode(nodeRef); - if (api == null || usernamePassword == null) + if (usernamePassword == null) { - throw new AlfrescoRuntimeException("publish.failed.unable_to_connect_to_service_provider"); + throw new AlfrescoRuntimeException("publish.failed.no_credentials_found"); } + SlideShareAPI api = slideShareHelper.getSlideShareApi(usernamePassword.getFirst(), usernamePassword.getSecond()); ContentReader reader = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT); if (reader.exists()) @@ -121,7 +121,14 @@ public class SlideSharePublishAction extends ActionExecuterAbstractBase String assetId = api.uploadSlideshow(usernamePassword.getFirst(), usernamePassword.getSecond(), title, contentFile, description, tags.toString(), false, false, false, false, false); +// String url = api.getSlideshow(assetId).getPermalink(); + String url = null; + if (log.isInfoEnabled()) + { + log.info("File " + name + " has been published to SlideShare with id " + assetId + " at URL " + url); + } nodeService.setProperty(nodeRef, SlideSharePublishingModel.PROP_ASSET_ID, assetId); + nodeService.setProperty(nodeRef, SlideSharePublishingModel.PROP_ASSET_URL, url); if (deleteContentFileOnCompletion) { diff --git a/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingHelper.java b/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingHelper.java index 1b33f5ea9e..ad1c1e6aa8 100644 --- a/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingHelper.java +++ b/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingHelper.java @@ -24,23 +24,32 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.util.Pair; import com.benfante.jslideshare.SlideShareAPI; -import com.benfante.jslideshare.SlideShareAPIFactory; +import com.benfante.jslideshare.SlideShareConnector; public class SlideSharePublishingHelper { private NodeService nodeService; + private SlideShareConnector slideshareConnector; public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } - + + public void setSlideshareConnector(SlideShareConnector slideshareConnector) + { + this.slideshareConnector = slideshareConnector; + } public SlideShareAPI getSlideShareApi() { - return SlideShareAPIFactory.getSlideShareAPI("hhjh", "oijkl"); + return createApiObject(); } + private SlideShareApiImpl createApiObject() + { + return new SlideShareApiImpl(slideshareConnector); + } public Pair getSlideShareCredentialsForNode(NodeRef publishNode) { @@ -61,4 +70,12 @@ public class SlideSharePublishingHelper return result; } + public SlideShareAPI getSlideShareApi(String username, String password) + { + SlideShareApiImpl api = createApiObject(); + api.setUsername(username); + api.setPassword(password); + return api; + } + } diff --git a/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingModel.java b/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingModel.java index 90b76625da..3705493ef7 100644 --- a/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingModel.java +++ b/source/java/org/alfresco/repo/publishing/slideshare/SlideSharePublishingModel.java @@ -27,8 +27,8 @@ import org.alfresco.service.namespace.QName; */ public interface SlideSharePublishingModel { - public static final String NAMESPACE = "http://www.alfresco.org/model/publishing/youtube/1.0"; - public static final String PREFIX = "youtube"; + public static final String NAMESPACE = "http://www.alfresco.org/model/publishing/slideshare/1.0"; + public static final String PREFIX = "slideshare"; public static final QName TYPE_DELIVERY_CHANNEL = QName.createQName(NAMESPACE, "DeliveryChannel"); @@ -36,5 +36,5 @@ public interface SlideSharePublishingModel public static final QName ASPECT_ASSET = QName.createQName(NAMESPACE, "AssetAspect"); public static final QName PROP_ASSET_ID = QName.createQName(NAMESPACE, "assetId"); - public static final QName PROP_PLAYER_URL = QName.createQName(NAMESPACE, "assetUrl"); + public static final QName PROP_ASSET_URL = QName.createQName(NAMESPACE, "assetUrl"); } diff --git a/source/java/org/alfresco/repo/publishing/slideshare/SlideShareTest.java b/source/java/org/alfresco/repo/publishing/slideshare/SlideShareTest.java new file mode 100644 index 0000000000..de0e86b7f9 --- /dev/null +++ b/source/java/org/alfresco/repo/publishing/slideshare/SlideShareTest.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +package org.alfresco.repo.publishing.slideshare; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.publishing.EnvironmentImpl; +import org.alfresco.repo.publishing.PublishingModel; +import org.alfresco.repo.publishing.PublishingQueueImpl; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.publishing.channels.Channel; +import org.alfresco.service.cmr.publishing.channels.ChannelService; +import org.alfresco.service.cmr.repository.ContentService; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.service.cmr.site.SiteVisibility; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.BaseSpringTest; +import org.alfresco.util.GUID; +import org.junit.Assert; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +/** + * @author Brian + * + */ +public class SlideShareTest extends BaseSpringTest +{ + protected ServiceRegistry serviceRegistry; + protected SiteService siteService; + protected FileFolderService fileFolderService; + protected NodeService nodeService; + protected String siteId; + protected PublishingQueueImpl queue; + protected EnvironmentImpl environment; + protected NodeRef docLib; + + private ChannelService channelService; + + private RetryingTransactionHelper transactionHelper; + + public void onSetUp() throws Exception + { + serviceRegistry = (ServiceRegistry) getApplicationContext().getBean("ServiceRegistry"); + channelService = (ChannelService) getApplicationContext().getBean("channelService"); + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); + siteService = serviceRegistry.getSiteService(); + fileFolderService = serviceRegistry.getFileFolderService(); + nodeService = serviceRegistry.getNodeService(); + transactionHelper = serviceRegistry.getRetryingTransactionHelper(); + + siteId = GUID.generate(); + siteService.createSite("test", siteId, "Site created by publishing test", "Site created by publishing test", + SiteVisibility.PUBLIC); + docLib = siteService.createContainer(siteId, SiteService.DOCUMENT_LIBRARY, ContentModel.TYPE_FOLDER, null); + } + + public void onTearDown() + { + siteService.deleteSite(siteId); + } + + public void testBlank() + { + + } + + //Note that this test isn't normally run, as it requires valid YouTube credentials. + //To run it, remove the initial 'x' from the method name and set the appropriate YouTube credentials where the + //text "YOUR_USER_NAME" and "YOUR_PASSWORD" appear. + public void xtestSlideSharePublishAndUnpublishActions() throws Exception + { + final NodeRef node = transactionHelper.doInTransaction(new RetryingTransactionCallback() + { + public NodeRef execute() throws Throwable + { + Map props = new HashMap(); + props.put(PublishingModel.PROP_CHANNEL_USERNAME, "YOUR_USER_NAME"); + props.put(PublishingModel.PROP_CHANNEL_PASSWORD, "YOUR_PASSWORD"); + Channel channel = channelService.createChannel(siteId, SlideShareChannelType.ID, "SlideShareChannel", props); + + NodeRef channelNode = channel.getNodeRef(); + Resource file = new ClassPathResource("test/alfresco/TestPresentation.pptx"); + Map vidProps = new HashMap(); + vidProps.put(ContentModel.PROP_NAME, "Test Presentation"); + NodeRef node = nodeService.createNode(channelNode, ContentModel.ASSOC_CONTAINS, + QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "testPresentation"), + ContentModel.TYPE_CONTENT, vidProps).getChildRef(); + ContentService contentService = serviceRegistry.getContentService(); + ContentWriter writer = contentService.getWriter(node, ContentModel.PROP_CONTENT, true); + writer.setMimetype(MimetypeMap.MIMETYPE_OPENXML_PRESENTATION); + writer.putContent(file.getFile()); + return node; + } + }); + + transactionHelper.doInTransaction(new RetryingTransactionCallback() + { + public NodeRef execute() throws Throwable + { + ActionService actionService = serviceRegistry.getActionService(); + Action publishAction = actionService.createAction(SlideSharePublishAction.NAME); + actionService.executeAction(publishAction, node); + Map props = nodeService.getProperties(node); + Assert.assertTrue(nodeService.hasAspect(node, SlideSharePublishingModel.ASPECT_ASSET)); + Assert.assertNotNull(props.get(SlideSharePublishingModel.PROP_ASSET_ID)); +// Assert.assertNotNull(props.get(SlideSharePublishingModel.PROP_ASSET_URL)); + + System.out.println("SlideShare id: " + props.get(SlideSharePublishingModel.PROP_ASSET_ID)); + +// Action unpublishAction = actionService.createAction(SlideShareUnpublishAction.NAME); +// actionService.executeAction(unpublishAction, node); +// props = nodeService.getProperties(node); +// Assert.assertFalse(nodeService.hasAspect(node, SlideSharePublishingModel.ASPECT_ASSET)); +// Assert.assertNull(props.get(SlideSharePublishingModel.PROP_ASSET_ID)); +// Assert.assertNull(props.get(SlideSharePublishingModel.PROP_ASSET_URL)); + return null; + } + }); + + transactionHelper.doInTransaction(new RetryingTransactionCallback() + { + public NodeRef execute() throws Throwable + { + nodeService.deleteNode(node); + return null; + } + }); + + } + +} diff --git a/source/java/org/alfresco/repo/publishing/twitter/TwitterChannelType.java b/source/java/org/alfresco/repo/publishing/twitter/TwitterChannelType.java index 6060f1414c..c24f4448b2 100644 --- a/source/java/org/alfresco/repo/publishing/twitter/TwitterChannelType.java +++ b/source/java/org/alfresco/repo/publishing/twitter/TwitterChannelType.java @@ -20,6 +20,7 @@ package org.alfresco.repo.publishing.twitter; import java.io.Serializable; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -154,14 +155,16 @@ public class TwitterChannelType extends AbstractChannelType OAuth1Operations oauthOperations = publishingHelper.getConnectionFactory().getOAuthOperations(); NodeRef channelNodeRef = channel.getNodeRef(); - Map props = nodeService.getProperties(channelNodeRef); - String tokenValue = (String) props.get(PublishingModel.PROP_OAUTH1_TOKEN_VALUE); - String tokenSecret = (String) props.get(PublishingModel.PROP_OAUTH1_TOKEN_SECRET); + Map currentProps = nodeService.getProperties(channelNodeRef); + String tokenValue = (String) currentProps.get(PublishingModel.PROP_OAUTH1_TOKEN_VALUE); + String tokenSecret = (String) currentProps.get(PublishingModel.PROP_OAUTH1_TOKEN_SECRET); OAuthToken token = new OAuthToken(tokenValue, tokenSecret); OAuthToken accessToken = oauthOperations.exchangeForAccessToken(new AuthorizedRequestToken(token, verifier[0]), null); - nodeService.setProperty(channelNodeRef, PublishingModel.PROP_OAUTH1_TOKEN_VALUE, accessToken.getValue()); - nodeService.setProperty(channelNodeRef, PublishingModel.PROP_OAUTH1_TOKEN_SECRET, accessToken.getSecret()); + Map newProps = new HashMap(); + newProps.put(PublishingModel.PROP_OAUTH1_TOKEN_VALUE, accessToken.getValue()); + newProps.put(PublishingModel.PROP_OAUTH1_TOKEN_SECRET, accessToken.getSecret()); + getChannelService().updateChannel(channel, newProps); authorised = true; } return authorised; diff --git a/source/java/org/alfresco/repo/publishing/youtube/YouTubeTest.java b/source/java/org/alfresco/repo/publishing/youtube/YouTubeTest.java index 1f8c9e1fd5..c4d370660a 100644 --- a/source/java/org/alfresco/repo/publishing/youtube/YouTubeTest.java +++ b/source/java/org/alfresco/repo/publishing/youtube/YouTubeTest.java @@ -105,8 +105,8 @@ public class YouTubeTest extends BaseSpringTest public NodeRef execute() throws Throwable { Map props = new HashMap(); - props.put(PublishingModel.PROP_CHANNEL_USERNAME, "demochilledpenguin"); - props.put(PublishingModel.PROP_CHANNEL_PASSWORD, "D3moChilledPenguin"); + props.put(PublishingModel.PROP_CHANNEL_USERNAME, "YOUR_USER_NAME"); + props.put(PublishingModel.PROP_CHANNEL_PASSWORD, "YOUR_PASSWORD"); Channel channel = channelService.createChannel(siteId, YouTubeChannelType.ID, "YouTubeChannel", props); NodeRef channelNode = channel.getNodeRef(); diff --git a/source/java/org/alfresco/service/cmr/publishing/channels/ChannelService.java b/source/java/org/alfresco/service/cmr/publishing/channels/ChannelService.java index e829a7213b..8015ef1dce 100644 --- a/source/java/org/alfresco/service/cmr/publishing/channels/ChannelService.java +++ b/source/java/org/alfresco/service/cmr/publishing/channels/ChannelService.java @@ -80,11 +80,11 @@ public interface ChannelService /** * Update the properties of the specified channel. - * @param siteId The identifier of the Share site that contains the channel that is to be updated. - * @param channelName The name of the channel that is to be updated. - * @param properties The complete set of properties to set on the channel. + * @param channel The channel that is to be updated. + * @param properties The properties to set on the channel. These are blended with the current properties + * on the channel. Any that aren't currently set will be added, others will be updated. */ - void updateChannel(String siteId, String channelName, Map properties); + void updateChannel(Channel channel, Map properties); /** * Retrieve all the channels contained by the specified Share site. @@ -130,7 +130,7 @@ public interface ChannelService List getStatusUpdateChannels(String siteId); /** - * Returns all {@link Channel}s cpaable of performing a status update for the Share Site in which the specified nodeToPublish exists. + * Returns all {@link Channel}s capable of performing a status update for the Share Site in which the specified nodeToPublish exists. * @param siteId * @return */