/*! ******************************************************************************
*
* 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.xslt;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.vfs2.FileObject;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.trans.step.BaseStepData;
import org.pentaho.di.trans.step.StepDataInterface;
/**
* @author Samatar
* @since 24-jan-2005
*
*/
public class XsltData extends BaseStepData implements StepDataInterface {
public RowMetaInterface outputRowMeta;
public int fieldposition;
public int fielxslfiledposition;
public String xslfilename;
public int[] fields_used;
public TransformerFactory factory;
public HashMap<String, Transformer> transformers;
public int nrParams;
public int[] indexOfParams;
public String[] nameOfParams;
public boolean useParameters;
public Properties outputProperties;
public boolean setOutputProperties;
public boolean xslIsAfile;
public XsltData() {
super();
fieldposition = -1;
fielxslfiledposition = -1;
xslfilename = null;
transformers = new HashMap<String, Transformer>();
useParameters = false;
nrParams = 0;
setOutputProperties = false;
}
public Transformer getTemplate( String xslFilename, boolean isAfile ) throws Exception {
Transformer template = transformers.get( xslFilename );
if ( template != null ) {
template.clearParameters();
return template;
}
return createNewTemplate( xslFilename, isAfile );
}
private Transformer createNewTemplate( String xslSource, boolean isAfile ) throws Exception {
FileObject file = null;
InputStream xslInputStream = null;
Transformer transformer = null;
try {
if ( isAfile ) {
file = KettleVFS.getFileObject( xslSource );
xslInputStream = KettleVFS.getInputStream( file );
} else {
xslInputStream = new ByteArrayInputStream( xslSource.getBytes( "UTF-8" ) );
}
// Use the factory to create a template containing the xsl source
transformer = factory.newTransformer( new StreamSource( xslInputStream ) );
// Add transformer to cache
transformers.put( xslSource, transformer );
return transformer;
} finally {
try {
if ( file != null ) {
file.close();
}
if ( xslInputStream != null ) {
xslInputStream.close();
}
} catch ( Exception e ) { /* Ignore */
}
}
}
public void dispose() {
transformers = null;
factory = null;
outputRowMeta = null;
outputProperties = null;
}
}