Java tutorial
/******************************************************************************* * Copyright (c) 2010, 2011 LogSaw project and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * LogSaw project committers - initial API and implementation *******************************************************************************/ package net.sf.logsaw.tests; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Locale; import java.util.TimeZone; import net.sf.logsaw.core.dialect.ILogDialect; import net.sf.logsaw.core.dialect.ILogDialectFactory; import net.sf.logsaw.core.logresource.IHasEncoding; import net.sf.logsaw.core.logresource.IHasLocale; import net.sf.logsaw.core.logresource.IHasTimeZone; import net.sf.logsaw.core.logresource.ILogResource; import net.sf.logsaw.core.logresource.ILogResourceFactory; import net.sf.logsaw.core.util.LocaleUtils; import net.sf.logsaw.index.IndexPlugin; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This is a convenience base class for test cases dealing with log resources and dialects. * * @author Philipp Nanz */ public abstract class ADialectTest { private transient Logger logger; private File logFile; private File indexFile; private ILogResource logResource; /** * Returns the dialect factory to use for testing. * @return the dialect factory to use for testing */ protected abstract ILogDialectFactory doGetLogDialectFactory(); /** * Returns the log dialect to test with. * @return the log dialect to test with */ protected final ILogDialect createLogDialect() { ILogDialectFactory factory = doGetLogDialectFactory(); Assert.isNotNull(factory, "factory"); return factory.createLogDialect(); } /** * Loads the given log file into a temporary file. * Subsequent calls to <code>getLogFile</code> will return this instance. * @param filename the file to load * @throws IOException if an error occurred */ protected final void loadLogFile(String filename) throws IOException { cleanUp(true, false); InputStream is = null; OutputStream os = null; File f = File.createTempFile("log", null); try { is = getClass().getResourceAsStream(filename); Assert.isTrue(is != null, "File not found: " + filename); os = new FileOutputStream(f); IOUtils.copy(is, os); setLogFile(f); } finally { IOUtils.closeQuietly(is); IOUtils.closeQuietly(os); } } /** * Returns the resource factory to use for testing. * @return the resource factory to use for testing */ protected abstract ILogResourceFactory doGetLogResourceFactory(); /** * Creates the log resource to work with. * Subsequent calls to <code>getLogResource</code> will return this instance. * @param encoding the file encoding * @param locale the locale to use * @param timeZone the timezone to apply * @throws IOException if an error occurred */ protected final void createLogResourceWithPK(String encoding, Locale locale, TimeZone timeZone) throws IOException { cleanUp(false, true); File logFile = getLogFile(); Assert.isNotNull(logFile, "logFile"); ILogResourceFactory factory = doGetLogResourceFactory(); Assert.isNotNull(factory, "factory"); ILogResource log = factory.createLogResource(); log.setName(getLogFile().getName()); log.setDialect(createLogDialect()); try { log.configure(IHasEncoding.OPTION_ENCODING, encoding); log.configure(IHasLocale.OPTION_LOCALE, LocaleUtils.getLocaleId(locale)); log.configure(IHasTimeZone.OPTION_TIMEZONE, timeZone.getID()); doConfigure(log); // Create PK IndexPlugin.getDefault().getIndexService().createIndex(log); // That's it setIndexFile(IndexPlugin.getDefault().getIndexFile(log)); setLogResource(log); } catch (CoreException e) { logger.error(e.getLocalizedMessage(), e); } } /** * Creates the log resource to work with. * Subsequent calls to <code>getLogResource</code> will return this instance. * @param encoding the file encoding * @param locale the locale to use * @param timeZone the timezone to apply * @throws IOException if an error occurred */ protected final void createLogResource(String encoding, Locale locale, TimeZone timeZone) throws IOException { cleanUp(false, true); File logFile = getLogFile(); Assert.isNotNull(logFile, "logFile"); ILogResourceFactory factory = doGetLogResourceFactory(); Assert.isNotNull(factory, "factory"); ILogResource log = factory.createLogResource(); log.setName(getLogFile().getName()); log.setDialect(createLogDialect()); try { log.configure(IHasEncoding.OPTION_ENCODING, encoding); log.configure(IHasLocale.OPTION_LOCALE, LocaleUtils.getLocaleId(locale)); log.configure(IHasTimeZone.OPTION_TIMEZONE, timeZone.getID()); doConfigure(log); // That's it setLogResource(log); } catch (CoreException e) { logger.error(e.getLocalizedMessage(), e); } } /** * Subclasses may override to perform necessary configuration on * newly created log resources. * @param log the log * @throws CoreException if an error occurred */ protected void doConfigure(ILogResource log) throws CoreException { // to override } /** * @return the logFile */ protected final File getLogFile() { return logFile; } /** * @param logFile the logFile to set */ protected final void setLogFile(File logFile) { this.logFile = logFile; } /** * @return the indexFile */ protected final File getIndexFile() { return indexFile; } /** * @param indexFile the indexFile to set */ protected final void setIndexFile(File indexFile) { this.indexFile = indexFile; } /** * @return the logResource */ protected final ILogResource getLogResource() { return logResource; } /** * @param logResource the logResource to set */ protected final void setLogResource(ILogResource logResource) { this.logResource = logResource; } /** * Returns the logger to use by this class. * @return the logger to use */ protected final Logger getLogger() { if (logger == null) { logger = LoggerFactory.getLogger(getClass()); } return logger; } /** * Returns the default time zone. * @return the default time zone */ protected TimeZone getTimeZone() { return TimeZone.getTimeZone("Europe/Berlin"); } /** * Removes the specified temporary files. * @param deleteLogFile * @param deleteIndexFile * @throws IOException */ protected final void cleanUp(boolean deleteLogFile, boolean deleteIndexFile) throws IOException { File logFile = getLogFile(); File indexFile = getIndexFile(); if (deleteLogFile && (logFile != null)) { assertTrue("Could not delete file", logFile.delete()); logFile = null; } if (deleteIndexFile && (indexFile != null)) { FileUtils.deleteDirectory(indexFile); indexFile = null; } } }