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/06 14:02:14 UTC

svn commit: r1310292 - in /ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin: ./ component/

Author: jawi
Date: Fri Apr  6 12:02:14 2012
New Revision: 1310292

URL: http://svn.apache.org/viewvc?rev=1310292&view=rev
Log:
ACE-248: some additional code cleanups.

Added:
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AssociationRemover.java   (with props)
Removed:
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/RemoveAssociationHandler.java
Modified:
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/VaadinClient.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/ArtifactsPanel.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/BaseObjectPanel.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/DistributionsPanel.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/FeaturesPanel.java
    ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/TargetsPanel.java

Added: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AssociationRemover.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AssociationRemover.java?rev=1310292&view=auto
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AssociationRemover.java (added)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AssociationRemover.java Fri Apr  6 12:02:14 2012
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ace.webui.vaadin;
+
+import org.apache.ace.client.repository.object.Artifact2FeatureAssociation;
+import org.apache.ace.client.repository.object.Distribution2TargetAssociation;
+import org.apache.ace.client.repository.object.Feature2DistributionAssociation;
+
+/**
+ * Defines methods for removing associations.
+ */
+public interface AssociationRemover {
+
+    /**
+     * @param association
+     */
+    void removeAssociation(Artifact2FeatureAssociation association);
+
+    /**
+     * @param association
+     */
+    void removeAssociation(Feature2DistributionAssociation association);
+    
+    /**
+     * @param association
+     */
+    void removeAssociation(Distribution2TargetAssociation association);
+
+}

Propchange: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/AssociationRemover.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1310292&r1=1310291&r2=1310292&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 Fri Apr  6 12:02:14 2012
@@ -98,12 +98,12 @@ import com.vaadin.ui.Window;
  - Add buttons to create new items in all of the tables (done for those that make sense)
  */
 @SuppressWarnings("serial")
