geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ammul...@apache.org
Subject svn commit: r394534 - in /geronimo/branches/1.1: applications/console-standard/src/java/org/apache/geronimo/console/car/ applications/console-standard/src/java/org/apache/geronimo/console/threads/ assemblies/j2ee-jetty-server/ configs/j2ee-server/src/p...
Date Sun, 16 Apr 2006 18:21:00 GMT
Author: ammulder
Date: Sun Apr 16 11:20:56 2006
New Revision: 394534

URL: http://svn.apache.org/viewcvs?rev=394534&view=rev
Log:
Fix terrible bug in thread pool statistics gathering
Move ThreadPool interface to system so it can be used by configuration
  installer
Move configuration installer GBean definition to j2ee-server so it can
  have a thread pool reference
Improve XML for configuration import/export
Make the configuration installer run asynchronously, and make the
  command-line client poll for status

Added:
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadPoller.java   (with props)
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/threads/
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/threads/ThreadPool.java
      - copied, changed from r394461, geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/ThreadPool.java
Removed:
    geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/ThreadPool.java
Modified:
    geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/car/DownloadCARHandler.java
    geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/threads/ListScreenHandler.java
    geronimo/branches/1.1/assemblies/j2ee-jetty-server/project.xml
    geronimo/branches/1.1/configs/j2ee-server/src/plan/plan.xml
    geronimo/branches/1.1/configs/j2ee-system/src/plan/plan.xml
    geronimo/branches/1.1/modules/connector/project.xml
    geronimo/branches/1.1/modules/core/project.xml
    geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/GeronimoExecutor.java
    geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/ThreadPool.java
    geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java
    geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/local/AbstractDeployCommand.java
    geronimo/branches/1.1/modules/deploy-tool/src/java/org/apache/geronimo/deployment/cli/CommandListConfigurations.java
    geronimo/branches/1.1/modules/j2ee/src/java/org/apache/geronimo/j2ee/management/impl/J2EEServerImpl.java
    geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/KernelDelegate.java
    geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/J2EEServer.java
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigInstallerGBean.java
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationInstaller.java
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationMetadata.java
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadResults.java
    geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/repository/AbstractRepository.java
    geronimo/branches/1.1/modules/system/src/schema/config-list.xsd
    geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java
    geronimo/branches/1.1/modules/timer/project.xml

Modified: geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/car/DownloadCARHandler.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/car/DownloadCARHandler.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/car/DownloadCARHandler.java (original)
+++ geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/car/DownloadCARHandler.java Sun Apr 16 11:20:56 2006
@@ -117,13 +117,10 @@
                 throw new PortletException("No configuration found for '"+configId+"'");
             }
 
