[102978] Include catalina.properties file in Tomcat 5.0 and Tomcat 5.5 configurations. Allows some configurability about how server/lib is handled. Also includes some refactoring to share code across multiple Tomcat versions.
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat32Configuration.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat32Configuration.java
index 188cc6c..b4557b5 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat32Configuration.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat32Configuration.java
@@ -215,22 +215,7 @@
 			monitor.worked(1);
 	
 			// load policy file
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(new FileInputStream(path.append("tomcat.policy").toFile())));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-				br.close();
-			} catch (Exception e) {
-				Trace.trace(Trace.SEVERE, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(new FileInputStream(path.append("tomcat.policy").toFile()));
 			monitor.worked(1);
 	
 			if (monitor.isCanceled())
@@ -279,22 +264,7 @@
 			// load tomcat.policy
 			file = folder.getFile("tomcat.policy");
 			in = file.getContents();
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(in));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-				br.close();
-			} catch (Exception e) {
-				Trace.trace(Trace.SEVERE, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(in);
 			monitor.worked(200);
 	
 			if (monitor.isCanceled())
@@ -357,6 +327,14 @@
 		}
 	}
 	
+	/**
+	 * Save the information held by this object to the given directory.
+	 * All files are forced to be saved.
+	 * 
+	 * @param path desination path for the files
+	 * @param monitor a progress monitor
+	 * @exception CoreException
+	 */
 	public void save(IPath path, IProgressMonitor monitor) throws CoreException {
 		save(path, true, monitor);
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Configuration.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Configuration.java
index 172ff40..9447103 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Configuration.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Configuration.java
@@ -175,6 +175,9 @@
 		return list;
 	}
 	
+	/**
+	 * @see org.eclipse.jst.server.tomcat.core.internal.TomcatConfiguration#importFromPath(org.eclipse.core.runtime.IPath, boolean, org.eclipse.core.runtime.IProgressMonitor)
+	 */
 	public void importFromPath(IPath path, boolean isTestEnv, IProgressMonitor monitor) throws CoreException {
 		load(path, monitor);
 		
@@ -221,21 +224,7 @@
 			monitor.worked(1);
 		
 			// load policy file
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(new FileInputStream(path.append("catalina.policy").toFile())));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(new FileInputStream(path.append("catalina.policy").toFile()));
 			monitor.worked(1);
 	
 			if (monitor.isCanceled())
@@ -283,21 +272,7 @@
 			// load catalina.policy
 			file = folder.getFile("catalina.policy");
 			in = file.getContents();
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(in));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(in);
 			monitor.worked(200);
 	
 			if (monitor.isCanceled())
@@ -362,6 +337,13 @@
 		}
 	}
 	
+	/**
+	 * Save to the given directory.  All files are forced to be saved.
+	 * 
+	 * @param path desination path for the files
+	 * @param monitor a progress monitor
+	 * @exception CoreException
+	 */
 	public void save(IPath path, IProgressMonitor monitor) throws CoreException {
 		save(path, true, monitor);
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Configuration.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Configuration.java
index 90fff44..7034ea8 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Configuration.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Configuration.java
@@ -186,6 +186,9 @@
 		return list;
 	}
 	
+	/**
+	 * @see org.eclipse.jst.server.tomcat.core.internal.TomcatConfiguration#importFromPath(org.eclipse.core.runtime.IPath, boolean, org.eclipse.core.runtime.IProgressMonitor)
+	 */
 	public void importFromPath(IPath path, boolean isTestEnv, IProgressMonitor monitor) throws CoreException {
 		load(path, monitor);
 		
@@ -232,21 +235,7 @@
 			monitor.worked(1);
 		
 			// load policy file
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(new FileInputStream(path.append("catalina.policy").toFile())));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(new FileInputStream(path.append("catalina.policy").toFile()));
 			monitor.worked(1);
 	
 			if (monitor.isCanceled())
@@ -294,21 +283,7 @@
 			// load catalina.policy
 			file = folder.getFile("catalina.policy");
 			in = file.getContents();
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(in));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(in);
 			monitor.worked(200);
 	
 			if (monitor.isCanceled())
