/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2015 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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.trans.steps.xsdvalidator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.vfs2.FileObject;
import org.apache.poi.util.IOUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.RowMetaAndData;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.TransTestFactory;
public class XsdValidatorIntTest {
private static final String RAMDIR = "ram://" + XsdValidatorIntTest.class.getSimpleName();
private static final String TEST_FILES_DIR = "testfiles/xsdvalidator/";
private static FileObject schemaRamFile = null;
private static FileObject dataRamFile = null;
@BeforeClass
public static void setUpBeforeClass() throws KettleException {
KettleEnvironment.init( false );
}
@AfterClass
public static void tearDownAfterClass() {
try {
if ( schemaRamFile != null && schemaRamFile.exists() ) {
schemaRamFile.delete();
}
if ( dataRamFile != null && dataRamFile.exists() ) {
dataRamFile.delete();
}
} catch ( Exception ignore ) {
// Ignore
}
}
@Test
public void testVfsInputFiles() throws Exception {
testVfsFileTypes( getDataRamFile().getURL().toString(), getSchemaRamFile().getURL().toString(), true );
testVfsFileTypes( getDataRamFile().getURL().toString(), getSchemaFileUrl(), true );
testVfsFileTypes( getDataFileUrl(), getSchemaRamFile().getURL().toString(), true );
testVfsFileTypes( getDataFileUrl(), getSchemaFileUrl(), true );
}
private FileObject getSchemaRamFile() throws Exception {
if ( schemaRamFile != null && schemaRamFile.exists() && schemaRamFile.getContent().getSize() > 0 ) {
return schemaRamFile;
}
schemaRamFile = loadRamFile( "schema.xsd" );
return schemaRamFile;
}
private FileObject getDataRamFile() throws Exception {
if ( dataRamFile != null && dataRamFile.exists() && dataRamFile.getContent().getSize() > 0 ) {
return dataRamFile;
}
dataRamFile = loadRamFile( "data.xml" );
return dataRamFile;
}
private String getFileUrl( String filename ) throws Exception {
File file = new File( TEST_FILES_DIR + filename );
return file.toURI().toURL().toExternalForm();
}
private InputStream getFileInputStream( String filename ) throws Exception {
File file = new File( TEST_FILES_DIR + filename );
return new FileInputStream( file );
}
private String getSchemaFileUrl() throws Exception {
return getFileUrl( "schema.xsd" );
}
private String getDataFileUrl() throws Exception {
return getFileUrl( "data.xml" );
}
private FileObject loadRamFile( String filename ) throws Exception {
String targetUrl = RAMDIR + "/" + filename;
try (InputStream source = getFileInputStream( filename )) {
FileObject fileObject = KettleVFS.getFileObject( targetUrl );
try (OutputStream targetStream = fileObject.getContent().getOutputStream()) {
IOUtils.copy( source, targetStream );
}
return fileObject;
}
}
private void testVfsFileTypes( String dataFilename, String schemaFilename, boolean expected ) throws Exception {
assertNotNull( dataFilename );
assertNotNull( schemaFilename );
assertTrue( KettleVFS.getFileObject( dataFilename ).exists() );
assertTrue( KettleVFS.getFileObject( schemaFilename ).exists() );
RowMetaInterface inputRowMeta = new RowMeta();
inputRowMeta.addValueMeta( new ValueMetaString( "DataFile" ) );
inputRowMeta.addValueMeta( new ValueMetaString( "SchemaFile" ) );
List<RowMetaAndData> inputData = new ArrayList<RowMetaAndData>();
inputData.add( new RowMetaAndData( inputRowMeta, new Object[] { dataFilename, schemaFilename } ) );
String stepName = "XSD Validator";
XsdValidatorMeta meta = new XsdValidatorMeta();
meta.setDefault();
meta.setXMLSourceFile( true );
meta.setXMLStream( "DataFile" );
meta.setXSDSource( meta.SPECIFY_FIELDNAME );
meta.setXSDDefinedField( "SchemaFile" );
TransMeta transMeta = TransTestFactory.generateTestTransformation( null, meta, stepName );
List<RowMetaAndData> result = null;
result =
TransTestFactory.executeTestTransformation( transMeta, TransTestFactory.INJECTOR_STEPNAME, stepName,
TransTestFactory.DUMMY_STEPNAME, inputData );
assertNotNull( result );
assertEquals( 1, result.size() );
// Check Metadata
assertEquals( ValueMetaInterface.TYPE_STRING, result.get( 0 ).getValueMeta( 0 ).getType() );
assertEquals( ValueMetaInterface.TYPE_STRING, result.get( 0 ).getValueMeta( 1 ).getType() );
assertEquals( ValueMetaInterface.TYPE_BOOLEAN, result.get( 0 ).getValueMeta( 2 ).getType() );
assertEquals( "DataFile", result.get( 0 ).getValueMeta( 0 ).getName() );
assertEquals( "SchemaFile", result.get( 0 ).getValueMeta( 1 ).getName() );
assertEquals( "result", result.get( 0 ).getValueMeta( 2 ).getName() );
// Check result
assertEquals( dataFilename, result.get( 0 ).getString( 0, "default" ) );
assertEquals( schemaFilename, result.get( 0 ).getString( 1, "default" ) );
assertEquals( expected, result.get( 0 ).getBoolean( 2, !expected ) );
}
}