/* * 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; import static org.alfresco.model.ContentModel.TYPE_CONTENT; import static org.alfresco.repo.publishing.PublishingModel.PROP_AUTHORISATION_COMPLETE; import static org.alfresco.repo.publishing.PublishingModel.TYPE_DELIVERY_CHANNEL; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; import java.io.File; import java.io.Serializable; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.publishing.PublishingDetails; import org.alfresco.service.cmr.publishing.PublishingEvent; import org.alfresco.service.cmr.publishing.PublishingQueue; import org.alfresco.service.cmr.publishing.PublishingService; import org.alfresco.service.cmr.publishing.Status; 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.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.site.SiteVisibility; import org.alfresco.service.namespace.QName; import org.alfresco.util.GUID; /** * @author Nick Smith * @since 4.0 */ public class PublishingTestHelper { private final ChannelService channelService; private final PublishingService publishingService; private final SiteService siteService; private final FileFolderService fileFolderService; private final PermissionService permissionService; private final NodeRef docLib; private final String siteId = GUID.generate(); private final List channels = new LinkedList(); private final List events = new LinkedList(); public PublishingTestHelper(ChannelService channelService, PublishingService publishingService, SiteService siteService, FileFolderService fileFolderService, PermissionService permissionService) { this.channelService = channelService; this.publishingService = publishingService; this.siteService = siteService; this.fileFolderService = fileFolderService; this.permissionService = permissionService; AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser(); siteService.createSite("test", siteId, "Test site created by ChannelServiceImplIntegratedTest", "Test site created by ChannelServiceImplIntegratedTest", SiteVisibility.PUBLIC); this.docLib = siteService.createContainer(siteId, SiteService.DOCUMENT_LIBRARY, ContentModel.TYPE_FOLDER, null); } public void tearDown() throws Exception { AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser(); try { cancelAllEvents(); } finally { try { deleteAllChannels(); } finally { deleteSite(); } } } private void deleteSite() { try { siteService.deleteSite(siteId); } catch (Throwable t) { //NOOP } } private void deleteAllChannels() { for (Channel channel : channels) { try { channelService.deleteChannel(channel); } catch (Throwable t) { //NOOP } } } private void cancelAllEvents() { for (String event : events) { try { publishingService.cancelPublishingEvent(event); } catch (Throwable t) { //NOOP } } } public AbstractChannelType mockChannelType(String channelTypeId) { AbstractChannelType channelType = (AbstractChannelType) channelService.getChannelType(channelTypeId); if (channelType != null) { reset(channelType); when(channelType.getId()).thenReturn(channelTypeId); } else { channelType = mock(AbstractChannelType.class); when(channelType.getId()).thenReturn(channelTypeId); channelService.register(channelType); } when(channelType.getChannelNodeType()).thenReturn(TYPE_DELIVERY_CHANNEL); return channelType; } public Channel createChannel(String typeId) { String channelName = GUID.generate(); return createChannel(typeId, channelName); } public Channel createChannel(String typeId, String channelName) { return createChannel(typeId, channelName, true); } public Channel createChannel(String typeId, String channelName, boolean isAuthorised) { Channel channel = channelService.createChannel(typeId, channelName, null); channels.add(channel); Map properties = Collections.singletonMap(PROP_AUTHORISATION_COMPLETE, (Serializable)isAuthorised); channelService.updateChannel(channel, properties); return channel; } public void allowChannelAccess(String username, String channelId) { setChannelPermission(username, channelId, PermissionService.ADD_CHILDREN); } public void setChannelPermission(final String username, String channelId, final String permission) { final NodeRef channel = new NodeRef(channelId); AuthenticationUtil.runAs(new RunAsWork() { public Void doWork() throws Exception { permissionService.setPermission(channel, username, permission, true); return null; } }, AuthenticationUtil.getSystemUserName()); } public String scheduleEvent1Year(PublishingDetails details) { Calendar schedule = Calendar.getInstance(); schedule.add(Calendar.YEAR, 1); details.setSchedule(schedule); return scheduleEvent(details); } public String scheduleEvent(PublishingDetails details) { String eventId = publishingService.scheduleNewEvent(details); events.add(eventId); return eventId; } public void addEvent(String eventId) { events.add(eventId); } public void addEvents(Collection eventIds) { events.addAll(eventIds); } public NodeRef createContentNode(String name) { return fileFolderService.create(docLib, name, TYPE_CONTENT).getNodeRef(); } public NodeRef createContentNode(String name, File theContent, String mimetype) { NodeRef source = createContentNode(name); writeContent(source, theContent, mimetype); return source; } public NodeRef createContentNode(String name, String theContent, String mimetype) { NodeRef source = fileFolderService.create(docLib, name, TYPE_CONTENT).getNodeRef(); writeContent(source, theContent, mimetype); return source; } public void writeContent(NodeRef source, String theContent, String mimetype) { ContentWriter writer = fileFolderService.getWriter(source); writer.setEncoding("UTF-8"); writer.putContent(theContent); writer.setMimetype(mimetype); } public void writeContent(NodeRef source, File theContent, String mimetype) { ContentWriter writer = fileFolderService.getWriter(source); writer.setMimetype(mimetype); writer.setEncoding("UTF-8"); writer.putContent(theContent); } public PublishingEvent publishAndWait(final PublishingDetails details, RetryingTransactionHelper transactionHelper) throws InterruptedException { RetryingTransactionCallback startWorkflowCallback = new RetryingTransactionCallback() { public String execute() throws Throwable { return scheduleEvent(details); } }; String eventId = transactionHelper.doInTransaction(startWorkflowCallback); int i = 0; while (i < 100) { Thread.sleep(200); PublishingEvent event = publishingService.getPublishingEvent(eventId); Status status = event.getStatus(); if (Status.IN_PROGRESS != status && Status.SCHEDULED != status) { return event; } i++; } throw new IllegalStateException("The publishing event did not complete after 20s!"); } }