/*
* 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.deploy;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.config.JNDIConstants;
import org.alfresco.jlan.smb.dcerpc.UUID;
import org.alfresco.repo.action.ActionImpl;
import org.alfresco.repo.avm.AVMNodeConverter;
import org.alfresco.repo.avm.AVMNodeType;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.deploy.DeploymentCallback;
import org.alfresco.service.cmr.avm.deploy.DeploymentReport;
import org.alfresco.service.cmr.avm.deploy.DeploymentReportCallback;
import org.alfresco.service.cmr.avm.deploy.DeploymentService;
import org.alfresco.service.cmr.avmsync.AVMDifference;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.GUID;
import org.alfresco.util.NameMatcher;
import org.alfresco.wcm.AbstractWCMServiceImplTest;
import org.alfresco.wcm.actions.WCMSandboxRevertSnapshotAction;
import org.alfresco.wcm.actions.WCMSandboxSubmitAction;
import org.alfresco.wcm.actions.WCMSandboxUndoAction;
import org.alfresco.wcm.asset.AssetInfo;
import org.alfresco.wcm.sandbox.SandboxInfo;
import org.alfresco.wcm.util.WCMUtil;
import org.alfresco.wcm.webproject.WebProjectInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
* Test of deployment to a Test Server.
*
* Through the WCM application rather than directly through AVM.
*
* @author Mark Rogers
*/
public class DeploymentServiceTest extends AbstractWCMServiceImplTest
{
private static Log logger = LogFactory.getLog(DeploymentServiceTest.class);
// base sandbox
private static final String TEST_SANDBOX = TEST_WEBPROJ_DNS+"-sandbox";
private static final int SCALE_USERS = 5;
private static final int SCALE_WEBPROJECTS = 2;
//
// services
//
private AVMService avmService; // non-locking-aware
private DeploymentService deploymentService = null;
private NameMatcher matcher = null;
private File log = null;
private File metadata = null;
private File data = null;
private File target = null;
@Override
protected void setUp() throws Exception
{
super.setUp();
// Get the required services
avmService = (AVMService)ctx.getBean("AVMService");
deploymentService = (DeploymentService)ctx.getBean("DeploymentService");
NameMatcher matcher = (NameMatcher)ctx.getBean("globalPathExcluder");
super.setUp();
log = new File("deplog");
log.mkdir();
metadata = new File("depmetadata");
metadata.mkdir();
data = new File("depdata");
data.mkdir();
target = new File("sampleTarget");
target.mkdir();
/**
* Start the FSR
*/
@SuppressWarnings("unused")
FileSystemXmlApplicationContext receiverContext =
new FileSystemXmlApplicationContext("../deployment/config/application-context.xml");
}
@Override
protected void tearDown() throws Exception
{
if (CLEAN)
{
// Switch back to Admin
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
deleteUser(USER_ONE);
deleteUser(USER_TWO);
deleteUser(USER_THREE);
deleteUser(USER_FOUR);
}
super.tearDown();
}
private String TEST_USER = "Giles";
private String TEST_PASSWORD = "Watcher";
private String TEST_TARGET = "sampleTarget";
public void testSimple() throws Exception
{
int storeCnt = avmService.getStores().size();
String projectName = "DeploymentServiceTestSimple";
// create web project (also creates staging sandbox and admin's author sandbox)
WebProjectInfo wpInfo = wpService.createWebProject(projectName, projectName, TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null);
String wpStoreId = wpInfo.getStoreId();
// list 2 sandboxes
assertEquals(2, sbService.listSandboxes(wpStoreId).size());
// list 4 extra AVM stores (2 per sandbox)
assertEquals(storeCnt+4, avmService.getStores().size()); // 2x stating (main,preview), 2x admin author (main, preview)
// get admin's sandbox
SandboxInfo authorInfo = sbService.getAuthorSandbox(wpStoreId);
assertNotNull(authorInfo);
// get staging sandbox
SandboxInfo stagingInfo = sbService.getStagingSandbox(wpStoreId);
assertNotNull(stagingInfo);
DeploymentReport report = new DeploymentReport();
List callbacks = new ArrayList();
callbacks.add(new DeploymentReportCallback(report));
/**
* Test Server Admin Sandbox Webapps
*/
String srcPath = projectName + "--admin:/www/avm_webapps";
deploymentService.deployDifferenceFS(-1, srcPath, "default", "localhost", 44100, TEST_USER, TEST_PASSWORD, TEST_TARGET, matcher, false, false, false, callbacks);
/**
* Test Server Admin Sandbox ROOT Webapp
*/
assetService.createFolder(authorInfo.getSandboxId(), "/", "hello", null);
srcPath = projectName + "--admin:/www/avm_webapps/ROOT";
deploymentService.deployDifferenceFS(-1, srcPath, "default", "localhost", 44100, TEST_USER, TEST_PASSWORD, TEST_TARGET, matcher, false, false, false, callbacks);
/**
* Live Server - Staging ROOT
*/
srcPath = projectName + ":/www/avm_webapps/ROOT";
deploymentService.deployDifferenceFS(-1, srcPath, "default", "localhost", 44100, TEST_USER, TEST_PASSWORD, TEST_TARGET, matcher, false, false, false, callbacks);
wpService.deleteWebProject(projectName);
}
}