changeset 10:086a55aa2620

PasswdUserConfig. Error logging.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 02 Nov 2009 23:17:40 +0300
parents a3321ea9b33f
children 3a71cbe721f9
files nbproject/build-impl.xml nbproject/genfiles.properties src/kryshen/catalina/startup/HomesUserConfig.java src/kryshen/catalina/startup/PasswdUserConfig.java src/kryshen/catalina/startup/UserConfig.java
diffstat 5 files changed, 159 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/nbproject/build-impl.xml	Mon Nov 02 18:36:24 2009 +0300
+++ b/nbproject/build-impl.xml	Mon Nov 02 23:17:40 2009 +0300
@@ -20,6 +20,13 @@
 
         -->
 <project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="tomcat-userconfig-impl">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
     <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
     <!-- 
                 ======================
@@ -152,10 +159,18 @@
             <attribute default="${includes}" name="includes"/>
             <attribute default="${excludes}" name="excludes"/>
             <attribute default="${javac.debug}" name="debug"/>
-            <attribute default="/does/not/exist" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
             <element name="customize" optional="true"/>
             <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
                 <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
                     <classpath>
                         <path path="@{classpath}"/>
                     </classpath>
@@ -271,6 +286,8 @@
                 <java classname="@{classname}" dir="${work.dir}" fork="true">
                     <jvmarg line="${debug-args-line}"/>
                     <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg value="-Dfile.encoding=${source.encoding}"/>
+                    <redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/>
                     <jvmarg line="${run.jvmargs}"/>
                     <classpath>
                         <path path="@{classpath}"/>
@@ -287,12 +304,15 @@
     <target name="-init-macrodef-java">
         <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
             <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.classpath}" name="classpath"/>
             <element name="customize" optional="true"/>
             <sequential>
                 <java classname="@{classname}" dir="${work.dir}" fork="true">
+                    <jvmarg value="-Dfile.encoding=${source.encoding}"/>
+                    <redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/>
                     <jvmarg line="${run.jvmargs}"/>
                     <classpath>
-                        <path path="${run.classpath}"/>
+                        <path path="@{classpath}"/>
                     </classpath>
                     <syspropertyset>
                         <propertyref prefix="run-sys-prop."/>
@@ -332,10 +352,15 @@
         <!-- You can override this target in the ../build.xml file. -->
     </target>
     <target if="do.depend.true" name="-compile-depend">
-        <j2seproject3:depend/>
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
     </target>
     <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
-        <j2seproject3:javac/>
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
         <copy todir="${build.classes.dir}">
             <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
         </copy>
@@ -352,7 +377,7 @@
     <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
         <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
         <j2seproject3:force-recompile/>
-        <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
     </target>
     <target name="-post-compile-single">
         <!-- Empty placeholder for easier customization. -->
@@ -418,11 +443,29 @@
         <property location="${dist.jar}" name="dist.jar.resolved"/>
         <echo>java -jar "${dist.jar.resolved}"</echo>
     </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="libs.CopyLibs.classpath" name="-do-jar-with-libraries-without-manifest" unless="manifest.available+main.class">
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <pathconvert property="run.classpath.without.build.classes.dir">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to=""/>
+        </pathconvert>
+        <pathconvert pathsep=" " property="jar.classpath">
+            <path path="${run.classpath.without.build.classes.dir}"/>
+            <chainedmapper>
+                <flattenmapper/>
+                <globmapper from="*" to="lib/*"/>
+            </chainedmapper>
+        </pathconvert>
+        <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+        <copylibs compress="${jar.compress}" jarfile="${dist.jar}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+            <fileset dir="${build.classes.dir}"/>
+        </copylibs>
+    </target>
     <target name="-post-jar">
         <!-- Empty placeholder for easier customization. -->
         <!-- You can override this target in the ../build.xml file. -->
     </target>
-    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-do-jar-with-libraries-without-manifest,-post-jar" description="Build JAR." name="jar"/>
     <!--
                 =================
                 EXECUTION SECTION