@@ -373,6 +348,13 @@
 		}
 	}
 	
+	/**
+	 * Save to the given directory.  All files are forced to be saved.
+	 * 
+	 * @param path desination path for the files
+	 * @param monitor a progress monitor
+	 * @exception CoreException
+	 */
 	public void save(IPath path, IProgressMonitor monitor) throws CoreException {
 		save(path, true, monitor);
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Configuration.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Configuration.java
index d291af0..25f87e2 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Configuration.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Configuration.java
@@ -46,6 +46,9 @@
 	protected String policyFile;
 	protected boolean isPolicyDirty;
 
+	protected String propertiesFile;
+	protected boolean isPropertiesDirty;
+	
 	/**
 	 * Tomcat50Configuration constructor.
 	 * 
@@ -172,7 +175,7 @@
 	public void load(IPath path, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.loadingTask, 5);
+			monitor.beginTask(Messages.loadingTask, 6);
 			
 			// check for catalina.policy to verify that this is a v5.0 config
 			InputStream in = new FileInputStream(path.append("catalina.policy").toFile());
@@ -192,21 +195,15 @@
 			monitor.worked(1);
 			
 			// load policy file
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(new FileInputStream(path.append("catalina.policy").toFile())));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(new FileInputStream(path.append("catalina.policy").toFile()));
+			monitor.worked(1);
+
+			// load properties file
+			File file = path.append("catalina.properties").toFile();
+			if (file.exists())
+				propertiesFile = TomcatVersionHelper.getFileContents(new FileInputStream(file));
+			else
+				propertiesFile = null;
 			monitor.worked(1);
 			
 			if (monitor.isCanceled())
@@ -218,6 +215,9 @@
 		}
 	}
 
+	/**
+	 * @see TomcatConfiguration#importFromPath(IPath, boolean, IProgressMonitor)
+	 */
 	public void importFromPath(IPath path, boolean isTestEnv, IProgressMonitor monitor) throws CoreException {
 		load(path, monitor);
 		
@@ -244,7 +244,7 @@
 	public void load(IFolder folder, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.loadingTask, 800);
+			monitor.beginTask(Messages.loadingTask, 1000);
 	
 			// check for catalina.policy to verify that this is a v4.0 config
 			IFile file = folder.getFile("catalina.policy");
@@ -274,23 +274,19 @@
 			// load catalina.policy
 			file = folder.getFile("catalina.policy");
 			in = file.getContents();
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(in));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(in);
 			monitor.worked(200);
-	
+
+			// load catalina.properties
+			file = folder.getFile("catalina.properties");
+			if (file.exists()) {
+				in = file.getContents();
+				propertiesFile = TomcatVersionHelper.getFileContents(in);
+			}
+			else
+				propertiesFile = null;
+			monitor.worked(200);
+			
 			if (monitor.isCanceled())
 				throw new Exception("Cancelled");
 			monitor.done();
@@ -310,7 +306,7 @@
 	protected void save(IPath path, boolean forceDirty, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.savingTask, 3);
+			monitor.beginTask(Messages.savingTask, 4);
 	
 			// make sure directory exists
 			if (!path.toFile().exists()) {
@@ -340,8 +336,15 @@
 				bw.close();
 			}
 			monitor.worked(1);
+			if (propertiesFile != null && (forceDirty || isPropertiesDirty)) {
+				BufferedWriter bw = new BufferedWriter(new FileWriter(path.append("catalina.properties").toFile()));
+				bw.write(propertiesFile);
+				bw.close();
+			}
+			monitor.worked(1);
 			isServerDirty = false;
 			isPolicyDirty = false;
+			isPropertiesDirty = false;
 	
 			if (monitor.isCanceled())
 				return;
@@ -352,6 +355,13 @@
 		}
 	}
 	
