[logback-dev] svn commit: r1826 - in logback/trunk/logback-core/src: main/java/ch/qos/logback/core main/java/ch/qos/logback/core/util test/java/ch/qos/logback/core/appender test/java/ch/qos/logback/core/util
noreply.ceki at qos.ch
noreply.ceki at qos.ch
Wed Oct 8 22:38:22 CEST 2008
Author: ceki
Date: Wed Oct 8 22:38:22 2008
New Revision: 1826
Added:
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/FileUtil.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/FileUtilTest.java
Modified:
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java
Log:
LBCORE-42
FileAppender will now automatically create parent directories as needed.
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java Wed Oct 8 22:38:22 2008
@@ -10,11 +10,13 @@
package ch.qos.logback.core;
import java.io.BufferedWriter;
+import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import ch.qos.logback.core.status.ErrorStatus;
import ch.qos.logback.core.status.InfoStatus;
+import ch.qos.logback.core.util.FileUtil;
/**
* FileAppender appends log events to a file.
@@ -79,7 +81,7 @@
/**
* If the value of <b>File</b> is not <code>null</code>, then
- * {@link #setFile} is called with the values of <b>File</b> and <b>Append</b>
+ * {@link #openFile} is called with the values of <b>File</b> and <b>Append</b>
* properties.
*/
public void start() {
@@ -96,7 +98,7 @@
this));
}
try {
- setFile();
+ openFile();
} catch (java.io.IOException e) {
errors++;
@@ -136,11 +138,18 @@
* @throws IOException
*
*/
- public synchronized void setFile() throws IOException {
+ public synchronized void openFile() throws IOException {
closeWriter();
+ File file = new File(fileName);
+ if(FileUtil.mustCreateParentDirectories(file)) {
+ boolean result = FileUtil.createMissingParentDirectories(file);
+ if(!result) {
+ addError("Failed to create parent directories for ["+file.getAbsolutePath()+"]");
+ }
+ }
+
this.writer = createWriter(new FileOutputStream(fileName, append));
-
if (bufferedIO) {
this.writer = new BufferedWriter(this.writer, bufferSize);
}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/FileUtil.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/FileUtil.java Wed Oct 8 22:38:22 2008
@@ -0,0 +1,36 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.util;
+
+import java.io.File;
+
+public class FileUtil {
+
+
+ public static boolean mustCreateParentDirectories(File file) {
+ File parent = file.getParentFile();
+ if(parent != null && !parent.exists()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public static boolean createMissingParentDirectories(File file) {
+ File parent = file.getParentFile();
+ if(parent == null || parent.exists()) {
+ throw new IllegalStateException(file + " should not have a null parent");
+ }
+ if(parent.exists()) {
+ throw new IllegalStateException(file + " should not have existing parent directory");
+ }
+ return parent.mkdirs();
+ }
+}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java Wed Oct 8 22:38:22 2008
@@ -9,11 +9,16 @@
*/
package ch.qos.logback.core.appender;
+import java.io.File;
+import java.util.Random;
+
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.layout.DummyLayout;
import ch.qos.logback.core.layout.NopLayout;
+import ch.qos.logback.core.util.Constants;
+import ch.qos.logback.core.util.FileUtil;
public class FileAppenderTest extends AbstractAppenderTest {
@@ -45,14 +50,43 @@
}
public void test() {
+ String filename = Constants.OUTPUT_DIR_PREFIX+"temp.log";
+
FileAppender<Object> appender = new FileAppender<Object>();
appender.setLayout(new DummyLayout<Object>());
appender.setAppend(false);
- appender.setFile("temp.log");
+ appender.setFile(filename);
appender.setName("temp.log");
appender.setContext(new ContextBase());
appender.start();
appender.doAppend(new Object());
+ appender.stop();
+
+ File file = new File(filename);
+ assertTrue(file.exists());
+ assertTrue("failed to delete "+file.getAbsolutePath(), file.delete());
+ }
+
+ public void testCreateParentFolders() {
+ int diff = new Random().nextInt(100);
+ String filename = Constants.OUTPUT_DIR_PREFIX+"/fat"+diff+"/testing.txt";
+ File file = new File(filename);
+ FileAppender<Object> appender = new FileAppender<Object>();
+ appender.setLayout(new DummyLayout<Object>());
+ appender.setAppend(false);
+ appender.setFile(filename);
+ appender.setName("testCreateParentFolders");
+ appender.setContext(new ContextBase());
+ appender.start();
+ appender.doAppend(new Object());
+ appender.stop();
+ assertFalse(FileUtil.mustCreateParentDirectories(file));
+ assertTrue(file.exists());
+
+ // cleanup
+ assertTrue("failed to delete "+file.getAbsolutePath(), file.delete());
+ File parent = file.getParentFile();
+ assertTrue("failed to delete "+parent.getAbsolutePath(), parent.delete());
}
}
Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/FileUtilTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/FileUtilTest.java Wed Oct 8 22:38:22 2008
@@ -0,0 +1,68 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.util;
+
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class FileUtilTest {
+
+ List<File> cleanupList = new ArrayList<File>();
+
+ @Before
+ public void setUp() throws Exception {
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ for(File f: cleanupList) {
+ f.delete();
+ }
+ }
+
+
+ @Test
+ public void smoke() {
+ int diff = new Random().nextInt(100);
+ File file = new File(Constants.OUTPUT_DIR_PREFIX+"/fu"+diff+"/testing.txt");
+ // these will be deleted later
+ cleanupList.add(file);
+ cleanupList.add(file.getParentFile());
+
+ assertTrue(FileUtil.mustCreateParentDirectories(file));
+ assertTrue(FileUtil.createMissingParentDirectories(file));
+ assertFalse(FileUtil.mustCreateParentDirectories(file));
+ }
+
+ @Test
+ public void smokeII() {
+ int diff = new Random().nextInt(100);
+ File file = new File(Constants.OUTPUT_DIR_PREFIX+"/fu"+diff+"/bla/testing.txt");
+ // these will be deleted later
+ cleanupList.add(file);
+ cleanupList.add(file.getParentFile());
+ cleanupList.add(file.getParentFile().getParentFile());
+
+ assertTrue(FileUtil.mustCreateParentDirectories(file));
+ assertTrue(FileUtil.createMissingParentDirectories(file));
+ assertFalse(FileUtil.mustCreateParentDirectories(file));
+ }
+}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java Wed Oct 8 22:38:22 2008
@@ -9,6 +9,7 @@
*/
package ch.qos.logback.core.util;
+import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -20,6 +21,7 @@
TestSuite suite = new TestSuite();
suite.addTestSuite(DurationTest.class);
suite.addTestSuite(FileSizeTest.class);
+ suite.addTest(new JUnit4TestAdapter(FileUtilTest.class));
suite.addTestSuite(OptionHelperTest.class);
suite.addTestSuite(StatusPrinterTest.class);
suite.addTestSuite(TimeUtilTest.class);
More information about the logback-dev
mailing list