@@ -442,6 +485,10 @@
         <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
         <j2seproject1:java classname="${run.class}"/>
     </target>
+    <target depends="init,-do-not-recompile,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
     <!--
                 =================
                 DEBUGGING SECTION
@@ -450,6 +497,9 @@
     <target depends="init" if="netbeans.home" name="-debug-start-debugger">
         <j2seproject1:nbjpdastart name="${debug.class}"/>
     </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
     <target depends="init,compile" name="-debug-start-debuggee">
         <j2seproject3:debug>
             <customize>
@@ -467,6 +517,11 @@
         <j2seproject3:debug classname="${debug.class}"/>
     </target>
     <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
     <target depends="init" name="-pre-debug-fix">
         <fail unless="fix.includes">Must set fix.includes</fail>
         <property name="javac.includes" value="${fix.includes}.java"/>
@@ -489,6 +544,9 @@
             <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
                 <filename name="**/*.java"/>
             </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+            </fileset>
         </javadoc>
     </target>
     <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
@@ -550,7 +608,7 @@
         <j2seproject3:junit testincludes="**/*Test.java"/>
     </target>
     <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
-        <fail if="tests.failed">Some tests failed; see details above.</fail>
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
     </target>
     <target depends="init" if="have.tests" name="test-report"/>
     <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
@@ -563,7 +621,7 @@
         <j2seproject3:junit excludes="" includes="${test.includes}"/>
     </target>
     <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
-        <fail if="tests.failed">Some tests failed; see details above.</fail>
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
     </target>
     <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
     <!--
--- a/nbproject/genfiles.properties	Mon Nov 02 18:36:24 2009 +0300
+++ b/nbproject/genfiles.properties	Mon Nov 02 23:17:40 2009 +0300
@@ -4,5 +4,5 @@
 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
 nbproject/build-impl.xml.data.CRC32=8168bf3c
-nbproject/build-impl.xml.script.CRC32=22b92b6d
-nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
+nbproject/build-impl.xml.script.CRC32=92172d17
+nbproject/build-impl.xml.stylesheet.CRC32=5c621a33@1.26.2.45
--- a/src/kryshen/catalina/startup/HomesUserConfig.java	Mon Nov 02 18:36:24 2009 +0300
+++ b/src/kryshen/catalina/startup/HomesUserConfig.java	Mon Nov 02 23:17:40 2009 +0300
@@ -6,6 +6,7 @@
 package kryshen.catalina.startup;
 
 import java.io.File;