-            DownloadResults results;
-            try {
-                results = PortletManager.getCurrentServer(request).getConfigurationInstaller().install(installList, user, pass);
-            } catch (FailedLoginException e) {
-                throw new PortletException("Invalid login for Maven repository '"+repo+"'", e);
-            } catch (MissingDependencyException e) {
-                throw new PortletException(e.getMessage(), e);
+            // todo: switch to asynchronous AJAX-based download monitor
+            DownloadResults results = PortletManager.getCurrentServer(request).getConfigurationInstaller().install(installList, user, pass);
+            if(results.isFailed()) {
+                throw new PortletException("Unable to install configuration", results.getFailure());
             }
             List dependencies = new ArrayList();
             for (int i = 0; i < results.getDependenciesInstalled().length; i++) {

Modified: geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/threads/ListScreenHandler.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/threads/ListScreenHandler.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/threads/ListScreenHandler.java (original)
+++ geronimo/branches/1.1/applications/console-standard/src/java/org/apache/geronimo/console/threads/ListScreenHandler.java Sun Apr 16 11:20:56 2006
@@ -28,7 +28,7 @@
 import org.apache.geronimo.console.util.PortletManager;
 import org.apache.geronimo.gbean.AbstractName;
 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
-import org.apache.geronimo.management.geronimo.ThreadPool;
+import org.apache.geronimo.system.threads.ThreadPool;
 
 /**
  * A handles for the front page that lists available thread pools.

Modified: geronimo/branches/1.1/assemblies/j2ee-jetty-server/project.xml
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/assemblies/j2ee-jetty-server/project.xml?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/assemblies/j2ee-jetty-server/project.xml (original)
+++ geronimo/branches/1.1/assemblies/j2ee-jetty-server/project.xml Sun Apr 16 11:20:56 2006
@@ -89,6 +89,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
+<!--
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>directory</artifactId>
@@ -107,6 +108,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
+-->
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>system-database</artifactId>
@@ -219,6 +221,7 @@
             </properties>
         </dependency>
 <!-- applications -->
+<!--
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>ldap-demo-jetty</artifactId>
@@ -228,6 +231,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
+-->
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>welcome-jetty</artifactId>
@@ -237,6 +241,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
+<!--
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>servlets-examples-jetty</artifactId>
@@ -255,6 +260,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
+-->
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>webconsole-jetty</artifactId>
@@ -282,6 +288,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
+<!--
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>uddi-jetty</artifactId>
@@ -309,7 +316,7 @@
                 <geronimo.assemble>install</geronimo.assemble>
             </properties>
         </dependency>
-
+-->
         <!-- unpack --> 
         <dependency>
             <groupId>geronimo</groupId>
@@ -835,7 +842,7 @@
             <artifactId>concurrent</artifactId>
             <version>${concurrent_version}</version>
         </dependency>
-
+<!-- Remove all Apache Directory stuff
         <dependency>
             <groupId>directory</groupId>
             <artifactId>apacheds-core</artifactId>
@@ -901,9 +908,8 @@
             <artifactId>ldap-common</artifactId>
             <version>${apacheds_version}</version>
         </dependency>
+-->
 
-<!-- geronimo jars -->
-<!-- geronimo spec jars -->
 
         <dependency>
             <groupId>howl</groupId>
@@ -929,13 +935,13 @@
             <artifactId>org.mortbay.jetty</artifactId>
             <version>${jetty_version}</version>
         </dependency>
-
+<!-- Should be installed when jUDDI app is installed
         <dependency>
             <groupId>juddi</groupId>
             <artifactId>juddi</artifactId>
             <version>${juddi_version}</version>
         </dependency>
-
+-->
         <dependency>
             <groupId>openejb</groupId>
             <artifactId>openejb-builder</artifactId>
@@ -1015,7 +1021,7 @@
             <version>${stax_api_version}</version>
         </dependency>
 
-<!-- tomcat -->
+<!-- tomcat WHY IS THIS IN THE JETTY SERVER?!?! -->
         <dependency>
             <groupId>tomcat</groupId>
             <artifactId>catalina</artifactId>
@@ -1100,6 +1106,12 @@
             <version>${xmlbeans_version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons_fileupload_version}</version>
+        </dependency>
+
 <!-- stuff that has no clear purpose -->
         <dependency>
             <groupId>castor</groupId>
@@ -1108,12 +1120,6 @@
         </dependency>
 
         <dependency>
-            <groupId>commons-fileupload</groupId>
-            <artifactId>commons-fileupload</artifactId>
-            <version>${commons_fileupload_version}</version>
-        </dependency>
-
-        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>${junit_version}</version>
@@ -1245,11 +1251,13 @@
             <artifactId>geronimo-derby</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>
+<!-- Should be installed when Directory is installed
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>geronimo-directory</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>
+-->
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>geronimo-j2ee</artifactId>
@@ -1320,6 +1328,7 @@
             <artifactId>geronimo-timer</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>
+<!-- WHY IS THIS IN JETTY BUILD?!?!? -->
         <dependency>
             <groupId>geronimo</groupId>
             <artifactId>geronimo-tomcat</artifactId>

Modified: geronimo/branches/1.1/configs/j2ee-server/src/plan/plan.xml
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/configs/j2ee-server/src/plan/plan.xml?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/configs/j2ee-server/src/plan/plan.xml (original)
+++ geronimo/branches/1.1/configs/j2ee-server/src/plan/plan.xml Sun Apr 16 11:20:56 2006
@@ -62,6 +62,25 @@
         </reference>
     </gbean>
 
+    <!-- Configuration Installer -->
+    <gbean name="ConfigurationInstaller" class="org.apache.geronimo.system.configuration.ConfigInstallerGBean">
+      <reference name="Repository">
+        <name>Repository</name>
+      </reference>
+      <reference name="ConfigStore">
+        <name>Local</name>
+      </reference>
+      <reference name="ConfigManager">
+        <name>ConfigurationManager</name>
+      </reference>
+      <reference name="ServerInfo">
+        <name>ServerInfo</name>
+      </reference>
+      <reference name="ThreadPool">
+        <name>DefaultThreadPool</name>
+      </reference>
+    </gbean>
+
     <gbean name="HOWLTransactionLog" class="org.apache.geronimo.transaction.log.HOWLLog">
         <attribute name="bufferClassName">org.objectweb.howl.log.BlockLogBuffer</attribute>
         <attribute name="bufferSizeKBytes">32</attribute>

Modified: geronimo/branches/1.1/configs/j2ee-system/src/plan/plan.xml
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/configs/j2ee-system/src/plan/plan.xml?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/configs/j2ee-system/src/plan/plan.xml (original)
+++ geronimo/branches/1.1/configs/j2ee-system/src/plan/plan.xml Sun Apr 16 11:20:56 2006
@@ -90,22 +90,6 @@
     </reference>
   </gbean>
 
-  <!-- Configuration Installer -->
-  <gbean name="ConfigurationInstaller" class="org.apache.geronimo.system.configuration.ConfigInstallerGBean">
-    <reference name="Repository">
-      <name>Repository</name>
-    </reference>
-    <reference name="ConfigStore">
-      <name>Local</name>
-    </reference>
-    <reference name="ConfigManager">
-      <name>ConfigurationManager</name>
-    </reference>
-    <reference name="ServerInfo">
-      <name>ServerInfo</name>
-    </reference>
-  </gbean>
-
   <!-- Logging service -->
   <gbean name="Logger" class="org.apache.geronimo.system.logging.log4j.Log4jService">
     <attribute name="configFileName">var/log/server-log4j.properties</attribute>

Modified: geronimo/branches/1.1/modules/connector/project.xml
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/connector/project.xml?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/connector/project.xml (original)
+++ geronimo/branches/1.1/modules/connector/project.xml Sun Apr 16 11:20:56 2006
@@ -62,6 +62,12 @@
 
         <dependency>
             <groupId>geronimo</groupId>
+            <artifactId>geronimo-system</artifactId>
+            <version>${pom.currentVersion}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>geronimo</groupId>
             <artifactId>geronimo-j2ee</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>

Modified: geronimo/branches/1.1/modules/core/project.xml
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/core/project.xml?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/core/project.xml (original)
+++ geronimo/branches/1.1/modules/core/project.xml Sun Apr 16 11:20:56 2006
@@ -65,6 +65,12 @@
 
         <dependency>
             <groupId>geronimo</groupId>
+            <artifactId>geronimo-system</artifactId>
+            <version>${pom.currentVersion}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>geronimo</groupId>
             <artifactId>geronimo-management</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>

Modified: geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/GeronimoExecutor.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/GeronimoExecutor.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/GeronimoExecutor.java (original)
+++ geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/GeronimoExecutor.java Sun Apr 16 11:20:56 2006
@@ -24,7 +24,7 @@
  *
  * @version $Rev$ $Date$
  */
-public interface GeronimoExecutor extends Executor, org.apache.geronimo.management.geronimo.ThreadPool {
+public interface GeronimoExecutor extends Executor, org.apache.geronimo.system.threads.ThreadPool {
     /**
      * Gets a human-readable name identifying this object.
      */

Modified: geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/ThreadPool.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/ThreadPool.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/ThreadPool.java (original)
+++ geronimo/branches/1.1/modules/core/src/java/org/apache/geronimo/pool/ThreadPool.java Sun Apr 16 11:20:56 2006
@@ -140,7 +140,7 @@
                     stat = new CountStatisticImpl("Threads for " + client, "", "The number of threads used by the client known as '" + client + "'", count.intValue());
                     addStat(stat.getName(), stat);
                 } else {
-                    it.remove();
+                    consumers.remove(client);
                     stat.setCount(count.intValue());
                 }
                 result.put(client, stat);

Modified: geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java (original)
+++ geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java Sun Apr 16 11:20:56 2006
@@ -33,18 +33,21 @@
 
 import org.apache.geronimo.deployment.plugin.local.DistributeCommand;
 import org.apache.geronimo.deployment.plugin.local.RedeployCommand;
+import org.apache.geronimo.deployment.plugin.GeronimoDeploymentManager;
 import org.apache.geronimo.gbean.AbstractName;
 import org.apache.geronimo.gbean.AbstractNameQuery;
 import org.apache.geronimo.kernel.jmx.KernelDelegate;
 import org.apache.geronimo.system.configuration.ConfigurationList;
 import org.apache.geronimo.system.configuration.DownloadResults;
+import org.apache.geronimo.system.configuration.ConfigurationInstaller;
+import org.apache.geronimo.system.configuration.DownloadPoller;
 
 /**
  * Connects to a Kernel in a remote VM (may or many not be on the same machine).
  *
  * @version $Rev$ $Date$
  */
-public class RemoteDeploymentManager extends JMXDeploymentManager {
+public class RemoteDeploymentManager extends JMXDeploymentManager implements GeronimoDeploymentManager {
     private JMXConnector jmxConnector;
     private boolean isSameMachine;
 
@@ -125,29 +128,70 @@
         }
     }
 
-    public ConfigurationList listConfigurations(URL mavenRepository, String username, String password) throws IOException {
+    public ConfigurationList listConfigurations(URL mavenRepository, String username, String password) {
         Set set = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.system.configuration.ConfigurationInstaller"));
         for (Iterator it = set.iterator(); it.hasNext();) {
             AbstractName name = (AbstractName) it.next();
             try {
                 return (ConfigurationList) kernel.invoke(name, "listConfigurations", new Object[]{mavenRepository, username, password}, new String[]{URL.class.getName(), String.class.getName(), String.class.getName()});
             } catch (Exception e) {
+                System.err.println("Unable to install configurations: "+e.getMessage());
                 e.printStackTrace();
-                throw new IOException("Unable to list configurations: "+e.getMessage());
             }
         }
         return null;
     }
 
-    public DownloadResults install(ConfigurationList installList, String username, String password) throws IOException {
+    public DownloadResults install(ConfigurationList installList, String username, String password) {
         Set set = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.system.configuration.ConfigurationInstaller"));
         for (Iterator it = set.iterator(); it.hasNext();) {
             AbstractName name = (AbstractName) it.next();
             try {
                 return (DownloadResults) kernel.invoke(name, "install", new Object[]{installList, username, password}, new String[]{ConfigurationList.class.getName(), String.class.getName(), String.class.getName()});
             } catch (Exception e) {
+                System.err.println("Unable to install configurations: "+e.getMessage());
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    public void install(ConfigurationList configsToInstall, String username, String password, DownloadPoller poller) {
+        Set set = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.system.configuration.ConfigurationInstaller"));
+        for (Iterator it = set.iterator(); it.hasNext();) {
+            AbstractName name = (AbstractName) it.next();
+            try {
+                kernel.invoke(name, "install", new Object[]{configsToInstall, username, password, poller}, new String[]{ConfigurationList.class.getName(), String.class.getName(), String.class.getName(), DownloadPoller.class.getName()});
+            } catch (Exception e) {
+                System.err.println("Unable to install configurations: "+e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public Object startInstall(ConfigurationList configsToInstall, String username, String password) {
+        Set set = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.system.configuration.ConfigurationInstaller"));
+        for (Iterator it = set.iterator(); it.hasNext();) {
+            AbstractName name = (AbstractName) it.next();
+            try {
+                return kernel.invoke(name, "startInstall", new Object[]{configsToInstall, username, password}, new String[]{ConfigurationList.class.getName(), String.class.getName(), String.class.getName()});
+            } catch (Exception e) {
+                System.err.println("Unable to start installing configurations: "+e.getMessage());
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    public DownloadResults checkOnInstall(Object key) {
+        Set set = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.system.configuration.ConfigurationInstaller"));
+        for (Iterator it = set.iterator(); it.hasNext();) {
+            AbstractName name = (AbstractName) it.next();
+            try {
+                return (DownloadResults)kernel.invoke(name, "checkOnInstall", new Object[]{key}, new String[]{Object.class.getName()});
+            } catch (Exception e) {
+                System.err.println("Unable to check on configuration install: "+e.getMessage());
                 e.printStackTrace();
-                throw new IOException("Unable to install configurations: "+e.getMessage());
             }
         }
         return null;

Modified: geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/local/AbstractDeployCommand.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/local/AbstractDeployCommand.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/local/AbstractDeployCommand.java (original)
+++ geronimo/branches/1.1/modules/deploy-jsr88/src/java/org/apache/geronimo/deployment/plugin/local/AbstractDeployCommand.java Sun Apr 16 11:20:56 2006
@@ -74,7 +74,7 @@
                  "runtime deployer and distribute it while the server is not running and " +
                  "then start the server with a command like the above.  For help on this, " +
                  "write to user@geronimo.apache.org and include the contents of your " +
-                 "config-store/index.properties and var/config/config.xml files.");
+                 "var/config/config.xml file.");
             return null;
         }
         Iterator j = deployers.iterator();

Modified: geronimo/branches/1.1/modules/deploy-tool/src/java/org/apache/geronimo/deployment/cli/CommandListConfigurations.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/deploy-tool/src/java/org/apache/geronimo/deployment/cli/CommandListConfigurations.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/deploy-tool/src/java/org/apache/geronimo/deployment/cli/CommandListConfigurations.java (original)
+++ geronimo/branches/1.1/modules/deploy-tool/src/java/org/apache/geronimo/deployment/cli/CommandListConfigurations.java Sun Apr 16 11:20:56 2006
@@ -31,10 +31,9 @@
 import org.apache.geronimo.common.DeploymentException;
 import org.apache.geronimo.deployment.plugin.GeronimoDeploymentManager;
 import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.repository.MissingDependencyException;
+import org.apache.geronimo.system.configuration.ConfigurationList;
 import org.apache.geronimo.system.configuration.ConfigurationMetadata;
 import org.apache.geronimo.system.configuration.DownloadResults;
-import org.apache.geronimo.system.configuration.ConfigurationList;
 
 /**
  * The CLI deployer logic to start.
@@ -115,27 +114,61 @@
                 }
                 int selection = Integer.parseInt(answer);
                 ConfigurationMetadata target = ((ConfigurationMetadata) available.get(selection - 1));
-                DownloadResults results = mgr.install(ConfigurationList.createInstallList(data, target.getConfigId()), null, null);
-                for (int i = 0; i < results.getDependenciesPresent().length; i++) {
-                    Artifact uri = results.getDependenciesPresent()[i];
-                    System.out.print(DeployUtils.reformat("Using existing dependency "+uri, 4, 72));
-                }
-                for (int i = 0; i < results.getDependenciesInstalled().length; i++) {
-                    Artifact uri = results.getDependenciesInstalled()[i];
-                    System.out.print(DeployUtils.reformat("Installed new dependency "+uri, 4, 72));
+                long start = System.currentTimeMillis();
+                Object key = mgr.startInstall(ConfigurationList.createInstallList(data, target.getConfigId()), null, null);
+                DownloadResults results = showProgress(mgr, key);
+                int time = (int)(System.currentTimeMillis() - start) / 1000;
+                System.out.println();
+                if(!results.isFailed()) {
+                    System.out.println(DeployUtils.reformat("**** Installation Complete!", 4, 72));
+                    for (int i = 0; i < results.getDependenciesPresent().length; i++) {
+                        Artifact uri = results.getDependenciesPresent()[i];
+                        System.out.print(DeployUtils.reformat("Used existing: "+uri, 4, 72));
+                    }
+                    for (int i = 0; i < results.getDependenciesInstalled().length; i++) {
+                        Artifact uri = results.getDependenciesInstalled()[i];
+                        System.out.print(DeployUtils.reformat("Installed new: "+uri, 4, 72));
+                    }
+                    System.out.println();
+                    System.out.println(DeployUtils.reformat("Downloaded "+(results.getTotalDownloadBytes()/1024)+" kB in "+time+"s ("+results.getTotalDownloadBytes()/(1024*time)+" kB/s)", 4, 72));
+                }
+                if(results.isFinished() && !results.isFailed()) {
+                    System.out.print(DeployUtils.reformat("Now starting "+target.getConfigId()+"...", 4, 72));
+                    System.out.flush();
+                    new CommandStart().execute(out, connection, new String[]{target.getConfigId().toString()});
                 }
-                new CommandStart().execute(out, connection, new String[]{target.getConfigId().toString()});
             } catch (IOException e) {
                 throw new DeploymentException("Unable to install configuration", e);
             } catch(NumberFormatException e) {
                 throw new DeploymentException("Invalid response");
-            } catch (FailedLoginException e) {
-                throw new DeploymentException("Invalid login for Maven repository '"+repository+"'");
-            } catch (MissingDependencyException e) {
-                throw new DeploymentException(e.getMessage());
             }
         } else {
             throw new DeploymentException("Cannot list repositories when connected to "+connection.getServerURI());
+        }
+    }
+
+    private DownloadResults showProgress(GeronimoDeploymentManager mgr, Object key) {
+        System.out.println("Checking for status every 1000ms:");
+        while(true) {
+            DownloadResults results = mgr.checkOnInstall(key);
+            if(results.getCurrentFile() != null) {
+                if(results.getCurrentFilePercent() > -1) {
+                    System.out.println(results.getCurrentMessage()+" ("+results.getCurrentFilePercent()+"%)");
+                } else {
+                    System.out.println(results.getCurrentMessage());
+                }
+            }
+            if(results.isFinished()) {
+                if(results.isFailed()) {
+                    System.err.println("Installation FAILED: "+results.getFailure().getMessage());
+                }
+                return results;
+            }
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                return results;
+            }
         }
     }
 }

Modified: geronimo/branches/1.1/modules/j2ee/src/java/org/apache/geronimo/j2ee/management/impl/J2EEServerImpl.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/j2ee/src/java/org/apache/geronimo/j2ee/management/impl/J2EEServerImpl.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/j2ee/src/java/org/apache/geronimo/j2ee/management/impl/J2EEServerImpl.java (original)
+++ geronimo/branches/1.1/modules/j2ee/src/java/org/apache/geronimo/j2ee/management/impl/J2EEServerImpl.java Sun Apr 16 11:20:56 2006
@@ -41,11 +41,11 @@
 import org.apache.geronimo.management.geronimo.JVM;
 import org.apache.geronimo.management.geronimo.LoginService;
 import org.apache.geronimo.management.geronimo.SecurityRealm;
-import org.apache.geronimo.management.geronimo.ThreadPool;
 import org.apache.geronimo.management.geronimo.WebManager;
 import org.apache.geronimo.management.geronimo.KeystoreManager;
 import org.apache.geronimo.system.serverinfo.ServerInfo;
 import org.apache.geronimo.system.configuration.ConfigurationInstaller;
+import org.apache.geronimo.system.threads.ThreadPool;
 
 /**
  * @version $Rev$ $Date$

Modified: geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/KernelDelegate.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/KernelDelegate.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/KernelDelegate.java (original)
+++ geronimo/branches/1.1/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/KernelDelegate.java Sun Apr 16 11:20:56 2006
@@ -41,7 +41,7 @@
 import org.apache.geronimo.kernel.proxy.ProxyManager;
 
 /**
- * @version $Rev: 385487 $ $Date$
+ * @version $Rev$ $Date$
  */
 public class KernelDelegate implements Kernel {
     private final MBeanServerConnection mbeanServer;
@@ -959,6 +959,9 @@
     }
 
     private Object invokeKernel(String methodName, Object[] args, String[] types) throws Exception {
+        if(args != null && types != null && args.length != types.length) {
+            throw new IllegalArgumentException("Call to "+methodName+" has "+args.length+" arguments but "+types.length+" argument classes!");
+        }
         try {
             return mbeanServer.invoke(Kernel.KERNEL, methodName, args, types);
         } catch (Exception e) {
@@ -966,7 +969,17 @@
             if (cause instanceof InstanceNotFoundException) {
                 throw new InternalKernelException("Kernel is not loaded");
             } else if (cause instanceof NoSuchMethodException) {
-                throw new InternalKernelException("KernelDelegate is out of synch with Kernel");
+                StringBuffer buf = new StringBuffer("KernelDelegate is out of synch with Kernel on ");
+                buf.append(methodName).append("(");
+                if(types != null) {
+                    for (int i = 0; i < types.length; i++) {
+                        String type = types[i];
+                        if(i>0) buf.append(",");
+                        buf.append(type);
+                    }
+                }
+                buf.append(")");
+                throw new InternalKernelException(buf.toString());
             } else if (cause instanceof JMException) {
                 throw new InternalKernelException(cause);
             } else if (cause instanceof JMRuntimeException) {

Modified: geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/J2EEServer.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/J2EEServer.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/J2EEServer.java (original)
+++ geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/J2EEServer.java Sun Apr 16 11:20:56 2006
@@ -22,6 +22,7 @@
 import org.apache.geronimo.kernel.config.ConfigurationManager;
 import org.apache.geronimo.system.serverinfo.ServerInfo;
 import org.apache.geronimo.system.configuration.ConfigurationInstaller;
+import org.apache.geronimo.system.threads.ThreadPool;
 
 /**
  * Geronimo-specific extensions to the standard J2EE server management

Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigInstallerGBean.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigInstallerGBean.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigInstallerGBean.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigInstallerGBean.java Sun Apr 16 11:20:56 2006
@@ -29,6 +29,10 @@
 import java.util.List;
 import java.util.LinkedList;
 import java.util.Arrays;
+import java.util.Set;
+import java.util.Map;
+import java.util.Collections;
+import java.util.HashMap;
 import javax.security.auth.login.FailedLoginException;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -48,8 +52,12 @@
 import org.apache.geronimo.kernel.repository.Dependency;
 import org.apache.geronimo.kernel.repository.WritableListableRepository;
 import org.apache.geronimo.kernel.repository.MissingDependencyException;
+import org.apache.geronimo.kernel.repository.Repository;
+import org.apache.geronimo.kernel.repository.ImportType;
+import org.apache.geronimo.kernel.repository.FileWriteMonitor;
 import org.apache.geronimo.util.encoders.Base64;
 import org.apache.geronimo.system.serverinfo.ServerInfo;
+import org.apache.geronimo.system.threads.ThreadPool;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -63,18 +71,31 @@
  */
 public class ConfigInstallerGBean implements ConfigurationInstaller {
     private final static Log log = LogFactory.getLog(ConfigInstallerGBean.class);
+    private static int counter;
     private ConfigurationManager configManager;
     private WritableListableRepository writeableRepo;
     private ConfigurationStore configStore;
     private ArtifactResolver resolver;
     private ServerInfo serverInfo;
+    private Map asyncKeys;
+    private ThreadPool threadPool;
 
-    public ConfigInstallerGBean(ConfigurationManager configManager, WritableListableRepository repository, ConfigurationStore configStore, ServerInfo serverInfo) {
+    public ConfigInstallerGBean(ConfigurationManager configManager, WritableListableRepository repository, ConfigurationStore configStore, ServerInfo serverInfo, ThreadPool threadPool) {
         this.configManager = configManager;
         this.writeableRepo = repository;
         this.configStore = configStore;
         this.serverInfo = serverInfo;
+        this.threadPool = threadPool;
         resolver = new DefaultArtifactResolver(null, writeableRepo);
+        asyncKeys = Collections.synchronizedMap(new HashMap());
+    }
+
+    private static Object getNextKey() {
+        int value;
+        synchronized(ConfigInstallerGBean.class) {
+            value = ++counter;
+        }
+        return new Integer(value);
     }
 
     public ConfigurationList listConfigurations(URL mavenRepository, String username, String password) throws IOException, FailedLoginException {
@@ -85,7 +106,8 @@
         //todo: Try downloading a .gz first
         URL url = new URL(repository+"geronimo-plugins.xml");
         try {
-            InputStream in = openStream(null, url, new URL[0], username, password);
+            //todo: use a progress monitor
+            InputStream in = openStream(null, url, new URL[0], username, password, null);
             return loadConfiguration(mavenRepository, in);
         } catch (MissingDependencyException e) {
             log.error("Cannot find plugin index at site "+url);
@@ -124,7 +146,7 @@
                 prereqs[j] = new ConfigurationMetadata.Prerequisite(artifact, present,
                         getChildText(node, "resource-type"), getChildText(node, "description"));
                 if(!present) {
-                    log.info(configId+" is not eligible due to missing "+prereqs[j].getConfigId());
+                    log.debug(configId+" is not eligible due to missing "+prereqs[j].getConfigId());
                     eligible = false;
                 }
             }
@@ -156,8 +178,9 @@
             }
             Artifact artifact = Artifact.create(configId);
             boolean installed = configManager.isLoaded(artifact);
-            log.info("Checking "+configId+": installed="+installed+", eligible="+eligible);
-            ConfigurationMetadata data = new ConfigurationMetadata(artifact, getChildText(config, "name"), getChildText(config, "category"), installed, eligible);
+            log.trace("Checking "+configId+": installed="+installed+", eligible="+eligible);
+            ConfigurationMetadata data = new ConfigurationMetadata(artifact, getChildText(config, "name"),
+                    getChildText(config, "description"), getChildText(config, "category"), installed, eligible);
             data.setGeronimoVersions(gerVersions);
             data.setJvmVersions(jvmVersions);
             data.setLicenses(licenses);
@@ -229,47 +252,111 @@
     }
 
 
-    public DownloadResults install(ConfigurationList list, String username, String password) throws IOException, FailedLoginException, MissingDependencyException {
+    public DownloadResults install(ConfigurationList list, String username, String password) {
         DownloadResults results = new DownloadResults();
-        for (int i = 0; i < list.getConfigurations().length; i++) {
-            ConfigurationMetadata metadata = list.getConfigurations()[i];
-            downloadConfiguration(metadata.getConfigId(),list.getMainRepository(),list.getBackupRepositories(),username,password,results);
+        try {
+            for (int i = 0; i < list.getConfigurations().length; i++) {
+                ConfigurationMetadata metadata = list.getConfigurations()[i];
+                downloadArtifact(metadata.getConfigId(), list.getMainRepository(), list.getBackupRepositories(),
+                        username, password, new ResultsFileWriteMonitor(results));
+            }
+        } catch (Exception e) {
+            results.setFailure(e);
+        } finally {
+            results.setFinished();
         }
         return results;
     }
 
-    private void downloadConfiguration(Artifact configID, URL repoURL, URL[] backups, String username, String password, DownloadResults results) throws IOException, FailedLoginException, MissingDependencyException {
-        if(!configStore.containsConfiguration(configID)) {
-            InputStream in = openStream(configID, repoURL, backups, username, password);
-            try { //todo: use a file status monitor
-                writeableRepo.copyToRepository(in, configID, null); //todo: download only SNAPSHOTS if previously available?
+    public void install(ConfigurationList list, String username, String password, DownloadPoller poller) {
+        try {
+            for (int i = 0; i < list.getConfigurations().length; i++) {
+                ConfigurationMetadata metadata = list.getConfigurations()[i];
+                downloadArtifact(metadata.getConfigId(), list.getMainRepository(), list.getBackupRepositories(),
+                        username, password, new ResultsFileWriteMonitor(poller));
+            }
+        } catch (Exception e) {
+            poller.setFailure(e);
+        } finally {
+            poller.setFinished();
+        }
+    }
+
+    public Object startInstall(final ConfigurationList configsToInstall, final String username, final String password) {
+        Object key = getNextKey();
+        final DownloadResults results = new DownloadResults();
+        Runnable work = new Runnable() {
+            public void run() {
+                install(configsToInstall, username, password, results);
+            }
+        };
+        asyncKeys.put(key, results);
+        try {
+            threadPool.execute("Configuration Installer", work);
+        } catch (InterruptedException e) {
+            throw new RuntimeException("Unable to start work", e);
+        }
+        return key;
+    }
+
+    public DownloadResults checkOnInstall(Object key) {
+        DownloadResults results = (DownloadResults) asyncKeys.get(key);
+        if(results.isFinished()) {
+            //todo: subject to a race condition
+            // since this is not synchronized, it's possible that the download finishes after this
+            // passes but before the client reads it, so the client thinks it's done but we never removed the key
+            // fix if we care by copying the results before the if block and returning the copy?
+            asyncKeys.remove(key);
+        }
+        return results;
+    }
+
+    /**
+     * Download (if necessary) and install something, which may be a Configuration or may
+     * be just a JAR.  For each artifact processed, all its dependencies will be
+     * processed as well.
+     *
+     * @param configID  Identifies the artifact to install
+     * @param repoURL   The main URL to contact the repository
+     * @param backups   Any additional repositories to search
+     * @param username  The username used for repositories secured with HTTP Basic authentication
+     * @param password  The password used for repositories secured with HTTP Basic authentication
+     * @param monitor   The ongoing results of the download operations, with some monitoring logic
+     *
+     * @throws IOException                 When there's a problem reading or writing data
+     * @throws FailedLoginException        When a repository requires authentication and either no username
+     *                                     and password are supplied or the username and password supplied
+     *                                     are not accepted
+     * @throws MissingDependencyException  When a dependency cannot be located in any of the listed repositories
+     */
+    private void downloadArtifact(Artifact configID, URL repoURL, URL[] backups, String username, String password, ResultsFileWriteMonitor monitor) throws IOException, FailedLoginException, MissingDependencyException {
+        //todo: check all repositories?
+        if(!writeableRepo.contains(configID)) {
+            InputStream in = openStream(configID, repoURL, backups, username, password, monitor);
+            try {
+                writeableRepo.copyToRepository(in, configID, monitor); //todo: download SNAPSHOTS if previously available?
+                monitor.getResults().addDependencyInstalled(configID);
             } finally {
                 in.close();
             }
+        } else {
+            monitor.getResults().addDependencyPresent(configID);
         }
 
         try {
             ConfigurationData data = null;
             if(configStore.containsConfiguration(configID)) {
+                if(configManager.isRunning(configID)) {
+                    return; // its dependencies must be OK
+                }
                 data = configStore.loadConfiguration(configID);
             }
-            if(data == null) {
-                throw new IllegalStateException("No configuration store for repository "+writeableRepo);
-            }
-            Dependency[] dependencies = getDependencies(data);
+            Dependency[] dependencies = data == null ? getDependencies(writeableRepo, configID) : getDependencies(data);
             // Download the dependencies
             for (int i = 0; i < dependencies.length; i++) {
                 Dependency dep = dependencies[i];
                 Artifact artifact = dep.getArtifact();
-                //todo: check all repositories?
-                if(writeableRepo.contains(artifact)) {
-                    results.addDependencyPresent(artifact);
-                    continue;
-                }
-                //todo: use a file status monitor
-                writeableRepo.copyToRepository(openStream(dep.getArtifact(), repoURL, backups, username, password), artifact, null);
-                results.addDependencyInstalled(artifact);
-                downloadConfiguration(artifact, repoURL, backups, username, password, results);
+                downloadArtifact(artifact, repoURL, backups, username, password, monitor);
             }
         } catch (NoSuchConfigException e) {
             throw new IllegalStateException("Installed configuration into repository but ConfigStore does not see it: "+e.getMessage());
@@ -278,6 +365,23 @@
         }
     }
 
+    /**
+     * Used to get dependencies for a JAR
+     */
+    private static Dependency[] getDependencies(Repository repo, Artifact artifact) {
+        Set set = repo.getDependencies(artifact);
+        Dependency[] results = new Dependency[set.size()];
+        int index=0;
+        for (Iterator it = set.iterator(); it.hasNext(); ++index) {
+            Artifact dep = (Artifact) it.next();
+            results[index] = new Dependency(dep, ImportType.CLASSES);
+        }
+        return results;
+    }
+
+    /**
+     * Used to get dependencies for a Configuration
+     */
     private static Dependency[] getDependencies(ConfigurationData data) {
         List dependencies = data.getEnvironment().getDependencies();
         Collection children = data.getChildConfigurations().values();
@@ -285,14 +389,17 @@
             ConfigurationData child = (ConfigurationData) it.next();
             dependencies.addAll(child.getEnvironment().getDependencies());
         }
-        return (Dependency[]) children.toArray(new Dependency[children.size()]);
+        return (Dependency[]) dependencies.toArray(new Dependency[dependencies.size()]);
     }
 
     private static URL getURL(Artifact configId, URL repository) throws MalformedURLException {
         return new URL(repository, configId.getGroupId().replace('.','/')+"/"+configId.getArtifactId()+"/"+configId.getVersion()+"/"+configId.getArtifactId()+"-"+configId.getVersion()+"."+configId.getType());
     }
 
-    private static InputStream openStream(Artifact artifact, URL repo, URL[] backups, String username, String password) throws IOException, FailedLoginException, MissingDependencyException {
+    private static InputStream openStream(Artifact artifact, URL repo, URL[] backups, String username, String password, ResultsFileWriteMonitor monitor) throws IOException, FailedLoginException, MissingDependencyException {
+        if(monitor != null) {
+            monitor.setTotalBytes(-1); // In case the server doesn't say
+        }
         InputStream in;
         LinkedList list = new LinkedList();
         list.add(repo);
@@ -303,6 +410,7 @@
             }
             URL repository = (URL) list.removeFirst();
             URL url = artifact == null ? repository : getURL(artifact, repository);
+            log.debug("Attempting to download "+artifact+" from "+url);
             URLConnection con = url.openConnection();
             if(con instanceof HttpURLConnection) {
                 HttpURLConnection http = (HttpURLConnection) url.openConnection();
@@ -319,23 +427,37 @@
                     } else if(http.getResponseCode() == 404) {
                         continue; // Not found at this repository
                     }
+                    if(monitor != null && http.getContentLength() > 0) {
+                        monitor.setTotalBytes(http.getContentLength());
+                    }
                     in = http.getInputStream();
                 } else if(http.getResponseCode() == 404) {
                     continue; // Not found at this repository
                 } else {
+                    if(monitor != null && http.getContentLength() > 0) {
+                        monitor.setTotalBytes(http.getContentLength());
+                    }
                     in = http.getInputStream();
                 }
             } else {
                 if(username != null && !username.equals("")) {
                     con.setRequestProperty("Authorization", "Basic " + new String(Base64.encode((username + ":" + password).getBytes())));
                     try {
+                        con.connect();
+                        if(monitor != null && con.getContentLength() > 0) {
+                            monitor.setTotalBytes(con.getContentLength());
+                        }
                         in = con.getInputStream();
                     } catch (FileNotFoundException e) {
                         continue;
                     }
                 } else {
                     try {
-                        in = url.openStream();
+                        con.connect();
+                        if(monitor != null && con.getContentLength() > 0) {
+                            monitor.setTotalBytes(con.getContentLength());
+                        }
+                        in = con.getInputStream();
                     } catch (FileNotFoundException e) {
                         continue;
                     }
@@ -347,6 +469,45 @@
         }
     }
 
+    private static class ResultsFileWriteMonitor implements FileWriteMonitor {
+        private final DownloadPoller results;
+        private int totalBytes;
+        private String file;
+
+        public ResultsFileWriteMonitor(DownloadPoller results) {
+            this.results = results;
+        }
+
+        public void setTotalBytes(int totalBytes) {
+            this.totalBytes = totalBytes;
+        }
+
+        public void writeStarted(String fileDescription) {
+            file = fileDescription;
+            results.setCurrentFile(fileDescription);
+            results.setCurrentMessage("Downloading "+fileDescription+"...");
+            results.setCurrentFilePercent(totalBytes > 0 ? 0 : -1);
+        }
+
+        public void writeProgress(int bytes) {
+            if(totalBytes > 0) {
+                results.setCurrentFilePercent((bytes*100)/totalBytes);
+            } else {
+                results.setCurrentMessage((bytes/1024)+" kB of "+file);
+            }
+        }
+
+        public void writeComplete(int bytes) {
+            results.setCurrentFilePercent(100);
+            results.setCurrentMessage("Downloaded "+file+" ("+(bytes/1024)+" kB)");
+            results.addDownloadBytes(bytes);
+        }
+
+        public DownloadPoller getResults() {
+            return results;
+        }
+    }
+
     public static final GBeanInfo GBEAN_INFO;
 
     static {
@@ -355,9 +516,10 @@
         infoFactory.addReference("Repository", WritableListableRepository.class, "Repository");
         infoFactory.addReference("ConfigStore", ConfigurationStore.class, "ConfigurationStore");
         infoFactory.addReference("ServerInfo", ServerInfo.class, "GBean");
+        infoFactory.addReference("ThreadPool", ThreadPool.class, "GBean");
         infoFactory.addInterface(ConfigurationInstaller.class);
 
-        infoFactory.setConstructor(new String[]{"ConfigManager", "Repository", "ConfigStore", "ServerInfo"});
+        infoFactory.setConstructor(new String[]{"ConfigManager", "Repository", "ConfigStore", "ServerInfo","ThreadPool"});
 
         GBEAN_INFO = infoFactory.getBeanInfo();
     }

Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationInstaller.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationInstaller.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationInstaller.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationInstaller.java Sun Apr 16 11:20:56 2006
@@ -16,11 +16,9 @@
  */
 package org.apache.geronimo.system.configuration;
 
-import java.net.URL;
 import java.io.IOException;
+import java.net.URL;
 import javax.security.auth.login.FailedLoginException;
-import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.repository.MissingDependencyException;
 
 /**
  * Knows how to import and export configurations
@@ -40,7 +38,9 @@
 
     /**
      * Installs a configuration from a remote repository into the local Geronimo server,
-     * including all its dependencies.
+     * including all its dependencies.  The caller will get the results when the
+     * operation completes.  Note that this method does not throw exceptions on failure,
+     * but instead sets the failure property of the DownloadResults.
      *
      * @param username         Optional username, if the maven repo uses HTTP Basic authentication.
      *                         Set this to null if no authentication is required.
@@ -48,5 +48,50 @@
      *                         Set this to null if no authentication is required.
      * @param configsToInstall The list of configurations to install
      */
-    public DownloadResults install(ConfigurationList configsToInstall, String username, String password) throws IOException, FailedLoginException, MissingDependencyException;
+    public DownloadResults install(ConfigurationList configsToInstall, String username, String password);
+
+    /**
+     * Installs a configuration from a remote repository into the local Geronimo server,
+     * including all its dependencies.  The method blocks until the operation completes,
+     * but the caller will be notified of progress frequently along the way (using the
+     * supplied DownloadPoller).  Therefore the caller is meant to create the poller and
+     * then call this method in a background thread.  Note that this method does not
+     * throw exceptions on failure, but instead sets the failure property of the
+     * DownloadPoller.
+     *
+     * @param configsToInstall The list of configurations to install
+     * @param username         Optional username, if the maven repo uses HTTP Basic authentication.
+     *                         Set this to null if no authentication is required.
+     * @param password         Optional password, if the maven repo uses HTTP Basic authentication.
+     *                         Set this to null if no authentication is required.
+     * @param poller           Will be notified with status updates as the download proceeds
+     */
+    public void install(ConfigurationList configsToInstall, String username, String password, DownloadPoller poller);
+
+    /**
+     * Installs a configuration from a remote repository into the local Geronimo server,
+     * including all its dependencies.  The method return immediately, providing a key
+     * that can be used to poll the status of the download operation.  Note that the
+     * installation does not throw exceptions on failure, but instead sets the failure
+     * property of the DownloadResults that the caller can poll for.
+     *
+     * @param configsToInstall The list of configurations to install
+     * @param username         Optional username, if the maven repo uses HTTP Basic authentication.
+     *                         Set this to null if no authentication is required.
+     * @param password         Optional password, if the maven repo uses HTTP Basic authentication.
+     *                         Set this to null if no authentication is required.
+     *
+     * @return A key that can be passed to checkOnInstall
+     */
+    public Object startInstall(ConfigurationList configsToInstall, String username, String password);
+
+    /**
+     * Gets the current progress of a download operation.  Note that once the
+     * DownloadResults is returned for this operation shows isFinished = true,
+     * the operation will be forgotten, so the caller should be careful not to
+     * call this again after the download has finished.
+     *
+     * @param key Identifies the operation to check on
+     */
+    public DownloadResults checkOnInstall(Object key);
 }

Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationMetadata.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationMetadata.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationMetadata.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationMetadata.java Sun Apr 16 11:20:56 2006
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.repository.Dependency;
 
 /**
  * Various metadata on a configuration that's used when listing, importing,
@@ -29,6 +28,7 @@
 public class ConfigurationMetadata implements Serializable, Comparable {
     private final Artifact configId;
     private final String name;
+    private final String description;
     private final String category;
     private final boolean installed;
     private final boolean eligible;
@@ -38,9 +38,10 @@
     private String[] jvmVersions;
     private Prerequisite[] prerequisites;
 
-    public ConfigurationMetadata(Artifact configId, String name, String category, boolean installed, boolean eligible) {
+    public ConfigurationMetadata(Artifact configId, String name, String description, String category, boolean installed, boolean eligible) {
         this.configId = configId;
         this.name = name;
+        this.description = description;
         this.category = category;
         this.installed = installed;
         this.eligible = eligible;
@@ -63,6 +64,13 @@
      */
     public String getName() {
         return name;
+    }
+
+    /**
+     * Gets a description of this configuration and why it is interesting
+     */
+    public String getDescription() {
+        return description;
     }
 
     /**

Added: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadPoller.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadPoller.java?rev=394534&view=auto
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadPoller.java (added)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadPoller.java Sun Apr 16 11:20:56 2006
@@ -0,0 +1,46 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.system.configuration;
+
+import org.apache.geronimo.kernel.repository.Artifact;
+
+/**
+ * An interface for callers who want to monitor the progress of an installation.
+ * These are all callbacks sent by the server.
+ *
+ * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $
+ */
+public interface DownloadPoller {
+    void addDependencyPresent(Artifact dep);
+
+    void addDependencyInstalled(Artifact dep);
+
+    void setCurrentFile(String currentFile);
+
+    void setCurrentMessage(String currentMessage);
+
+    void setCurrentFilePercent(int currentFileProgress);
+
+    void addDownloadBytes(long bytes);
+
+    void setFailure(Exception failure);
+
+    /**
+     * This will be called even in the event of a failure.
+     */
+    void setFinished();
+}

Propchange: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadPoller.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadResults.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadResults.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadResults.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/configuration/DownloadResults.java Sun Apr 16 11:20:56 2006
@@ -22,27 +22,112 @@
 import org.apache.geronimo.kernel.repository.Artifact;
 
 /**
- * Lists the results of a configuration download operation.
+ * Provides the results of a configuration download operation.  This is updated
+ * along the way for callers who want to monitor the ongoing progress.
  *
  * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $
  */
-public class DownloadResults implements Serializable {
+public class DownloadResults implements Serializable, DownloadPoller {
     private List dependenciesPresent = new ArrayList();
     private List dependenciesInstalled = new ArrayList();
+    private String currentFile;
+    private String currentMessage;
+    private int currentFileProgress = -1;
+    private Exception failure;
+    private boolean finished;
+    private long totalDownloadBytes = 0;
 
-    void addDependencyPresent(Artifact dep) {
+    public void addDependencyPresent(Artifact dep) {
         dependenciesPresent.add(dep);
     }
 
-    void addDependencyInstalled(Artifact dep) {
+    public void addDependencyInstalled(Artifact dep) {
         dependenciesInstalled.add(dep);
     }
 
+    public void setCurrentFile(String currentFile) {
+        this.currentFile = currentFile;
+    }
+
+    public void setCurrentMessage(String currentMessage) {
+        this.currentMessage = currentMessage;
+    }
+
+    public void setCurrentFilePercent(int currentFileProgress) {
+        this.currentFileProgress = currentFileProgress;
+    }
+
+    public void setFailure(Exception failure) {
+        this.failure = failure;
+    }
+
+    public void setFinished() {
+        finished = true;
+    }
+
+    public void addDownloadBytes(long bytes) {
+        totalDownloadBytes += bytes;
+    }
+
+    public boolean isFinished() {
+        return finished;
+    }
+
+    public boolean isFailed() {
+        return failure != null;
+    }
+
+    /**
+     * The total number of bytes in the archives downloaded from remote
+     * repositories.
+     */
+    public long getTotalDownloadBytes() {
+        return totalDownloadBytes;
+    }
+
+    /**
+     * If the operation failed, the Exception that caused the failure.
+     */
+    public Exception getFailure() {
+        return failure;
+    }
+
+    /**
+     * Gets the dependencies that we've needed but they're already present in
+     * the local server so no installation was necessary.
+     */
     public Artifact[] getDependenciesPresent() {
         return (Artifact[]) dependenciesPresent.toArray(new Artifact[dependenciesPresent.size()]);
     }
 
+    /**
+     * Gets the dependencies that we've successfully downloaded and installed
+     * into the local server environment.
+     */
     public Artifact[] getDependenciesInstalled() {
         return (Artifact[]) dependenciesInstalled.toArray(new Artifact[dependenciesInstalled.size()]);
+    }
+
+    /**
+     * Gets the name of the file that is currently being operated on.
+     */
+    public String getCurrentFile() {
+        return currentFile;
+    }
+
+    /**
+     * Gets a description of the work currently being done.
+     */
+    public String getCurrentMessage() {
+        return currentMessage;
+    }
+
+    /**
+     * Gets the progress on the current file expressed as a percentage.  This
+     * value may be -1 in which case the progress cannot be calculated (e.g. a
+     * download where the server doesn't supply the file size up front).
+     */
+    public int getCurrentFilePercent() {
+        return currentFileProgress;
     }
 }

Modified: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/repository/AbstractRepository.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/repository/AbstractRepository.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/repository/AbstractRepository.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/repository/AbstractRepository.java Sun Apr 16 11:20:56 2006
@@ -99,7 +99,7 @@
 
     public boolean contains(Artifact artifact) {
         File location = getLocation(artifact);
-        return location.isFile() && location.canRead();
+        return location.canRead() && (location.isFile() || new File(location, "META-INF").isDirectory());
     }
 
     private static final String NAMESPACE = "http://geronimo.apache.org/xml/ns/deployment-1.1";

Copied: geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/threads/ThreadPool.java (from r394461, geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/ThreadPool.java)
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/threads/ThreadPool.java?p2=geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/threads/ThreadPool.java&p1=geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/ThreadPool.java&r1=394461&r2=394534&rev=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/management/src/java/org/apache/geronimo/management/geronimo/ThreadPool.java (original)
+++ geronimo/branches/1.1/modules/system/src/java/org/apache/geronimo/system/threads/ThreadPool.java Sun Apr 16 11:20:56 2006
@@ -13,7 +13,7 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.geronimo.management.geronimo;
+package org.apache.geronimo.system.threads;
 
 /**
  * Management interface for thread pools

Modified: geronimo/branches/1.1/modules/system/src/schema/config-list.xsd
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/schema/config-list.xsd?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/schema/config-list.xsd (original)
+++ geronimo/branches/1.1/modules/system/src/schema/config-list.xsd Sun Apr 16 11:20:56 2006
@@ -42,19 +42,25 @@
             </xs:documentation>
         </xs:annotation>
     </xs:element>
-    <xs:element name="geronimo-configuration" type="list:configurationType">
+    <xs:element name="geronimo-configuration" type="list:configuration-descriptorType">
         <xs:annotation>
             <xs:documentation>
                 The geronimo-configuration root element is used as the config file
                 submitted with an individual Geronimo configuration to the plugin
                 repository. It will be merged into the plugin list for the repository
                 when the submitted plugin is accepted.
+
+                It is also used for the metadata packed into a configuration when
+                a configuration archive is downloaded from an online repository
+                for local installation, in which case it should be packed into the
+                archive at META-INF/geronimo-plugin.xml
             </xs:documentation>
         </xs:annotation>
     </xs:element>
 
     <!--   Data types used in this schema   -->
 
+    <!-- Format for a list of available configurations provided by a remote repository -->
     <xs:complexType name="config-listType">
         <xs:sequence>
             <xs:element name="configuration" type="list:configurationType" minOccurs="0" maxOccurs="unbounded">
@@ -114,6 +120,21 @@
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
+            <xs:element name="description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        A description of this component. This will be displayed when the user
+                        looks for more information about this component. It typically includes
+                        a description of what it does, what if any third-party software it's
+                        based on, why it would be interesting to use it, etc.
+
+                        Currently this should be plain text, where whitespace is not significant
+                        except an entirely blank line indicates a paragraph break (like this
+                        documentation, for example). This may change to a more structured format
+                        in the future, if we can agree on what that ought to be.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
             <xs:element name="license" type="list:licenseType" minOccurs="0" maxOccurs="unbounded">
                 <xs:annotation>
                     <xs:documentation>
@@ -245,9 +266,9 @@
             <xs:element name="id" type="xs:string">
                 <xs:annotation>
                     <xs:documentation>
-                        The Config ID of the prerequisite.  This is used to check whether
+                        The Config ID of the prerequisite. This is used to check whether
                         it's available on the server that you're downloading the plugin
-                        into.  It may omit some portions of the Config ID to be more
+                        into. It may omit some portions of the Config ID to be more
                         accomodating (e.g. "*/MyDBPool/*/*" to identify a database pool
                         instead of "console/MyDBPool/1.0/car").
 
@@ -292,17 +313,63 @@
                 <xs:annotation>
                     <xs:documentation>
                         A description for the user about why this is a prerequisite and what
-                        they should do to set it up.  Here are a couple examples:
+                        they should do to set it up. Here are a couple examples:
 
                         This plugin of SomeApp is configured for the Jetty version of
-                        Geronimo.  It cannot be installed on the Tomcat version of Geronimo.
+                        Geronimo. It cannot be installed on the Tomcat version of Geronimo.
                         There's a separate plugin for the Tomcat version of Geronimo.
 
-                        SomeApp requires a database connection pool.  Supported databases
-                        are PostgreSQL and MySQL.  Please configure a database connection
+                        SomeApp requires a database connection pool. Supported databases
+                        are PostgreSQL and MySQL. Please configure a database connection
                         pool with the name "SomeAppPool" and then run the associated create
                         script from http://someapp.com/db-scripts/ before installing this
                         plugin.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <!-- Format for the config file for a single configuration download -->
+    <xs:complexType name="configuration-descriptorType">
+        <xs:sequence>
+            <xs:element name="configuration" type="list:configurationType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The metadata for this configuration
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="source-repository" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>
+                        The base URL for the repository that this configuration was
+                        downloaded from.  This will be used as the primary
+                        repository for downloading additional dependencies, etc.
+
+                        If this descriptor is being put together for submission to
+                        a repository, etc. then this value may be omitted.  When an
+                        individual configuration is downloaded from a repository
+                        for offline installation, it must be present.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="backup-repository" type="xs:string" minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation>
+                        Each backup-repository is a URL to check for any dependencies that
+                        were not found in the current repository. That can be used, for
+                        example, to host Geronimo configurations at one site and common
+                        third-party JARs at another.
+
+                        The repository where this file came from will be checked first for
+                        every artifact, and if an artifact is not found there, each of the
+                        repositories listed here will be checked in the order listed until
+                        the artifact is found.
+
+                        Note that while the primary repository may be protected by HTTP
+                        Basic authentication, the backup repositories must either use the
+                        same username and password as the primary or use no authentication.
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>

Modified: geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java (original)
+++ geronimo/branches/1.1/modules/system/src/test/org/apache/geronimo/system/configuration/ConfigInstallerTest.java Sun Apr 16 11:20:56 2006
@@ -16,30 +16,30 @@
  */
 package org.apache.geronimo.system.configuration;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.net.URL;
-import java.util.List;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
-import java.io.IOException;
-import java.io.File;
-import java.io.InputStream;
 import junit.framework.TestCase;
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.kernel.config.Configuration;
+import org.apache.geronimo.kernel.config.ConfigurationData;
 import org.apache.geronimo.kernel.config.ConfigurationManager;
 import org.apache.geronimo.kernel.config.ConfigurationStore;
-import org.apache.geronimo.kernel.config.NoSuchStoreException;
-import org.apache.geronimo.kernel.config.Configuration;
-import org.apache.geronimo.kernel.config.NoSuchConfigException;
 import org.apache.geronimo.kernel.config.InvalidConfigException;
-import org.apache.geronimo.kernel.config.ConfigurationData;
+import org.apache.geronimo.kernel.config.NoSuchConfigException;
+import org.apache.geronimo.kernel.config.NoSuchStoreException;
 import org.apache.geronimo.kernel.config.NullConfigurationStore;
 import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.repository.WritableListableRepository;
 import org.apache.geronimo.kernel.repository.FileWriteMonitor;
-import org.apache.geronimo.gbean.AbstractName;
-import org.apache.geronimo.system.serverinfo.ServerInfo;
+import org.apache.geronimo.kernel.repository.WritableListableRepository;
 import org.apache.geronimo.system.serverinfo.BasicServerInfo;
+import org.apache.geronimo.system.threads.ThreadPool;
 
 /**
  * Tests the config installer GBean
@@ -55,7 +55,15 @@
         int pos = url.lastIndexOf("/");
         testRepo = new URL(url.substring(0, pos));
         installer = new ConfigInstallerGBean(new MockConfigManager(), new MockRepository(), new MockConfigStore(),
-                new BasicServerInfo("."));
+                new BasicServerInfo("."), new ThreadPool() {
+            public int getPoolSize() {
+                return 0;
+            }
+
+            public void execute(String consumerName, Runnable runnable) {
+                new Thread(runnable).start();
+            }
+        });
     }
 
     public void testParsing() throws Exception {

Modified: geronimo/branches/1.1/modules/timer/project.xml
URL: http://svn.apache.org/viewcvs/geronimo/branches/1.1/modules/timer/project.xml?rev=394534&r1=394533&r2=394534&view=diff
==============================================================================
--- geronimo/branches/1.1/modules/timer/project.xml (original)
+++ geronimo/branches/1.1/modules/timer/project.xml Sun Apr 16 11:20:56 2006
@@ -55,6 +55,12 @@
 
         <dependency>
             <groupId>geronimo</groupId>
+            <artifactId>geronimo-system</artifactId>
+            <version>${pom.currentVersion}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>geronimo</groupId>
             <artifactId>geronimo-connector</artifactId>
             <version>${pom.currentVersion}</version>
         </dependency>



Mime
View raw message