You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2012/04/23 14:15:06 UTC

svn commit: r1329199 [5/5] - in /ace/trunk: ./ ace-authenticationprocessor-basicauth/src/main/java/org/apache/ace/authenticationprocessor/basicauth/ ace-client-automation/src/main/java/org/apache/ace/client/automation/ ace-client-repository-api/src/mai...

Modified: ace/trunk/ace-repository-task/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-repository-task/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-repository-task/pom.xml (original)
+++ ace/trunk/ace-repository-task/pom.xml Mon Apr 23 12:15:01 2012
@@ -71,6 +71,10 @@
             <artifactId>org.apache.ace.scheduler.api</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>

Modified: ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/Activator.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/Activator.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/Activator.java (original)
+++ ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/Activator.java Mon Apr 23 12:15:01 2012
@@ -20,6 +20,7 @@ package org.apache.ace.repository.task;
 
 import java.util.Properties;
 
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.ace.discovery.Discovery;
 import org.apache.ace.scheduler.constants.SchedulerConstants;
 import org.apache.felix.dm.DependencyActivatorBase;
@@ -28,15 +29,18 @@ import org.osgi.framework.BundleContext;
 import org.osgi.service.log.LogService;
 
 public class Activator extends DependencyActivatorBase {
+
     @Override
     public void init(BundleContext context, DependencyManager manager) throws Exception {
         Properties props = new Properties();
         props.put(SchedulerConstants.SCHEDULER_NAME_KEY, RepositoryReplicationTask.class.getName());
         props.put(SchedulerConstants.SCHEDULER_DESCRIPTION_KEY, "Synchronizes repositories.");
+
         manager.add(createComponent()
             .setInterface(Runnable.class.getName(), props)
             .setImplementation(RepositoryReplicationTask.class)
             .add(createServiceDependency().setService(Discovery.class).setRequired(true))
+            .add(createServiceDependency().setService(ConnectionFactory.class).setRequired(true))
             .add(createServiceDependency().setService(LogService.class).setRequired(false))
             );
     }

Modified: ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/RepositoryReplicationTask.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/RepositoryReplicationTask.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/RepositoryReplicationTask.java (original)
+++ ace/trunk/ace-repository-task/src/main/java/org/apache/ace/repository/task/RepositoryReplicationTask.java Mon Apr 23 12:15:01 2012
@@ -25,6 +25,7 @@ import java.net.URL;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.ace.discovery.Discovery;
 import org.apache.ace.range.RangeIterator;
 import org.apache.ace.range.SortedRangeSet;
@@ -40,51 +41,73 @@ import org.osgi.service.log.LogService;
  * stuff out.
  */
 public class RepositoryReplicationTask implements Runnable {
+    private volatile BundleContext m_context;
     private volatile Discovery m_discovery;
+    private volatile ConnectionFactory m_connectionFactory;
     private volatile LogService m_log;
-    private volatile BundleContext m_context;
 
     public void run() {
         try {
-            URL host = m_discovery.discover();
             ServiceReference[] refs = m_context.getServiceReferences(RepositoryReplication.class.getName(), null);
+            if (refs == null) {
+                return;
+            }
+
             for (ServiceReference ref : refs) {
                 RepositoryReplication repository = (RepositoryReplication) m_context.getService(ref);
-                SortedRangeSet localRange = repository.getRange();
-                Object customer = ref.getProperty("customer");
-                Object name = ref.getProperty("name");
-                String filter = "customer=" + customer + "&name=" + name;
-                URL query = new URL(host, "/replication/query?" + filter);
-                HttpURLConnection connection = (HttpURLConnection) query.openConnection();
-                if (connection.getResponseCode() == HttpServletResponse.SC_OK) {
-                    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
-                    try {
-                        String line = reader.readLine();
-                        int i = line.lastIndexOf(',');
-                        if (i > 0) {
-                            SortedRangeSet remoteRange = new SortedRangeSet(line.substring(i + 1));
-                            SortedRangeSet delta = localRange.diffDest(remoteRange);
-                            RangeIterator iterator = delta.iterator();
-                            while (iterator.hasNext()) {
-                                long version = iterator.next();
-                                URL get = new URL(host, "/replication/get?" + filter + "&version=" + version);
-                                HttpURLConnection connection2 = (HttpURLConnection) get.openConnection();
-                                repository.put(connection2.getInputStream(), version);
+
+                try {
+                    String filter = getQueryFilter(ref);
+                    URL host = m_discovery.discover();
+                    URL query = new URL(host, "/replication/query?" + filter);
+
+                    HttpURLConnection connection = (HttpURLConnection) m_connectionFactory.createConnection(query);
+
+                    if (connection.getResponseCode() == HttpServletResponse.SC_OK) {
+                        SortedRangeSet localRange = repository.getRange();
+
+                        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+                        try {
+                            String line = reader.readLine();
+                            int i = line.lastIndexOf(',');
+                            if (i > 0) {
+                                SortedRangeSet remoteRange = new SortedRangeSet(line.substring(i + 1));
+                                SortedRangeSet delta = localRange.diffDest(remoteRange);
+                                RangeIterator iterator = delta.iterator();
+
+                                while (iterator.hasNext()) {
+                                    long version = iterator.next();
+                                    URL get = new URL(host, "/replication/get?" + filter + "&version=" + version);
+                                    
+                                    HttpURLConnection connection2 = (HttpURLConnection) m_connectionFactory.createConnection(get);
+
+                                    repository.put(connection2.getInputStream(), version);
+                                }
                             }
                         }
+                        catch (Exception e) {
+                            m_log.log(LogService.LOG_WARNING, "Error parsing remote range", e);
+                        }
                     }
-                    catch (Exception e) {
-                        m_log.log(LogService.LOG_WARNING, "Error parsing remote range", e);
+                    else {
+                        m_log.log(LogService.LOG_WARNING, "Could not sync repository for customer: " + ref.getProperty("customer") + ", name: " + ref.getProperty("name") + ", because: " + connection.getResponseMessage() + " (" + connection.getResponseCode() + ")");
                     }
                 }
-                else {
-                    m_log.log(LogService.LOG_WARNING, "Could not sync repository for customer " + customer + " name " + name + " because: " + connection.getResponseMessage() + " (" + connection.getResponseCode() + ")");
+                finally {
+                    m_context.ungetService(ref);
                 }
-                m_context.ungetService(ref);
             }
         }
         catch (Exception e) {
             m_log.log(LogService.LOG_WARNING, "Error while replicating", e);
         }
     }
+
+    /**
+     * @param ref
+     * @return
+     */
+    public String getQueryFilter(ServiceReference ref) {
+        return "customer=" + ref.getProperty("customer") + "&name=" + ref.getProperty("name");
+    }
 }
\ No newline at end of file

Modified: ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/ExecuterTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/ExecuterTest.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/ExecuterTest.java (original)
+++ ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/ExecuterTest.java Mon Apr 23 12:15:01 2012
@@ -20,6 +20,7 @@ package org.apache.ace.scheduler;
 
 import static org.apache.ace.test.utils.TestUtils.UNIT;
 
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -67,4 +68,24 @@ public class ExecuterTest {
         Thread.sleep(100);
         assert m_sem.tryAcquire(1, TimeUnit.SECONDS);
     }
+
+    /* start task, which executes longer than the task interval specifies, causing multiple concurrent tasks to be started. */
+    @Test(groups = { UNIT })
+    public void testTooLongTask() throws Exception {
+        final CountDownLatch latch = new CountDownLatch(5);
+        
+        Executer executer = new Executer(new Runnable() {
+            public void run() {
+                try {
+                    Thread.sleep(20);
+                    latch.countDown();
+                }
+                catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        executer.start(10);
+        assert latch.await(1, TimeUnit.SECONDS);
+    }
 }

Modified: ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/SchedulerTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/SchedulerTest.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/SchedulerTest.java (original)
+++ ace/trunk/ace-scheduler/src/test/java/org/apache/ace/scheduler/SchedulerTest.java Mon Apr 23 12:15:01 2012
@@ -23,7 +23,6 @@ import static org.apache.ace.test.utils.
 import java.util.Properties;
 
 import org.apache.ace.test.utils.TestUtils;
-import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.log.LogService;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;

Modified: ace/trunk/ace-server-log-ui/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-server-log-ui/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-server-log-ui/pom.xml (original)
+++ ace/trunk/ace-server-log-ui/pom.xml Mon Apr 23 12:15:01 2012
@@ -53,6 +53,10 @@
     <dependencies>
         <dependency>
              <groupId>org.apache.ace</groupId>
+             <artifactId>org.apache.ace.client.repository.api</artifactId>
+        </dependency>
+        <dependency>
+             <groupId>org.apache.ace</groupId>
              <artifactId>org.apache.ace.server.log.store</artifactId>
         </dependency>
         <dependency>

Modified: ace/trunk/ace-tageditor/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-tageditor/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-tageditor/pom.xml (original)
+++ ace/trunk/ace-tageditor/pom.xml Mon Apr 23 12:15:01 2012
@@ -65,6 +65,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.client.repository.api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
             <artifactId>org.apache.ace.webui.vaadin</artifactId>
         </dependency>
         <dependency>

Modified: ace/trunk/ace-target-devgateway/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devgateway/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devgateway/pom.xml (original)
+++ ace/trunk/ace-target-devgateway/pom.xml Mon Apr 23 12:15:01 2012
@@ -186,6 +186,11 @@
             <artifactId>org.apache.ace.deployment.task</artifactId>
             <scope>runtime</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+            <scope>runtime</scope>
+        </dependency>
     </dependencies>
 
 </project>

Modified: ace/trunk/ace-target-devserver/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/pom.xml (original)
+++ ace/trunk/ace-target-devserver/pom.xml Mon Apr 23 12:15:01 2012
@@ -174,6 +174,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
             <artifactId>org.apache.ace.authentication</artifactId>
             <scope>runtime</scope>
         </dependency>

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.client.rest.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.client.rest.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.client.rest.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.client.rest.cfg Mon Apr 23 12:15:01 2012
@@ -1 +1,2 @@
 org.apache.ace.server.servlet.endpoint=/client
+authentication.enabled=false

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.provider.repositorybased.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.provider.repositorybased.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.provider.repositorybased.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.provider.repositorybased.cfg Mon Apr 23 12:15:01 2012
@@ -1,3 +1,3 @@
-url=http://localhost:8080/repository
-name=deployment
-customer=apache
+url = http://localhost:8080/repository
+name = deployment
+customer = apache

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.servlet.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.servlet.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.servlet.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.deployment.servlet.cfg Mon Apr 23 12:15:01 2012
@@ -1 +1,2 @@
 org.apache.ace.server.servlet.endpoint=/deployment
+authentication.enabled = false

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.obr.servlet.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.obr.servlet.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.obr.servlet.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.obr.servlet.cfg Mon Apr 23 12:15:01 2012
@@ -1 +1,2 @@
-org.apache.ace.server.servlet.endpoint=/obr
\ No newline at end of file
+org.apache.ace.server.servlet.endpoint=/obr
+authentication.enabled = false

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryReplicationServlet.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryReplicationServlet.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryReplicationServlet.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryReplicationServlet.cfg Mon Apr 23 12:15:01 2012
@@ -1 +1,2 @@
 org.apache.ace.server.servlet.endpoint=/replication
+authentication.enabled = false

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryServlet.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryServlet.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryServlet.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.repository.servlet.RepositoryServlet.cfg Mon Apr 23 12:15:01 2012
@@ -1 +1,2 @@
 org.apache.ace.server.servlet.endpoint=/repository
+authentication.enabled = false

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.server.log.servlet.factory/auditlog.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.server.log.servlet.factory/auditlog.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.server.log.servlet.factory/auditlog.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.server.log.servlet.factory/auditlog.cfg Mon Apr 23 12:15:01 2012
@@ -1,2 +1,3 @@
-name=auditlog
 org.apache.ace.server.servlet.endpoint=/auditlog
+name = auditlog
+authentication.enabled = false

Modified: ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.webui.vaadin.cfg
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.webui.vaadin.cfg?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.webui.vaadin.cfg (original)
+++ ace/trunk/ace-target-devserver/src/main/resources/conf/org.apache.ace.webui.vaadin.cfg Mon Apr 23 12:15:01 2012
@@ -1,3 +1,10 @@
-org.apache.ace.server.servlet.endpoint=/ace
-aceHost = http://localhost:8080/
-obrUrl = http://localhost:8080/obr/
\ No newline at end of file
+# The endpoint of the Vaadin UI
+org.apache.ace.server.servlet.endpoint = /ace
+# Vaadin UI settings
+ui.authentication.enabled = true
+#ui.authentication.user.name = d
+#ui.authentication.user.password = f
+# ACE MS settings
+ace.host = http://localhost:8080/
+# OBR settings
+obr.url = http://localhost:8080/obr/

Modified: ace/trunk/ace-target-mgmt-ui/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-target-mgmt-ui/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-target-mgmt-ui/pom.xml (original)
+++ ace/trunk/ace-target-mgmt-ui/pom.xml Mon Apr 23 12:15:01 2012
@@ -55,6 +55,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.client.repository.api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
             <artifactId>org.apache.ace.webui.vaadin</artifactId>
         </dependency>
         <dependency>

Modified: ace/trunk/ace-webui-vaadin/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/pom.xml (original)
+++ ace/trunk/ace-webui-vaadin/pom.xml Mon Apr 23 12:15:01 2012
@@ -88,6 +88,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.ace</groupId>
+            <artifactId>org.apache.ace.connectionfactory</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ace</groupId>
             <artifactId>org.apache.ace.authentication.api</artifactId>
         </dependency>
         <dependency>

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AddArtifactWindow.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AddArtifactWindow.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AddArtifactWindow.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AddArtifactWindow.java Mon Apr 23 12:15:01 2012
@@ -287,6 +287,7 @@ abstract class AddArtifactWindow extends
     private final List<File> m_uploadedArtifacts = new ArrayList<File>();
     private final Button m_searchButton;
     private final Button m_closeButton;
+    private final Table m_artifactsTable;
 
     /**
      * Creates a new {@link AddArtifactWindow} instance.
@@ -303,10 +304,10 @@ abstract class AddArtifactWindow extends
         setModal(true);
         setWidth("50em");
 
-        final Table artifacts = new ArtifactTable();
-        artifacts.setCaption("Artifacts in repository");
+        m_artifactsTable = new ArtifactTable();
+        m_artifactsTable.setCaption("Artifacts in repository");
 
-        final IndexedContainer dataSource = (IndexedContainer) artifacts.getContainerDataSource();
+        final IndexedContainer dataSource = (IndexedContainer) m_artifactsTable.getContainerDataSource();
 
         final Table uploadedArtifacts = new ArtifactTable();
         uploadedArtifacts.setCaption("Uploaded artifacts");
@@ -385,7 +386,7 @@ abstract class AddArtifactWindow extends
         m_closeButton = new Button("Add", new ClickListener() {
             public void buttonClick(ClickEvent event) {
                 // Import all "local" (existing) bundles...
-                importLocalBundles(artifacts);
+                importLocalBundles(m_artifactsTable);
                 // Import all "remote" (non existing) bundles...
                 importRemoteBundles(m_uploadedArtifacts);
 
@@ -405,7 +406,7 @@ abstract class AddArtifactWindow extends
         layout.setSpacing(true);
 
         layout.addComponent(searchBar);
-        layout.addComponent(artifacts);
+        layout.addComponent(m_artifactsTable);
         layout.addComponent(uploadArtifact);
         layout.addComponent(finalUploadedArtifacts);
         // The components added to the window are actually added to the window's
@@ -413,14 +414,6 @@ abstract class AddArtifactWindow extends
         layout.addComponent(m_closeButton);
         layout.setComponentAlignment(m_closeButton, Alignment.MIDDLE_RIGHT);
 
-        try {
-            getBundles(artifacts);
-        }
-        catch (Exception e) {
-            showErrorNotification("Failed to retrieve OBR repository!", "Reason: <br/>" + e.getMessage());
-            logError("Failed to retrieve OBR repository!", e);
-        }
-
         searchField.focus();
     }
 
@@ -440,6 +433,25 @@ abstract class AddArtifactWindow extends
             return namedItem.getTextContent();
         }
     }
+    
+    /**
+     * Shows this dialog on the parent window.
+     * 
+     * @param parent the parent for this window, cannot be <code>null</code>.
+     */
+    public final void showWindow(Window parent) {
+        try {
+            // Fill the artifacts table with the data from the OBR...
+            getBundles(m_artifactsTable);
+            
+            parent.addWindow(this);
+        }
+        catch (Exception e) {
+            // We've not yet added this window to the given parent, so we cannot use #showErrorNotification here...
+            parent.showNotification("Failed to retrieve OBR repository!", "Reason: <br/>" + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+            logError("Failed to retrieve OBR repository!", e);
+        }
+    }
 
     /**
      * Closes this window.
@@ -556,6 +568,12 @@ abstract class AddArtifactWindow extends
      * @return the log service.
      */
     protected abstract LogService getLogger();
+    
+    /**
+     * @param url the URL to connect to, cannot be <code>null</code>.
+     * @return a valid {@link URLConnection} instance, never <code>null</code>.
+     */
+    protected abstract URLConnection openConnection(URL url) throws IOException;
 
     /**
      * Converts a given artifact object to an OBR entry.
@@ -565,8 +583,7 @@ abstract class AddArtifactWindow extends
      * @return an OBR entry instance, never <code>null</code>.
      */
     private OBREntry convertToOBREntry(ArtifactObject artifactObject, String artifactURL) {
-        return new OBREntry(artifactObject.getName(), artifactObject.getAttribute(BundleHelper.KEY_VERSION), new File(
-            artifactURL).getName());
+        return new OBREntry(artifactObject.getName(), artifactObject.getAttribute(BundleHelper.KEY_VERSION), new File(artifactURL).getName());
     }
 
     /**
@@ -698,9 +715,10 @@ abstract class AddArtifactWindow extends
         InputStream input = null;
         NodeList resources = null;
         try {
-            URLConnection connection = url.openConnection();
+            URLConnection connection = openConnection(url);
             // We always want the newest repository.xml file.
             connection.setUseCaches(false);
+
             input = connection.getInputStream();
 
             try {

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinClient.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinClient.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinClient.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinClient.java Mon Apr 23 12:15:01 2012
@@ -20,7 +20,9 @@ package org.apache.ace.webui.vaadin;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLConnection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,6 +51,7 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.repository.FeatureRepository;
 import org.apache.ace.client.repository.stateful.StatefulTargetObject;
 import org.apache.ace.client.repository.stateful.StatefulTargetRepository;
+import org.apache.ace.connectionfactory.ConnectionFactory;
 import org.apache.ace.test.utils.FileUtils;
 import org.apache.ace.webui.NamedObject;
 import org.apache.ace.webui.UIExtensionFactory;
@@ -129,6 +132,7 @@ public class VaadinClient extends com.va
     private volatile Distribution2TargetAssociationRepository m_distribution2targetAssociationRepository;
     private volatile RepositoryAdmin m_admin;
     private volatile LogService m_log;
+    private volatile ConnectionFactory m_connectionFactory;
 
     private String m_sessionID;
     private ArtifactsPanel m_artifactsPanel;
@@ -144,8 +148,10 @@ public class VaadinClient extends com.va
     private Button m_targetToolbar;
     private Window m_mainWindow;
 
-    private final URL m_aceHost;
     private final URL m_obrUrl;
+    private final URL m_repository;
+    private final boolean m_useAuth;
+    private final String m_userName;
 
     private final Associations m_associations = new Associations();
     private final AtomicBoolean m_dependenciesResolved = new AtomicBoolean(false);
@@ -157,9 +163,28 @@ public class VaadinClient extends com.va
         return SESSION_ID++;
     }
 
-    public VaadinClient(URL aceHost, URL obrUrl) {
-        m_aceHost = aceHost;
+    /**
+     * Creates a new {@link VaadinClient} instance.
+     * 
+     * @param aceHost the hostname where the management service can be reached;
+     * @param obrUrl the URL of the OBR to use;
+     * @param useAuth <code>true</code> to use authentication, <code>false</code> to disable authentication;
+     * @param userName the hardcoded username to use when authentication is disabled.
+     */
+    public VaadinClient(URL aceHost, URL obrUrl, boolean useAuth, String userName) {
+        try {
+            m_repository = new URL(aceHost, endpoint);
+        }
+        catch (MalformedURLException e) {
+            throw new IllegalArgumentException("Need a valid repository URL!", e);
+        }
         m_obrUrl = obrUrl;
+        m_useAuth = useAuth;
+        m_userName = userName;
+
+        if (!m_useAuth && (m_userName == null || "".equals(m_userName.trim()))) {
+            throw new IllegalArgumentException("Need a valid user name when no authentication is used!");
+        }
     }
 
     public void setupDependencies(Component component) {
@@ -168,26 +193,17 @@ public class VaadinClient extends com.va
         dir.mkdir();
         m_sessionDir = dir;
         m_sessionFactory.createSession(m_sessionID);
-        addDependency(component, RepositoryAdmin.class);
-        addDependency(component, DistributionRepository.class);
-        addDependency(component, ArtifactRepository.class);
-        addDependency(component, FeatureRepository.class);
-        addDependency(component, Artifact2FeatureAssociationRepository.class);
-        addDependency(component, Feature2DistributionAssociationRepository.class);
-        addDependency(component, Distribution2TargetAssociationRepository.class);
-        addDependency(component, StatefulTargetRepository.class);
-    }
-
-    // @formatter:off
-    private void addDependency(Component component, Class service) {
-        component.add(m_manager.createServiceDependency()
-            .setService(service, "(" + SessionFactory.SERVICE_SID + "=" + m_sessionID + ")")
-            .setRequired(true)
-            .setInstanceBound(true));
+        addSessionDependency(component, RepositoryAdmin.class);
+        addSessionDependency(component, DistributionRepository.class);
+        addSessionDependency(component, ArtifactRepository.class);
+        addSessionDependency(component, FeatureRepository.class);
+        addSessionDependency(component, Artifact2FeatureAssociationRepository.class);
+        addSessionDependency(component, Feature2DistributionAssociationRepository.class);
+        addSessionDependency(component, Distribution2TargetAssociationRepository.class);
+        addSessionDependency(component, StatefulTargetRepository.class);
+        addDependency(component, ConnectionFactory.class);
     }
 
-    // @formatter:on
-
     public void start() {
         m_log.log(LogService.LOG_INFO, "Starting session #" + m_sessionID);
         m_dependenciesResolved.set(true);
@@ -230,7 +246,8 @@ public class VaadinClient extends com.va
 
         setMainWindow(m_mainWindow);
 
-        showLoginWindow();
+        // Authenticate the user either by showing a login window; or by another means...
+        authenticate();
     }
 
     /**
@@ -238,9 +255,9 @@ public class VaadinClient extends com.va
      */
     private void showLoginWindow() {
         LoginWindow loginWindow = new LoginWindow(m_log, this);
-        
+
         m_mainWindow.addWindow(loginWindow);
-        
+
         loginWindow.center();
     }
 
@@ -350,7 +367,7 @@ public class VaadinClient extends com.va
             protected void associateFromRight(String left, String right) {
                 ArtifactObject artifact = getArtifact(left);
                 // if you drop on a resource processor, and try to get it, you
-                // will get null because you cannot associate anything with a 
+                // will get null because you cannot associate anything with a
                 // resource processor so we check for null here
                 if (artifact != null) {
                     if (m_dynamicRelations) {
@@ -369,7 +386,7 @@ public class VaadinClient extends com.va
             protected void associateFromLeft(String left, String right) {
                 ArtifactObject artifact = getArtifact(left);
                 // if you drop on a resource processor, and try to get it, you
-                // will get null because you cannot associate anything with a 
+                // will get null because you cannot associate anything with a
                 // resource processor so we check for null here
                 if (artifact != null) {
                     if (m_dynamicRelations) {
@@ -423,7 +440,8 @@ public class VaadinClient extends com.va
         addListener(m_artifactsPanel, ArtifactObject.TOPIC_ALL, RepositoryAdmin.TOPIC_STATUSCHANGED);
         addListener(m_featuresPanel, FeatureObject.TOPIC_ALL, RepositoryAdmin.TOPIC_STATUSCHANGED);
         addListener(m_distributionsPanel, DistributionObject.TOPIC_ALL, RepositoryAdmin.TOPIC_STATUSCHANGED);
-        addListener(m_targetsPanel, StatefulTargetObject.TOPIC_ALL, TargetObject.TOPIC_ALL, RepositoryAdmin.TOPIC_STATUSCHANGED);
+        addListener(m_targetsPanel, StatefulTargetObject.TOPIC_ALL, TargetObject.TOPIC_ALL,
+            RepositoryAdmin.TOPIC_STATUSCHANGED);
 
         m_mainWindow.addComponent(m_grid);
     }
@@ -453,31 +471,32 @@ public class VaadinClient extends com.va
      * {@inheritDoc}
      */
     public boolean login(String username, String password) {
-        try {
-            User user = m_authenticationService.authenticate(username, password);
-            if (user == null) {
-                return false;
-            }
+        User user = m_authenticationService.authenticate(username, password);
+        setUser(user);
+        return login(user);
+    }
 
-            RepositoryAdminLoginContext context = m_admin.createLoginContext(user);
+    private void addSessionDependency(Component component, Class service) {
+        component.add(m_manager.createServiceDependency()
+            .setService(service, "(" + SessionFactory.SERVICE_SID + "=" + m_sessionID + ")")
+            .setRequired(true)
+            .setInstanceBound(true));
+    }
 
-            // @formatter:off
-            context.addShopRepository(new URL(m_aceHost, endpoint), customerName, shopRepo, true)
-                .setObrBase(m_obrUrl)
-                .addTargetRepository(new URL(m_aceHost, endpoint), customerName, targetRepo, true)
-                .addDeploymentRepository(new URL(m_aceHost, endpoint), customerName, deployRepo, true);
-            // @formatter:on
-            
-            m_admin.login(context);
-            initGrid(user);
-            m_admin.checkout();
-            
-            return true;
-        }
-        catch (IOException e) {
-            m_log.log(LogService.LOG_WARNING, "Login failed!", e);
-            return false;
-        }
+    private void addDependency(Component component, Class service) {
+        component.add(m_manager.createServiceDependency()
+            .setService(service)
+            .setRequired(true)
+            .setInstanceBound(true));
+    }
+
+    /**
+     * @return <code>true</code> if the login succeeded, <code>false</code> otherwise.
+     */
+    private boolean loginAutomatically() {
+        User user = m_userAdmin.getUser("username", m_userName);
+        setUser(user);
+        return login(user);
     }
 
     private void addListener(final Object implementation, final String... topics) {
@@ -492,8 +511,22 @@ public class VaadinClient extends com.va
         // @formatter:on
     }
 
+    /**
+     * Determines how authentication should take place.
+     */
+    private void authenticate() {
+        if (m_useAuth) {
+            showLoginWindow();
+        }
+        else {
+            // Not using authentication; use fallback scenario...
+            loginAutomatically();
+        }
+    }
+
     private GridLayout createToolbar() {
-        MainActionToolbar mainActionToolbar = new MainActionToolbar() {
+        final boolean showLogoutButton = m_useAuth;
+        MainActionToolbar mainActionToolbar = new MainActionToolbar(showLogoutButton) {
             @Override
             protected RepositoryAdmin getRepositoryAdmin() {
                 return m_admin;
@@ -540,14 +573,15 @@ public class VaadinClient extends com.va
                     protected void onOk(String name, String description) throws Exception {
                         object.setDescription(description);
                     }
-                    
+
                     @Override
                     protected void handleError(Exception e) {
-                        getWindow().showNotification("Failed to edit artifact!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to edit artifact!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
             }
-            
+
             @Override
             protected ArtifactRepository getRepository() {
                 return m_artifactRepository;
@@ -569,14 +603,15 @@ public class VaadinClient extends com.va
                     protected void onOk(String name, String description) throws Exception {
                         object.setDescription(description);
                     }
-                    
+
                     @Override
                     protected void handleError(Exception e) {
-                        getWindow().showNotification("Failed to edit feature!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to edit feature!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
             }
-            
+
             @Override
             protected FeatureRepository getRepository() {
                 return m_featureRepository;
@@ -598,14 +633,15 @@ public class VaadinClient extends com.va
                     protected void onOk(String name, String description) throws Exception {
                         object.setDescription(description);
                     }
-                    
+
                     @Override
                     protected void handleError(Exception e) {
-                        getWindow().showNotification("Failed to edit distribution!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to edit distribution!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
             }
-            
+
             @Override
             protected DistributionRepository getRepository() {
                 return m_distributionRepository;
@@ -627,10 +663,11 @@ public class VaadinClient extends com.va
                     protected void onOk(String name, String description) throws Exception {
                         // Nothing to edit!
                     }
-                    
+
                     @Override
                     protected void handleError(Exception e) {
-                        getWindow().showNotification("Failed to edit target!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to edit target!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
 
                     @Override
@@ -638,7 +675,7 @@ public class VaadinClient extends com.va
                         m_name.setCaption("Identifier");
                         m_name.setReadOnly(true);
                         m_description.setVisible(false);
-                        
+
                         super.initDialog(object, factories);
                     }
                 };
@@ -747,7 +784,8 @@ public class VaadinClient extends com.va
 
                     public void handleError(Exception e) {
                         // ACE-241: notify user when the feature-creation failed!
-                        getWindow().showNotification("Failed to add new feature!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to add new feature!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
                 window.show(getMainWindow());
@@ -773,7 +811,8 @@ public class VaadinClient extends com.va
 
                     public void handleError(Exception e) {
                         // ACE-241: notify user when the distribution-creation failed!
-                        getWindow().showNotification("Failed to add new distribution!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to add new distribution!",
+                            "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
                 window.show(getMainWindow());
@@ -800,7 +839,8 @@ public class VaadinClient extends com.va
 
                     protected void handleError(Exception e) {
                         // ACE-241: notify user when the target-creation failed!
-                        getWindow().showNotification("Failed to add new target!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        getWindow().showNotification("Failed to add new target!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
 
                     @Override
@@ -887,6 +927,11 @@ public class VaadinClient extends com.va
             protected ArtifactRepository getArtifactRepository() {
                 return m_artifactRepository;
             }
+            
+            @Override
+            protected URLConnection openConnection(URL url) throws IOException {
+                return m_connectionFactory.createConnection(url);
+            }
 
             @Override
             protected LogService getLogger() {
@@ -895,6 +940,37 @@ public class VaadinClient extends com.va
         };
 
         // Open the subwindow by adding it to the parent window
-        getMainWindow().addWindow(window);
+        window.showWindow(getMainWindow());
+    }
+
+    /**
+     * Authenticates the given user by creating all dependent services.
+     * 
+     * @param user
+     * @throws IOException in case of I/O problems.
+     */
+    private boolean login(final User user) {
+        try {
+            RepositoryAdminLoginContext context = m_admin.createLoginContext(user);
+            
+            // @formatter:off
+            context.setObrBase(m_obrUrl)
+                .add(context.createShopRepositoryContext()
+                    .setLocation(m_repository).setCustomer(customerName).setName(shopRepo).setWriteable())
+                .add(context.createTargetRepositoryContext()
+                    .setLocation(m_repository).setCustomer(customerName).setName(targetRepo).setWriteable())
+                .add(context.createDeploymentRepositoryContext()
+                    .setLocation(m_repository).setCustomer(customerName).setName(deployRepo).setWriteable());
+            // @formatter:on
+
+            m_admin.login(context);
+            initGrid(user);
+            m_admin.checkout();
+            return true;
+        }
+        catch (Exception e) {
+            m_log.log(LogService.LOG_WARNING, "Login failed!", e);
+            return false;
+        }
     }
 }

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinServlet.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinServlet.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinServlet.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinServlet.java Mon Apr 23 12:15:01 2012
@@ -41,11 +41,19 @@ public class VaadinServlet extends Abstr
     
     public static final String PID = "org.apache.ace.webui.vaadin";
     
-    public static final String ACE_HOST = "aceHost";
-    public static final String OBR_URL = "obrUrl";
+    /** A boolean denoting whether or not authentication is enabled. */
+    private static final String KEY_USE_AUTHENTICATION = "ui.authentication.enabled";
+    /** Name of the user to log in as. */
+    private static final String KEY_USER_NAME = "ui.authentication.user.name";
+    /** A string denoting the host name of the management service. */
+    private static final String KEY_ACE_HOST = "ace.host";
+    /** A string denoting the URL to the management server's OBR. */
+    private static final String KEY_OBR_URL = "obr.url";
 
     private volatile DependencyManager m_manager;
 
+    private volatile boolean m_useAuth;
+    private volatile String m_userName;
     private volatile URL m_aceHost;
     private volatile URL m_obrUrl;
     
@@ -56,7 +64,7 @@ public class VaadinServlet extends Abstr
 
     @Override
     protected Application getNewApplication(HttpServletRequest request)	throws ServletException {
-        Application application = new VaadinClient(m_aceHost, m_obrUrl);
+        Application application = new VaadinClient(m_aceHost, m_obrUrl, m_useAuth, m_userName);
         m_manager.add(m_manager.createComponent()
             .setImplementation(application)
             .setCallbacks("setupDependencies", "start", "stop", "destroyDependencies")
@@ -70,7 +78,7 @@ public class VaadinServlet extends Abstr
             )
             .add(m_manager.createServiceDependency()
                 .setService(AuthenticationService.class)
-                .setRequired(true)
+                .setRequired(m_useAuth)
             )
             .add(m_manager.createServiceDependency()
                 .setService(LogService.class)
@@ -84,28 +92,41 @@ public class VaadinServlet extends Abstr
         if (dictionary != null) {
             URL aceHost;
             try {
-                String aceHostString = (String) dictionary.get(ACE_HOST);
+                String aceHostString = (String) dictionary.get(KEY_ACE_HOST);
                 if (aceHostString == null) {
-                    throw new ConfigurationException(ACE_HOST, "Missing property");
+                    throw new ConfigurationException(KEY_ACE_HOST, "Missing property");
                 }
                 aceHost = new URL(aceHostString);
             }
             catch (MalformedURLException e) {
-                throw new ConfigurationException(ACE_HOST, "Is not a valid URL", e);
+                throw new ConfigurationException(KEY_ACE_HOST, "Is not a valid URL", e);
             }
 
             URL obrUrl;
             try {
-                String obrUrlString = (String) dictionary.get(OBR_URL);
+                String obrUrlString = (String) dictionary.get(KEY_OBR_URL);
                 if (obrUrlString == null) {
-                    throw new ConfigurationException(OBR_URL, "Missing property");
+                    throw new ConfigurationException(KEY_OBR_URL, "Missing property");
                 }
                 obrUrl = new URL(obrUrlString);
             }
             catch (MalformedURLException e) {
-                throw new ConfigurationException(OBR_URL, "Is not a valid URL", e);
+                throw new ConfigurationException(KEY_OBR_URL, "Is not a valid URL", e);
+            }
+
+            String useAuthString = (String) dictionary.get(KEY_USE_AUTHENTICATION);
+            if (useAuthString == null || !("true".equalsIgnoreCase(useAuthString) || "false".equalsIgnoreCase(useAuthString))) {
+                throw new ConfigurationException(KEY_USE_AUTHENTICATION, "Missing or invalid value!");
+            }
+            boolean useAuth = Boolean.parseBoolean(useAuthString);
+
+            String userNameString = (String) dictionary.get(KEY_USER_NAME);
+            if ((userNameString == null) && !useAuth) {
+                throw new ConfigurationException(KEY_USER_NAME, "Missing value; authentication is disabled!");
             }
 
+            m_useAuth = useAuth;
+            m_userName = userNameString;
             m_aceHost = aceHost;
             m_obrUrl = obrUrl;
         }

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/MainActionToolbar.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/MainActionToolbar.java?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/MainActionToolbar.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/MainActionToolbar.java Mon Apr 23 12:15:01 2012
@@ -38,7 +38,7 @@ public abstract class MainActionToolbar 
      * Provides a button listener for the logout button.
      */
     private class LogoutButtonListener implements Button.ClickListener, ConfirmationDialog.Callback {
-        
+
         /**
          * {@inheritDoc}
          */
@@ -46,14 +46,18 @@ public abstract class MainActionToolbar 
             final RepositoryAdmin repoAdmin = getRepositoryAdmin();
             try {
                 if (repoAdmin.isModified() && repoAdmin.isCurrent()) {
-                    getWindow().addWindow(new ConfirmationDialog("Revert changes?", "The repository is changed. Are you sure you want to loose all local changes?", this));
+                    getWindow().addWindow(
+                        new ConfirmationDialog("Revert changes?",
+                            "The repository is changed. Are you sure you want to loose all local changes?", this));
                 }
                 else {
                     logout();
                 }
             }
             catch (IOException e) {
-                getWindow().showNotification("Changes not stored", "Failed to store the changes to the server.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                getWindow().showNotification("Changes not stored",
+                    "Failed to store the changes to the server.<br />Reason: " + e.getMessage(),
+                    Notification.TYPE_ERROR_MESSAGE);
             }
         }
 
@@ -75,7 +79,9 @@ public abstract class MainActionToolbar 
          * @param e the exception to handle.
          */
         private void handleIOException(IOException e) {
-            getWindow().showNotification("Warning", "There were errors during the logout procedure.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+            getWindow().showNotification("Warning",
+                "There were errors during the logout procedure.<br />Reason: " + e.getMessage(),
+                Notification.TYPE_ERROR_MESSAGE);
         }
 
         /**
@@ -102,7 +108,9 @@ public abstract class MainActionToolbar 
             try {
                 if (repoAdmin.isModified()) {
                     // Warn the user about the possible loss of changes...
-                    getWindow().addWindow(new ConfirmationDialog("Retrieve latest changes?", "The repository is changed. Are you sure you want to loose all local changes?", this));
+                    getWindow().addWindow(
+                        new ConfirmationDialog("Retrieve latest changes?",
+                            "The repository is changed. Are you sure you want to loose all local changes?", this));
                 }
                 else {
                     retrieveData();
@@ -131,7 +139,9 @@ public abstract class MainActionToolbar 
          * @param e the exception to handle.
          */
         private void handleIOException(IOException e) {
-            getWindow().showNotification("Retrieve failed", "Failed to retrieve the data from the server.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+            getWindow().showNotification("Retrieve failed",
+                "Failed to retrieve the data from the server.<br />Reason: " + e.getMessage(),
+                Notification.TYPE_ERROR_MESSAGE);
         }
 
         /**
@@ -144,7 +154,7 @@ public abstract class MainActionToolbar 
             doAfterRetrieve();
         }
     }
-    
+
     /**
      * Provides a button listener for the revert button.
      */
@@ -157,11 +167,14 @@ public abstract class MainActionToolbar 
             try {
                 if (getRepositoryAdmin().isModified()) {
                     // Revert all changes...
-                    getWindow().addWindow(new ConfirmationDialog("Revert changes?", "Are you sure you want to overwrite all local changes?", this));
+                    getWindow().addWindow(
+                        new ConfirmationDialog("Revert changes?",
+                            "Are you sure you want to overwrite all local changes?", this));
                 }
                 else {
                     // Nothing to revert...
-                    getWindow().showNotification("Nothing to revert", "There are no local changes that need to be reverted.", Notification.TYPE_WARNING_MESSAGE);
+                    getWindow().showNotification("Nothing to revert",
+                        "There are no local changes that need to be reverted.", Notification.TYPE_WARNING_MESSAGE);
                 }
             }
             catch (IOException e) {
@@ -187,7 +200,8 @@ public abstract class MainActionToolbar 
          * @param e the exception to handle.
          */
         private void handleIOException(IOException e) {
-            getWindow().showNotification("Revert failed", "Failed to revert your changes.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+            getWindow().showNotification("Revert failed",
+                "Failed to revert your changes.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
         }
 
         /**
@@ -217,15 +231,21 @@ public abstract class MainActionToolbar 
                         commitChanges();
                     }
                     else {
-                        getWindow().showNotification("Changes not stored", "Unable to store your changes; repository changed!", Notification.TYPE_WARNING_MESSAGE);
+                        getWindow().showNotification("Changes not stored",
+                            "Unable to store your changes; repository changed!", Notification.TYPE_WARNING_MESSAGE);
                     }
                 }
                 else {
-                    getWindow().showNotification("Nothing to store", "There are no changes that can be stored to the repository.", Notification.TYPE_WARNING_MESSAGE);
+                    getWindow()
+                        .showNotification("Nothing to store",
+                            "There are no changes that can be stored to the repository.",
+                            Notification.TYPE_WARNING_MESSAGE);
                 }
             }
             catch (IOException e) {
-                getWindow().showNotification("Changes not stored", "Failed to store the changes to the server.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                getWindow().showNotification("Changes not stored",
+                    "Failed to store the changes to the server.<br />Reason: " + e.getMessage(),
+                    Notification.TYPE_ERROR_MESSAGE);
             }
         }
 
@@ -240,6 +260,8 @@ public abstract class MainActionToolbar 
         }
     }
 
+    private final boolean m_showLogoutButton;
+
     private Button m_retrieveButton;
     private Button m_storeButton;
     private Button m_revertButton;
@@ -247,10 +269,14 @@ public abstract class MainActionToolbar 
 
     /**
      * Creates a new {@link MainActionToolbar} instance.
+     * 
+     * @param showLogoutButton <code>true</code> if a logout button should be shown, <code>false</code> if it should not.
      */
-    public MainActionToolbar() {
+    public MainActionToolbar(boolean showLogoutButton) {
         super(5, 1);
 
+        m_showLogoutButton = showLogoutButton;
+
         setWidth("100%");
         setSpacing(true);
 
@@ -262,14 +288,17 @@ public abstract class MainActionToolbar 
      */
     public void handleEvent(org.osgi.service.event.Event event) {
         String topic = event.getTopic();
-        if (RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic) || RepositoryAdmin.TOPIC_REFRESH.equals(topic) || RepositoryAdmin.TOPIC_LOGIN.equals(topic)) {
+        if (RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic) || RepositoryAdmin.TOPIC_REFRESH.equals(topic)
+            || RepositoryAdmin.TOPIC_LOGIN.equals(topic)) {
 
             boolean modified = false;
             try {
                 modified = getRepositoryAdmin().isModified();
             }
             catch (IOException e) {
-                getWindow().showNotification("Communication failed!", "Failed to communicate with the server.<br />Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                getWindow().showNotification("Communication failed!",
+                    "Failed to communicate with the server.<br />Reason: " + e.getMessage(),
+                    Notification.TYPE_ERROR_MESSAGE);
             }
 
             m_storeButton.setEnabled(modified);
@@ -297,7 +326,7 @@ public abstract class MainActionToolbar 
      * @throws IOException
      */
     protected abstract void doAfterRetrieve() throws IOException;
-    
+
     /**
      * Called after a revert has taken place, allows additional UI-updates to be performed.
      * 
@@ -325,15 +354,17 @@ public abstract class MainActionToolbar 
         m_revertButton = new Button("Revert");
         m_revertButton.addListener(new RevertButtonListener());
         addComponent(m_revertButton, 2, 0);
-        
+
         Label spacer = new Label(" ");
         addComponent(spacer, 3, 0);
-        
+
         m_logoutButton = new Button("Logout");
         m_logoutButton.addListener(new LogoutButtonListener());
-        addComponent(m_logoutButton, 4, 0);
+        if (m_showLogoutButton) {
+            addComponent(m_logoutButton, 4, 0);
+        }
 
-        // Ensure the spacer gets all the excessive room, causing the logout 
+        // Ensure the spacer gets all the excessive room, causing the logout
         // button to appear at the right side of the screen....
         setColumnExpandRatio(3, 5);
     }

Modified: ace/trunk/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/pom.xml (original)
+++ ace/trunk/pom.xml Mon Apr 23 12:15:01 2012
@@ -74,6 +74,8 @@
         <module>ace-client-repository-helper-user</module>
         <module>ace-client-automation</module>
 
+        <module>ace-connectionfactory</module>
+
         <module>ace-client-rest</module>
 
         <module>ace-deployment-provider-api</module>
@@ -106,7 +108,9 @@
         <module>ace-resourceprocessor-useradmin</module>
         <module>ace-configurator-useradmin-task</module>
 
+<!-- XXX no longer in use?
         <module>ace-client-repository-useradmin</module>
+-->
 
         <module>ace-server-action</module>
         <module>ace-server-action-popupmessage</module>

Modified: ace/trunk/pom/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/pom/pom.xml?rev=1329199&r1=1329198&r2=1329199&view=diff
==============================================================================
--- ace/trunk/pom/pom.xml (original)
+++ ace/trunk/pom/pom.xml Mon Apr 23 12:15:01 2012
@@ -501,6 +501,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.ace</groupId>
+                <artifactId>org.apache.ace.connectionfactory</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.ace</groupId>
                 <artifactId>org.apache.ace.httplistener</artifactId>
                 <version>${project.version}</version>
             </dependency>