+import org.apache.juli.logging.LogFactory;
 
 /**
  *
@@ -13,26 +14,17 @@
  */
 public class HomesUserConfig extends UserConfig {
 
-    /**
-     * The directory name to be searched for within each user home directory.
-     */
-    private String directoryName = "public_webapps";
+    protected static org.apache.juli.logging.Log log =
+            org.apache.juli.logging.LogFactory.getLog(HomesUserConfig.class);
+
     /**
      * The base directory containing user home directories.
      */
     private String homeBase = null;
 
-    public String getDirectoryName() {
-        return directoryName;
-    }
 
-    /**
-     * Set the directory name for user web applications.
-     *
-     * @param directoryName The new directory name
-     */
-    public void setDirectoryName(String directoryName) {
-        this.directoryName = directoryName;
+    public HomesUserConfig() {
+        log = LogFactory.getLog(HomesUserConfig.class);
     }
 
     /**
@@ -56,7 +48,7 @@
         File homeBaseFile = new File(homeBase);
 
         if (!homeBaseFile.exists() || !homeBaseFile.isDirectory()) {
-            host.getLogger().error("Invalid home base.");
+            log.error("Invalid home base.");
             return;
         }
 
@@ -69,8 +61,7 @@
                 continue;
             }
 
-            File base = new File(home, directoryName);
-            deployUserApps(name, base);
+            deployUserApps(name, home);
         }
     }
 }
--- a/src/kryshen/catalina/startup/PasswdUserConfig.java	Mon Nov 02 18:36:24 2009 +0300
+++ b/src/kryshen/catalina/startup/PasswdUserConfig.java	Mon Nov 02 23:17:40 2009 +0300
@@ -1,5 +1,13 @@
 package kryshen.catalina.startup;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.regex.Pattern;
+import org.apache.juli.logging.LogFactory;
+
 /**
  *
  * @author Mikhail Kryshen
@@ -8,6 +16,11 @@
 
     private static final String PASSWD_DATABASE = "passwd";
 
+    /* Passwd format details. */
+    private static final Pattern PASSWD_SPLIT_PATTERN = Pattern.compile(":");
+    private static final int PASSWD_FIELD_USERNAME = 0;
+    private static final int PASSWD_FIELD_HOME = 5;
+
     /**
      * Command for retrieving passwd database.
      */
@@ -18,6 +31,10 @@
      */
     private String passwd = "/etc/passwd";
 
+    public PasswdUserConfig() {
+        log = LogFactory.getLog(PasswdUserConfig.class);
+    }
+
     /**
      * Get command for retrieving passwd database.
      */
@@ -48,6 +65,43 @@
 
     @Override
     protected void deployUserApps() {
-        // TODO
+        BufferedReader in;
+
+        try {
+            if (getent == null) {
+                in = new BufferedReader(new FileReader(passwd));
+            } else {
+                Process process = Runtime.getRuntime().exec(
+                        getent, new String[]{PASSWD_DATABASE});
+
+                in = new BufferedReader(
+                        new InputStreamReader(process.getInputStream()));
+            }
+
+            String line;
+
+            try {
+                while ((line = in.readLine()) != null) {
+                    String[] fields = PASSWD_SPLIT_PATTERN.split(line);
+
+                    String name = fields[PASSWD_FIELD_USERNAME];
+                    File home = new File(fields[PASSWD_FIELD_HOME]);
+
+                    if (!home.isDirectory()) {
+                        log.error("Invalid home directory for user"
+                                + name + ": " + home.getPath() + ".");
+                        continue;
+                    }
+
+                    deployUserApps(name, home);
+                }
+            } finally {
+                in.close();
+            }
+        } catch (IOException e) {
+            log.error("Error reading passwd database.", e);
+        } catch (ArrayIndexOutOfBoundsException e) {
+            log.error("Invalid passwd format.", e);
+        }
     }
 }
--- a/src/kryshen/catalina/startup/UserConfig.java	Mon Nov 02 18:36:24 2009 +0300
+++ b/src/kryshen/catalina/startup/UserConfig.java	Mon Nov 02 23:17:40 2009 +0300
@@ -2,6 +2,7 @@
 
 import java.io.File;
 import org.apache.catalina.startup.HostConfig;
+import org.apache.juli.logging.LogFactory;
 
 /**
  *
@@ -9,6 +10,29 @@
  */
 public abstract class UserConfig extends HostConfig {
 
+    /**
+     * The directory name to be searched for within each user home directory.
+     */
+    private String directoryName = "public_webapps";
+
+    
+    protected UserConfig() {
+        log = LogFactory.getLog(UserConfig.class);
+    }
+    
+    public String getDirectoryName() {
+        return directoryName;
+    }
+
+    /**
+     * Set the directory name for user web applications.
+     *
+     * @param directoryName The new directory name
+     */
+    public void setDirectoryName(String directoryName) {
+        this.directoryName = directoryName;
+    }
+
     @Override
     protected void deployApps() {       
         deployUserApps();
@@ -22,7 +46,9 @@
 
     protected abstract void deployUserApps();
 
-    protected void deployUserApps(String user, File base) {
+    protected void deployUserApps(String user, File home) {
+        File base = new File(home, directoryName);
+
         if (!base.exists() || !base.isDirectory() || !base.canRead()) {
             return;
         }
@@ -40,6 +66,7 @@
     protected void deployDirectories(String user, File base, String[] files) {
 
         if (files == null) {
+            log.error("Error reading base directory: " + base.getPath() + ".");
             return;
         }