+	/**
+	 * Save to the given directory.  All files are forced to be saved.
+	 * 
+	 * @param path desination path for the files
+	 * @param monitor a progress monitor
+	 * @exception CoreException
+	 */
 	public void save(IPath path, IProgressMonitor monitor) throws CoreException {
 		save(path, true, monitor);
 	}
@@ -366,7 +376,7 @@
 	public void save(IFolder folder, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.savingTask, 900);
+			monitor.beginTask(Messages.savingTask, 1100);
 	
 			// save server.xml
 			byte[] data = serverFactory.getContents();
@@ -401,7 +411,21 @@
 				//file.setContents(in, true, true, ProgressUtil.getSubMonitorFor(monitor, 200));
 			else
 				file.create(in, true, ProgressUtil.getSubMonitorFor(monitor, 200));
-	
+
+			// save catalina.properties
+			if (propertiesFile != null) {
+				in = new ByteArrayInputStream(propertiesFile.getBytes());
+				file = folder.getFile("catalina.properties");
+				if (file.exists())
+					monitor.worked(200);
+					//file.setContents(in, true, true, ProgressUtil.getSubMonitorFor(monitor, 200));
+				else
+					file.create(in, true, ProgressUtil.getSubMonitorFor(monitor, 200));
+			}
+			else {
+				monitor.worked(200);
+			}
+			
 			if (monitor.isCanceled())
 				return;
 			monitor.done();
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Configuration.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Configuration.java
index 2fa2f18..fdd26c1 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Configuration.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Configuration.java
@@ -44,6 +44,9 @@
 	protected String policyFile;
 	protected boolean isPolicyDirty;
 
+	protected String propertiesFile;
+	protected boolean isPropertiesDirty;
+	
 	/**
 	 * Tomcat55Configuration constructor.
 	 * 
@@ -170,7 +173,7 @@
 	public void load(IPath path, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.loadingTask, 5);
+			monitor.beginTask(Messages.loadingTask, 6);
 			
 			// check for catalina.policy to verify that this is a v5.5 config
 			InputStream in = new FileInputStream(path.append("catalina.policy").toFile());
@@ -190,21 +193,15 @@
 			monitor.worked(1);
 			
 			// load policy file
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(new FileInputStream(path.append("catalina.policy").toFile())));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(new FileInputStream(path.append("catalina.policy").toFile()));
+			monitor.worked(1);
+
+			// load properties file
+			File file = path.append("catalina.properties").toFile();
+			if (file.exists())
+				propertiesFile = TomcatVersionHelper.getFileContents(new FileInputStream(file));
+			else
+				propertiesFile = null;
 			monitor.worked(1);
 			
 			if (monitor.isCanceled())
@@ -216,6 +213,9 @@
 		}
 	}
 
+	/**
+	 * @see TomcatConfiguration#importFromPath(IPath, boolean, IProgressMonitor)
+	 */
 	public void importFromPath(IPath path, boolean isTestEnv, IProgressMonitor monitor) throws CoreException {
 		load(path, monitor);
 		
@@ -242,7 +242,7 @@
 	public void load(IFolder folder, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.loadingTask, 800);
+			monitor.beginTask(Messages.loadingTask, 1000);
 	
 			// check for catalina.policy to verify that this is a v4.0 config
 			IFile file = folder.getFile("catalina.policy");
@@ -272,23 +272,19 @@
 			// load catalina.policy
 			file = folder.getFile("catalina.policy");
 			in = file.getContents();
-			BufferedReader br = null;
-			try {
-				br = new BufferedReader(new InputStreamReader(in));
-				String temp = br.readLine();
-				policyFile = "";
-				while (temp != null) {
-					policyFile += temp + "\n";
-					temp = br.readLine();
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load policy file", e);
-			} finally {
-				if (br != null)
-					br.close();
-			}
+			policyFile = TomcatVersionHelper.getFileContents(in);
 			monitor.worked(200);
 	
+			// load catalina.properties
+			file = folder.getFile("catalina.properties");
+			if (file.exists()) {
+				in = file.getContents();
+				propertiesFile = TomcatVersionHelper.getFileContents(in);
+			}
+			else
+				propertiesFile = null;
+			monitor.worked(200);
+			
 			if (monitor.isCanceled())
 				throw new Exception("Cancelled");
 			monitor.done();
@@ -308,7 +304,7 @@
 	protected void save(IPath path, boolean forceDirty, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.savingTask, 3);
+			monitor.beginTask(Messages.savingTask, 4);
 	
 			// make sure directory exists
 			if (!path.toFile().exists()) {
@@ -338,8 +334,15 @@
 				bw.close();
 			}
 			monitor.worked(1);
+			if (propertiesFile != null && (forceDirty || isPropertiesDirty)) {
+				BufferedWriter bw = new BufferedWriter(new FileWriter(path.append("catalina.properties").toFile()));
+				bw.write(propertiesFile);
+				bw.close();
+			}
+			monitor.worked(1);
 			isServerDirty = false;
 			isPolicyDirty = false;
+			isPropertiesDirty = false;
 	
 			if (monitor.isCanceled())
 				return;
@@ -350,6 +353,13 @@
 		}
 	}
 	
