/* * 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. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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 General Public License for more details. * * * Copyright 2006 - 2016 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.repository2.unified.webservices.jaxws; import com.sun.xml.ws.developer.JAXWSProperties; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.pentaho.platform.api.mt.ITenant; import org.pentaho.platform.api.repository2.unified.IRepositoryVersionManager; import org.pentaho.platform.api.repository2.unified.RepositoryFile; import org.pentaho.platform.api.repository2.unified.RepositoryFileAce; import org.pentaho.platform.api.repository2.unified.RepositoryFileAcl; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; import org.pentaho.platform.api.repository2.unified.RepositoryFileSid; import org.pentaho.platform.api.repository2.unified.RepositoryFileTree; import org.pentaho.platform.api.repository2.unified.RepositoryRequest; import org.pentaho.platform.api.repository2.unified.VersionSummary; import org.pentaho.platform.api.repository2.unified.data.node.DataNode; import org.pentaho.platform.api.repository2.unified.data.node.DataNode.DataPropertyType; import org.pentaho.platform.api.repository2.unified.data.node.NodeRepositoryFileData; import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData; import org.pentaho.platform.repository2.ClientRepositoryPaths; import org.pentaho.platform.repository2.unified.DefaultUnifiedRepositoryBase; import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryDumpToFile; import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryFileUtils; import org.pentaho.platform.repository2.unified.jcr.JcrRepositoryDumpToFile.Mode; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.Endpoint; import javax.xml.ws.Service; import javax.xml.ws.soap.SOAPBinding; import java.io.ByteArrayInputStream; import java.io.Serializable; import java.net.URL; import java.util.Arrays; import java.util.EnumSet; import java.util.List; import static org.junit.Assert.*; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests marshalling, unmarshalling, and {@code UnifiedRepositoryToWebServiceAdapter}. Do not test unified * repository logic in this class; just make sure args serialize back and forth correctly and that the adapter is * translating to the right calls. * * @author mlowery */ @RunWith( SpringJUnit4ClassRunner.class ) @SuppressWarnings( "nls" ) public class DefaultUnifiedRepositoryJaxwsWebServiceIT extends DefaultUnifiedRepositoryBase { // ~ Static fields/initializers // ====================================================================================== private final Logger logger = Logger.getLogger( DefaultUnifiedRepositoryJaxwsWebServiceIT.class ); // ~ Instance fields // ================================================================================================= // ~ Constructors // ==================================================================================================== public DefaultUnifiedRepositoryJaxwsWebServiceIT() throws Exception { super(); } @Before public void setUp() throws Exception { super.setUp(); IRepositoryVersionManager mockRepositoryVersionManager = mock( IRepositoryVersionManager.class ); when( mockRepositoryVersionManager.isVersioningEnabled( anyString() ) ).thenReturn( true ); when( mockRepositoryVersionManager.isVersionCommentEnabled( anyString() ) ).thenReturn( false ); JcrRepositoryFileUtils.setRepositoryVersionManager( mockRepositoryVersionManager ); SecurityContextHolder.setStrategyName( SecurityContextHolder.MODE_GLOBAL ); String address = "http://localhost:9000/repo"; Endpoint.publish( address, new DefaultUnifiedRepositoryJaxwsWebService( repo ) ); Service service = Service.create( new URL( "http://localhost:9000/repo?wsdl" ), new QName( "http://www.pentaho.org/ws/1.0", "unifiedRepository" ) ); IUnifiedRepositoryJaxwsWebService repoWebService = service.getPort( IUnifiedRepositoryJaxwsWebService.class ); // accept cookies to maintain session on server ( (BindingProvider) repoWebService ).getRequestContext().put( BindingProvider.SESSION_MAINTAIN_PROPERTY, true ); // support streaming binary data ( (BindingProvider) repoWebService ).getRequestContext().put( JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192 ); SOAPBinding binding = (SOAPBinding) ( (BindingProvider) repoWebService ).getBinding(); binding.setMTOMEnabled( true ); repo = new UnifiedRepositoryToWebServiceAdapter( repoWebService ); } @Test public void testDummy() { } @Test public void testEverything() throws Exception { login( sysAdminUserName, systemTenant, new String[] { tenantAdminRoleName, tenantAuthenticatedRoleName } ); ITenant tenantAcme = tenantManager.createTenant( systemTenant, TENANT_ID_ACME, tenantAdminRoleName, tenantAuthenticatedRoleName, ANONYMOUS_ROLE_NAME ); userRoleDao.createUser( tenantAcme, USERNAME_SUZY, PASSWORD, "", new String[]{tenantAdminRoleName} ); logout(); login( USERNAME_SUZY, tenantAcme, new String[]{tenantAdminRoleName, tenantAuthenticatedRoleName} ); logger.info( "getFile" ); JcrRepositoryDumpToFile dumpToFile = new JcrRepositoryDumpToFile( testJcrTemplate, jcrTransactionTemplate, repositoryAdminUsername, "c:/build/testrepo_9", Mode.CUSTOM ); dumpToFile.execute(); RepositoryFile f = repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) ); assertNotNull( f.getId() ); assertEquals( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ), f.getPath() ); assertNotNull( f.getCreatedDate() ); assertEquals( USERNAME_SUZY, f.getName() ); assertTrue( f.isFolder() ); logger.info( "getFileById" ); assertNotNull( repo.getFileById( f.getId() ) ); logger.info( "createFolder" ); RepositoryFile folder1 = repo.createFolder( f.getId(), new RepositoryFile.Builder( "folder1" ).folder( true ).build(), null ); assertNotNull( folder1 ); assertEquals( "folder1", folder1.getName() ); assertNotNull( folder1.getId() ); NodeRepositoryFileData data = makeNodeRepositoryFileData1(); logger.info( "createFile" ); RepositoryFile file1 = repo.createFile( folder1.getId(), new RepositoryFile.Builder( "file1.whatever" ).versioned( true ).build(), data, null ); assertNotNull( file1 ); assertNotNull( file1.getId() ); logger.info( "getDataForRead" ); NodeRepositoryFileData file1Data = repo.getDataForRead( file1.getId(), NodeRepositoryFileData.class ); assertNotNull( file1Data ); assertEquals( "testNode", file1Data.getNode().getName() ); assertEquals( "hello world", file1Data.getNode().getProperty( "prop1" ).getString() ); assertEquals( false, file1Data.getNode().getProperty( "prop2" ).getBoolean() ); assertEquals( DataPropertyType.BOOLEAN, file1Data.getNode().getProperty( "prop2" ).getType() ); assertEquals( 12L, file1Data.getNode().getProperty( "prop3" ).getLong() ); logger.info( "createFile (binary)" ); SimpleRepositoryFileData simpleData = new SimpleRepositoryFileData( new ByteArrayInputStream( "Hello World!".getBytes( "UTF-8" ) ), "UTF-8", "text/plain" ); RepositoryFile simpleFile = repo.createFile( folder1.getId(), new RepositoryFile.Builder( "file2.whatever" ).versioned( true ).build(), simpleData, null ); Serializable simpleVersion = simpleFile.getVersionId(); logger.info( "getDataForRead (binary)" ); SimpleRepositoryFileData simpleFileData = repo.getDataForRead( simpleFile.getId(), SimpleRepositoryFileData.class ); assertNotNull( simpleFileData ); assertEquals( "Hello World!", IOUtils.toString( simpleFileData.getInputStream(), simpleFileData.getEncoding() ) ); assertEquals( "text/plain", simpleFileData.getMimeType() ); assertEquals( "UTF-8", simpleFileData.getEncoding() ); logger.info( "updateFile (binary)" ); simpleData = new SimpleRepositoryFileData( new ByteArrayInputStream( "Ciao World!".getBytes( "UTF-8" ) ), "UTF-8", "text/plain" ); simpleFile = repo.updateFile( simpleFile, simpleData, null ); assertNotNull( simpleFile.getLastModifiedDate() ); logger.info( "getDataForRead (binary)" ); simpleFileData = repo.getDataForRead( simpleFile.getId(), SimpleRepositoryFileData.class ); assertNotNull( simpleFileData ); assertEquals( "Ciao World!", IOUtils.toString( simpleFileData.getInputStream(), simpleFileData.getEncoding() ) ); logger.info( "getDataForReadAtVersion (binary)" ); simpleFileData = repo.getDataAtVersionForRead( simpleFile.getId(), simpleVersion, SimpleRepositoryFileData.class ); assertNotNull( simpleFileData ); assertEquals( "Hello World!", IOUtils.toString( simpleFileData.getInputStream(), simpleFileData.getEncoding() ) ); logger.info( "getChildren" ); List<RepositoryFile> folder1Children = repo.getChildren( new RepositoryRequest( String.valueOf( folder1.getId() ), true, -1, null ) ); assertNotNull( folder1Children ); assertEquals( 2, folder1Children.size() ); logger.info( "getChildren" ); List<RepositoryFile> folder1ChildrenFiltered = repo.getChildren( new RepositoryRequest( String.valueOf( folder1.getId() ), true, -1, "*.sample" ) ); assertNotNull( folder1ChildrenFiltered ); assertEquals( 0, folder1ChildrenFiltered.size() ); logger.info( "getDeletedFiles" ); assertEquals( 0, repo.getDeletedFiles().size() ); logger.info( "deleteFile" ); repo.deleteFile( file1.getId(), null ); logger.info( "getDeletedFiles" ); assertEquals( 0, repo.getDeletedFiles( folder1.getPath(), "*.sample" ).size() ); logger.info( "hasAccess" ); assertFalse( repo.hasAccess( "/pentaho", EnumSet.of( RepositoryFilePermission.WRITE ) ) ); logger.info( "getEffectiveAces" ); List<RepositoryFileAce> folder1EffectiveAces = repo.getEffectiveAces( folder1.getId() ); assertEquals( 1, folder1EffectiveAces.size() ); logger.info( "getAcl" ); RepositoryFileAcl folder1Acl = repo.getAcl( folder1.getId() ); assertEquals( USERNAME_SUZY, folder1Acl.getOwner().getName() ); logger.info( "updateAcl" ); userRoleDao.createUser( tenantAcme, USERNAME_TIFFANY, PASSWORD, "", null ); RepositoryFileAcl updatedFolder1Acl = repo.updateAcl( new RepositoryFileAcl.Builder( folder1Acl ).entriesInheriting( false ).ace( userNameUtils.getPrincipleId( tenantAcme, USERNAME_TIFFANY ), RepositoryFileSid.Type.USER, RepositoryFilePermission.ALL ).build() ); assertNotNull( updatedFolder1Acl ); assertEquals( 1, updatedFolder1Acl.getAces().size() ); logger.info( "lockFile" ); assertFalse( file1.isLocked() ); repo.lockFile( file1.getId(), "I locked this file" ); logger.info( "canUnlockFile" ); assertTrue( repo.canUnlockFile( file1.getId() ) ); logger.info( "unlockFile" ); repo.unlockFile( file1.getId() ); logger.info( "moveFile" ); repo.moveFile( file1.getId(), ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + "/folder1", null ); logger.info( "copyFile" ); repo.copyFile( file1.getId(), ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + "/folder1/fileB.whatever", null ); RepositoryFile copiedFile = repo.getFile( ClientRepositoryPaths.getUserHomeFolderPath( USERNAME_SUZY ) + "/folder1/fileB.whatever" ); copiedFile = repo.updateFile( copiedFile, data, null ); logger.info( "getVersionSummaries" ); List<VersionSummary> versionSummaries = repo.getVersionSummaries( file1.getId() ); assertNotNull( versionSummaries ); // copy doesn't increase version number assertTrue( versionSummaries.size() >= 1 ); assertEquals( USERNAME_SUZY, versionSummaries.get( 0 ).getAuthor() ); logger.info( "getVersionSummary" ); VersionSummary versionSummary = repo.getVersionSummary( file1.getId(), null ); assertNotNull( versionSummary ); assertNotNull( versionSummary.getId() ); logger.info( "getFileAtVersion" ); RepositoryFile file1AtVersion = repo.getFileAtVersion( file1.getId(), versionSummary.getId() ); assertNotNull( file1AtVersion ); assertEquals( versionSummary.getId(), file1AtVersion.getVersionId() ); logger.info( "getTree" ); RepositoryFileTree tree = repo.getTree( new RepositoryRequest( ClientRepositoryPaths.getRootFolderPath(), true, -1, null ) ); assertNotNull( tree.getFile().getId() ); logger.info( "getDataForReadInBatch" ); List<NodeRepositoryFileData> result = repo.getDataForReadInBatch( Arrays.asList( file1, copiedFile ), NodeRepositoryFileData.class ); assertEquals( 2, result.size() ); logger.info( "getVersionSummaryInBatch" ); List<VersionSummary> vResult = repo.getVersionSummaryInBatch( Arrays.asList( file1, simpleFile ) ); assertEquals( 2, vResult.size() ); logger.info( "getReservedChars" ); assertFalse( repo.getReservedChars().isEmpty() ); } private NodeRepositoryFileData makeNodeRepositoryFileData1() { DataNode node = new DataNode( "testNode" ); node.setProperty( "prop1", "hello world" ); node.setProperty( "prop2", false ); node.setProperty( "prop3", 12L ); return new NodeRepositoryFileData( node ); } }