/*!
* Copyright 2010 - 2016 Pentaho Corporation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.pentaho.di.repository.pur;
import static org.junit.Assert.fail;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.pentaho.di.base.AbstractMeta;
import org.pentaho.di.cluster.SlaveServer;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.RepositoryDirectoryInterface;
import org.pentaho.di.repository.RepositoryObjectType;
import org.pentaho.di.shared.SharedObjectInterface;
import org.pentaho.di.trans.TransMeta;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class PurRepository_SharedObjects_Links_IT extends PurRepositoryIT {
public PurRepository_SharedObjects_Links_IT( Boolean lazyRepo ) {
super( lazyRepo );
}
private interface GenericMeta {
public AbstractMeta createFilled() throws Exception;
public void loadFromXml( Node xmlNode ) throws Exception;
public AbstractMeta createEmpty();
}
@Test
public void testReadSharedObjects_Trans() throws Exception {
testReadSharedObjects( new GenericMeta() {
private TransMeta meta;
@Override
public void loadFromXml( Node xmlNode ) throws Exception {
meta.loadXML( xmlNode, repository, true, null );
}
@Override
public AbstractMeta createFilled() throws Exception {
meta = createTransMeta( EXP_DBMETA_NAME );
return meta;
}
@Override
public AbstractMeta createEmpty() {
meta = new TransMeta();
return meta;
}
} );
}
@Test
public void testReadSharedObjects_Job() throws Exception {
testReadSharedObjects( new GenericMeta() {
private JobMeta meta;
@Override
public void loadFromXml( Node xmlNode ) throws Exception {
meta.loadXML( xmlNode, repository, null );
}
@Override
public AbstractMeta createFilled() throws Exception {
meta = createJobMeta( EXP_DBMETA_NAME );
return meta;
}
@Override
public AbstractMeta createEmpty() {
meta = new JobMeta();
return meta;
}
} );
}
@SuppressWarnings( "unchecked" )
private void testReadSharedObjects( GenericMeta gMeta ) throws Exception {
PurRepository pur = (PurRepository) repository;
RepositoryDirectoryInterface rootDir = initRepo();
SlaveServer slave1 = createSlaveServer( "slave1" );
SlaveServer slave2 = createSlaveServer( "slave2" );
pur.save( slave1, VERSION_COMMENT_V1, null );
pur.save( slave2, VERSION_COMMENT_V1, null );
AbstractMeta meta = gMeta.createFilled();
meta.getSlaveServers().add( slave1 );
meta.getSlaveServers().add( slave2 );
rootDir.findDirectory( DIR_TRANSFORMATIONS );
pur.save( meta, VERSION_COMMENT_V1, null );
String xmlText = meta.getXML();
try {
// import transformation from file
meta = gMeta.createEmpty();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse( IOUtils.toInputStream( xmlText ) );
gMeta.loadFromXml( doc.getParentNode() );
List<SharedObjectInterface> sharedObjects =
(List<SharedObjectInterface>) pur.loadAndCacheSharedObjects( false ).get( RepositoryObjectType.SLAVE_SERVER );
for ( int i = 0; i < meta.getSlaveServers().size(); i++ ) {
for ( int j = 0; j < sharedObjects.size(); j++ ) {
SlaveServer s1 = meta.getSlaveServers().get( i );
SlaveServer s2 = (SlaveServer) sharedObjects.get( j );
if ( s1 == s2 ) {
fail( "Trans/job has direct links on slave servers from cache" );
}
}
}
} finally {
pur.deleteSlave( slave1.getObjectId() );
pur.deleteSlave( slave2.getObjectId() );
pur.clearSharedObjectCache();
}
}
@Override
protected void delete( ObjectId id ) {
// do nothing
}
}