+	/**
+	 * Save to the given directory.  All files are forced to be saved.
+	 * 
+	 * @param path desination path for the files
+	 * @param monitor a progress monitor
+	 * @exception CoreException
+	 */
 	public void save(IPath path, IProgressMonitor monitor) throws CoreException {
 		save(path, true, monitor);
 	}
@@ -364,7 +374,7 @@
 	public void save(IFolder folder, IProgressMonitor monitor) throws CoreException {
 		try {
 			monitor = ProgressUtil.getMonitorFor(monitor);
-			monitor.beginTask(Messages.savingTask, 900);
+			monitor.beginTask(Messages.savingTask, 1100);
 	
 			// save server.xml
 			byte[] data = serverFactory.getContents();
@@ -400,6 +410,20 @@
 			else
 				file.create(in, true, ProgressUtil.getSubMonitorFor(monitor, 200));
 	
+			// save catalina.properties
+			if (propertiesFile != null) {
+				in = new ByteArrayInputStream(propertiesFile.getBytes());
+				file = folder.getFile("catalina.properties");
+				if (file.exists())
+					monitor.worked(200);
+					//file.setContents(in, true, true, ProgressUtil.getSubMonitorFor(monitor, 200));
+				else
+					file.create(in, true, ProgressUtil.getSubMonitorFor(monitor, 200));
+			}
+			else {
+				monitor.worked(200);
+			}
+			
 			if (monitor.isCanceled())
 				return;
 			monitor.done();
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatVersionHelper.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatVersionHelper.java
new file mode 100644
index 0000000..3c6c8b5
--- /dev/null
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatVersionHelper.java
@@ -0,0 +1,54 @@
+/**********************************************************************
+ * Copyright (c) 2007 SAS Institute, Inc 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:
+ *    SAS Institute, Inc - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.jst.server.tomcat.core.internal;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Utility class for methods that are used by more that one version
+ * of Tomcat.  Use of these methods makes it clear that more than
+ * one version will be impacted by changes.
+ *
+ */
+public class TomcatVersionHelper {
+
+	/**
+	 * Reads the from the specified InputStream and returns
+	 * the result as a String. Each line is terminated by
+	 * "\n".  Returns whatever is read regardless
+	 * of any errors that occurs while reading.
+	 * 
+	 * @param stream InputStream for the contents to be read
+	 * @return contents read
+	 * @throws IOException if error occurs closing the stream
+	 */
+	public static String getFileContents(InputStream stream) throws IOException {
+		BufferedReader br = null;
+		StringBuffer sb = new StringBuffer();
+		try {
+			br = new BufferedReader(new InputStreamReader(stream));
+			String temp = br.readLine();
+			while (temp != null) {
+				sb.append(temp).append("\n");
+				temp = br.readLine();
+			}
+		} catch (Exception e) {
+			Trace.trace(Trace.WARNING, "Could not load file contents.", e);
+		} finally {
+			if (br != null)
+				br.close();
+		}
+		return sb.toString();
+	}
+}