/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2013 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.step.errorhandling; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.vfs2.FileObject; import org.pentaho.di.core.ResultFile; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.exception.KettleFileException; import org.pentaho.di.core.vfs.KettleVFS; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.trans.step.BaseStep; public abstract class AbstractFileErrorHandler implements FileErrorHandler { private static Class<?> PKG = AbstractFileErrorHandler.class; // for i18n purposes, needed by Translator2!! private static final String DD_MMYYYY_HHMMSS = "ddMMyyyy-HHmmss"; public static final String NO_PARTS = "NO_PARTS"; private final String destinationDirectory; private final String fileExtension; private final String encoding; private String processingFilename; private Map<Object, Writer> writers; private String dateString; private BaseStep baseStep; public AbstractFileErrorHandler( Date date, String destinationDirectory, String fileExtension, String encoding, BaseStep baseStep ) { this.destinationDirectory = destinationDirectory; this.fileExtension = fileExtension; this.encoding = encoding; this.baseStep = baseStep; this.writers = new HashMap<Object, Writer>(); initDateFormatter( date ); } private void initDateFormatter( Date date ) { dateString = createDateFormat().format( date ); } public static DateFormat createDateFormat() { return new SimpleDateFormat( DD_MMYYYY_HHMMSS ); } public static FileObject getReplayFilename( String destinationDirectory, String processingFilename, String dateString, String extension, Object source ) throws KettleFileException { String name = null; String sourceAdding = ""; if ( !NO_PARTS.equals( source ) ) { sourceAdding = "_" + source.toString(); } if ( extension == null || extension.length() == 0 ) { name = processingFilename + sourceAdding + "." + dateString; } else { name = processingFilename + sourceAdding + "." + dateString + "." + extension; } return KettleVFS.getFileObject( destinationDirectory + "/" + name ); } public static FileObject getReplayFilename( String destinationDirectory, String processingFilename, Date date, String extension, Object source ) throws KettleFileException { return getReplayFilename( destinationDirectory, processingFilename, createDateFormat().format( date ), extension, source ); } /** * returns the OutputWiter if exists. Otherwhise it will create a new one. * * @return * @throws KettleException */ Writer getWriter( Object source ) throws KettleException { try { Writer outputStreamWriter = writers.get( source ); if ( outputStreamWriter != null ) { return outputStreamWriter; } FileObject file = getReplayFilename( destinationDirectory, processingFilename, dateString, fileExtension, source ); ResultFile resultFile = new ResultFile( ResultFile.FILE_TYPE_GENERAL, file, baseStep.getTransMeta().getName(), baseStep .getStepname() ); baseStep.addResultFile( resultFile ); try { if ( encoding == null ) { outputStreamWriter = new OutputStreamWriter( KettleVFS.getOutputStream( file, false ) ); } else { outputStreamWriter = new OutputStreamWriter( KettleVFS.getOutputStream( file, false ), encoding ); } } catch ( Exception e ) { throw new KettleException( BaseMessages.getString( PKG, "AbstractFileErrorHandler.Exception.CouldNotCreateFileErrorHandlerForFile" ) + file.getName().getURI(), e ); } writers.put( source, outputStreamWriter ); return outputStreamWriter; } catch ( KettleFileException e ) { throw new KettleException( BaseMessages.getString( PKG, "AbstractFileErrorHandler.Exception.CouldNotCreateFileErrorHandlerForFile" ), e ); } } public void close() throws KettleException { for ( Iterator<Writer> iter = writers.values().iterator(); iter.hasNext(); ) { close( iter.next() ); } writers = new HashMap<Object, Writer>(); } private void close( Writer outputStreamWriter ) throws KettleException { if ( outputStreamWriter != null ) { try { outputStreamWriter.flush(); } catch ( IOException exception ) { baseStep.logError( BaseMessages.getString( PKG, "AbstractFileErrorHandler.Log.CouldNotFlushContentToFile" ), exception .getLocalizedMessage() ); } try { outputStreamWriter.close(); } catch ( IOException exception ) { throw new KettleException( BaseMessages.getString( PKG, "AbstractFileErrorHandler.Exception.CouldNotCloseFile" ), exception ); } finally { outputStreamWriter = null; } } } public void handleFile( FileObject file ) throws KettleException { close(); this.processingFilename = file.getName().getBaseName(); } }