-public class VaadinClient extends com.vaadin.Application {
+public class VaadinClient extends com.vaadin.Application implements AssociationRemover {
 
     private static final long serialVersionUID = 1L;
-    
+
     private static long SESSION_ID = 12345;
-    
+
     private static String targetRepo = "target";
     private static String shopRepo = "shop";
     private static String deployRepo = "deployment";
@@ -123,7 +123,7 @@ public class VaadinClient extends com.va
     private volatile Distribution2TargetAssociationRepository m_distribution2targetAssociationRepository;
     private volatile RepositoryAdmin m_admin;
     private volatile LogService m_log;
-    
+
     private String m_sessionID;
     private ArtifactsPanel m_artifactsPanel;
     private FeaturesPanel m_featuresPanel;
@@ -140,7 +140,7 @@ public class VaadinClient extends com.va
 
     private final URL m_aceHost;
     private final URL m_obrUrl;
-    
+
     private final Associations m_associations = new Associations();
     private final AtomicBoolean m_dependenciesResolved = new AtomicBoolean(false);
 
@@ -199,28 +199,29 @@ public class VaadinClient extends com.va
 
     public void init() {
         setTheme("ace");
-        
+
         if (!m_dependenciesResolved.get()) {
             final Window message = new Window("Apache ACE");
             message.getContent().setSizeFull();
             setMainWindow(message);
-            
-            Label richText = new Label(
+
+            Label richText =
+                new Label(
                     "<h1>Apache ACE User Interface</h1>"
                         + "<p>Due to missing component dependencies on the server, probably due to misconfiguration, "
                         + "the user interface cannot be properly started. Please contact your server administrator. "
                         + "You can retry accessing the user interface by <a href=\"?restartApplication\">following this link</a>.</p>");
             richText.setContentMode(Label.CONTENT_XHTML);
-            
+
             // TODO we might want to add some more details here as to what's
             // missing on the other hand, the user probably can't fix that anyway
             message.addComponent(richText);
             return;
         }
-        
+
         m_mainWindow = new Window("Apache ACE");
         m_mainWindow.getContent().setSizeFull();
-        
+
         setMainWindow(m_mainWindow);
 
         showLoginWindow();
@@ -253,7 +254,7 @@ public class VaadinClient extends com.va
 
         m_grid.addComponent(createToolbar(), 0, 0, count - 1, 0);
 
-        m_artifactsPanel = createArtifactsPanel(m_mainWindow);
+        m_artifactsPanel = createArtifactsPanel();
 
         m_artifactToolbar = new HorizontalLayout();
         m_artifactToolbar.addComponent(createAddArtifactButton());
@@ -275,7 +276,7 @@ public class VaadinClient extends com.va
             count++;
         }
 
-        m_featuresPanel = createFeaturesPanel(m_mainWindow);
+        m_featuresPanel = createFeaturesPanel();
         m_featureToolbar = createAddFeatureButton(m_mainWindow);
 
         if (auth.hasRole("viewFeature")) {
@@ -284,7 +285,7 @@ public class VaadinClient extends com.va
             count++;
         }
 
-        m_distributionsPanel = createDistributionsPanel(m_mainWindow);
+        m_distributionsPanel = createDistributionsPanel();
         m_distributionToolbar = createAddDistributionButton(m_mainWindow);
 
         if (auth.hasRole("viewDistribution")) {
@@ -293,24 +294,24 @@ public class VaadinClient extends com.va
             count++;
         }
 
-        m_targetsPanel = createTargetsPanel(m_mainWindow);
+        m_targetsPanel = createTargetsPanel();
         m_targetToolbar = createAddTargetButton(m_mainWindow);
 
         if (auth.hasRole("viewTarget")) {
             m_grid.addComponent(m_targetsPanel, count, 2);
             m_grid.addComponent(m_targetToolbar, count, 1);
         }
-        
+
         // Wire up all panels so they have the correct associations...
         m_artifactsPanel.setLeftTable(null);
         m_artifactsPanel.setRightTable(m_featuresPanel);
-        
+
         m_featuresPanel.setLeftTable(m_artifactsPanel);
         m_featuresPanel.setRightTable(m_distributionsPanel);
-        
+
         m_distributionsPanel.setLeftTable(m_featuresPanel);
         m_distributionsPanel.setRightTable(m_targetsPanel);
-        
+
         m_targetsPanel.setLeftTable(m_distributionsPanel);
         m_targetsPanel.setRightTable(null);
 
@@ -319,7 +320,7 @@ public class VaadinClient extends com.va
         m_progress = new ProgressIndicator(0f);
         m_progress.setStyleName("invisible");
         m_progress.setPollingInterval(500);
-        
+
         m_grid.addComponent(m_progress, 0, 3);
 
         m_artifactsPanel.addListener(m_associations.createSelectionListener(m_artifactsPanel, m_artifactRepository,
@@ -328,9 +329,10 @@ public class VaadinClient extends com.va
         m_featuresPanel.addListener(m_associations.createSelectionListener(m_featuresPanel, m_featureRepository,
             new Class[] { ArtifactObject.class }, new Class[] { DistributionObject.class, TargetObject.class },
             new Table[] { m_artifactsPanel, m_distributionsPanel, m_targetsPanel }));
-        m_distributionsPanel.addListener(m_associations.createSelectionListener(m_distributionsPanel, m_distributionRepository,
-                new Class[] { FeatureObject.class, ArtifactObject.class }, new Class[] { TargetObject.class },
-                new Table[] { m_artifactsPanel, m_featuresPanel, m_targetsPanel }));
+        m_distributionsPanel.addListener(m_associations.createSelectionListener(m_distributionsPanel,
+            m_distributionRepository,
+            new Class[] { FeatureObject.class, ArtifactObject.class }, new Class[] { TargetObject.class },
+            new Table[] { m_artifactsPanel, m_featuresPanel, m_targetsPanel }));
         m_targetsPanel.addListener(m_associations.createSelectionListener(m_targetsPanel, m_statefulTargetRepository,
             new Class[] { DistributionObject.class, FeatureObject.class, ArtifactObject.class }, new Class[] {},
             new Table[] { m_artifactsPanel, m_featuresPanel, m_distributionsPanel }));
@@ -426,6 +428,27 @@ public class VaadinClient extends com.va
         m_mainWindow.addComponent(m_grid);
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public void removeAssociation(Artifact2FeatureAssociation association) {
+        m_artifact2featureAssociationRepository.remove(association);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeAssociation(Distribution2TargetAssociation association) {
+        m_distribution2targetAssociationRepository.remove(association);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void removeAssociation(Feature2DistributionAssociation association) {
+        m_feature2distributionAssociationRepository.remove(association);
+    }
+
     boolean login(String username, String password) {
         try {
             User user = m_userAdmin.getUser("username", username);
@@ -487,7 +510,7 @@ public class VaadinClient extends com.va
             protected void doAfterCommit() throws IOException {
                 updateTableData();
             }
-            
+
             @Override
             protected void doAfterLogout() throws IOException {
                 // Close the application and reload the main window...
@@ -505,91 +528,59 @@ public class VaadinClient extends com.va
         return mainActionToolbar;
     }
 
-    private ArtifactsPanel createArtifactsPanel(Window main) {
-        return new ArtifactsPanel(m_associations) {
-
+    private ArtifactsPanel createArtifactsPanel() {
+        return new ArtifactsPanel(m_associations, this) {
             @Override
             protected ArtifactRepository getRepository() {
                 return m_artifactRepository;
             }
-            
+
             @Override
             protected RepositoryAdmin getRepositoryAdmin() {
                 return m_admin;
             }
-            
-            @Override
-            protected void removeAssociation(Artifact2FeatureAssociation association) {
-                m_artifact2featureAssociationRepository.remove(association);
-            }
         };
     }
 
-    private FeaturesPanel createFeaturesPanel(Window main) {
-        return new FeaturesPanel(m_associations) {
+    private FeaturesPanel createFeaturesPanel() {
+        return new FeaturesPanel(m_associations, this) {
             @Override
             protected FeatureRepository getRepository() {
                 return m_featureRepository;
             }
-            
+
             @Override
             protected RepositoryAdmin getRepositoryAdmin() {
                 return m_admin;
             }
-            
-            @Override
-            protected void removeAssocation(Artifact2FeatureAssociation association) {
-                m_artifact2featureAssociationRepository.remove(association);
-            }
-            
-            @Override
-            protected void removeAssocation(Feature2DistributionAssociation association) {
-                m_feature2distributionAssociationRepository.remove(association);
-            }
         };
     }
 
-    private DistributionsPanel createDistributionsPanel(Window main) {
-        return new DistributionsPanel(m_associations) {
-
+    private DistributionsPanel createDistributionsPanel() {
+        return new DistributionsPanel(m_associations, this) {
             @Override
             protected DistributionRepository getRepository() {
                 return m_distributionRepository;
             }
-            
+
             @Override
             protected RepositoryAdmin getRepositoryAdmin() {
                 return m_admin;
             }
-            
-            @Override
-            protected void removeAssocation(Distribution2TargetAssociation association) {
-                m_distribution2targetAssociationRepository.remove(association);
-            }
-            
-            @Override
-            protected void removeAssocation(Feature2DistributionAssociation association) {
-                m_feature2distributionAssociationRepository.remove(association);                
-            }
         };
     }
 
-    private TargetsPanel createTargetsPanel(Window main) {
-        return new TargetsPanel(m_associations) {
+    private TargetsPanel createTargetsPanel() {
+        return new TargetsPanel(m_associations, this) {
             @Override
             protected StatefulTargetRepository getRepository() {
                 return m_statefulTargetRepository;
             }
-            
+
             @Override
             protected RepositoryAdmin getRepositoryAdmin() {
                 return m_admin;
             }
-            
-            @Override
-            protected void removeAssocation(Distribution2TargetAssociation association) {
-                m_distribution2targetAssociationRepository.remove(association);
-            }
         };
     }
 
@@ -609,7 +600,8 @@ public class VaadinClient extends com.va
                 TableTransferable tt = (TableTransferable) transferable;
                 Object fromItemId = tt.getItemId();
                 // get the active selection, but only if we drag from the same table
-                Set<?> selection = m_associations.isActiveTable(tt.getSourceComponent()) ? m_associations.getActiveSelection() : null;
+                Set<?> selection =
+                    m_associations.isActiveTable(tt.getSourceComponent()) ? m_associations.getActiveSelection() : null;
                 if (targetDetails instanceof AbstractSelectTargetDetails) {
                     AbstractSelectTargetDetails ttd = (AbstractSelectTargetDetails) targetDetails;
                     Object toItemId = ttd.getItemIdOver();
@@ -633,8 +625,8 @@ public class VaadinClient extends com.va
                             associateFromRight((String) toItemId, (String) fromItemId);
                         }
                     }
-                    // TODO add to highlighting (it's probably easiest to 
-                    // recalculate the whole set of related and associated 
+                    // TODO add to highlighting (it's probably easiest to
+                    // recalculate the whole set of related and associated
                     // items here, see SelectionListener, or to manually figure
                     // out the changes in all cases
                 }
@@ -681,10 +673,11 @@ public class VaadinClient extends com.va
                     public void onOk(String name, String description) {
                         createFeature(name, description);
                     }
-                    
+
                     public void handleError(Exception e) {
                         // ACE-241: notify user when the feature-creation failed!
-                        main.showNotification("Failed to add new feature!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        main.showNotification("Failed to add new feature!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
                 addFeatureWindow.show(main);
@@ -708,10 +701,11 @@ public class VaadinClient extends com.va
                     public void onOk(String name, String description) {
                         createDistribution(name, description);
                     }
-                    
+
                     public void handleError(Exception e) {
                         // ACE-241: notify user when the distribution-creation failed!
-                        main.showNotification("Failed to add new distribution!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        main.showNotification("Failed to add new distribution!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
                 addDistributionWindow.show(main);
@@ -736,10 +730,11 @@ public class VaadinClient extends com.va
                     public void onOk(String id, String description) {
                         createTarget(id, description);
                     }
-                    
+
                     public void handleError(Exception e) {
                         // ACE-241: notify user when the target-creation failed!
-                        main.showNotification("Failed to add new target!", "<br/>Reason: " + e.getMessage(), Notification.TYPE_ERROR_MESSAGE);
+                        main.showNotification("Failed to add new target!", "<br/>Reason: " + e.getMessage(),
+                            Notification.TYPE_ERROR_MESSAGE);
                     }
                 };
                 addTargetWindow.show(main);
@@ -814,7 +809,7 @@ public class VaadinClient extends com.va
         // when the session times out
         // TODO: clean up the ace client session?
     }
-     
+
     private void showAddArtifactDialog() {
         final AddArtifactWindow featureWindow = new AddArtifactWindow(m_sessionDir, m_obrUrl) {
             @Override
@@ -827,7 +822,7 @@ public class VaadinClient extends com.va
                 return m_log;
             }
         };
-        
+
         if (featureWindow.getParent() != null) {
             // window is already showing
             getMainWindow().showNotification("Window is already open");

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/ArtifactsPanel.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/ArtifactsPanel.java?rev=1310292&r1=1310291&r2=1310292&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/ArtifactsPanel.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/ArtifactsPanel.java Fri Apr  6 12:02:14 2012
@@ -28,43 +28,42 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.object.FeatureObject;
 import org.apache.ace.client.repository.repository.ArtifactRepository;
 import org.apache.ace.webui.UIExtensionFactory;
+import org.apache.ace.webui.vaadin.AssociationRemover;
 import org.apache.ace.webui.vaadin.Associations;
 
 import com.vaadin.data.Item;
 
 /**
- *
+ * Provides an object panel for displaying artifacts.
  */
 public abstract class ArtifactsPanel extends BaseObjectPanel<ArtifactObject, ArtifactRepository> {
 
     /**
-     * @param associations
+     * Creates a new {@link ArtifactsPanel} instance.
+     * 
+     * @param associations the assocation-holder object;
+     * @param associationRemover the helper for removing associations.
      */
-    public ArtifactsPanel(Associations associations) {
-        super(associations, "Artifact", UIExtensionFactory.EXTENSION_POINT_VALUE_ARTIFACT, true);
+    public ArtifactsPanel(Associations associations, AssociationRemover associationRemover) {
+        super(associations, associationRemover, "Artifact", UIExtensionFactory.EXTENSION_POINT_VALUE_ARTIFACT, true);
     }
 
     /**
      * {@inheritDoc}
      */
-    protected void add(ArtifactObject artifact) {
-        String resourceProcessorPID = artifact.getAttribute(BundleHelper.KEY_RESOURCE_PROCESSOR_PID);
-        if (resourceProcessorPID != null) {
-            // if it's a resource processor we don't add it to our list, as
-            // resource processors don't show up there (you can query for them
-            // separately)
-            return;
-        }
-        Item item = addItem(artifact.getDefinition());
-        if (item != null) {
-            populateItem(artifact, item);
+    @Override
+    protected boolean doRemoveRightSideAssociation(ArtifactObject object, RepositoryObject other) {
+        List<Artifact2FeatureAssociation> associations = object.getAssociationsWith((FeatureObject) other);
+        for (Artifact2FeatureAssociation association : associations) {
+            m_associationRemover.removeAssociation(association);
         }
+        return true;
     }
 
     /**
      * {@inheritDoc}
      */
-    protected void doHandleEvent(String topic, ArtifactObject artifact, org.osgi.service.event.Event event) {
+    protected void handleEvent(String topic, ArtifactObject artifact, org.osgi.service.event.Event event) {
         if (ArtifactObject.TOPIC_ADDED.equals(topic)) {
             add(artifact);
         }
@@ -80,30 +79,10 @@ public abstract class ArtifactsPanel ext
      * {@inheritDoc}
      */
     @Override
-    protected boolean doRemoveLeftSideAssociation(ArtifactObject object, RepositoryObject other) {
-        return false;
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected boolean doRemoveRightSideAssociation(ArtifactObject object, RepositoryObject other) {
-        List<Artifact2FeatureAssociation> associations = object.getAssociationsWith((FeatureObject) other);
-        for (Artifact2FeatureAssociation association : associations) {
-            removeAssociation(association);
-        }
-        return true;
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     protected boolean isSupportedEntity(RepositoryObject entity) {
-        return entity instanceof ArtifactObject;
+        return (entity instanceof ArtifactObject) && !isResourceProcessor((ArtifactObject) entity);
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -116,7 +95,12 @@ public abstract class ArtifactsPanel ext
     }
 
     /**
-     * @param association
+     * Returns whether or not the given artifact is actually a resource processor.
+     * 
+     * @param artifact the artifact to test, cannot be <code>null</code>.
+     * @return <code>true</code> if the given artifact is a resource processor, <code>false</code> otherwise.
      */
-    protected abstract void removeAssociation(Artifact2FeatureAssociation association);
+    private boolean isResourceProcessor(ArtifactObject artifact) {
+        return artifact.getAttribute(BundleHelper.KEY_RESOURCE_PROCESSOR_PID) != null;
+    }
 }

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/BaseObjectPanel.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/BaseObjectPanel.java?rev=1310292&r1=1310291&r2=1310292&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/BaseObjectPanel.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/BaseObjectPanel.java Fri Apr  6 12:02:14 2012
@@ -30,6 +30,7 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.RepositoryObject.WorkingState;
 import org.apache.ace.webui.NamedObject;
 import org.apache.ace.webui.UIExtensionFactory;
+import org.apache.ace.webui.vaadin.AssociationRemover;
 import org.apache.ace.webui.vaadin.Associations;
 import org.apache.ace.webui.vaadin.EditWindow;
 import org.apache.felix.dm.Component;
@@ -51,8 +52,7 @@ import com.vaadin.ui.Window.Notification
 /**
  * Provides a custom table for displaying artifacts, features and so on.
  */
-abstract class BaseObjectPanel<REPO_OBJ extends RepositoryObject, REPO extends ObjectRepository<REPO_OBJ>> extends
-    Table implements EventHandler, RemoveAssociationHandler<REPO_OBJ> {
+abstract class BaseObjectPanel<REPO_OBJ extends RepositoryObject, REPO extends ObjectRepository<REPO_OBJ>> extends Table implements EventHandler {
 
     /**
      * Provides a generic remove item button.
@@ -82,7 +82,7 @@ abstract class BaseObjectPanel<REPO_OBJ 
      */
     private class RemoveLinkButton<REPO_OBJECT extends RepositoryObject> extends Button {
         public RemoveLinkButton(final REPO_OBJECT object, final Table toLeft, final Table toRight,
-            final RemoveAssociationHandler<REPO_OBJECT> removeHandler) {
+            final BaseObjectPanel removeHandler) {
             super("-");
             setStyleName("small");
 
@@ -173,6 +173,8 @@ abstract class BaseObjectPanel<REPO_OBJ 
     protected static final int ICON_WIDTH = 16;
 
     private final Associations m_associations;
+    protected final AssociationRemover m_associationRemover;
+
     private final List<UIExtensionFactoryHolder> m_extensionFactories;
     private final String m_extensionPoint;
 
@@ -186,15 +188,18 @@ abstract class BaseObjectPanel<REPO_OBJ 
      * Creates a new {@link BaseObjectPanel} instance.
      * 
      * @param associations the associations for this panel;
+     * @param associationRemover the association remove to use for removing associations;
      * @param name the name of this panel;
      * @param extensionPoint the extension point to listen for;
      * @param hasEdit <code>true</code> if double clicking an row in this table should show an editor, <code>false</code> to disallow editing.
      */
-    public BaseObjectPanel(Associations associations, final String name, String extensionPoint, final boolean hasEdit) {
+    public BaseObjectPanel(final Associations associations, final AssociationRemover associationRemover,
+        final String name, final String extensionPoint, final boolean hasEdit) {
         super(name + "s");
 
-        m_extensionFactories = new ArrayList<UIExtensionFactoryHolder>();
         m_associations = associations;
+        m_associationRemover = associationRemover;
+        m_extensionFactories = new ArrayList<UIExtensionFactoryHolder>();
         m_extensionPoint = extensionPoint;
 
         defineTableColumns();
@@ -243,7 +248,7 @@ abstract class BaseObjectPanel<REPO_OBJ 
         synchronized (getApplication()) {
             if (isSupportedEntity(entity)) {
                 try {
-                    doHandleEvent(topic, (REPO_OBJ) entity, event);
+                    handleEvent(topic, (REPO_OBJ) entity, event);
                 }
                 finally {
                     refreshRenderedCells();
@@ -253,18 +258,6 @@ abstract class BaseObjectPanel<REPO_OBJ 
     }
 
     /**
-     * @param entity
-     */
-    public void updateEntity(REPO_OBJ entity) {
-        try {
-            update(entity);
-        }
-        finally {
-            refreshRenderedCells();
-        }
-    }
-
-    /**
      * Called by the dependency manager upon initialization of this component.
      * 
      * @param component the component representing this object.
@@ -276,8 +269,7 @@ abstract class BaseObjectPanel<REPO_OBJ 
         component.add(dm
             .createServiceDependency()
             .setInstanceBound(true)
-            .setService(UIExtensionFactory.class,
-                "(" + UIExtensionFactory.EXTENSION_POINT_KEY + "=" + m_extensionPoint + ")")
+            .setService(UIExtensionFactory.class, "(" + UIExtensionFactory.EXTENSION_POINT_KEY + "=" + m_extensionPoint + ")")
             .setCallbacks("addExtension", "removeExtension"));
     }
 
@@ -305,26 +297,6 @@ abstract class BaseObjectPanel<REPO_OBJ 
     }
 
     /**
-     * {@inheritDoc}
-     */
-    public final void removeLeftSideAssociation(REPO_OBJ object, RepositoryObject other) {
-        if (doRemoveLeftSideAssociation(object, other)) {
-            m_associations.removeAssociatedItem(object);
-            requestRepaint();
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public final void removeRightSideAssocation(REPO_OBJ object, RepositoryObject other) {
-        if (doRemoveRightSideAssociation(object, other)) {
-            m_associations.removeAssociatedItem(object);
-            requestRepaint();
-        }
-    }
-
-    /**
      * Sets the left-side table, that defines the left-hand side of the assocations of the entities.
      * 
      * @param leftTable the table to set, can be <code>null</code>.
@@ -343,6 +315,32 @@ abstract class BaseObjectPanel<REPO_OBJ 
     }
 
     /**
+     * Removes the left-hand side associations for a given repository object.
+     * 
+     * @param object the repository object to remove the left-hand side associations;
+     * @param other the (left-hand side) repository object to remove the associations for.
+     */
+    final void removeLeftSideAssociation(REPO_OBJ object, RepositoryObject other) {
+        if (doRemoveLeftSideAssociation(object, other)) {
+            m_associations.removeAssociatedItem(object);
+            requestRepaint();
+        }
+    }
+
+    /**
+     * Removes the right-hand side associations for a given repository object.
+     * 
+     * @param object the repository object to remove the right-hand side associations;
+     * @param other the (right-hand side) repository object to remove the associations for.
+     */
+    final void removeRightSideAssocation(REPO_OBJ object, RepositoryObject other) {
+        if (doRemoveRightSideAssociation(object, other)) {
+            m_associations.removeAssociatedItem(object);
+            requestRepaint();
+        }
+    }
+
+    /**
      * Adds a given repository object to this table.
      * 
      * @param object the repository object to add, cannot be <code>null</code>.
@@ -381,7 +379,7 @@ abstract class BaseObjectPanel<REPO_OBJ 
      * @param res the resource denoting the actual icon.
      * @return an embeddable icon, never <code>null</code>.
      */
-    protected final Embedded createIcon(String name, Resource res) {
+    protected Embedded createIcon(String name, Resource res) {
         Embedded embedded = new Embedded(name, res);
         embedded.setType(Embedded.TYPE_IMAGE);
         embedded.setDescription(name);
@@ -396,7 +394,7 @@ abstract class BaseObjectPanel<REPO_OBJ 
      * @param iconName the base name of the icon to use, it will be appended with '.png'.
      * @return a {@link Resource} denoting the icon.
      */
-    protected final Resource createIconResource(String iconName) {
+    protected Resource createIconResource(String iconName) {
         return new ThemeResource("icons/" + iconName.toLowerCase() + ".png");
     }
 
@@ -439,7 +437,7 @@ abstract class BaseObjectPanel<REPO_OBJ 
      * 
      * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
      */
-    protected void doHandleEvent(String topic, REPO_OBJ entity, org.osgi.service.event.Event event) {
+    protected void handleEvent(String topic, REPO_OBJ entity, org.osgi.service.event.Event event) {
         // Nop...
     }
 

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/DistributionsPanel.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/DistributionsPanel.java?rev=1310292&r1=1310291&r2=1310292&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/DistributionsPanel.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/DistributionsPanel.java Fri Apr  6 12:02:14 2012
@@ -29,35 +29,25 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.object.TargetObject;
 import org.apache.ace.client.repository.repository.DistributionRepository;
 import org.apache.ace.webui.UIExtensionFactory;
+import org.apache.ace.webui.vaadin.AssociationRemover;
 import org.apache.ace.webui.vaadin.Associations;
 
 import com.vaadin.data.Item;
 
 /**
- *
+ * Provides an object panel for displaying distributions.
  */
 public abstract class DistributionsPanel extends BaseObjectPanel<DistributionObject, DistributionRepository> {
 
     /**
-     * @param associations
-     */
-    public DistributionsPanel(Associations associations) {
-        super(associations, "Distribution", UIExtensionFactory.EXTENSION_POINT_VALUE_DISTRIBUTION, true /* hasEdit */);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected void doHandleEvent(String topic, DistributionObject distribution, org.osgi.service.event.Event event) {
-        if (DistributionObject.TOPIC_ADDED.equals(topic)) {
-            add(distribution);
-        }
-        if (DistributionObject.TOPIC_REMOVED.equals(topic)) {
-            remove(distribution);
-        }
-        if (DistributionObject.TOPIC_CHANGED.equals(topic) || RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic)) {
-            update(distribution);
-        }
+     * Creates a new {@link DistributionsPanel} instance.
+     * 
+     * @param associations the assocation-holder object;
+     * @param associationRemover the helper for removing associations.
+     */
+    public DistributionsPanel(Associations associations, AssociationRemover associationRemover) {
+        super(associations, associationRemover, "Distribution", UIExtensionFactory.EXTENSION_POINT_VALUE_DISTRIBUTION,
+            true /* hasEdit */);
     }
 
     /**
@@ -67,11 +57,11 @@ public abstract class DistributionsPanel
     protected boolean doRemoveLeftSideAssociation(DistributionObject object, RepositoryObject other) {
         List<Feature2DistributionAssociation> associations = object.getAssociationsWith((FeatureObject) other);
         for (Feature2DistributionAssociation association : associations) {
-            removeAssocation(association);
+            m_associationRemover.removeAssociation(association);
         }
         return true;
     }
-    
+
     /**
      * {@inheritDoc}
      */
@@ -79,11 +69,26 @@ public abstract class DistributionsPanel
     protected boolean doRemoveRightSideAssociation(DistributionObject object, RepositoryObject other) {
         List<Distribution2TargetAssociation> associations = object.getAssociationsWith((TargetObject) other);
         for (Distribution2TargetAssociation association : associations) {
-            removeAssocation(association);
+            m_associationRemover.removeAssociation(association);
         }
         return true;
     }
-    
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void handleEvent(String topic, DistributionObject distribution, org.osgi.service.event.Event event) {
+        if (DistributionObject.TOPIC_ADDED.equals(topic)) {
+            add(distribution);
+        }
+        if (DistributionObject.TOPIC_REMOVED.equals(topic)) {
+            remove(distribution);
+        }
+        if (DistributionObject.TOPIC_CHANGED.equals(topic) || RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic)) {
+            update(distribution);
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -102,14 +107,4 @@ public abstract class DistributionsPanel
         item.getItemProperty(OBJECT_DESCRIPTION).setValue(distribution.getDescription());
         item.getItemProperty(ACTIONS).setValue(createActionButtons(distribution));
     }
-    
-    /**
-     * @param association
-     */
-    protected abstract void removeAssocation(Distribution2TargetAssociation association);
-    
-    /**
-     * @param association
-     */
-    protected abstract void removeAssocation(Feature2DistributionAssociation association);
 }

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/FeaturesPanel.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/FeaturesPanel.java?rev=1310292&r1=1310291&r2=1310292&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/FeaturesPanel.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/FeaturesPanel.java Fri Apr  6 12:02:14 2012
@@ -29,45 +29,34 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.object.FeatureObject;
 import org.apache.ace.client.repository.repository.FeatureRepository;
 import org.apache.ace.webui.UIExtensionFactory;
+import org.apache.ace.webui.vaadin.AssociationRemover;
 import org.apache.ace.webui.vaadin.Associations;
 
 import com.vaadin.data.Item;
 
 /**
- *
+ * Provides an object panel for displaying features.
  */
 public abstract class FeaturesPanel extends BaseObjectPanel<FeatureObject, FeatureRepository> {
 
     /**
-     * @param associations
+     * Creates a new {@link FeaturesPanel} instance.
+     * 
+     * @param associations the assocation-holder object;
+     * @param associationRemover the helper for removing associations.
      */
-    public FeaturesPanel(Associations associations) {
-        super(associations, "Feature", UIExtensionFactory.EXTENSION_POINT_VALUE_FEATURE, true);
+    public FeaturesPanel(Associations associations, AssociationRemover associationRemover) {
+        super(associations, associationRemover, "Feature", UIExtensionFactory.EXTENSION_POINT_VALUE_FEATURE, true);
     }
 
     /**
      * {@inheritDoc}
      */
-    protected void doHandleEvent(String topic, FeatureObject feature, org.osgi.service.event.Event event) {
-        if (FeatureObject.TOPIC_ADDED.equals(topic)) {
-            add(feature);
-        }
-        if (FeatureObject.TOPIC_REMOVED.equals(topic)) {
-            remove(feature);
-        }
-        if (FeatureObject.TOPIC_CHANGED.equals(topic) || RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic)) {
-            update(feature);
-        }
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
     @Override
     protected boolean doRemoveLeftSideAssociation(FeatureObject object, RepositoryObject other) {
         List<Artifact2FeatureAssociation> associations = object.getAssociationsWith((ArtifactObject) other);
         for (Artifact2FeatureAssociation association : associations) {
-            removeAssocation(association);
+            m_associationRemover.removeAssociation(association);
         }
         return true;
     }
@@ -79,7 +68,7 @@ public abstract class FeaturesPanel exte
     protected boolean doRemoveRightSideAssociation(FeatureObject object, RepositoryObject other) {
         List<Feature2DistributionAssociation> associations = object.getAssociationsWith((DistributionObject) other);
         for (Feature2DistributionAssociation association : associations) {
-            removeAssocation(association);
+            m_associationRemover.removeAssociation(association);
         }
         return true;
     }
@@ -87,6 +76,21 @@ public abstract class FeaturesPanel exte
     /**
      * {@inheritDoc}
      */
+    protected void handleEvent(String topic, FeatureObject feature, org.osgi.service.event.Event event) {
+        if (FeatureObject.TOPIC_ADDED.equals(topic)) {
+            add(feature);
+        }
+        if (FeatureObject.TOPIC_REMOVED.equals(topic)) {
+            remove(feature);
+        }
+        if (FeatureObject.TOPIC_CHANGED.equals(topic) || RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic)) {
+            update(feature);
+        }
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
     @Override
     protected boolean isSupportedEntity(RepositoryObject entity) {
         return entity instanceof FeatureObject;
@@ -102,15 +106,5 @@ public abstract class FeaturesPanel exte
         item.getItemProperty(OBJECT_DESCRIPTION).setValue(feature.getDescription());
         item.getItemProperty(ACTIONS).setValue(createActionButtons(feature));
     }
-    
-    /**
-     * @param association
-     */
-    protected abstract void removeAssocation(Artifact2FeatureAssociation association);
-    
-    /**
-     * @param association
-     */
-    protected abstract void removeAssocation(Feature2DistributionAssociation association);
 }
 

Modified: ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/TargetsPanel.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/TargetsPanel.java?rev=1310292&r1=1310291&r2=1310292&view=diff
==============================================================================
--- ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/TargetsPanel.java (original)
+++ ace/trunk/ace-webui-vaadin/src/main/java/org/apache/ace/webui/vaadin/component/TargetsPanel.java Fri Apr  6 12:02:14 2012
@@ -28,6 +28,7 @@ import org.apache.ace.client.repository.
 import org.apache.ace.client.repository.stateful.StatefulTargetObject;
 import org.apache.ace.client.repository.stateful.StatefulTargetRepository;
 import org.apache.ace.webui.UIExtensionFactory;
+import org.apache.ace.webui.vaadin.AssociationRemover;
 import org.apache.ace.webui.vaadin.Associations;
 
 import com.vaadin.data.Item;
@@ -37,7 +38,7 @@ import com.vaadin.ui.Embedded;
 import com.vaadin.ui.HorizontalLayout;
 
 /**
- *
+ * Provides an object panel for displaying (stateful) targets.
  */
 public abstract class TargetsPanel extends BaseObjectPanel<StatefulTargetObject, StatefulTargetRepository> {
 
@@ -48,12 +49,16 @@ public abstract class TargetsPanel exten
     /**
      * Creates a new {@link TargetsPanel} instance.
      * 
-     * @param associations the assocation-holder object.
+     * @param associations the assocation-holder object;
+     * @param associationRemover the helper for removing associations.
      */
-    public TargetsPanel(Associations associations) {
-        super(associations, "Target", UIExtensionFactory.EXTENSION_POINT_VALUE_TARGET, true /* hasEdit */);
+    public TargetsPanel(Associations associations, AssociationRemover associationRemover) {
+        super(associations, associationRemover, "Target", UIExtensionFactory.EXTENSION_POINT_VALUE_TARGET, true /* hasEdit */);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     protected Button createRemoveItemButton(StatefulTargetObject object) {
         Button b = super.createRemoveItemButton(object);
@@ -84,28 +89,11 @@ public abstract class TargetsPanel exten
     /**
      * {@inheritDoc}
      */
-    protected void doHandleEvent(String topic, StatefulTargetObject statefulTarget, org.osgi.service.event.Event event) {
-        if (StatefulTargetObject.TOPIC_ADDED.equals(topic)) {
-            add(statefulTarget);
-        }
-        if (StatefulTargetObject.TOPIC_REMOVED.equals(topic)) {
-            remove(statefulTarget);
-        }
-        if (StatefulTargetObject.TOPIC_CHANGED.equals(topic) || StatefulTargetObject.TOPIC_STATUS_CHANGED.equals(topic)
-            || StatefulTargetObject.TOPIC_AUDITEVENTS_CHANGED.equals(topic)
-            || RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic)) {
-            update(statefulTarget);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     @Override
     protected boolean doRemoveLeftSideAssociation(StatefulTargetObject object, RepositoryObject other) {
         List<Distribution2TargetAssociation> associations = object.getAssociationsWith((DistributionObject) other);
         for (Distribution2TargetAssociation association : associations) {
-            removeAssocation(association);
+            m_associationRemover.removeAssociation(association);
         }
         return true;
     }
@@ -125,6 +113,23 @@ public abstract class TargetsPanel exten
     /**
      * {@inheritDoc}
      */
+    protected void handleEvent(String topic, StatefulTargetObject statefulTarget, org.osgi.service.event.Event event) {
+        if (StatefulTargetObject.TOPIC_ADDED.equals(topic)) {
+            add(statefulTarget);
+        }
+        if (StatefulTargetObject.TOPIC_REMOVED.equals(topic)) {
+            remove(statefulTarget);
+        }
+        if (StatefulTargetObject.TOPIC_CHANGED.equals(topic) || StatefulTargetObject.TOPIC_STATUS_CHANGED.equals(topic)
+            || StatefulTargetObject.TOPIC_AUDITEVENTS_CHANGED.equals(topic)
+            || RepositoryAdmin.TOPIC_STATUSCHANGED.equals(topic)) {
+            update(statefulTarget);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
     @Override
     protected boolean isSupportedEntity(RepositoryObject entity) {
         return entity instanceof StatefulTargetObject;
@@ -146,11 +151,6 @@ public abstract class TargetsPanel exten
     }
 
     /**
-     * @param association
-     */
-    protected abstract void removeAssocation(Distribution2TargetAssociation association);
-
-    /**
      * @param object
      * @return
      */