Java tutorial
/*! ****************************************************************************** * * 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.vfs.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(); } }