From 0e7ebf605d29829a9065af65932492d5fd2608b2 Mon Sep 17 00:00:00 2001
From: Jan-Pascal van Best <janpascal@vanbest.org>
Date: Thu, 26 Apr 2012 22:19:57 +0200
Subject: [PATCH] using log4j for Main and TvGids classes

---
 pom.xml                                       | 42 ++++++++++++++-
 .../org/vanbest/xmltv/AbstractEPGSource.java  |  2 +-
 src/main/java/org/vanbest/xmltv/Main.java     | 44 ++++++++--------
 src/main/java/org/vanbest/xmltv/RTL.java      |  4 --
 src/main/java/org/vanbest/xmltv/TvGids.java   | 52 ++++++++-----------
 src/main/resources/log4j.properties           | 25 +++++++++
 6 files changed, 111 insertions(+), 58 deletions(-)
 create mode 100644 src/main/resources/log4j.properties

diff --git a/pom.xml b/pom.xml
index 54d465f..8cbc3f4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,11 @@
 			<artifactId>hsqldb</artifactId>
 			<version>2.2.8</version>
 		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>1.2.16</version>
+		</dependency>
 	</dependencies>
 	<build>
 		<plugins>
@@ -95,7 +100,42 @@
       </resources>
             <filters>
       <filter>${basedir}/target/filter.properties</filter>
-    </filters> 
+    </filters>
+            <pluginManagement>
+            	<plugins>
+            		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+            		<plugin>
+            			<groupId>org.eclipse.m2e</groupId>
+            			<artifactId>lifecycle-mapping</artifactId>
+            			<version>1.0.0</version>
+            			<configuration>
+            				<lifecycleMappingMetadata>
+            					<pluginExecutions>
+            						<pluginExecution>
+            							<pluginExecutionFilter>
+            								<groupId>
+            									org.apache.maven.plugins
+            								</groupId>
+            								<artifactId>
+            									maven-antrun-plugin
+            								</artifactId>
+            								<versionRange>
+            									[1.3,)
+            								</versionRange>
+            								<goals>
+            									<goal>run</goal>
+            								</goals>
+            							</pluginExecutionFilter>
+            							<action>
+            								<ignore></ignore>
+            							</action>
+            						</pluginExecution>
+            					</pluginExecutions>
+            				</lifecycleMappingMetadata>
+            			</configuration>
+            		</plugin>
+            	</plugins>
+            </pluginManagement>
 	</build>
 
 </project>
diff --git a/src/main/java/org/vanbest/xmltv/AbstractEPGSource.java b/src/main/java/org/vanbest/xmltv/AbstractEPGSource.java
index 57769ac..c92afb7 100644
--- a/src/main/java/org/vanbest/xmltv/AbstractEPGSource.java
+++ b/src/main/java/org/vanbest/xmltv/AbstractEPGSource.java
@@ -47,7 +47,7 @@ public abstract class AbstractEPGSource implements EPGSource {
 	}
 
 	@Override
-	public void close() throws FileNotFoundException, IOException {
+	public void close() {
 		cache.close();
 	}
 
diff --git a/src/main/java/org/vanbest/xmltv/Main.java b/src/main/java/org/vanbest/xmltv/Main.java
index 60c0d25..6432b0f 100644
--- a/src/main/java/org/vanbest/xmltv/Main.java
+++ b/src/main/java/org/vanbest/xmltv/Main.java
@@ -47,6 +47,10 @@ import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.Parser;
 import org.apache.commons.io.FileUtils;
 
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
 public class Main {
 	private File configFile;
 	private Config config;
@@ -54,6 +58,8 @@ public class Main {
 	private int days = 5;
 	private int offset = 0;
 	private boolean clearCache = false;
+	
+	static Logger logger = Logger.getLogger(Main.class);
 	/**
 	 * @param args
 	 */
@@ -61,23 +67,24 @@ public class Main {
 	public Main() {
 		this.configFile = defaultConfigFile();
 		this.outputWriter = System.out;
+		//PropertyConfigurator.configure(args[0]);
 	}
 
 	public void showHeader() {
-		System.out.println("tv_grab_nl_java version "+config.project_version + " (built "+config.build_time+")");
-		System.out.println("Copyright (C) 2012 Jan-Pascal van Best <janpascal@vanbest.org>");
-		System.out.println("tv_grab_nl_java comes with ABSOLUTELY NO WARRANTY. It is free software, and you are welcome to redistribute it");
-		System.out.println("under certain conditions; `tv_grab_nl_java --license' for details.");
+		logger.info("tv_grab_nl_java version "+config.project_version + " (built "+config.build_time+")");
+		logger.info("Copyright (C) 2012 Jan-Pascal van Best <janpascal@vanbest.org>");
+		logger.info("tv_grab_nl_java comes with ABSOLUTELY NO WARRANTY. It is free software, and you are welcome to redistribute it");
+		logger.info("under certain conditions; `tv_grab_nl_java --license' for details.");
 	}
 	
 	public void run() throws FactoryConfigurationError, Exception {
 		if (!config.quiet) {
 			showHeader();
-			System.out.println("Fetching programme data for " + this.days + " days starting from day " + this.offset);
+			logger.info("Fetching programme data for " + this.days + " days starting from day " + this.offset);
 			int enabledCount = 0;
 			for(Channel c: config.channels) { if (c.enabled) enabledCount++; } 
-			System.out.println("... from " + enabledCount + " channels");
-			System.out.println("... using cache at " + config.cacheDbHandle);
+			logger.info("... from " + enabledCount + " channels");
+			logger.info("... using cache at " + config.cacheDbHandle);
 		}
 		if (clearCache) {
 			ProgrammeCache cache = new ProgrammeCache(config);
@@ -123,16 +130,8 @@ public class Main {
 		writer.flush();
 		writer.close();
 		
-		try {
-			for(int source: guides.keySet()) {
-				guides.get(source).close();
-			}
-		} catch (FileNotFoundException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+		for(int source: guides.keySet()) {
+			guides.get(source).close();
 		}
 
 		if (!config.quiet) {
@@ -143,9 +142,9 @@ public class Main {
 				stats.cacheMisses += part.cacheMisses;
 				stats.fetchErrors += part.fetchErrors;
 			}
-			System.out.println("Number of programmes from cache: " + stats.cacheHits);
-			System.out.println("Number of programmes fetched: " + stats.cacheMisses);
-			System.out.println("Number of fetch errors: " + stats.fetchErrors);
+			logger.info("Number of programmes from cache: " + stats.cacheHits);
+			logger.info("Number of programmes fetched: " + stats.cacheMisses);
+			logger.warn("Number of fetch errors: " + stats.fetchErrors);
 		}
 	}
 	
@@ -263,7 +262,7 @@ public class Main {
 		config.setChannels(channels);
 		try {
 			config.writeConfig(configFile);
-			System.out.println("Configuration file written to " + configFile.getPath());
+			logger.info("Configuration file written to " + configFile.getPath());
 		} catch (FileNotFoundException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -393,6 +392,9 @@ public class Main {
 		if (line.hasOption("log-level")) {
 			config.logLevel = Integer.parseInt(line.getOptionValue("log-level"));
 			if (config.quiet) config.logLevel = 0;
+                        // TODO: make distinction between levels for console and
+                        // file appenders
+                        logger.getRootLogger().setLevel(Level.toLevel(config.logLevel, Level.INFO));
 		}
 		if (line.hasOption("cache")) {
 			config.setCacheFile(line.getOptionValue("cache"));
diff --git a/src/main/java/org/vanbest/xmltv/RTL.java b/src/main/java/org/vanbest/xmltv/RTL.java
index e227be1..ddd9c28 100644
--- a/src/main/java/org/vanbest/xmltv/RTL.java
+++ b/src/main/java/org/vanbest/xmltv/RTL.java
@@ -373,10 +373,6 @@ public class RTL extends AbstractEPGSource implements EPGSource  {
 		return result;
 	}
 
-	public void close() throws FileNotFoundException, IOException {
-		super.close();
-	}
-
 	// Assumption: programmes are more-or-less in ascending order by start time
 	private Date parseTime(String time, DateStatus status, int mode) {
 		Calendar result = Calendar.getInstance();
diff --git a/src/main/java/org/vanbest/xmltv/TvGids.java b/src/main/java/org/vanbest/xmltv/TvGids.java
index 0568413..36f2500 100644
--- a/src/main/java/org/vanbest/xmltv/TvGids.java
+++ b/src/main/java/org/vanbest/xmltv/TvGids.java
@@ -40,6 +40,7 @@ import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
 
 import net.sf.ezmorph.MorpherRegistry;
 import net.sf.ezmorph.ObjectMorpher;
@@ -60,6 +61,8 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 	private static final int MAX_DAYS_AHEAD_SUPPORTED_BY_TVGIDS = 3;
 	
 	public static String NAME="tvgids.nl";
+	
+	static Logger logger = Logger.getLogger(TvGids.class);
 
 	public TvGids(int sourceId, Config config) {
 		super(sourceId, config);
@@ -121,7 +124,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 			case '3':result.add("Afgeraden voor kinderen jonger dan 12 jaar"); break;
 			case '4':result.add("Afgeraden voor kinderen jonger dan 16 jaar"); break;
 			default: if (!config.quiet) {
-				System.out.println("Unknown kijkwijzer character: " + c + " in string " + s);
+				logger.warn("Unknown kijkwijzer character: " + c + " in string " + s);
 				}
 			}
 		}
@@ -154,7 +157,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 			e.printStackTrace();
 		}
 
-		if (config.logJSON()) System.out.println(json.toString());
+		logger.debug("tvgids channels json: " + json.toString());
 		JSONArray jsonArray = JSONArray.fromObject( json.toString() );  
 		// System.out.println( jsonArray );  
 		
@@ -174,7 +177,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 	
 	private JSONObject fetchJSON(URL url) throws Exception {
 		String json = fetchURL(url);
-		if (config.logJSON()) System.out.println(json);
+		logger.debug(json);
 		return JSONObject.fromObject( json );  
 	}
 	
@@ -262,10 +265,10 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 			//System.out.println("From cache: " + programme.getString("titel"));
 			stats.cacheHits++;
 		}
-		//System.out.println("      titel:" + programme.getString("titel"));
-		//System.out.println("datum_start:" + programme.getString("datum_start"));
-		//System.out.println("  datum_end:" + programme.getString("datum_end"));
-		//System.out.println("      genre:" + programme.getString("genre"));
+		logger.trace("      titel:" + programme.getString("titel"));
+		logger.trace("datum_start:" + programme.getString("datum_start"));
+		logger.trace("  datum_end:" + programme.getString("datum_end"));
+		logger.trace("      genre:" + programme.getString("genre"));
 		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", new Locale("nl"));
 		result.startTime = df.parse(programme.getString("datum_start"));
 		result.endTime =  df.parse(programme.getString("datum_end"));
@@ -279,9 +282,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 			// FIXME where to do this?
 			cache.put(getId(), id, result);
 		}
-		if(config.logProgrammes()) {
-			System.out.println(result.toString());
-		}
+		logger.debug(result);
 		return result;
 	}
 
@@ -289,12 +290,12 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 		try {
 			fillJSONDetails(id, result);
 		} catch (Exception e) {
-			if (!config.quiet) System.out.println("Error fetching details for programme " + result.toString() );
+			logger.warn("Error fetching details for programme " + result.toString() );
 		}
 		try {
 			fillScraperDetails(id, result);
 		} catch (Exception e) {
-			if (!config.quiet) System.out.println("Error fetching details for programme " + result.toString() );
+			logger.warn("Error fetching details for programme " + result.toString() );
 		}
 		
 		if ((result.secondaryTitles==null || result.secondaryTitles.isEmpty()) && 
@@ -302,9 +303,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 			for(Programme.Title t: result.titles) {
 				String[] parts = t.title.split("\\s*:\\s*", 2);
 				if (parts.length >= 2 && parts[0].length()>=5) {
-					if (config.logLevel >= Config.LOG_DEBUG) {
-						System.out.println("Splitting title from \"" + t.title + "\" to: \"" + parts[0].trim() + "\"; sub-title: \"" + parts[1].trim() + "\"");
-					}
+					logger.debug("Splitting title from \"" + t.title + "\" to: \"" + parts[0].trim() + "\"; sub-title: \"" + parts[1].trim() + "\"");
 					t.title = parts[0].trim();
 					result.addSecondaryTitle(parts[1].trim());
 				}
@@ -378,9 +377,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 			} else if (key.equals("zender_id")) {
 				// ignore
 			} else {
-				if (!config.quiet) {
-					System.out.println("Unknown key in tvgids.nl json details: \"" + key + "\"");
-				}
+				logger.warn("Unknown key in tvgids.nl json details: \"" + key + "\"");
 			}
 		}
 	}
@@ -393,18 +390,14 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 
 		URL url = HTMLDetailUrl(id);
 		String clob=fetchURL(url);
-		//System.out.println("clob:");
-		//System.out.println(clob);
 		Matcher m = progInfoPattern.matcher(clob);
 		if (m.find()) {
 			String progInfo = m.group();
-			//System.out.println("progInfo");
-			//System.out.println(progInfo);
 			Matcher m2 = infoLinePattern.matcher(progInfo);
 			while (m2.find()) {
-				//System.out.println("    infoLine: " + m2.group());
-				//System.out.println("         key: " + m2.group(1));
-				//System.out.println("       value: " + m2.group(2));
+				logger.trace("    infoLine: " + m2.group());
+				logger.trace("         key: " + m2.group(1));
+				logger.trace("       value: " + m2.group(2));
 				String key = m2.group(1).toLowerCase();
 				String value = m2.group(2);
 				if (key.equals("bijzonderheden")) {
@@ -425,7 +418,7 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 							if (m3.find()) {
 								result.setVideoQuality(m3.group());
 							} else {
-								if (!config.quiet) System.out.println("  Unknown value in 'bijzonderheden': " + item);
+								logger.warn("  Unknown value in 'bijzonderheden': " + item);
 							}
 						}
 					}
@@ -438,14 +431,11 @@ public class TvGids extends AbstractEPGSource implements EPGSource {
 					kijkwijzer.add(m3.group(1));
 				}
 				if (!kijkwijzer.isEmpty()) {
-					// log.debug()
-					// System.out.println("  (kijkwijzer): " + p.details.kijkwijzer);
-					// System.out.println("    kijkwijzer: " + kijkwijzer);
+					logger.debug("  (kijkwijzer): " + p.details.kijkwijzer);
+					logger.debug("    kijkwijzer: " + kijkwijzer);
 				}
 			}
 		}
-			
-//			result.details.fixup(result, config.quiet);
 	}
 
 	/**
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
new file mode 100644
index 0000000..6566302
--- /dev/null
+++ b/src/main/resources/log4j.properties
@@ -0,0 +1,25 @@
+# Set root logger level to INFO and its only appender to stdout.
+log4j.rootLogger=INFO, stdout
+
+# stdout is set to be a ConsoleAppender.
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+
+# stdout uses PatternLayout.
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+#log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
+# Only log the message itself to the console
+log4j.appender.stdout.layout.ConversionPattern=%m%n
+
+# Disabled, maybe use later
+# log4j.appender.file=org.apache.log4j.RollingFileAppender
+# log4j.appender.file.File=example.log
+# 
+# log4j.appender.file.MaxFileSize=100KB
+# # Keep two backup files
+# log4j.appender.file.MaxBackupIndex=2
+# 
+# log4j.appender.file.layout=org.apache.log4j.PatternLayout
+# log4j.appender.file.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c - %m%n
+
+# Shut up hsqldb
+log4j.logger.hsqldb.db=WARN
-- 
2.39.5